package me.km.inventory; import me.km.KajetansMod; import me.km.snuviscript.SnuviInventory; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.ClickType; import net.minecraft.inventory.ContainerChest; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryBasic; import net.minecraft.item.ItemStack; import net.minecraft.network.play.server.SPacketOpenWindow; public class CustomContainer extends ContainerChest { private boolean canBeClosed; public CustomContainer(String title, int slotCount, EntityPlayerMP p) { super(p.inventory, new EntityInventory(title, slotCount, p), p); canBeClosed = true; } public void closeSafe(EntityPlayer p) { if(canBeClosed) { p.closeScreen(); } else { KajetansMod.scheduler.scheduleTask(() -> { if(p.openContainer.windowId == this.windowId) { p.closeScreen(); } }); } } public CustomContainer(SnuviInventory inv, EntityPlayerMP p) { super(p.inventory, inv, p); canBeClosed = true; } public InventoryBasic getShownInventory() { return (InventoryBasic) this.getLowerChestInventory(); } public void openForPlayer(EntityPlayerMP p) { // opening container on next tick to prevent closing during noClicking or onCanceledClick if(p.openContainer instanceof CustomContainer) { CustomContainer cc = (CustomContainer) p.openContainer; if(!cc.canBeClosed) { KajetansMod.scheduler.scheduleTask(() -> openForPlayer(p)); return; } } if(p.openContainer != p.inventoryContainer) { p.closeScreen(); } p.getNextWindowId(); IInventory inv = this.getLowerChestInventory(); p.connection.sendPacket(new SPacketOpenWindow(p.currentWindowId, "minecraft:container", inv.getDisplayName(), inv.getSizeInventory())); p.openContainer = this; p.openContainer.windowId = p.currentWindowId; p.openContainer.addListener(p); } public boolean noClicking(int slotId, int dragType, ClickType clickTypeIn, EntityPlayerMP player) { return true; } @Override public final ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer p) { if(p instanceof EntityPlayerMP) { EntityPlayerMP player = (EntityPlayerMP) p; canBeClosed = false; if(noClicking(slotId, dragType, clickTypeIn, player)) { onCanceledClick(slotId, dragType, clickTypeIn, player); canBeClosed = true; return ItemStack.EMPTY; } canBeClosed = true; } return super.slotClick(slotId, dragType, clickTypeIn, p); } public void onCanceledClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayerMP player) { } }