CustomContainer.java 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package me.km.inventory;
  2. import me.km.KajetansMod;
  3. import net.minecraft.entity.player.PlayerEntity;
  4. import net.minecraft.entity.player.ServerPlayerEntity;
  5. import net.minecraft.inventory.container.ClickType;
  6. import net.minecraft.item.ItemStack;
  7. import net.minecraft.util.text.ITextComponent;
  8. public class CustomContainer extends CustomContainerBase
  9. {
  10. private boolean canBeClosed;
  11. public CustomContainer(InventoryBase inv, ServerPlayerEntity p, ITextComponent title)
  12. {
  13. super(inv, p, title);
  14. canBeClosed = true;
  15. }
  16. public CustomContainer(InventoryBase inv, PlayerEntity p, ITextComponent title, int id)
  17. {
  18. super(inv, p, title, id);
  19. canBeClosed = true;
  20. }
  21. @Override
  22. public void closeSafe()
  23. {
  24. if(canBeClosed)
  25. {
  26. super.closeSafe();
  27. }
  28. else if(isServerSide)
  29. {
  30. KajetansMod.scheduler.scheduleTask(() ->
  31. {
  32. if(viewer.openContainer.windowId == this.windowId)
  33. {
  34. super.closeSafe();
  35. }
  36. });
  37. }
  38. }
  39. @Override
  40. public void openForPlayer()
  41. {
  42. // opening container on next tick to prevent closing during noClicking or onCanceledClick
  43. if(isServerSide)
  44. {
  45. if(viewer.openContainer instanceof CustomContainer)
  46. {
  47. CustomContainer cc = (CustomContainer) viewer.openContainer;
  48. if(!cc.canBeClosed)
  49. {
  50. KajetansMod.scheduler.scheduleTask(() -> openForPlayer());
  51. return;
  52. }
  53. }
  54. super.openForPlayer();
  55. }
  56. }
  57. @Override
  58. public final ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity p)
  59. {
  60. if(slotId < 0 || slotId >= inv.getSizeInventory())
  61. {
  62. return super.slotClick(slotId, dragType, clickTypeIn, p);
  63. }
  64. switch(inv.getSlotStatus(slotId))
  65. {
  66. case 0: return ItemStack.EMPTY;
  67. case 1: return super.slotClick(slotId, dragType, clickTypeIn, p);
  68. case 2:
  69. if(isServerSide)
  70. {
  71. //System.out.println("Button was pressed");
  72. ServerPlayerEntity player = (ServerPlayerEntity) p;
  73. canBeClosed = false;
  74. onButtonClick(slotId, dragType, clickTypeIn, player);
  75. canBeClosed = true;
  76. }
  77. return ItemStack.EMPTY;
  78. case 3:
  79. if(isServerSide)
  80. {
  81. //System.out.println("Button was pressed, serverside cancel possible");
  82. ServerPlayerEntity player = (ServerPlayerEntity) p;
  83. canBeClosed = false;
  84. if(onButtonClick(slotId, dragType, clickTypeIn, player))
  85. {
  86. canBeClosed = true;
  87. return ItemStack.EMPTY;
  88. }
  89. canBeClosed = true;
  90. }
  91. return super.slotClick(slotId, dragType, clickTypeIn, p);
  92. }
  93. return ItemStack.EMPTY;
  94. }
  95. public boolean onButtonClick(int slotId, int dragType, ClickType clickTypeIn, ServerPlayerEntity player)
  96. {
  97. return false;
  98. }
  99. }