|
@@ -0,0 +1,335 @@
|
|
|
|
|
+package me.lethunderhawk.minion.ui;
|
|
|
|
|
+
|
|
|
|
|
+import me.lethunderhawk.bazaarflux.util.gui.InventoryGUI;
|
|
|
|
|
+import me.lethunderhawk.bazaarflux.util.gui.InventoryManager;
|
|
|
|
|
+import me.lethunderhawk.main.Main;
|
|
|
|
|
+import me.lethunderhawk.main.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() {
|
|
|
|
|
+ // Fill background with stained glass panes
|
|
|
|
|
+ fillBackground(Material.GRAY_STAINED_GLASS_PANE, " ");
|
|
|
|
|
+
|
|
|
|
|
+ // Minion head/icon in the center (slot 13)
|
|
|
|
|
+ ItemStack minionItem = minion.getHelmetItem().clone();
|
|
|
|
|
+ ItemMeta minionMeta = minionItem.getItemMeta();
|
|
|
|
|
+ minionMeta.displayName(UnItalic.text(minion.getType().getName() + " " + minion.getRomanLevel()).color(NamedTextColor.BLUE));
|
|
|
|
|
+
|
|
|
|
|
+ List<Component> 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();
|
|
|
|
|
+ InventoryManager.refreshMinionMenuForPlayer(p.getUniqueId(), minion.getMinionId());
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // Quick upgrade button
|
|
|
|
|
+ ItemStack upgradeItem = buildQuickUpgradeItem();
|
|
|
|
|
+ setItemWithClickAction(50, upgradeItem, (p, type) -> {
|
|
|
|
|
+
|
|
|
|
|
+ JavaPlugin plugin = Main.getInstance();
|
|
|
|
|
+ PlacedMinion newMinion = minion.getUpgrade(plugin);
|
|
|
|
|
+ if(newMinion != null) {
|
|
|
|
|
+ MinionManager.stopAndUnregister(minion);
|
|
|
|
|
+ MinionManager.startAndRegister(newMinion, plugin);
|
|
|
|
|
+ InventoryManager.close(p.getUniqueId());
|
|
|
|
|
+ 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<Component> 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<Component> 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<Component> 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<Component> 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<Component> 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<Component> 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<ItemStack> 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.setDisplayName("§aGo Back");
|
|
|
|
|
+ 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.setDisplayName("§aGo Back");
|
|
|
|
|
+ backItem.setItemMeta(backMeta);
|
|
|
|
|
+ setItemWithClickAction(22, backItem, (p, type) -> {
|
|
|
|
|
+ new MinionMenu(minion).open(p);
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void update() {
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|