CustomContainer.java 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package me.km.inventory;
  2. import me.km.KajetansMod;
  3. import me.km.snuviscript.SnuviInventory;
  4. import net.minecraft.entity.player.EntityPlayer;
  5. import net.minecraft.entity.player.EntityPlayerMP;
  6. import net.minecraft.inventory.ClickType;
  7. import net.minecraft.inventory.ContainerChest;
  8. import net.minecraft.inventory.IInventory;
  9. import net.minecraft.inventory.InventoryBasic;
  10. import net.minecraft.item.ItemStack;
  11. import net.minecraft.network.play.server.SPacketOpenWindow;
  12. public class CustomContainer extends ContainerChest
  13. {
  14. private boolean canBeClosed;
  15. public CustomContainer(String title, int slotCount, EntityPlayerMP p)
  16. {
  17. super(p.inventory, new EntityInventory(title, slotCount, p), p);
  18. canBeClosed = true;
  19. }
  20. public void closeSafe(EntityPlayer p)
  21. {
  22. if(canBeClosed)
  23. {
  24. p.closeScreen();
  25. }
  26. else
  27. {
  28. KajetansMod.scheduler.scheduleTask(() ->
  29. {
  30. if(p.openContainer.windowId == this.windowId)
  31. {
  32. p.closeScreen();
  33. }
  34. });
  35. }
  36. }
  37. public CustomContainer(SnuviInventory inv, EntityPlayerMP p)
  38. {
  39. super(p.inventory, inv, p);
  40. canBeClosed = true;
  41. }
  42. public InventoryBasic getShownInventory()
  43. {
  44. return (InventoryBasic) this.getLowerChestInventory();
  45. }
  46. public void openForPlayer(EntityPlayerMP p)
  47. {
  48. // opening container on next tick to prevent closing during noClicking or onCanceledClick
  49. if(p.openContainer instanceof CustomContainer)
  50. {
  51. CustomContainer cc = (CustomContainer) p.openContainer;
  52. if(!cc.canBeClosed)
  53. {
  54. KajetansMod.scheduler.scheduleTask(() -> openForPlayer(p));
  55. return;
  56. }
  57. }
  58. if(p.openContainer != p.inventoryContainer)
  59. {
  60. p.closeScreen();
  61. }
  62. p.getNextWindowId();
  63. IInventory inv = this.getLowerChestInventory();
  64. p.connection.sendPacket(new SPacketOpenWindow(p.currentWindowId, "minecraft:container", inv.getDisplayName(), inv.getSizeInventory()));
  65. p.openContainer = this;
  66. p.openContainer.windowId = p.currentWindowId;
  67. p.openContainer.addListener(p);
  68. }
  69. public boolean noClicking(int slotId, int dragType, ClickType clickTypeIn, EntityPlayerMP player)
  70. {
  71. return true;
  72. }
  73. @Override
  74. public final ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer p)
  75. {
  76. if(p instanceof EntityPlayerMP)
  77. {
  78. EntityPlayerMP player = (EntityPlayerMP) p;
  79. canBeClosed = false;
  80. if(noClicking(slotId, dragType, clickTypeIn, player))
  81. {
  82. onCanceledClick(slotId, dragType, clickTypeIn, player);
  83. canBeClosed = true;
  84. return ItemStack.EMPTY;
  85. }
  86. canBeClosed = true;
  87. }
  88. return super.slotClick(slotId, dragType, clickTypeIn, p);
  89. }
  90. public void onCanceledClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayerMP player)
  91. {
  92. }
  93. }