package me.lethunderhawk.profile.data.sacks.mining; import me.lethunderhawk.fluxapi.FluxService; import me.lethunderhawk.fluxapi.profile.ProfileManager; import me.lethunderhawk.fluxapi.util.gui.InventoryGUI; import me.lethunderhawk.fluxapi.util.itemdesign.ItemOptions; import me.lethunderhawk.fluxapi.util.itemdesign.LoreDesigner; import me.lethunderhawk.profile.data.sacks.Sack; import me.lethunderhawk.util.StringUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import java.util.HashMap; import java.util.List; public class MiningSackGUI extends InventoryGUI { private int i = 10; private Sack sack; private Player player; public MiningSackGUI(Player p) { super("Your Mining Sack", 36, p); if (this.sack == null) { throw new IllegalStateException("Sack profile not available."); } } @Override public void performAdditionalComputationOnPlayer(Player player){ sack = FluxService.get(ProfileManager.class).getProfile(player.getUniqueId()).getSubProfile("mining_sack", MiningSack.class); this.player = player; } private void addSackItem(Material material) { String materialName = StringUtil.toCamelCase(material.name()); String finalName = materialName; List lore = LoreDesigner.createLore("Mining Sack " + "
" + "
" + "Stored: " + (sack.getMaterialAmount(material) == 0 ? "0" : "" + sack.getMaterialAmount(material) + "") + "/" + sack.getMaxMaterialAmount(material) + "

Right-Click for stack!" + "
Click to pickup!", "This is a string long enough to have everything inside of it", NamedTextColor.GRAY); setItemWithClickAction(i, new ItemOptions(material) .setName(Component.text(finalName, NamedTextColor.GREEN)) .setLore(lore) .buildItemStack(), (p, type) -> { doSackAction(type, material); }); i++; } private void doSackAction(ClickType type, Material material) { int amountToTake = 1; if (type == ClickType.RIGHT || type == ClickType.SHIFT_RIGHT) { amountToTake = 64; } int removed = sack.takeOutItem(material, amountToTake); if (removed > 0) { ItemStack stack = new ItemStack(material, removed); HashMap leftover = player.getInventory().addItem(stack); // If inventory full → return items back into sack if (!leftover.isEmpty()) { int notStored = leftover.values().stream() .mapToInt(ItemStack::getAmount) .sum(); sack.addItem(material, notStored); } } player.updateInventory(); update(); } @Override public void buildContent() { fillGlassPaneBackground(); i = 10; for (Material material : sack.getAssociatedSackMap().keySet()) { addSackItem(material); } setCloseButton(31); setAddAllItemsItem(); } private void setAddAllItemsItem() { setItemWithClickAction(32, new ItemOptions(Material.CAULDRON) .setName(Component.text("Add all items into the Sack", NamedTextColor.GREEN)) .setLore(LoreDesigner.createLore( "
Allows you to put all items from your inventory into the sack", "This is an example width reference", NamedTextColor.DARK_GRAY) ) .buildItemStack(), this::putAllItemsIn); } private void putAllItemsIn(Player player, ClickType type) { PlayerInventory inv = player.getInventory(); for (ItemStack stack : inv.getContents()) { if (stack == null) continue; if (stack.getType() == Material.AIR) continue; Material material = stack.getType(); int amount = stack.getAmount(); // Try adding to sack int leftover = sack.addItem(material, amount); int successfullyAdded = amount - leftover; if (successfullyAdded > 0) { stack.setAmount(leftover); // leave leftover in inventory } } player.updateInventory(); update(); } @Override public void update() { i = 10; for (Material material : sack.getAssociatedSackMap().keySet()) { addSackItem(material); } } }