2019-07-29 22:20:48 +00:00
|
|
|
package org.geysermc.connector.utils;
|
|
|
|
|
|
|
|
import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
|
2019-10-20 21:25:41 +00:00
|
|
|
import com.github.steveice10.mc.protocol.data.game.window.WindowType;
|
2019-07-29 22:20:48 +00:00
|
|
|
import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket;
|
2019-10-20 21:25:41 +00:00
|
|
|
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
2019-07-29 22:20:48 +00:00
|
|
|
import com.nukkitx.protocol.bedrock.data.ItemData;
|
|
|
|
import org.geysermc.api.Geyser;
|
|
|
|
import org.geysermc.connector.inventory.Inventory;
|
|
|
|
import org.geysermc.connector.network.session.GeyserSession;
|
|
|
|
import org.geysermc.connector.network.translators.TranslatorsInit;
|
|
|
|
import org.geysermc.connector.network.translators.inventory.InventoryTranslator;
|
|
|
|
|
2019-10-20 21:25:41 +00:00
|
|
|
import java.util.Objects;
|
2019-07-29 22:20:48 +00:00
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
public class InventoryUtils {
|
|
|
|
|
|
|
|
public static void openInventory(GeyserSession session, ServerOpenWindowPacket packet) {
|
2019-10-20 21:25:41 +00:00
|
|
|
Inventory inventory = new Inventory(packet.getWindowId(), packet.getType());
|
|
|
|
InventoryTranslator translator = TranslatorsInit.getInventoryTranslators().get(inventory.getWindowType());
|
|
|
|
if (translator != null) {
|
|
|
|
session.getInventoryCache().cacheInventory(inventory);
|
|
|
|
session.getInventoryCache().setOpenInventory(inventory);
|
|
|
|
translator.prepareInventory(session, inventory);
|
|
|
|
//TODO: find better way to handle double chest delay
|
|
|
|
if (inventory.getWindowType() == WindowType.GENERIC_9X4 || inventory.getWindowType() == WindowType.GENERIC_9X5 || inventory.getWindowType() == WindowType.GENERIC_9X6) {
|
|
|
|
Geyser.getGeneralThreadPool().schedule(() -> {
|
|
|
|
translator.openInventory(session, inventory);
|
|
|
|
translator.updateInventory(session, inventory);
|
|
|
|
}, 200, TimeUnit.MILLISECONDS);
|
|
|
|
} else {
|
|
|
|
translator.openInventory(session, inventory);
|
|
|
|
}
|
2019-07-29 22:20:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-20 21:25:41 +00:00
|
|
|
public static void closeInventory(GeyserSession session, int windowId) {
|
|
|
|
if (windowId != 0) {
|
|
|
|
Inventory inventory = session.getInventoryCache().getInventories().get(windowId);
|
|
|
|
if (inventory != null) {
|
|
|
|
InventoryTranslator translator = TranslatorsInit.getInventoryTranslators().get(inventory.getWindowType());
|
|
|
|
translator.closeInventory(session, inventory);
|
|
|
|
session.getInventoryCache().uncacheInventory(windowId);
|
|
|
|
}
|
|
|
|
session.getInventoryCache().setOpenInventory(null);
|
2019-07-29 22:20:48 +00:00
|
|
|
}
|
2019-10-20 21:25:41 +00:00
|
|
|
}
|
2019-07-29 22:20:48 +00:00
|
|
|
|
2019-10-20 21:25:41 +00:00
|
|
|
//currently, ItemStack.equals() does not check the item id
|
|
|
|
public static boolean canCombine(ItemData stack1, ItemData stack2) {
|
|
|
|
if (stack1 == null || stack2 == null)
|
|
|
|
return false;
|
|
|
|
return stack1.getId() == stack2.getId() && stack1.equals(stack2, false, true, true);
|
|
|
|
}
|
2019-07-29 22:20:48 +00:00
|
|
|
|
2019-10-20 21:25:41 +00:00
|
|
|
//NPE if nbt tag is null
|
|
|
|
public static ItemStack fixNbt(ItemStack stack) {
|
|
|
|
if (stack == null)
|
|
|
|
return null;
|
|
|
|
return new ItemStack(stack.getId(), stack.getAmount(), stack.getNbt() == null ? new CompoundTag("") : stack.getNbt());
|
2019-07-29 22:20:48 +00:00
|
|
|
}
|
|
|
|
}
|