From 7bb452020a38c95da7ae03abccdfaa702381a4eb Mon Sep 17 00:00:00 2001 From: Charles Date: Mon, 31 Dec 2018 01:15:40 +0800 Subject: [PATCH] 1.0.0-SNAPSHOT-U155 + Started implementing the GiveRewardRewardsListPanel --- plugin-modules/Core/resources-json/items.json | 4 + plugin-modules/Core/resources-yml/config.yml | 18 ++- plugin-modules/Core/resources-yml/editor.yml | 64 ++++++++- .../epicbosses/managers/BossPanelManager.java | 8 ++ .../give/GiveRewardPositionListPanel.java | 27 +--- .../give/GiveRewardRewardsListPanel.java | 125 ++++++++++++++++++ .../songoda/epicbosses/utils/NumberUtils.java | 20 +++ .../songoda/epicbosses/utils/ObjectUtils.java | 16 +++ pom.xml | 2 +- 9 files changed, 259 insertions(+), 25 deletions(-) create mode 100644 plugin-modules/Core/src/com/songoda/epicbosses/utils/ObjectUtils.java diff --git a/plugin-modules/Core/resources-json/items.json b/plugin-modules/Core/resources-json/items.json index 07cef0f..10cf49a 100644 --- a/plugin-modules/Core/resources-json/items.json +++ b/plugin-modules/Core/resources-json/items.json @@ -3,6 +3,10 @@ "type": "DIAMOND", "name": "&c&lDefault DropTable Reward Item" }, + "DefaultDropTableRewardsListItem": { + "type": "CHEST", + "name": "&c&lDefault DropTable Rewards List Item" + }, "DefaultMinionMenuSpawnItem": { "type": "ZOMBIE_SPAWN_EGG", "name": "&c&lDefault Minion Menu Spawn Item" diff --git a/plugin-modules/Core/resources-yml/config.yml b/plugin-modules/Core/resources-yml/config.yml index 1edf548..8b24f51 100644 --- a/plugin-modules/Core/resources-yml/config.yml +++ b/plugin-modules/Core/resources-yml/config.yml @@ -114,7 +114,7 @@ Display: - '&3Chance: &f{chance}%' - '&7' - '&7Click to modify this reward.' - GiveRewardList: + GivePositionList: name: '&bReward Section' lore: - '&3Position: &f{position}' @@ -122,6 +122,22 @@ Display: - '&7' - '&7Shift Right-Click to remove.' - '&7Left-Click to edit.' + GiveRewardsList: + name: '&bReward Section' + lore: + - '&3Position: &f{position}' + - '&3Required Percentage: &f{percentage}%' + - '&7' + - '&3Item Drops: &f{items}' + - '&3Max Drops: &f{maxDrops}' + - '&3Random Drops: &f{randomDrops}' + - '&7' + - '&3Command Drops: &f{commands}' + - '&3Max Commands: &f{maxCommands}' + - '&3Random Commands: &f{randomCommands}' + - '&7' + - '&7Shift Right-Click to remove.' + - '&7Left-Click to edit.' Shop: menuName: '&b&lEpicBosses &3&lShop' name: '&b&lBuy {name}''s Egg' diff --git a/plugin-modules/Core/resources-yml/editor.yml b/plugin-modules/Core/resources-yml/editor.yml index 2256382..4bbd323 100644 --- a/plugin-modules/Core/resources-yml/editor.yml +++ b/plugin-modules/Core/resources-yml/editor.yml @@ -2530,4 +2530,66 @@ GiveRewardPositionListMenu: name: '&cClick here to go back' lore: - '&7Click this button to go back to' - - '&7the drop table main edit menu.' \ No newline at end of file + - '&7the drop table main edit menu.' +GiveRewardRewardsListMenu: + name: '&b&l{name} DropTable' + slots: 54 + Settings: + backButton: true + fillTo: 45 + Buttons: + backButton: 54 + Items: + '46': + type: BOOK + name: '&c&lGive Reward Rewards Guide' + lore: + - '&7In this list it displays the drop sections' + - '&7assigned to the drop position of &f{position}&7.' + - '&7To edit the drops simply click on the drop' + - '&7section you wish to edit and then you can' + - '&7modify the data there.' + - '&7To remove a drop section simply shift-right' + - '&7click the section you want to remove.' + '47': + type: GLASS_PANE + name: '&7' + '48': + type: GLASS_PANE + name: '&7' + '49': + type: ARROW + name: '&e&l&m<-&e&l Previous Page' + lore: + - '&7Click here to go to the previous' + - '&7page of drop sections.' + PreviousPage: true + '50': + type: EMERALD_BLOCK + name: '&e&lAdd new Drop Section' + lore: + - '&7Click here to add a new drop section' + - '&7to the drop table. This will find' + - '&7the next available drop section and' + - '&7create a new drop section for' + - '&7that position.' + Button: NewRewardSection + '51': + type: ARROW + name: '&e&lNext Page &e&l&m->' + lore: + - '&7Click here to go to the next' + - '&7page of drop sections.' + NextPage: true + '52': + type: GLASS_PANE + name: '&7' + '53': + type: GLASS_PANE + name: '&7' + '54': + type: REDSTONE + name: '&cClick here to go back' + lore: + - '&7Click this button to go back to' + - '&7the reward position list menu.' \ No newline at end of file diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/managers/BossPanelManager.java b/plugin-modules/Core/src/com/songoda/epicbosses/managers/BossPanelManager.java index 3140b25..02905d3 100644 --- a/plugin-modules/Core/src/com/songoda/epicbosses/managers/BossPanelManager.java +++ b/plugin-modules/Core/src/com/songoda/epicbosses/managers/BossPanelManager.java @@ -29,6 +29,7 @@ import com.songoda.epicbosses.panel.droptables.types.drop.DropNewRewardEditorPan import com.songoda.epicbosses.panel.droptables.types.drop.DropRewardMainEditorPanel; import com.songoda.epicbosses.panel.droptables.types.drop.DropRewardsListEditorPanel; import com.songoda.epicbosses.panel.droptables.types.give.GiveRewardPositionListPanel; +import com.songoda.epicbosses.panel.droptables.types.give.GiveRewardRewardsListPanel; import com.songoda.epicbosses.panel.droptables.types.spray.SprayDropTableMainEditorPanel; import com.songoda.epicbosses.panel.droptables.types.spray.SprayNewRewardEditorPanel; import com.songoda.epicbosses.panel.droptables.types.spray.SprayRewardMainEditorPanel; @@ -98,7 +99,10 @@ public class BossPanelManager implements ILoadable, IReloadable { @Getter private IVariablePanelHandler mainDropTableEditMenu, dropTableTypeEditMenu; @Getter private ISubVariablePanelHandler sprayDropTableMainEditMenu, sprayRewardListEditMenu, sprayNewRewardEditMenu; @Getter private ISubSubVariablePanelHandler sprayRewardMainEditMenu; + @Getter private ISubVariablePanelHandler giveRewardPositionListMenu; + @Getter private ISubSubVariablePanelHandler giveRewardRewardsListMenu; + @Getter private ISubVariablePanelHandler dropDropTableMainEditMenu, dropRewardListEditMenu, dropNewRewardEditMenu; @Getter private ISubSubVariablePanelHandler dropRewardMainEditMenu; @@ -226,6 +230,7 @@ public class BossPanelManager implements ILoadable, IReloadable { PanelBuilder panelBuilder9 = new PanelBuilder(editor.getConfigurationSection("DropNewRewardEditMenu")); PanelBuilder panelBuilder10 = new PanelBuilder(editor.getConfigurationSection("GiveRewardPositionListMenu")); + PanelBuilder panelBuilder11 = new PanelBuilder(editor.getConfigurationSection("GiveRewardRewardsListMenu")); this.mainDropTableEditMenu = new MainDropTableEditorPanel(this, panelBuilder); this.dropTableTypeEditMenu = new DropTableTypeEditorPanel(this, panelBuilder1, this.customBosses); @@ -241,6 +246,7 @@ public class BossPanelManager implements ILoadable, IReloadable { this.dropNewRewardEditMenu = new DropNewRewardEditorPanel(this, panelBuilder9, this.customBosses); this.giveRewardPositionListMenu = new GiveRewardPositionListPanel(this, panelBuilder10, this.customBosses); + this.giveRewardRewardsListMenu = new GiveRewardRewardsListPanel(this, panelBuilder11, this.customBosses); } private void reloadDropTableEditMenus() { @@ -258,6 +264,7 @@ public class BossPanelManager implements ILoadable, IReloadable { PanelBuilder panelBuilder9 = new PanelBuilder(editor.getConfigurationSection("DropNewRewardEditMenu")); PanelBuilder panelBuilder10 = new PanelBuilder(editor.getConfigurationSection("GiveRewardPositionListMenu")); + PanelBuilder panelBuilder11 = new PanelBuilder(editor.getConfigurationSection("GiveRewardRewardsListMenu")); this.mainDropTableEditMenu.initializePanel(panelBuilder); this.dropTableTypeEditMenu.initializePanel(panelBuilder1); @@ -273,6 +280,7 @@ public class BossPanelManager implements ILoadable, IReloadable { this.dropNewRewardEditMenu.initializePanel(panelBuilder9); this.giveRewardPositionListMenu.initializePanel(panelBuilder10); + this.giveRewardPositionListMenu.initializePanel(panelBuilder11); } //--------------------------------------------- diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/panel/droptables/types/give/GiveRewardPositionListPanel.java b/plugin-modules/Core/src/com/songoda/epicbosses/panel/droptables/types/give/GiveRewardPositionListPanel.java index 9176128..56cfd32 100644 --- a/plugin-modules/Core/src/com/songoda/epicbosses/panel/droptables/types/give/GiveRewardPositionListPanel.java +++ b/plugin-modules/Core/src/com/songoda/epicbosses/panel/droptables/types/give/GiveRewardPositionListPanel.java @@ -69,7 +69,7 @@ public class GiveRewardPositionListPanel extends SubVariablePanelHandler panel.setOnClick(slot, getNewPositionAction(dropTable, giveTableElement))); fillPanel(panel, dropTable, giveTableElement); @@ -95,8 +95,8 @@ public class GiveRewardPositionListPanel extends SubVariablePanelHandler { ClickType clickType = event.getClick(); @@ -106,7 +106,7 @@ public class GiveRewardPositionListPanel extends SubVariablePanelHandler { Map> rewards = giveTableElement.getGiveRewards(); List keys = new ArrayList<>(giveTableElement.getGiveRewards().keySet()); - int nextAvailable = getNextAvailablePosition(keys); + int nextAvailable = NumberUtils.get().getNextAvailablePosition(keys); String nextKey = ""+nextAvailable; if(rewards.containsKey(nextKey)) { @@ -131,23 +131,6 @@ public class GiveRewardPositionListPanel extends SubVariablePanelHandler keys) { - if(keys.isEmpty()) return 1; - - List currentIds = new ArrayList<>(); - - keys.stream().filter(NumberUtils.get()::isInt).forEach(s -> currentIds.add(Integer.valueOf(s))); - currentIds.sort(Comparator.naturalOrder()); - - for(int i = 1; i <= currentIds.size(); i++) { - if(i < currentIds.get(i-1)) { - return i; - } - } - - return currentIds.size()+1; - } - private void saveDropTable(Player player, DropTable dropTable, GiveTableElement giveTableElement, JsonObject jsonObject) { dropTable.setRewards(jsonObject); this.plugin.getDropTableFileManager().save(); diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/panel/droptables/types/give/GiveRewardRewardsListPanel.java b/plugin-modules/Core/src/com/songoda/epicbosses/panel/droptables/types/give/GiveRewardRewardsListPanel.java index 3b5bb57..bdc20a5 100644 --- a/plugin-modules/Core/src/com/songoda/epicbosses/panel/droptables/types/give/GiveRewardRewardsListPanel.java +++ b/plugin-modules/Core/src/com/songoda/epicbosses/panel/droptables/types/give/GiveRewardRewardsListPanel.java @@ -1,12 +1,31 @@ package com.songoda.epicbosses.panel.droptables.types.give; +import com.google.gson.JsonObject; import com.songoda.epicbosses.CustomBosses; +import com.songoda.epicbosses.api.BossAPI; import com.songoda.epicbosses.droptable.DropTable; import com.songoda.epicbosses.droptable.elements.GiveTableElement; +import com.songoda.epicbosses.droptable.elements.GiveTableSubElement; import com.songoda.epicbosses.managers.BossPanelManager; +import com.songoda.epicbosses.managers.files.ItemsFileManager; +import com.songoda.epicbosses.utils.Debug; +import com.songoda.epicbosses.utils.NumberUtils; +import com.songoda.epicbosses.utils.ObjectUtils; +import com.songoda.epicbosses.utils.itemstack.ItemStackUtils; +import com.songoda.epicbosses.utils.panel.Panel; +import com.songoda.epicbosses.utils.panel.base.ClickAction; import com.songoda.epicbosses.utils.panel.base.handlers.SubSubVariablePanelHandler; import com.songoda.epicbosses.utils.panel.builder.PanelBuilder; +import com.songoda.epicbosses.utils.panel.builder.PanelBuilderCounter; +import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @author Charles Cullen @@ -15,21 +34,127 @@ import org.bukkit.entity.Player; */ public class GiveRewardRewardsListPanel extends SubSubVariablePanelHandler { + private ItemsFileManager itemsFileManager; private CustomBosses plugin; public GiveRewardRewardsListPanel(BossPanelManager bossPanelManager, PanelBuilder panelBuilder, CustomBosses plugin) { super(bossPanelManager, panelBuilder); this.plugin = plugin; + this.itemsFileManager = plugin.getItemStackManager(); } @Override public void openFor(Player player, DropTable dropTable, GiveTableElement giveTableElement, String s) { + PanelBuilder panelBuilder = getPanelBuilder().cloneBuilder(); + Map replaceMap = new HashMap<>(); + replaceMap.put("{name}", BossAPI.getDropTableName(dropTable)); + panelBuilder.addReplaceData(replaceMap); + + PanelBuilderCounter panelBuilderCounter = panelBuilder.getPanelBuilderCounter(); + Panel panel = panelBuilder.getPanel() + .setParentPanelHandler(this.bossPanelManager.getGiveRewardPositionListMenu(), dropTable, giveTableElement); + + panelBuilderCounter.getSlotsWith("NewRewardSection").forEach(slot -> panel.setOnClick(slot, getNewRewardSectionAction(dropTable, giveTableElement, s))); + fillPanel(panel, dropTable, giveTableElement, s); + panel.openFor(player); } @Override public void initializePanel(PanelBuilder panelBuilder) { } + + private void fillPanel(Panel panel, DropTable dropTable, GiveTableElement giveTableElement, String key) { + Map> rewardSections = giveTableElement.getGiveRewards(); + Map rewards = rewardSections.get(key); + List keys = new ArrayList<>(rewards.keySet()); + int maxPage = panel.getMaxPage(keys); + + panel.setOnPageChange(((player, currentPage, requestedPage) -> { + if(requestedPage < 0 || requestedPage > maxPage) return false; + + loadPage(panel, requestedPage, dropTable, giveTableElement, key, keys, rewardSections); + return true; + })); + + loadPage(panel, 0, dropTable, giveTableElement, key, keys, rewardSections); + } + + private void loadPage(Panel panel, int page, DropTable dropTable, GiveTableElement giveTableElement, String key, List keys, Map> rewardSections) { + Map rewards = rewardSections.get(key); + NumberUtils numberUtils = NumberUtils.get(); + + panel.loadPage(page, (slot, realisticSlot) -> { + if(slot >= keys.size()) { + panel.setItem(realisticSlot, new ItemStack(Material.AIR), e->{}); + } else { + String rewardSectionPosition = keys.get(slot); + GiveTableSubElement giveTableSubElement = rewards.get(rewardSectionPosition); + ItemStack itemStack = this.itemsFileManager.getItemStackConverter().from(this.itemsFileManager.getItemStackHolder("DefaultDropTableRewardsListItem")); + + int position = NumberUtils.get().getInteger(key); + Integer itemDrops = giveTableSubElement.getItems().size(); + Integer commandDrops = giveTableSubElement.getCommands().size(); + Double requiredPercentage = ObjectUtils.getValue(giveTableSubElement.getRequiredPercentage(), 0.0); + Integer maxDrops = ObjectUtils.getValue(giveTableSubElement.getMaxDrops(), 3); + Integer maxCommands = ObjectUtils.getValue(giveTableSubElement.getMaxCommands(), 3); + Boolean randomDrops = ObjectUtils.getValue(giveTableSubElement.getRandomDrops(), false); + Boolean randomCommands = ObjectUtils.getValue(giveTableSubElement.getRandomCommands(), false); + Map replaceMap = new HashMap<>(); + + replaceMap.put("{position}", numberUtils.formatDouble(position)); + replaceMap.put("{percentage}", numberUtils.formatDouble(requiredPercentage)); + replaceMap.put("{items}", numberUtils.formatDouble(itemDrops)); + replaceMap.put("{maxDrops}", numberUtils.formatDouble(maxDrops)); + replaceMap.put("{randomDrops}", ""+randomDrops); + replaceMap.put("{commands}", numberUtils.formatDouble(commandDrops)); + replaceMap.put("{maxCommands}", numberUtils.formatDouble(maxCommands)); + replaceMap.put("{randomCommands}", ""+randomCommands); + + ItemStackUtils.applyDisplayName(itemStack, this.plugin.getConfig().getString("Display.DropTable.GiveRewardsList.name"), replaceMap); + ItemStackUtils.applyDisplayLore(itemStack, this.plugin.getConfig().getStringList("Display.DropTable.GiveRewardsList.lore"), replaceMap); + + panel.setItem(realisticSlot, itemStack, event -> { + ClickType clickType = event.getClick(); + + if(clickType == ClickType.SHIFT_RIGHT) { + + rewards.remove(rewardSectionPosition); + rewardSections.put(key, rewards); + giveTableElement.setGiveRewards(rewardSections); + saveDropTable((Player) event.getWhoClicked(), dropTable, giveTableElement, key); + } else { + //TODO OPEN Reward Editor + } + }); + } + }); + } + + private ClickAction getNewRewardSectionAction(DropTable dropTable, GiveTableElement giveTableElement, String key) { + return event -> { + Map> rewards = giveTableElement.getGiveRewards(); + Map rewardSections = rewards.get(key); + List keys = new ArrayList<>(giveTableElement.getGiveRewards().keySet()); + int nextAvailable = NumberUtils.get().getNextAvailablePosition(keys); + String nextKey = ""+nextAvailable; + + if(rewardSections.containsKey(nextKey)) { + Debug.FAILED_TO_CREATE_NEWPOSITION.debug(nextKey, BossAPI.getDropTableName(dropTable)); + return; + } + + rewardSections.put(nextKey, new GiveTableSubElement(new HashMap<>(), new HashMap<>(), 3, 3, false, false, 0.0)); + giveTableElement.setGiveRewards(rewards); + saveDropTable((Player) event.getWhoClicked(), dropTable, giveTableElement, key); + }; + } + + private void saveDropTable(Player player, DropTable dropTable, GiveTableElement giveTableElement, String string) { + dropTable.setRewards(BossAPI.convertObjectToJsonObject(giveTableElement)); + this.plugin.getDropTableFileManager().save(); + openFor(player, dropTable, giveTableElement, string); + } } diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/utils/NumberUtils.java b/plugin-modules/Core/src/com/songoda/epicbosses/utils/NumberUtils.java index 2d325ec..f7d5998 100644 --- a/plugin-modules/Core/src/com/songoda/epicbosses/utils/NumberUtils.java +++ b/plugin-modules/Core/src/com/songoda/epicbosses/utils/NumberUtils.java @@ -1,6 +1,9 @@ package com.songoda.epicbosses.utils; import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; /** * @author Charles Cullen @@ -55,6 +58,23 @@ public class NumberUtils { return decimalFormat.format(d); } + public int getNextAvailablePosition(List keys) { + if (keys.isEmpty()) return 1; + + List currentIds = new ArrayList<>(); + + keys.stream().filter(NumberUtils.get()::isInt).forEach(s -> currentIds.add(Integer.valueOf(s))); + currentIds.sort(Comparator.naturalOrder()); + + for (int i = 1; i <= currentIds.size(); i++) { + if (i < currentIds.get(i - 1)) { + return i; + } + } + + return currentIds.size() + 1; + } + public static NumberUtils get() { return INSTANCE; } diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/utils/ObjectUtils.java b/plugin-modules/Core/src/com/songoda/epicbosses/utils/ObjectUtils.java new file mode 100644 index 0000000..c7f4e52 --- /dev/null +++ b/plugin-modules/Core/src/com/songoda/epicbosses/utils/ObjectUtils.java @@ -0,0 +1,16 @@ +package com.songoda.epicbosses.utils; + +/** + * @author Charles Cullen + * @version 1.0.0 + * @since 31-Dec-18 + */ +public class ObjectUtils { + + public static T getValue(T input, T defaultValue) { + if(input == null) return defaultValue; + + return input; + } + +} diff --git a/pom.xml b/pom.xml index 7f1b1e0..f4e8f5a 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ - 1.0.0-U154 + 1.0.0-U155 EpicBosses com.songoda.epicbosses.CustomBosses AMinecraftDev