package me.lethunderhawk.minion.ui; import me.lethunderhawk.fluxapi.FluxService; import me.lethunderhawk.fluxapi.util.gui.InventoryGUI; import me.lethunderhawk.fluxapi.util.gui.InventoryManager; import me.lethunderhawk.main.Main; import me.lethunderhawk.fluxapi.util.UnItalic; import me.lethunderhawk.minion.api.MinionLevelData; import me.lethunderhawk.minion.manager.MinionManager; import me.lethunderhawk.minion.registry.MinionRegistry; import me.lethunderhawk.minion.runtime.PlacedMinion; 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.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.java.JavaPlugin; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class MinionMenu extends InventoryGUI implements InventoryGUI.AutoCloseHandler { private final PlacedMinion minion; public MinionMenu(PlacedMinion minion) { super(minion.getType().getName() + " " + minion.getRomanLevel(), 54); this.minion = minion; buildContents(); } private void buildContents() { fillGlassPaneBackground(); ItemStack minionItem = minion.getHelmetItem().clone(); ItemMeta minionMeta = minionItem.getItemMeta(); minionMeta.displayName(UnItalic.text(minion.getType().getName() + " " + minion.getRomanLevel()).color(NamedTextColor.BLUE)); List minionLore = minion.getHelmetItem().lore(); minionMeta.lore(minionLore); minionItem.setItemMeta(minionMeta); setItem(4, minionItem); // Next tier info ItemStack nextTier = buildNextTierItem(); setItemWithClickAction(5, nextTier, (p, type) -> { p.sendMessage("not implemented yet"); }); // Collect resources button ItemStack collectItem = buildCollectResourcesItem(); setItemWithClickAction(48, collectItem, (p, type) -> { minion.pickupAllItems(); }); // Quick upgrade button ItemStack upgradeItem = buildQuickUpgradeItem(); setItemWithClickAction(50, upgradeItem, (p, type) -> { JavaPlugin plugin = FluxService.get(Main.class); PlacedMinion newMinion = minion.getUpgrade(plugin); if(newMinion != null) { MinionManager.stopAndUnregister(minion); MinionManager.startAndRegister(newMinion, plugin); InventoryManager.openFor(p, new MinionMenu(newMinion)); }else{ p.sendMessage("§cAlready at max tier."); } }); // Fuel slot ItemStack fuelItem = buildFuelSlot(); setItem(19, fuelItem); ItemStack settingsItem = buildSettingsItem(); setItemWithClickAction(3, settingsItem, (p, type) -> { new MinionSettingsMenu(minion).open(p); }); ItemStack pickupMinionItem = buildPickupMinionItem(); setItemWithClickAction(53, pickupMinionItem, (p, type) -> { InventoryManager.close(p.getUniqueId()); p.getInventory().addItem(minion.getHelmetItem()); minion.pickupAllItems(); MinionManager.stopAndUnregister(minion); p.sendMessage(Component.text("Removed Minion!", NamedTextColor.RED)); }); // Display collected resources in border slots int[] displaySlots = {21, 22, 23, 24, 25, 30, 31, 32, 33, 34, 39, 40, 41, 42, 43}; ItemStack[] resources = minion.getCollectedResources(); ItemStack lockedStorage = buildLockedSlot(); for (int i = 0; i < displaySlots.length; i++) { if (resources == null || i >= resources.length) { setItem(displaySlots[i], lockedStorage); } else { int finalI = i; setItemWithClickAction(displaySlots[i], resources[i], (p, type) -> { minion.pickupItem(finalI); updateDisplay(p); }); } } } private ItemStack buildLockedSlot() { ItemStack lockedStorage = new ItemStack(Material.WHITE_STAINED_GLASS_PANE); ItemMeta lockedStorageMeta = lockedStorage.getItemMeta(); lockedStorageMeta.displayName(Component.text("Locked Storage", NamedTextColor.RED)); lockedStorage.setItemMeta(UnItalic.removeItalicFromMeta(lockedStorageMeta)); return lockedStorage; } private ItemStack buildSettingsItem() { ItemStack settingsItem = new ItemStack(Material.REDSTONE_TORCH); ItemMeta settingsMeta = settingsItem.getItemMeta(); settingsMeta.displayName(Component.text("§aMinion Settings")); List settingsLore = new ArrayList<>(); settingsLore.add(Component.text("§7Configure how this")); settingsLore.add(Component.text("§7minion behaves!")); settingsMeta.lore(settingsLore); settingsItem.setItemMeta(settingsMeta); return settingsItem; } private ItemStack buildFuelSlot() { ItemStack fuelItem = new ItemStack(Material.ORANGE_STAINED_GLASS_PANE); ItemMeta fuelMeta = fuelItem.getItemMeta(); fuelMeta.displayName(Component.text("§aFuel")); List fuelLore = new ArrayList<>(); fuelLore.add(Component.text("§7Increase the speed of your")); fuelLore.add(Component.text("§7minion by adding minion fuel")); fuelLore.add(Component.text("§7items here.")); fuelLore.add(Component.text("")); fuelLore.add(Component.text("§cNote: §7You cant take fuel ")); fuelLore.add(Component.text("§7back out after you place it ")); fuelLore.add(Component.text("§7here!")); fuelLore.add(Component.text("§7Current Fuel: §eNone")); fuelMeta.lore(fuelLore); fuelItem.setItemMeta(fuelMeta); return fuelItem; } private ItemStack buildQuickUpgradeItem() { ItemStack upgradeItem = new ItemStack(Material.DIAMOND); ItemMeta upgradeMeta = upgradeItem.getItemMeta(); upgradeMeta.displayName(Component.text("Quick-Upgrade your Minion", NamedTextColor.GREEN)); List upgradeLore = new ArrayList<>(); upgradeLore.add(Component.text("Click here to upgrade your", NamedTextColor.GRAY)); upgradeLore.add(Component.text("minion to the next tier.", NamedTextColor.GRAY)); upgradeLore.add(Component.text("")); MinionLevelData nextLevel = getNextLevelData(); if(nextLevel == null || nextLevel.getTimeBetweenActions().equals(minion.getSpeedAsString())){ upgradeLore.add(Component.text("Time Between Actions: ", NamedTextColor.GRAY).append(Component.text(minion.getSpeedAsString(), NamedTextColor.GREEN))); }else{ upgradeLore.add(Component.text("Time Between Actions: ", NamedTextColor.GRAY) .append(Component.text(minion.getSpeedAsString() + " ➜ ", NamedTextColor.DARK_GRAY)) .append(Component.text(nextLevel.getTimeBetweenActions(), NamedTextColor.GREEN))); } if(nextLevel == null || nextLevel.getMaxStorageItems() == minion.getMaxStorageItems()){ upgradeLore.add(Component.text("Max Storage: ", NamedTextColor.GRAY) .append(Component.text( minion.getMaxStorageItems(), NamedTextColor.YELLOW))); }else{ upgradeLore.add(Component.text("Max Storage: ", NamedTextColor.GRAY) .append(Component.text(minion.getMaxStorageItems() + " ➜ ", NamedTextColor.DARK_GRAY)) .append(Component.text( nextLevel.getMaxStorageItems(), NamedTextColor.YELLOW))); } upgradeMeta.lore(upgradeLore); upgradeItem.setItemMeta(UnItalic.removeItalicFromMeta(upgradeMeta)); return upgradeItem; } private ItemStack buildPickupMinionItem() { ItemStack pickupItem = new ItemStack(Material.BEDROCK); ItemMeta pickupMeta = pickupItem.getItemMeta(); pickupMeta.displayName(Component.text("§cPickup Minion")); List pickupLore = new ArrayList<>(); pickupLore.add(Component.text("§7Click to pickup this")); pickupLore.add(Component.text("§7minion and all its")); pickupLore.add(Component.text("§7upgrades!")); pickupLore.add(Component.text("")); pickupLore.add(Component.text("§cWarning: This will")); pickupLore.add(Component.text("§cstop the minion!")); pickupMeta.lore(pickupLore); pickupItem.setItemMeta(pickupMeta); return pickupItem; } private ItemStack buildCollectResourcesItem() { ItemStack collectItem = new ItemStack(Material.CHEST); ItemMeta collectMeta = collectItem.getItemMeta(); collectMeta.displayName(Component.text("§aCollect All")); List collectLore = new ArrayList<>(); collectLore.add(Component.text("Click to collect all", NamedTextColor.GRAY)); collectLore.add(Component.text("resources from this", NamedTextColor.GRAY)); collectLore.add(Component.text("minion!", NamedTextColor.GRAY)); collectMeta.lore(collectLore); collectItem.setItemMeta(UnItalic.removeItalicFromMeta(collectMeta)); return collectItem; } private ItemStack buildNextTierItem(){ ItemStack nextTier = new ItemStack(Material.GOLD_INGOT); ItemMeta nextTierItemMeta = nextTier.getItemMeta(); nextTierItemMeta.displayName(Component.text("Next tier info", NamedTextColor.GREEN)); List nextTierLore = new ArrayList<>(); nextTierLore.add(Component.text("View the items required to", NamedTextColor.GRAY)); nextTierLore.add(Component.text("upgrade this minion to the next", NamedTextColor.GRAY)); nextTierLore.add(Component.text("tier.", NamedTextColor.GRAY)); nextTierLore.add(Component.text("")); MinionLevelData nextLevel = getNextLevelData(); if(nextLevel == null || nextLevel.getTimeBetweenActions().equals(minion.getSpeedAsString())){ nextTierLore.add(Component.text("Time Between Actions: ", NamedTextColor.GRAY).append(Component.text(minion.getSpeedAsString(), NamedTextColor.GREEN))); }else{ nextTierLore.add(Component.text("Time Between Actions: ", NamedTextColor.GRAY) .append(Component.text(minion.getSpeedAsString() + " ➜ ", NamedTextColor.DARK_GRAY)) .append(Component.text(nextLevel.getTimeBetweenActions(), NamedTextColor.GREEN))); } if(nextLevel == null || nextLevel.getMaxStorageItems() == minion.getMaxStorageItems()){ nextTierLore.add(Component.text("Max Storage: ", NamedTextColor.GRAY) .append(Component.text( minion.getMaxStorageItems(), NamedTextColor.YELLOW))); }else{ nextTierLore.add(Component.text("Max Storage: ", NamedTextColor.GRAY) .append(Component.text(minion.getMaxStorageItems() + " ➜ ", NamedTextColor.DARK_GRAY)) .append(Component.text( nextLevel.getMaxStorageItems(), NamedTextColor.YELLOW))); } nextTierItemMeta.lore(nextTierLore); nextTier.setItemMeta(UnItalic.removeItalicFromMeta(nextTierItemMeta)); return nextTier; } private MinionLevelData getNextLevelData(){ return MinionRegistry.get(minion.getType().getId()).getLevelTable().get(minion.getLevel() + 1); } private void updateDisplay(Player player) { buildContents(); player.updateInventory(); } @Override public void onClosedByPlayer(Player player) { // Save minion data when menu is closed //minion.saveData(); } @Override public void update() { buildContents(); } public UUID getMinionId() { return minion.getMinionId(); } // Helper class for storage menu private static class MinionStorageMenu extends InventoryGUI { private final PlacedMinion minion; public MinionStorageMenu(PlacedMinion minion) { super(minion.getType().getName() + " Storage", 54); this.minion = minion; buildContents(); } private void buildContents() { fillBackground(Material.GRAY_STAINED_GLASS_PANE, " "); // List storage = minion.getStorageContents(); // for (int i = 0; i < Math.min(storage.size(), 36); i++) { // setItem(i, storage.get(i)); // } // Back button ItemStack backItem = new ItemStack(Material.ARROW); ItemMeta backMeta = backItem.getItemMeta(); backMeta.displayName(Component.text("Go Back", NamedTextColor.RED)); backItem.setItemMeta(backMeta); setItemWithClickAction(49, backItem, (p, type) -> { new MinionMenu(minion).open(p); }); } @Override public void update() { } } // Helper class for settings menu private static class MinionSettingsMenu extends InventoryGUI { private final PlacedMinion minion; public MinionSettingsMenu(PlacedMinion minion) { super(minion.getType().getName() + " Settings", 27); this.minion = minion; buildContents(); } private void buildContents() { fillBackground(Material.GRAY_STAINED_GLASS_PANE, " "); // Back button ItemStack backItem = new ItemStack(Material.ARROW); ItemMeta backMeta = backItem.getItemMeta(); backMeta.displayName(Component.text("Go Back", NamedTextColor.RED)); backItem.setItemMeta(backMeta); setItemWithClickAction(22, backItem, (p, type) -> { new MinionMenu(minion).open(p); }); } @Override public void update() { } } }