package me.km.inventory; import me.km.KajetansMod; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.ClickType; import net.minecraft.item.ItemStack; public class CustomContainer extends CustomContainerBase { private boolean canBeClosed; public CustomContainer(InventoryBase inv, EntityPlayer p) { super(inv, p); canBeClosed = true; } @Override public void closeSafe() { if(canBeClosed) { super.closeSafe(); } else if(isServerSide) { KajetansMod.scheduler.scheduleTask(() -> { if(viewer.openContainer.windowId == this.windowId) { super.closeSafe(); } }); } } @Override public void openForPlayer() { // opening container on next tick to prevent closing during noClicking or onCanceledClick if(isServerSide) { if(viewer.openContainer instanceof CustomContainer) { CustomContainer cc = (CustomContainer) viewer.openContainer; if(!cc.canBeClosed) { KajetansMod.scheduler.scheduleTask(() -> openForPlayer()); return; } } super.openForPlayer(); } } @Override public final ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer p) { if(slotId < 0 || slotId >= inv.getSizeInventory()) { return super.slotClick(slotId, dragType, clickTypeIn, p); } switch(inv.getSlotStatus(slotId)) { case 0: return ItemStack.EMPTY; case 1: return super.slotClick(slotId, dragType, clickTypeIn, p); case 2: if(isServerSide) { //System.out.println("Button was pressed"); EntityPlayerMP player = (EntityPlayerMP) p; canBeClosed = false; onButtonClick(slotId, dragType, clickTypeIn, player); canBeClosed = true; } return ItemStack.EMPTY; case 3: if(isServerSide) { //System.out.println("Button was pressed, serverside cancel possible"); EntityPlayerMP player = (EntityPlayerMP) p; canBeClosed = false; if(onButtonClick(slotId, dragType, clickTypeIn, player)) { canBeClosed = true; return ItemStack.EMPTY; } canBeClosed = true; } return super.slotClick(slotId, dragType, clickTypeIn, p); } return ItemStack.EMPTY; } public boolean onButtonClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayerMP player) { return false; } }