package me.km.inventory; import me.km.KajetansMod; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.inventory.container.ClickType; import net.minecraft.item.ItemStack; import net.minecraft.util.text.ITextComponent; public class CustomContainer extends CustomContainerBase { private boolean canBeClosed; public CustomContainer(InventoryBase inv, ServerPlayerEntity p, ITextComponent title) { super(inv, p, title); canBeClosed = true; } public CustomContainer(InventoryBase inv, PlayerEntity p, ITextComponent title, int id) { super(inv, p, title, id); 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, PlayerEntity 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"); ServerPlayerEntity player = (ServerPlayerEntity) 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"); ServerPlayerEntity player = (ServerPlayerEntity) 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, ServerPlayerEntity player) { return false; } }