diff --git a/locales/bsb_en_US.yml b/locales/bsb_en_US.yml index 7385cbf..90522a1 100755 --- a/locales/bsb_en_US.yml +++ b/locales/bsb_en_US.yml @@ -6,3 +6,51 @@ ### Credits ### # Tastybento: maintainer +challenges: + complete: "Complete" + expReward: "Exp reward" + firstTimeRewards: "First time reward(s)" + guititle: "BSkyBlock Challenges" + help1: "Use /c to view information about a challenge." + help2: "Use /c complete to attempt to complete that challenge." + incomplete: "Incomplete" + invalidChallengeName: "Invalid challenge name! Use /c help for more information" + itemTakeWarning: "All required items are taken when you complete this challenge!" + level: "Level" + maxreached: "Max reached [donetimes] out of [maxtimes]" + moneyReward: "Money reward" + name: "Challenge Name" + nameHasCompleted: "[name] has completed the [challenge] challenge!" + navigation: "Click to see [level] challenges!" + notRepeatable: "This Challenge is not repeatable!" + repeatRewards: "Repeat reward(s)" + rewards: "Reward(s)" + toComplete: "Complete [challengesToDo] more [thisLevel] challenges to unlock this level!" + toCompleteUse: "To complete this challenge, use" + unknownChallenge: "Unknown challenge name (check spelling)!" + youHaveCompleted: "You have completed the [challenge] challenge!" + youHaveNotUnlocked: "You have not unlocked this challenge yet!" + youRepeated: "You repeated the [challenge] challenge!" +completechallenge: + challangeCompleted: "Challenge: [challengename] has been completed for [name]" + errorChallengeDoesNotExist: "Challenge doesn't exist or is already completed" +error: + IslandLevel: "Your island must be level [level] to complete this challenge!" + ItemsNotThere: "All required items must be close to you on your island!" + NotCloseEnough: "You must be standing within [number] blocks of all required items." + NotEnoughItems: "You do not have enough required item(s)" + NotOnIsland: "You must be on your island to do that!" + RewardProblem: "There was a problem giving your reward. Ask Admin to check log!" + YouAreMissing: "You are missing" +help: + command: "/challenges: &fshow challenges" + configReloaded: "Configuration reloaded from file." + resetAllChallenges: "resets all of the player's challenges" + resetChallenge: "marks a challenge as incomplete" + resetChallengeForAll: "globally resets a challenge for every player with an optional repetition" +resetallchallenges: + success: "[name] has had all challenges reset." +resetchallenge: + challengeReset: "Challenge: [challengename] has been reset for [name]" + errorChallengeDoesNotExist: "Challenge doesn't exist or isn't yet completed" + diff --git a/src/bskyblock/addin/challenges/Challenges.java b/src/bskyblock/addin/challenges/Challenges.java index 2128a64..b284ae3 100644 --- a/src/bskyblock/addin/challenges/Challenges.java +++ b/src/bskyblock/addin/challenges/Challenges.java @@ -10,8 +10,6 @@ import bskyblock.addin.challenges.config.LocaleManager; import bskyblock.addin.challenges.config.PluginConfig; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.config.BSBLocale; -import us.tastybento.bskyblock.database.BSBDatabase; -import us.tastybento.bskyblock.database.flatfile.FlatFileDatabase; /** * Addin to BSkyBlock that enables challenges @@ -20,24 +18,14 @@ import us.tastybento.bskyblock.database.flatfile.FlatFileDatabase; */ public class Challenges extends JavaPlugin { - - private static final boolean DEBUG = true; - // The BSkyBlock plugin instance. private BSkyBlock bSkyBlock; // Locale manager for this plugin private LocaleManager localeManager; - // The BSkyBlock database object - private BSBDatabase database; - private ChallengesManager manager; - private FlatFileDatabase flatFile; - - - @SuppressWarnings("unchecked") @Override public void onEnable() { // Load the plugin's config @@ -58,7 +46,7 @@ public class Challenges extends JavaPlugin { // Register commands new ChallengesCommand(this); // Register Listener - getServer().getPluginManager().registerEvents(manager, this); + getServer().getPluginManager().registerEvents(manager.getChallengesPanels(), this); // Done } diff --git a/src/bskyblock/addin/challenges/ChallengesManager.java b/src/bskyblock/addin/challenges/ChallengesManager.java index 54869c5..52f31a9 100644 --- a/src/bskyblock/addin/challenges/ChallengesManager.java +++ b/src/bskyblock/addin/challenges/ChallengesManager.java @@ -5,57 +5,56 @@ import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import java.util.UUID; +import java.util.stream.Collectors; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.event.inventory.InventoryOpenEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import bskyblock.addin.challenges.database.object.ChallengesDO; import bskyblock.addin.challenges.database.object.LevelsDO; -import bskyblock.addin.challenges.panel.Panel; -import bskyblock.addin.challenges.panel.Panel.PanelBuilder; -import bskyblock.addin.challenges.panel.Panel.PanelItem; +import bskyblock.addin.challenges.panel.ChallengesPanels; import us.tastybento.bskyblock.database.flatfile.FlatFileDatabase; import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler; import us.tastybento.bskyblock.util.Util; -public class ChallengesManager implements Listener { +public class ChallengesManager { - private static final boolean DEBUG = false; + //private static final boolean DEBUG = false; private Challenges plugin; - private HashMap challengePanels; + private LinkedHashMap> challengeList; private AbstractDatabaseHandler chHandler; - private HashMap challenges; private AbstractDatabaseHandler lvHandler; - private HashMap levels; + + private ChallengesPanels challengesPanels; @SuppressWarnings("unchecked") - public ChallengesManager(Challenges plugin){ + public ChallengesManager(Challenges plugin) { this.plugin = plugin; // Set up the database handler to store and retrieve Challenges chHandler = (AbstractDatabaseHandler) new FlatFileDatabase().getHandler(plugin, ChallengesDO.class); lvHandler = (AbstractDatabaseHandler) new FlatFileDatabase().getHandler(plugin, LevelsDO.class); - challenges = new HashMap<>(); - levels = new HashMap<>(); - challengePanels = new HashMap<>(); + challengeList = new LinkedHashMap<>(); + // Start panels + challengesPanels = new ChallengesPanels(plugin, this); load(); } + /** + * @return the challengesPanels + */ + public ChallengesPanels getChallengesPanels() { + return challengesPanels; + } + public AbstractDatabaseHandler getHandler() { return chHandler; } @@ -64,28 +63,40 @@ public class ChallengesManager implements Listener { * Clear and reload all challenges */ public void load() { - levels.clear(); - try { - for (LevelsDO level : lvHandler.loadObjects()) { - levels.put(level.getUniqueId(), level); - } - } catch (InstantiationException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException | SecurityException | ClassNotFoundException | IntrospectionException - | SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - challenges.clear(); + // Load the challenges + challengeList.clear(); try { for (ChallengesDO challenge : chHandler.loadObjects()) { - challenges.put(challenge.getUniqueId(), challenge); + // See if we have this level already + LevelsDO level = new LevelsDO(); + if (lvHandler.objectExits(challenge.getLevel())) { + // Get it from the database + level = lvHandler.loadObject(challenge.getLevel()); + } else { + // Make it + level.setUniqueId(challenge.getLevel()); + lvHandler.saveObject(level); + } + if (challengeList.containsKey(level)) { + challengeList.get(level).add(challenge); + } else { + // First challenge of this level type + List challenges = new ArrayList<>(); + challenges.add(challenge); + challengeList.put(level, challenges); + } } } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException | ClassNotFoundException | IntrospectionException - | SQLException e) { + | SQLException | NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } + // Sort the challenge list into level order + challengeList = challengeList.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, + (oldValue, newValue) -> oldValue, LinkedHashMap::new)); } /** @@ -95,35 +106,55 @@ public class ChallengesManager implements Listener { public void save(boolean async){ if(async){ Runnable save = () -> { - int index = 1; - for(ChallengesDO challenge : challenges.values()){ - plugin.getLogger().info("DEBUG: saving challenges async " + index++); + for (Entry> en : challengeList.entrySet()) { try { - chHandler.saveObject(challenge); - } catch (Exception e) { + lvHandler.saveObject(en.getKey()); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | SecurityException | InstantiationException | NoSuchMethodException + | IntrospectionException | SQLException e) { + // TODO Auto-generated catch block e.printStackTrace(); } + for (ChallengesDO challenge : en.getValue()) { + try { + chHandler.saveObject(challenge); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | SecurityException | InstantiationException | NoSuchMethodException + | IntrospectionException | SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } } }; plugin.getServer().getScheduler().runTaskAsynchronously(plugin, save); } else { - int index = 1; - for(ChallengesDO challenge : challenges.values()){ - plugin.getLogger().info("DEBUG: saving challenges sync " + index++); + for (Entry> en : challengeList.entrySet()) { try { - chHandler.saveObject(challenge); - } catch (Exception e) { + lvHandler.saveObject(en.getKey()); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | SecurityException | InstantiationException | NoSuchMethodException | IntrospectionException + | SQLException e) { + // TODO Auto-generated catch block e.printStackTrace(); } + for (ChallengesDO challenge : en.getValue()) { + try { + chHandler.saveObject(challenge); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | SecurityException | InstantiationException | NoSuchMethodException + | IntrospectionException | SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } } } } - // Metrics-related methods // - public void shutdown(){ save(false); - challenges.clear(); + challengeList.clear(); } /** @@ -175,83 +206,102 @@ public class ChallengesManager implements Listener { return; } Util.sendMessage(player, "Challenge accepted!"); - challenges.put(newChallenge.getUniqueId(), newChallenge); + // TODO ADD CHALLENGE + //challenges.put(newChallenge.getUniqueId(), newChallenge); } - public Inventory getChallenges(Player player) { - // TODO build the panel that is customized to the player - // Build panel - PanelBuilder panelBuilder = Panel.builder(plugin) - .name(plugin.getLocale(player).get("challenges.guiTitle")); - for (ChallengesDO challenge: challenges.values()) { - plugin.getLogger().info("Adding challenge " + challenge.getUniqueId()); - PanelItem item = Panel.panelItemBuilder() - .setIcon(challenge.getIcon()) - .setName(challenge.getFriendlyName().isEmpty() ? challenge.getUniqueId() : challenge.getFriendlyName()) - .setDescription(challenge.getDescription()) - .setSlot(challenge.getSlot()) - .build(); - plugin.getLogger().info("requested slot" + item.getSlot()); - panelBuilder.addItem(item); - } - Panel panel = panelBuilder.build(); - challengePanels.put(player.getUniqueId(), panel); - plugin.getLogger().info("DEBUG: added inv " + challengePanels.size()); - return panel.getPanel(); - } - - @EventHandler(priority = EventPriority.LOWEST) - public void onInventoryClick(InventoryClickEvent event) { - Player player = (Player) event.getWhoClicked(); // The player that - // clicked the item - UUID playerUUID = player.getUniqueId(); - Inventory inventory = event.getInventory(); // The inventory that was - // clicked in - // Check this is the right panel - if (inventory.getName() == null || !inventory.getName().equals(plugin.getLocale(player).get("challenges.guiTitle"))) { - return; - } - event.setCancelled(true); - if (!event.getClick().equals(ClickType.LEFT)) { - inventory.clear(); - player.closeInventory(); - player.updateInventory(); - return; - } - int slot = event.getRawSlot(); - if (slot == -999) { - inventory.clear(); - player.closeInventory(); - event.setCancelled(true); - return; - } - // TODO: Deal with the clicking + /** + * Get the list of challenges for this level + * @param level - the level required + * @return the list of challenges for this level, or the first set of challenges if level is blank, or a blank list if there are no challenges + */ + public List getChallenges(String level) { + return challengeList.getOrDefault(level, challengeList.isEmpty() ? new ArrayList() : challengeList.values().iterator().next()); } - @EventHandler(priority = EventPriority.LOWEST) - public void onInventoryClose(InventoryCloseEvent event) { - challengePanels.remove(event.getPlayer().getUniqueId()); - plugin.getLogger().info("DEBUG: removing inv " + challengePanels.size()); + /** + * Checks if a challenge is complete or not + * @param uniqueId - player's UUID + * @param uniqueId2 - Challenge id + * @return - true if completed + */ + public boolean isChallengeComplete(UUID uniqueId, String uniqueId2) { + // TODO Auto-generated method stub + return false; + } + + public boolean isLevelComplete(UUID uniqueId, LevelsDO otherLevel) { + // TODO Auto-generated method stub + return false; + } + + public LevelsDO getPreviousLevel(LevelsDO otherLevel) { + LevelsDO result = null; + + for (LevelsDO level : challengeList.keySet()) { + if (level.equals(otherLevel)) { + return result; + } + result = level; + } + return result; } /** - * Clean up the hashmap should the player open up another inventory - * @param event + * Get the status on every level + * @param player + * @return Level name, how many challenges still to do on which level */ - @EventHandler(priority = EventPriority.LOWEST) - public void onInventoryOpen(InventoryOpenEvent event) { - Player player = (Player) event.getPlayer(); - UUID playerUUID = player.getUniqueId(); - Inventory inventory = event.getInventory(); // The inventory that was - if (inventory.getName() == null || !inventory.getName().equals(plugin.getLocale(player).get("challenges.guiTitle"))) { - challengePanels.remove(playerUUID); - plugin.getLogger().info("DEBUG: removing inv " + challengePanels.size()); + public List getChallengeLevelStatus(Player player) { + List result = new ArrayList<>(); + LevelsDO previousLevel = null; + for (Entry> en : challengeList.entrySet()) { + int challsToDo = 0; // TODO - calculate how many challenges still to do for this player + boolean complete = false; // TODO + result.add(new LevelStatus(en.getKey(), previousLevel, challsToDo, complete)); } + return result; } - @EventHandler(priority = EventPriority.NORMAL) - public void onLogOut(PlayerQuitEvent event) { - challengePanels.remove(event.getPlayer().getUniqueId()); - plugin.getLogger().info("DEBUG: removing inv " + challengePanels.size()); + public class LevelStatus { + private final LevelsDO level; + private final LevelsDO previousLevel; + private final int numberOfChallengesStillToDo; + private final boolean complete; + + public LevelStatus(LevelsDO level, LevelsDO previousLevel, int numberOfChallengesStillToDo, boolean complete) { + super(); + this.level = level; + this.previousLevel = previousLevel; + this.numberOfChallengesStillToDo = numberOfChallengesStillToDo; + this.complete = complete; + } + /** + * @return the level + */ + public LevelsDO getLevel() { + return level; + } + /** + * @return the previousLevel + */ + public LevelsDO getPreviousLevel() { + return previousLevel; + } + /** + * @return the numberOfChallengesStillToDo + */ + public int getNumberOfChallengesStillToDo() { + return numberOfChallengesStillToDo; + } + /** + * @return the complete + */ + public boolean isComplete() { + return complete; + } + + } + } diff --git a/src/bskyblock/addin/challenges/commands/ChallengesCommand.java b/src/bskyblock/addin/challenges/commands/ChallengesCommand.java index 3b2e537..f6bec2b 100644 --- a/src/bskyblock/addin/challenges/commands/ChallengesCommand.java +++ b/src/bskyblock/addin/challenges/commands/ChallengesCommand.java @@ -43,7 +43,7 @@ public class ChallengesCommand extends AbstractCommand implements Listener { public void execute(CommandSender sender, String[] args) { // Open up the challenges GUI if (isPlayer) { - player.openInventory(plugin.getManager().getChallenges(player)); + player.openInventory(plugin.getManager().getChallengesPanels().getChallenges(player)); } else { // TODO } diff --git a/src/bskyblock/addin/challenges/database/object/ChallengesDO.java b/src/bskyblock/addin/challenges/database/object/ChallengesDO.java index 8072c13..afbbb76 100644 --- a/src/bskyblock/addin/challenges/database/object/ChallengesDO.java +++ b/src/bskyblock/addin/challenges/database/object/ChallengesDO.java @@ -138,7 +138,6 @@ public class ChallengesDO extends DataObject { private int searchRadius = 10; /** * Inventory slot where this challenge should be placed. 0 to 49. - * */ private int slot; /** diff --git a/src/bskyblock/addin/challenges/database/object/LevelsDO.java b/src/bskyblock/addin/challenges/database/object/LevelsDO.java index 6d28d2a..d0fa7f9 100644 --- a/src/bskyblock/addin/challenges/database/object/LevelsDO.java +++ b/src/bskyblock/addin/challenges/database/object/LevelsDO.java @@ -5,7 +5,7 @@ import java.util.List; import us.tastybento.bskyblock.database.objects.DataObject; -public class LevelsDO extends DataObject { +public class LevelsDO extends DataObject implements Comparable { /** * A friendly name for the level. If blank, level name is used. @@ -24,6 +24,11 @@ public class LevelsDO extends DataObject { */ private int waiveramount = 1; + /** + * The ordering of the levels, lowest to highest + */ + private int order = 0; + public String getFriendlyName() { return friendlyName; } @@ -58,4 +63,17 @@ public class LevelsDO extends DataObject { this.waiveramount = waiveramount; } + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } + + @Override + public int compareTo(LevelsDO o) { + return Integer.compare(this.order, o.order); + } + } diff --git a/src/bskyblock/addin/challenges/panel/ChallengesPanels.java b/src/bskyblock/addin/challenges/panel/ChallengesPanels.java new file mode 100644 index 0000000..a258401 --- /dev/null +++ b/src/bskyblock/addin/challenges/panel/ChallengesPanels.java @@ -0,0 +1,176 @@ +package bskyblock.addin.challenges.panel; + +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import bskyblock.addin.challenges.Challenges; +import bskyblock.addin.challenges.ChallengesManager; +import bskyblock.addin.challenges.ChallengesManager.LevelStatus; +import bskyblock.addin.challenges.database.object.ChallengesDO; +import bskyblock.addin.challenges.panel.Panel.PanelBuilder; +import bskyblock.addin.challenges.panel.Panel.PanelItem; + +public class ChallengesPanels implements Listener { + private static final boolean DEBUG = false; + private static final String CHALLENGE_COMMAND = "challenges"; + private Challenges plugin; + private HashMap challengePanels; + private ChallengesManager manager; + + public ChallengesPanels(Challenges plugin, ChallengesManager manager){ + this.plugin = plugin; + this.manager = manager; + challengePanels = new HashMap<>(); + } + + /** + * @param player + * @return + */ + public Inventory getChallenges(Player player) { + return getChallenges(player, ""); + } + + /** + * Dynamically creates an inventory of challenges for the player showing the + * level + * + * @param player + * @param level + * @return inventory + */ + public Inventory getChallenges(Player player, String level) { + plugin.getLogger().info("DEBUG: level requested = " + level); + PanelBuilder panelBuilder = Panel.builder(plugin) + .name(plugin.getLocale(player).get("challenges.guiTitle")); + List levelChallenges = manager.getChallenges(level); + // Do some checking + if (DEBUG) + plugin.getLogger().info("DEBUG: Opening level " + level); + // Only show a control panel for the level requested. + for (ChallengesDO challenge : levelChallenges) { + plugin.getLogger().info("Adding challenge " + challenge.getUniqueId()); + boolean completed = manager.isChallengeComplete(player.getUniqueId(), challenge.getUniqueId()); + if (completed && challenge.isRemoveWhenCompleted()) + continue; + PanelItem item = Panel.panelItemBuilder() + .setIcon(challenge.getIcon()) + .setName(challenge.getFriendlyName().isEmpty() ? challenge.getUniqueId() : challenge.getFriendlyName()) + .setDescription(challenge.getDescription()) + .setSlot(challenge.getSlot()) + .setGlow(completed) + .setCommand(CHALLENGE_COMMAND + " c " + challenge.getUniqueId()) + .build(); + plugin.getLogger().info("requested slot" + item.getSlot()); + panelBuilder.addItem(item); + } + // Add navigation to other levels + for (LevelStatus status: manager.getChallengeLevelStatus(player)) { + String name = ChatColor.GOLD + (status.getLevel().getFriendlyName().isEmpty() ? status.getLevel().getUniqueId() : status.getLevel().getFriendlyName()); + if (status.isComplete() || status.getPreviousLevel() == null) { + // Clicking on this icon will open up this level's challenges + PanelItem item = Panel.panelItemBuilder() + .setIcon(new ItemStack(Material.BOOK_AND_QUILL)) + .setName(name) + .setDescription(plugin.getLocale(player).get("challenges.navigation").replace("[level]",name)) + .setCommand(CHALLENGE_COMMAND + " c " + status.getLevel().getUniqueId()) + .build(); + panelBuilder.addItem(item); + } else { + // Clicking on this icon will do nothing because the challenge is not unlocked yet + String previousLevelName = ChatColor.GOLD + (status.getPreviousLevel().getFriendlyName().isEmpty() ? status.getPreviousLevel().getUniqueId() : status.getPreviousLevel().getFriendlyName()); + PanelItem item = Panel.panelItemBuilder() + .setIcon(new ItemStack(Material.BOOK)) + .setName(name) + .setDescription((plugin.getLocale(player).get("challenges.toComplete").replace("[challengesToDo]",String.valueOf(status.getNumberOfChallengesStillToDo()))).replace("[thisLevel]", previousLevelName)) + .build(); + panelBuilder.addItem(item); + } + } + /* + // Add the free challenges if not already shown (which can happen if all of the challenges are done!) + if (!level.equals("") && challengeList.containsKey("")) { + for (String freeChallenges: challengeList.get("")) { + CPItem item = createItem(freeChallenges, player); + if (item != null) { + cp.add(item); + } + } + }*/ + // Create the panel + Panel panel = panelBuilder.build(); + challengePanels.put(player.getUniqueId(), panel); + return panel.getPanel(); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onInventoryClick(InventoryClickEvent event) { + Player player = (Player) event.getWhoClicked(); // The player that + // clicked the item + //UUID playerUUID = player.getUniqueId(); + Inventory inventory = event.getInventory(); // The inventory that was + // clicked in + // Check this is the right panel + if (inventory.getName() == null || !inventory.getName().equals(plugin.getLocale(player).get("challenges.guiTitle"))) { + return; + } + event.setCancelled(true); + if (!event.getClick().equals(ClickType.LEFT)) { + inventory.clear(); + player.closeInventory(); + player.updateInventory(); + return; + } + int slot = event.getRawSlot(); + if (slot == -999) { + inventory.clear(); + player.closeInventory(); + event.setCancelled(true); + return; + } + // TODO: Deal with the clicking + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onInventoryClose(InventoryCloseEvent event) { + challengePanels.remove(event.getPlayer().getUniqueId()); + plugin.getLogger().info("DEBUG: removing inv " + challengePanels.size()); + } + + /** + * Clean up the hashmap should the player open up another inventory + * @param event + */ + @EventHandler(priority = EventPriority.LOWEST) + public void onInventoryOpen(InventoryOpenEvent event) { + Player player = (Player) event.getPlayer(); + UUID playerUUID = player.getUniqueId(); + Inventory inventory = event.getInventory(); // The inventory that was + if (inventory.getName() == null || !inventory.getName().equals(plugin.getLocale(player).get("challenges.guiTitle"))) { + challengePanels.remove(playerUUID); + plugin.getLogger().info("DEBUG: removing inv " + challengePanels.size()); + } + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onLogOut(PlayerQuitEvent event) { + challengePanels.remove(event.getPlayer().getUniqueId()); + plugin.getLogger().info("DEBUG: removing inv " + challengePanels.size()); + } + +} diff --git a/src/bskyblock/addin/challenges/panel/Panel.java b/src/bskyblock/addin/challenges/panel/Panel.java index 98ac4da..9393ef8 100644 --- a/src/bskyblock/addin/challenges/panel/Panel.java +++ b/src/bskyblock/addin/challenges/panel/Panel.java @@ -87,19 +87,22 @@ public class Panel { } public static class PanelItem { - private final Integer slot; + private final int slot; // The current index of the icon private int index = 0; // There is a list of icons for every toggle option private final List icon; + // Command to run when clicked + private final List commands; - public PanelItem(ItemStack icon, String description, String name, Integer slot, List toggleItems, boolean glow) { + public PanelItem(ItemStack icon, String description, String name, int slot, List toggleItems, boolean glow, List commands) { this.slot = slot; + this.commands = commands; List result = new ArrayList<>(); if (toggleItems.isEmpty()) { // Create the icon ItemMeta meta = icon.getItemMeta(); - meta.setDisplayName(name); + meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name)); meta.setLore(chop(description)); // Set flags to neaten up the view meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); @@ -115,7 +118,7 @@ public class Panel { for (int i = 0; i < toggleItems.size(); i++) { // Create the icon(s) ItemMeta meta = icon.getItemMeta(); - meta.setDisplayName(name); + meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name)); List desc = chop(description); desc.addAll(chop(toggleItems.get(i))); meta.setLore(desc); @@ -151,15 +154,19 @@ public class Panel { return slot; } + public List getCommands() { + return commands; + } } public static class PanelItemBuilder { private ItemStack icon; private String description; private String name; - private Integer slot; + private int slot; private List toggleItems = new ArrayList<>(); private boolean glow; + private List command = new ArrayList<>(); public PanelItemBuilder setIcon(ItemStack icon) { this.icon = icon; @@ -173,7 +180,7 @@ public class Panel { this.name = name; return this; } - public PanelItemBuilder setSlot(Integer slot) { + public PanelItemBuilder setSlot(int slot) { this.slot = slot; return this; } @@ -185,8 +192,12 @@ public class Panel { this.glow = glow; return this; } + public PanelItemBuilder setCommand(String command) { + this.command.add(command); + return this; + } public PanelItem build() { - return new PanelItem(icon, description, name, slot, toggleItems, glow); + return new PanelItem(icon, description, name, slot, toggleItems, glow, command); }