From 0a8ba02d743eba6be6d6b994da3a0f7ec2eb8c52 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Mon, 19 Feb 2018 19:50:34 -0800 Subject: [PATCH] WIP - added /c create (name) command Opens up an inventory. Drag and drop items into the inventory. Escape out and the challenge is saved with the items as required items. --- locales/{bsb_en_US.yml => en-US.yml} | 0 pom.xml | 10 +- .../addon/challenges/Challenges.java | 25 +- .../addon/challenges/ChallengesManager.java | 101 +++++++-- .../commands/ChallengesCommand.java | 22 +- .../challenges/commands/CreateChallenge.java | 37 +-- .../addon/challenges/config/PluginConfig.java | 87 +------ .../addon/challenges/config/Settings.java | 36 +-- ...{ChallengesDO.java => ChallengesData.java} | 4 +- .../challenges/database/object/LevelsDO.java | 2 +- .../challenges/panel/ChallengesPanels.java | 41 ++-- .../panel/CreateChallengeListener.java | 38 ++++ .../panel/CreateChallengePanel.java | 13 ++ .../addon/challenges/panel/Panel.java | 213 ------------------ 14 files changed, 230 insertions(+), 399 deletions(-) rename locales/{bsb_en_US.yml => en-US.yml} (100%) rename src/bskyblock/addon/challenges/database/object/{ChallengesDO.java => ChallengesData.java} (99%) create mode 100644 src/bskyblock/addon/challenges/panel/CreateChallengeListener.java create mode 100644 src/bskyblock/addon/challenges/panel/CreateChallengePanel.java delete mode 100644 src/bskyblock/addon/challenges/panel/Panel.java diff --git a/locales/bsb_en_US.yml b/locales/en-US.yml similarity index 100% rename from locales/bsb_en_US.yml rename to locales/en-US.yml diff --git a/pom.xml b/pom.xml index 76f9908..22781bf 100644 --- a/pom.xml +++ b/pom.xml @@ -41,11 +41,11 @@ - org.spigotmc - spigot-api - 1.12-R0.1-SNAPSHOT - provided - + org.bukkit + bukkit + 1.12.2-R0.1-SNAPSHOT + provided + us.tastybento bskyblock diff --git a/src/bskyblock/addon/challenges/Challenges.java b/src/bskyblock/addon/challenges/Challenges.java index 5d02765..4b50925 100644 --- a/src/bskyblock/addon/challenges/Challenges.java +++ b/src/bskyblock/addon/challenges/Challenges.java @@ -1,36 +1,33 @@ package bskyblock.addon.challenges; +import org.bukkit.Bukkit; + import bskyblock.addon.challenges.commands.ChallengesCommand; import bskyblock.addon.challenges.config.PluginConfig; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.addons.Addon; /** - * Addin to BSkyBlock that enables challenges + * Add-on to BSkyBlock that enables challenges * @author tastybento * */ public class Challenges extends Addon { - // The BSkyBlock plugin instance. - private BSkyBlock bSkyBlock; - - private ChallengesManager manager; + private ChallengesManager challengesManager; @Override public void onEnable() { // Load the plugin's config new PluginConfig(this); - // Get the BSkyBlock plugin. This will be available because this plugin depends on it in plugin.yml. - bSkyBlock = BSkyBlock.getInstance(); // Check if it is enabled - it might be loaded, but not enabled. - if (bSkyBlock == null || !bSkyBlock.isEnabled()) { + if (getBSkyBlock() == null || !getBSkyBlock().isEnabled()) { + Bukkit.getLogger().severe("BSkyBlock is not available or disabled!"); this.setEnabled(false); return; } // Challenges Manager - manager = new ChallengesManager(this); + challengesManager = new ChallengesManager(this); // Register commands new ChallengesCommand(this); // Done @@ -38,12 +35,12 @@ public class Challenges extends Addon { @Override public void onDisable(){ - if (manager != null) - manager.save(false); + if (challengesManager != null) + challengesManager.save(false); } - public ChallengesManager getManager() { - return manager; + public ChallengesManager getChallengesManager() { + return challengesManager; } } diff --git a/src/bskyblock/addon/challenges/ChallengesManager.java b/src/bskyblock/addon/challenges/ChallengesManager.java index be01b34..d29f24d 100644 --- a/src/bskyblock/addon/challenges/ChallengesManager.java +++ b/src/bskyblock/addon/challenges/ChallengesManager.java @@ -14,10 +14,12 @@ import java.util.stream.Collectors; import org.bukkit.ChatColor; import org.bukkit.Material; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import bskyblock.addon.challenges.database.object.ChallengesDO; +import bskyblock.addon.challenges.database.object.ChallengesData; +import bskyblock.addon.challenges.database.object.ChallengesData.ChallengeType; import bskyblock.addon.challenges.database.object.LevelsDO; import bskyblock.addon.challenges.panel.ChallengesPanels; import us.tastybento.bskyblock.BSkyBlock; @@ -28,20 +30,20 @@ import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler; public class ChallengesManager { //private static final boolean DEBUG = false; - private Challenges plugin; - private LinkedHashMap> challengeList; + private Challenges addon; + private LinkedHashMap> challengeList; - private AbstractDatabaseHandler chHandler; + private AbstractDatabaseHandler chHandler; private AbstractDatabaseHandler lvHandler; private ChallengesPanels challengesPanels; @SuppressWarnings("unchecked") public ChallengesManager(Challenges plugin) { - this.plugin = plugin; + this.addon = plugin; // Set up the database handler to store and retrieve Challenges - chHandler = (AbstractDatabaseHandler) new FlatFileDatabase().getHandler(BSkyBlock.getInstance(), ChallengesDO.class); - lvHandler = (AbstractDatabaseHandler) new FlatFileDatabase().getHandler(BSkyBlock.getInstance(), LevelsDO.class); + chHandler = (AbstractDatabaseHandler) new FlatFileDatabase().getHandler(ChallengesData.class); + lvHandler = (AbstractDatabaseHandler) new FlatFileDatabase().getHandler(LevelsDO.class); challengeList = new LinkedHashMap<>(); // Start panels challengesPanels = new ChallengesPanels(plugin, this); @@ -55,7 +57,7 @@ public class ChallengesManager { return challengesPanels; } - public AbstractDatabaseHandler getHandler() { + public AbstractDatabaseHandler getHandler() { return chHandler; } @@ -66,10 +68,10 @@ public class ChallengesManager { // Load the challenges challengeList.clear(); try { - for (ChallengesDO challenge : chHandler.loadObjects()) { + for (ChallengesData challenge : chHandler.loadObjects()) { // See if we have this level already LevelsDO level; - if (lvHandler.objectExits(challenge.getLevel())) { + if (lvHandler.objectExists(challenge.getLevel())) { // Get it from the database level = lvHandler.loadObject(challenge.getLevel()); } else { @@ -82,7 +84,7 @@ public class ChallengesManager { challengeList.get(level).add(challenge); } else { // First challenge of this level type - List challenges = new ArrayList<>(); + List challenges = new ArrayList<>(); challenges.add(challenge); challengeList.put(level, challenges); } @@ -107,7 +109,7 @@ public class ChallengesManager { public void save(boolean async){ if(async){ Runnable save = () -> { - for (Entry> en : challengeList.entrySet()) { + for (Entry> en : challengeList.entrySet()) { try { lvHandler.saveObject(en.getKey()); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException @@ -116,7 +118,7 @@ public class ChallengesManager { // TODO Auto-generated catch block e.printStackTrace(); } - for (ChallengesDO challenge : en.getValue()) { + for (ChallengesData challenge : en.getValue()) { try { chHandler.saveObject(challenge); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException @@ -130,7 +132,7 @@ public class ChallengesManager { }; BSkyBlock.getInstance().getServer().getScheduler().runTaskAsynchronously(BSkyBlock.getInstance(), save); } else { - for (Entry> en : challengeList.entrySet()) { + for (Entry> en : challengeList.entrySet()) { try { lvHandler.saveObject(en.getKey()); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException @@ -139,7 +141,7 @@ public class ChallengesManager { // TODO Auto-generated catch block e.printStackTrace(); } - for (ChallengesDO challenge : en.getValue()) { + for (ChallengesData challenge : en.getValue()) { try { chHandler.saveObject(challenge); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException @@ -166,7 +168,7 @@ public class ChallengesManager { // Get the main icon ItemStack icon = user.getInventory().getItemInOffHand(); if (icon == null || icon.getType().equals(Material.AIR)) { - user.sendLegacyMessage("Icon will be paper"); + user.sendRawMessage("Hold something in your off-hand to make it the icon. Icon will be paper be default."); icon = new ItemStack(Material.PAPER); } icon.setAmount(1); @@ -189,12 +191,12 @@ public class ChallengesManager { meta.setDisplayName(name); meta.setLore(lore); icon.setItemMeta(meta); - ChallengesDO newChallenge = new ChallengesDO(); + ChallengesData newChallenge = new ChallengesData(); newChallenge.setRequiredItems(contents); newChallenge.setUniqueId(name); newChallenge.setIcon(icon); - if (chHandler.objectExits(name)) { - user.sendLegacyMessage(ChatColor.RED + "Challenge already exists! Use /c replace "); + if (chHandler.objectExists(name)) { + user.sendRawMessage(ChatColor.RED + "Challenge already exists! Use /c replace "); return; } try { @@ -203,10 +205,10 @@ public class ChallengesManager { | InstantiationException | NoSuchMethodException | IntrospectionException | SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); - user.sendLegacyMessage(ChatColor.RED + "Challenge creation failed! " + e.getMessage()); + user.sendRawMessage(ChatColor.RED + "Challenge creation failed! " + e.getMessage()); return; } - user.sendLegacyMessage("Challenge accepted!"); + user.sendRawMessage("Challenge accepted!"); // TODO ADD CHALLENGE //challenges.put(newChallenge.getUniqueId(), newChallenge); } @@ -216,13 +218,13 @@ public class ChallengesManager { * @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()); + public List getChallenges(String level) { + return challengeList.getOrDefault(level, challengeList.isEmpty() ? new ArrayList() : challengeList.values().iterator().next()); } /** * Checks if a challenge is complete or not - * @param uniqueId - player's UUID + * @param uniqueId - unique ID - player's UUID * @param uniqueId2 - Challenge id * @return - true if completed */ @@ -256,7 +258,7 @@ public class ChallengesManager { public List getChallengeLevelStatus(User user) { List result = new ArrayList<>(); LevelsDO previousLevel = null; - for (Entry> en : challengeList.entrySet()) { + 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)); @@ -304,5 +306,54 @@ public class ChallengesManager { } + + /** + * Creates an inventory challenge + * @param user + * @param inventory + */ + public void createInvChallenge(User user, Inventory inventory) { + if (inventory.getContents().length == 0) { + return; + } + ChallengesData newChallenge = new ChallengesData(); + newChallenge.setChallengeType(ChallengeType.INVENTORY); + newChallenge.setFriendlyName(inventory.getTitle()); + newChallenge.setDeployed(false); + List requiredItems = new ArrayList<>(); + inventory.forEach(item -> { + if (item != null && !item.getType().equals(Material.AIR)) { + requiredItems.add(item); + } + }); + newChallenge.setRequiredItems(requiredItems); + newChallenge.setTakeItems(true); + newChallenge.setUniqueId(inventory.getTitle()); + newChallenge.setIcon(new ItemStack(Material.EMPTY_MAP)); + + // Move all the items back to the player's inventory + inventory.forEach(item -> { + if (item != null) { + Map residual = user.getInventory().addItem(item); + // Drop any residual items at the foot of the player + residual.forEach((k, v) -> { + user.getWorld().dropItem(user.getLocation(), v); + }); + } + }); + + // Save the challenge + try { + chHandler.saveObject(newChallenge); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException + | InstantiationException | NoSuchMethodException | IntrospectionException | SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + user.sendRawMessage(ChatColor.RED + "Challenge creation failed! " + e.getMessage()); + return; + } + + user.sendRawMessage("Success"); + } } diff --git a/src/bskyblock/addon/challenges/commands/ChallengesCommand.java b/src/bskyblock/addon/challenges/commands/ChallengesCommand.java index 04ee15e..b577352 100644 --- a/src/bskyblock/addon/challenges/commands/ChallengesCommand.java +++ b/src/bskyblock/addon/challenges/commands/ChallengesCommand.java @@ -3,24 +3,26 @@ package bskyblock.addon.challenges.commands; import java.util.List; import bskyblock.addon.challenges.Challenges; +import us.tastybento.bskyblock.Constants; import us.tastybento.bskyblock.api.commands.CompositeCommand; import us.tastybento.bskyblock.api.commands.User; -import us.tastybento.bskyblock.config.Settings; public class ChallengesCommand extends CompositeCommand { private static final String CHALLENGE_COMMAND = "challenges"; - private Challenges plugin; + private Challenges addon; - public ChallengesCommand(Challenges plugin) { + public ChallengesCommand(Challenges addon) { super(CHALLENGE_COMMAND, "c", "challenge"); - this.plugin = plugin; + this.addon = addon; + // Set up create command + new CreateChallenge(addon, this); } @Override public boolean execute(User user, List args) { // Open up the challenges GUI if (user.isPlayer()) { - plugin.getManager().getChallengesPanels().getChallenges(user); + addon.getChallengesManager().getChallengesPanels().getChallenges(user); return true; } return false; @@ -29,12 +31,10 @@ public class ChallengesCommand extends CompositeCommand { @Override public void setup() { this.setOnlyPlayer(true); - this.setPermission(Settings.PERMPREFIX + "challenges"); - this.setDescription("addon.challenges.help"); - this.setUsage("addon.challenges.usage"); - - // Set up create command - new CreateChallenge(plugin, this); + this.setPermission(Constants.PERMPREFIX + "challenges"); + this.setParameters("challaneges.parameters"); + this.setDescription("challenges.description"); + this.setOnlyPlayer(true); } diff --git a/src/bskyblock/addon/challenges/commands/CreateChallenge.java b/src/bskyblock/addon/challenges/commands/CreateChallenge.java index b1cfffd..66c9a6c 100644 --- a/src/bskyblock/addon/challenges/commands/CreateChallenge.java +++ b/src/bskyblock/addon/challenges/commands/CreateChallenge.java @@ -1,40 +1,49 @@ package bskyblock.addon.challenges.commands; import java.util.List; -import java.util.UUID; import bskyblock.addon.challenges.Challenges; +import bskyblock.addon.challenges.panel.CreateChallengeListener; +import us.tastybento.bskyblock.Constants; import us.tastybento.bskyblock.api.commands.CompositeCommand; import us.tastybento.bskyblock.api.commands.User; -import us.tastybento.bskyblock.config.Settings; +import us.tastybento.bskyblock.api.panels.builders.PanelBuilder; public class CreateChallenge extends CompositeCommand { - private Challenges plugin; + private Challenges addon; - public CreateChallenge(Challenges plugin, ChallengesCommand parent) { + /** + * Admin command to make challenges + * @param parent + */ + public CreateChallenge(Challenges addon, ChallengesCommand parent) { super(parent, "create"); - this.plugin = plugin; + this.addon = addon; } @Override public void setup() { this.setOnlyPlayer(true); - this.setPermission(Settings.PERMPREFIX + "challenges"); - this.setDescription("addon.challenges.create.description"); - this.setUsage("addon.challenges.create.usage"); + this.setPermission(Constants.PERMPREFIX + "admin.challenges"); + this.setParameters("challaneges.admin.create.parameters"); + this.setDescription("challenges.admin.create.description"); } @Override public boolean execute(User user, List args) { - // Create a copy of items in the player's main inventory - String name = UUID.randomUUID().toString(); - if (args.size() > 0) { - name = args.get(0); + if (args.isEmpty()) { + user.sendRawMessage("not enough args"); + return false; } - plugin.getManager().createChallenge(user, name); - return false; + new PanelBuilder() + .setName(args.get(0)) + .setSize(49) + .setListener(new CreateChallengeListener(addon, user)) + .setUser(user) + .build(); + return true; } } diff --git a/src/bskyblock/addon/challenges/config/PluginConfig.java b/src/bskyblock/addon/challenges/config/PluginConfig.java index 6f922f2..3f2e6ff 100644 --- a/src/bskyblock/addon/challenges/config/PluginConfig.java +++ b/src/bskyblock/addon/challenges/config/PluginConfig.java @@ -1,15 +1,8 @@ package bskyblock.addon.challenges.config; -import java.util.HashMap; - -import org.apache.commons.lang.StringUtils; -import org.bukkit.Material; -import org.bukkit.material.MaterialData; - import bskyblock.addon.challenges.Challenges; public class PluginConfig { - private static final boolean DEBUG = false; /** * Loads the various settings from the config.yml file into the plugin @@ -17,79 +10,15 @@ public class PluginConfig { public PluginConfig(Challenges plugin) { plugin.saveDefaultConfig(); - // Island level cool down time - Settings.levelWait = plugin.getConfig().getInt("levelwait", 60); - if (Settings.levelWait < 0) { - Settings.levelWait = 0; - } + // Settings + Settings.resetChallenges = plugin.getConfig().getBoolean("resetchallenges"); + // Challenge completion broadcast + Settings.broadcastMessages = plugin.getConfig().getBoolean("broadcastmessages", true); + // Challenges - show or remove completed one-time challenges + Settings.removeCompleteOnetimeChallenges = plugin.getConfig().getBoolean("removecompleteonetimechallenges"); + // Add glow to completed challenge icons or not + Settings.addCompletedGlow = plugin.getConfig().getBoolean("addcompletedglow", true); - // Get the under water multiplier - Settings.deathpenalty = plugin.getConfig().getInt("deathpenalty", 0); - Settings.sumTeamDeaths = plugin.getConfig().getBoolean("sumteamdeaths"); - Settings.maxDeaths = plugin.getConfig().getInt("maxdeaths", 10); - Settings.islandResetDeathReset = plugin.getConfig().getBoolean("islandresetdeathreset", true); - Settings.teamJoinDeathReset = plugin.getConfig().getBoolean("teamjoindeathreset", true); - Settings.underWaterMultiplier = plugin.getConfig().getDouble("underwater", 1D); - Settings.levelCost = plugin.getConfig().getInt("levelcost", 100); - if (Settings.levelCost < 1) { - Settings.levelCost = 1; - plugin.getLogger().warning("levelcost in blockvalues.yml cannot be less than 1. Setting to 1."); - } - Settings.blockLimits = new HashMap(); - if (plugin.getConfig().isSet("limits")) { - for (String material : plugin.getConfig().getConfigurationSection("limits").getKeys(false)) { - try { - String[] split = material.split(":"); - byte data = 0; - if (split.length>1) { - data = Byte.valueOf(split[1]); - } - Material mat; - if (StringUtils.isNumeric(split[0])) { - mat = Material.getMaterial(Integer.parseInt(split[0])); - } else { - mat = Material.valueOf(split[0].toUpperCase()); - } - MaterialData materialData = new MaterialData(mat); - materialData.setData(data); - Settings.blockLimits.put(materialData, plugin.getConfig().getInt("limits." + material, 0)); - if (DEBUG) { - plugin.getLogger().info("Maximum number of " + materialData + " will be " + Settings.blockLimits.get(materialData)); - } - } catch (Exception e) { - plugin.getLogger().warning("Unknown material (" + material + ") in blockvalues.yml Limits section. Skipping..."); - } - } - } - Settings.blockValues = new HashMap(); - if (plugin.getConfig().isSet("blocks")) { - for (String material : plugin.getConfig().getConfigurationSection("blocks").getKeys(false)) { - try { - String[] split = material.split(":"); - byte data = 0; - if (split.length>1) { - data = Byte.valueOf(split[1]); - } - MaterialData materialData = null; - if (StringUtils.isNumeric(split[0])) { - materialData = new MaterialData(Integer.parseInt(split[0])); - } else { - materialData = new MaterialData(Material.valueOf(split[0].toUpperCase())); - } - - materialData.setData(data); - Settings.blockValues.put(materialData, plugin.getConfig().getInt("blocks." + material, 0)); - if (DEBUG) { - plugin.getLogger().info(materialData.toString() + " value = " + Settings.blockValues.get(materialData)); - } - } catch (Exception e) { - // e.printStackTrace(); - plugin.getLogger().warning("Unknown material (" + material + ") in blockvalues.yml blocks section. Skipping..."); - } - } - } else { - plugin.getLogger().severe("No block values in blockvalues.yml! All island levels will be zero!"); - } // All done } } diff --git a/src/bskyblock/addon/challenges/config/Settings.java b/src/bskyblock/addon/challenges/config/Settings.java index fa1ff74..b55f4d9 100644 --- a/src/bskyblock/addon/challenges/config/Settings.java +++ b/src/bskyblock/addon/challenges/config/Settings.java @@ -1,22 +1,28 @@ package bskyblock.addon.challenges.config; -import java.util.HashMap; - -import org.bukkit.material.MaterialData; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; public class Settings { - public static boolean sumTeamDeaths; - public static int seaHeight; - public static HashMap blockLimits; - public static HashMap blockValues; - public static double underWaterMultiplier; - public static int deathpenalty; - public static long levelCost; - public static Object defaultLanguage; - public static int levelWait; - public static int maxDeaths; - public static boolean islandResetDeathReset; - public static boolean teamJoinDeathReset; + // Storage + // Challenge List + public static Set challengeList; + // Waiver amount + public static int waiverAmount; + // List of challenge levels + public static List challengeLevels; + // Free levels + public static List freeLevels = new ArrayList(); + + // Settings + public static boolean resetChallenges; + // Challenge completion broadcast + public static boolean broadcastMessages; + // Challenges - show or remove completed on-time challenges + public static boolean removeCompleteOnetimeChallenges; + // Add glow to completed challenge icons or not + public static boolean addCompletedGlow; } diff --git a/src/bskyblock/addon/challenges/database/object/ChallengesDO.java b/src/bskyblock/addon/challenges/database/object/ChallengesData.java similarity index 99% rename from src/bskyblock/addon/challenges/database/object/ChallengesDO.java rename to src/bskyblock/addon/challenges/database/object/ChallengesData.java index f4e48f7..9f4d9e9 100644 --- a/src/bskyblock/addon/challenges/database/object/ChallengesDO.java +++ b/src/bskyblock/addon/challenges/database/object/ChallengesData.java @@ -10,9 +10,9 @@ import org.bukkit.inventory.ItemStack; import us.tastybento.bskyblock.database.objects.DataObject; -public class ChallengesDO extends DataObject { +public class ChallengesData implements DataObject { - enum ChallengeType { + public enum ChallengeType { /** * This challenge only shows and icon in the GUI and doesn't do anything. */ diff --git a/src/bskyblock/addon/challenges/database/object/LevelsDO.java b/src/bskyblock/addon/challenges/database/object/LevelsDO.java index b438f92..b5d9026 100644 --- a/src/bskyblock/addon/challenges/database/object/LevelsDO.java +++ b/src/bskyblock/addon/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 implements Comparable { +public class LevelsDO implements DataObject, Comparable { /** * A friendly name for the level. If blank, level name is used. diff --git a/src/bskyblock/addon/challenges/panel/ChallengesPanels.java b/src/bskyblock/addon/challenges/panel/ChallengesPanels.java index e83072c..4e7e55e 100644 --- a/src/bskyblock/addon/challenges/panel/ChallengesPanels.java +++ b/src/bskyblock/addon/challenges/panel/ChallengesPanels.java @@ -1,16 +1,16 @@ package bskyblock.addon.challenges.panel; +import java.util.Arrays; import java.util.List; import org.bukkit.ChatColor; import org.bukkit.Material; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import bskyblock.addon.challenges.Challenges; import bskyblock.addon.challenges.ChallengesManager; import bskyblock.addon.challenges.ChallengesManager.LevelStatus; -import bskyblock.addon.challenges.database.object.ChallengesDO; +import bskyblock.addon.challenges.database.object.ChallengesData; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.panels.ClickType; import us.tastybento.bskyblock.api.panels.Panel; @@ -49,25 +49,25 @@ public class ChallengesPanels { plugin.getLogger().info("DEBUG: level requested = " + level); PanelBuilder panelBuilder = new PanelBuilder() .setName(user.getTranslation("challenges.guiTitle")); - List levelChallenges = manager.getChallenges(level); + 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) { + for (ChallengesData challenge : levelChallenges) { plugin.getLogger().info("Adding challenge " + challenge.getUniqueId()); boolean completed = manager.isChallengeComplete(user.getUniqueId(), challenge.getUniqueId()); if (completed && challenge.isRemoveWhenCompleted()) continue; PanelItem item = new PanelItemBuilder() - .setIcon(challenge.getIcon()) - .setName(challenge.getFriendlyName().isEmpty() ? challenge.getUniqueId() : challenge.getFriendlyName()) - .setDescription(challenge.getDescription()) - .setGlow(completed) - .setClickHandler(new PanelItem.ClickHandler() { + .icon(challenge.getIcon()) + .name(challenge.getFriendlyName().isEmpty() ? challenge.getUniqueId() : challenge.getFriendlyName()) + .description(challenge.getDescription()) + .glow(completed) + .clickHandler(new PanelItem.ClickHandler() { @Override - public boolean onClick(Player player, ClickType click) { - player.sendMessage("Hi!"); + public boolean onClick(User user, ClickType click) { + user.sendMessage("Hi!"); return false; } }) @@ -82,13 +82,14 @@ public class ChallengesPanels { if (status.isComplete() || status.getPreviousLevel() == null) { // Clicking on this icon will open up this level's challenges PanelItem item = new PanelItemBuilder() - .setIcon(new ItemStack(Material.BOOK_AND_QUILL)) - .setName(name) - .setDescription(user.getTranslation("challenges.navigation","[level]",name)) - .setClickHandler(new PanelItem.ClickHandler() { + .icon(new ItemStack(Material.BOOK_AND_QUILL)) + .name(name) + .description(Arrays.asList(user.getTranslation("challenges.navigation","[level]",name))) + .clickHandler(new PanelItem.ClickHandler() { + @Override - public boolean onClick(Player player, ClickType click) { - player.sendMessage("Hi!"); + public boolean onClick(User user, ClickType click) { + // TODO Auto-generated method stub return false; } }) @@ -99,9 +100,9 @@ public class ChallengesPanels { // 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 = new PanelItemBuilder() - .setIcon(new ItemStack(Material.BOOK)) - .setName(name) - .setDescription((user.getTranslation("challenges.toComplete", "[challengesToDo]",String.valueOf(status.getNumberOfChallengesStillToDo()), "[thisLevel]", previousLevelName))) + .icon(new ItemStack(Material.BOOK)) + .name(name) + .description(Arrays.asList(user.getTranslation("challenges.toComplete", "[challengesToDo]",String.valueOf(status.getNumberOfChallengesStillToDo()), "[thisLevel]", previousLevelName))) .build(); panelBuilder.addItem(item); } diff --git a/src/bskyblock/addon/challenges/panel/CreateChallengeListener.java b/src/bskyblock/addon/challenges/panel/CreateChallengeListener.java new file mode 100644 index 0000000..2ab7896 --- /dev/null +++ b/src/bskyblock/addon/challenges/panel/CreateChallengeListener.java @@ -0,0 +1,38 @@ +package bskyblock.addon.challenges.panel; + +import org.bukkit.Bukkit; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; + +import bskyblock.addon.challenges.Challenges; +import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.api.panels.PanelListener; + +public class CreateChallengeListener implements PanelListener { + + private Challenges addon; + private User user; + + public CreateChallengeListener(Challenges addon, User user) { + this.addon = addon; + this.user = user; + } + + @Override + public void setup() {} + + @Override + public void onInventoryClose(InventoryCloseEvent event) { + Bukkit.getLogger().info("DEBUG: event = " + event); + Bukkit.getLogger().info("DEBUG: addon = " + addon); + Bukkit.getLogger().info("DEBUG: challenge manager = " + addon.getChallengesManager()); + addon.getChallengesManager().createInvChallenge(user, event.getInventory()); + } + + @Override + public void onInventoryClick(User user, InventoryClickEvent event) { + // Allow drag and drop + Bukkit.getLogger().info("DEBUG: setting cancelled to false"); + event.setCancelled(false); + } +} diff --git a/src/bskyblock/addon/challenges/panel/CreateChallengePanel.java b/src/bskyblock/addon/challenges/panel/CreateChallengePanel.java new file mode 100644 index 0000000..6509c6d --- /dev/null +++ b/src/bskyblock/addon/challenges/panel/CreateChallengePanel.java @@ -0,0 +1,13 @@ +package bskyblock.addon.challenges.panel; + +import bskyblock.addon.challenges.Challenges; +import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.api.panels.builders.PanelBuilder; + +public class CreateChallengePanel { + + public CreateChallengePanel(Challenges addon, User user) { + new PanelBuilder().setSize(49).setListener(new CreateChallengeListener(addon, user)).setUser(user).build(); + } + +} diff --git a/src/bskyblock/addon/challenges/panel/Panel.java b/src/bskyblock/addon/challenges/panel/Panel.java deleted file mode 100644 index 635ed6d..0000000 --- a/src/bskyblock/addon/challenges/panel/Panel.java +++ /dev/null @@ -1,213 +0,0 @@ -package bskyblock.addon.challenges.panel; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map.Entry; -import java.util.TreeMap; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.plugin.Plugin; - -public class Panel { - - private final Inventory gui; - private final TreeMap panelItems; - - public Panel(Plugin plugin, String name, TreeMap panelItems) { - // Generate gui - this.panelItems = panelItems; - // Create the panel - if (panelItems.lastKey() > 0) { - // Make sure size is a multiple of 9 - int size = panelItems.lastKey() + 8; - size -= (size % 9); - gui = Bukkit.createInventory(null, size, name); - // Fill the inventory and return - for (Entry en: panelItems.entrySet()) { - gui.setItem(en.getKey(), en.getValue().getIcon()); - } - } else { - gui = Bukkit.createInventory(null, 9, name); - } - - } - - public TreeMap getPanelItems() { - return panelItems; - } - - public Inventory getPanel() { - return gui; - } - - public static PanelBuilder builder(Plugin plugin) { - return new PanelBuilder(plugin); - } - - public static class PanelBuilder { - private TreeMap panelItems = new TreeMap<>(); - private String name; - private Plugin plugin; - - public PanelBuilder(Plugin plugin) { - this.plugin = plugin; - } - - public PanelBuilder addItem(PanelItem item) { - // Fit into slots. Handle duplicates - int index = item.getSlot(); - while (panelItems.containsKey(index) || index == 49) { - index++; - }; - panelItems.put(index, item); - Bukkit.getLogger().info("DEBUG: added to slot " + index); - return this; - } - - public PanelBuilder name(String name) { - this.name = name; - return this; - } - - public Panel build() { - return new Panel(plugin, name, panelItems); - } - - } - - public static PanelItemBuilder panelItemBuilder() { - return new PanelItemBuilder(); - } - - public static class PanelItem { - 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, 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(ChatColor.translateAlternateColorCodes('&', name)); - meta.setLore(chop(description)); - // Set flags to neaten up the view - meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); - meta.addItemFlags(ItemFlag.HIDE_DESTROYS); - meta.addItemFlags(ItemFlag.HIDE_PLACED_ON); - meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - if (glow) { - meta.addEnchant(Enchantment.ARROW_DAMAGE, 0, true); - } - icon.setItemMeta(meta); - result.add(icon); - } else { - for (int i = 0; i < toggleItems.size(); i++) { - // Create the icon(s) - ItemMeta meta = icon.getItemMeta(); - meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name)); - List desc = chop(description); - desc.addAll(chop(toggleItems.get(i))); - meta.setLore(desc); - // Set flags to neaten up the view - meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); - meta.addItemFlags(ItemFlag.HIDE_DESTROYS); - meta.addItemFlags(ItemFlag.HIDE_PLACED_ON); - meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - if (glow) { - meta.addEnchant(Enchantment.ARROW_DAMAGE, 0, true); - } - icon.setItemMeta(meta); - result.add(icon); - } - } - this.icon = result; - } - - public ItemStack getIcon() { - return icon.get(index); - } - - public ItemStack toggleIcon() { - if (icon.size() < (index + 1)) { - index++; - } else { - index = 0; - } - return icon.get(index); - } - - public Integer getSlot() { - return slot; - } - - public List getCommands() { - return commands; - } - } - - public static class PanelItemBuilder { - private ItemStack icon; - private String description; - private String name; - private int slot; - private List toggleItems = new ArrayList<>(); - private boolean glow; - private List command = new ArrayList<>(); - - public PanelItemBuilder setIcon(ItemStack icon) { - this.icon = icon; - return this; - } - public PanelItemBuilder setDescription(String description) { - this.description = description; - return this; - } - public PanelItemBuilder setName(String name) { - this.name = name; - return this; - } - public PanelItemBuilder setSlot(int slot) { - this.slot = slot; - return this; - } - public PanelItemBuilder setToggleItems(List toggleItems) { - this.toggleItems = toggleItems; - return this; - } - public PanelItemBuilder setGlow(boolean glow) { - 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, command); - } - - - } - - private static List chop(String longLine) { - longLine = ChatColor.translateAlternateColorCodes('&', longLine); - // Split pip character requires escaping it - String[] split = longLine.split("\\|"); - return new ArrayList(Arrays.asList(split)); - } - -} \ No newline at end of file