MiningSackGUI.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package me.lethunderhawk.profile.data.sacks.mining;
  2. import me.lethunderhawk.fluxapi.FluxService;
  3. import me.lethunderhawk.fluxapi.profile.ProfileManager;
  4. import me.lethunderhawk.fluxapi.util.gui.InventoryGUI;
  5. import me.lethunderhawk.fluxapi.util.itemdesign.ItemOptions;
  6. import me.lethunderhawk.fluxapi.util.itemdesign.LoreDesigner;
  7. import me.lethunderhawk.profile.data.sacks.Sack;
  8. import me.lethunderhawk.util.StringUtil;
  9. import net.kyori.adventure.text.Component;
  10. import net.kyori.adventure.text.format.NamedTextColor;
  11. import org.bukkit.Material;
  12. import org.bukkit.entity.Player;
  13. import org.bukkit.event.inventory.ClickType;
  14. import org.bukkit.inventory.ItemStack;
  15. import org.bukkit.inventory.PlayerInventory;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. public class MiningSackGUI extends InventoryGUI {
  19. private int i = 10;
  20. private Sack sack;
  21. private Player player;
  22. public MiningSackGUI(Player p) {
  23. super("Your Mining Sack", 36, p);
  24. if (this.sack == null) {
  25. throw new IllegalStateException("Sack profile not available.");
  26. }
  27. }
  28. @Override
  29. public void performAdditionalComputationOnPlayer(Player player){
  30. sack = FluxService.get(ProfileManager.class).getProfile(player.getUniqueId()).getSubProfile("mining_sack", MiningSack.class);
  31. this.player = player;
  32. }
  33. private void addSackItem(Material material) {
  34. String materialName = StringUtil.toCamelCase(material.name());
  35. String finalName = materialName;
  36. List<Component> lore = LoreDesigner.createLore("<dark_gray>Mining Sack </dark_gray>" +
  37. "<br>" +
  38. "<br>" +
  39. "Stored: " +
  40. (sack.getMaterialAmount(material) == 0 ? "<dark_gray>0</dark_gray>" : "<yellow>" + sack.getMaterialAmount(material) + "</yellow>")
  41. + "/"
  42. + sack.getMaxMaterialAmount(material)
  43. + "<br><br><aqua>Right-Click for stack!</aqua>"
  44. + "<br><yellow>Click to pickup!</yellow>",
  45. "This is a string long enough to have everything inside of it", NamedTextColor.GRAY);
  46. setItemWithClickAction(i, new ItemOptions(material)
  47. .setName(Component.text(finalName, NamedTextColor.GREEN))
  48. .setLore(lore)
  49. .buildItemStack(), (p, type) -> {
  50. doSackAction(type, material);
  51. });
  52. i++;
  53. }
  54. private void doSackAction(ClickType type, Material material) {
  55. int amountToTake = 1;
  56. if (type == ClickType.RIGHT || type == ClickType.SHIFT_RIGHT) {
  57. amountToTake = 64;
  58. }
  59. int removed = sack.takeOutItem(material, amountToTake);
  60. if (removed > 0) {
  61. ItemStack stack = new ItemStack(material, removed);
  62. HashMap<Integer, ItemStack> leftover = player.getInventory().addItem(stack);
  63. // If inventory full → return items back into sack
  64. if (!leftover.isEmpty()) {
  65. int notStored = leftover.values().stream()
  66. .mapToInt(ItemStack::getAmount)
  67. .sum();
  68. sack.addItem(material, notStored);
  69. }
  70. }
  71. player.updateInventory();
  72. update();
  73. }
  74. @Override
  75. public void buildContent() {
  76. fillGlassPaneBackground();
  77. i = 10;
  78. for (Material material : sack.getAssociatedSackMap().keySet()) {
  79. addSackItem(material);
  80. }
  81. setCloseButton(31);
  82. setAddAllItemsItem();
  83. }
  84. private void setAddAllItemsItem() {
  85. setItemWithClickAction(32,
  86. new ItemOptions(Material.CAULDRON)
  87. .setName(Component.text("Add all items into the Sack", NamedTextColor.GREEN))
  88. .setLore(LoreDesigner.createLore(
  89. "<br>Allows you to put all items from your inventory into the sack",
  90. "This is an example width reference",
  91. NamedTextColor.DARK_GRAY)
  92. )
  93. .buildItemStack(), this::putAllItemsIn);
  94. }
  95. private void putAllItemsIn(Player player, ClickType type) {
  96. PlayerInventory inv = player.getInventory();
  97. for (ItemStack stack : inv.getContents()) {
  98. if (stack == null) continue;
  99. if (stack.getType() == Material.AIR) continue;
  100. Material material = stack.getType();
  101. int amount = stack.getAmount();
  102. // Try adding to sack
  103. int leftover = sack.addItem(material, amount);
  104. int successfullyAdded = amount - leftover;
  105. if (successfullyAdded > 0) {
  106. stack.setAmount(leftover); // leave leftover in inventory
  107. }
  108. }
  109. player.updateInventory();
  110. update();
  111. }
  112. @Override
  113. public void update() {
  114. i = 10;
  115. for (Material material : sack.getAssociatedSackMap().keySet()) {
  116. addSackItem(material);
  117. }
  118. }
  119. }