1.0.0-SNAPSHOT-U155

+ Started implementing the GiveRewardRewardsListPanel
This commit is contained in:
Charles 2018-12-31 01:15:40 +08:00
parent c9b4fe0ca5
commit 7bb452020a
9 changed files with 259 additions and 25 deletions

View File

@ -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"

View File

@ -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'

View File

@ -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.'
- '&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.'

View File

@ -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<DropTable> mainDropTableEditMenu, dropTableTypeEditMenu;
@Getter private ISubVariablePanelHandler<DropTable, SprayTableElement> sprayDropTableMainEditMenu, sprayRewardListEditMenu, sprayNewRewardEditMenu;
@Getter private ISubSubVariablePanelHandler<DropTable, SprayTableElement, String> sprayRewardMainEditMenu;
@Getter private ISubVariablePanelHandler<DropTable, GiveTableElement> giveRewardPositionListMenu;
@Getter private ISubSubVariablePanelHandler<DropTable, GiveTableElement, String> giveRewardRewardsListMenu;
@Getter private ISubVariablePanelHandler<DropTable, DropTableElement> dropDropTableMainEditMenu, dropRewardListEditMenu, dropNewRewardEditMenu;
@Getter private ISubSubVariablePanelHandler<DropTable, DropTableElement, String> 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);
}
//---------------------------------------------

View File

@ -69,7 +69,7 @@ public class GiveRewardPositionListPanel extends SubVariablePanelHandler<DropTab
PanelBuilderCounter panelBuilderCounter = panelBuilder.getPanelBuilderCounter();
Panel panel = panelBuilder.getPanel()
.setParentPanelHandler(this.bossPanelManager.getDropTables());
.setParentPanelHandler(this.bossPanelManager.getMainDropTableEditMenu(), dropTable);
panelBuilderCounter.getSlotsWith("NewPosition").forEach(slot -> panel.setOnClick(slot, getNewPositionAction(dropTable, giveTableElement)));
fillPanel(panel, dropTable, giveTableElement);
@ -95,8 +95,8 @@ public class GiveRewardPositionListPanel extends SubVariablePanelHandler<DropTab
replaceMap.put("{position}", NumberUtils.get().formatDouble(Integer.valueOf(position)));
replaceMap.put("{dropAmount}", NumberUtils.get().formatDouble(dropAmount));
ItemStackUtils.applyDisplayName(itemStack, this.plugin.getConfig().getString("Display.DropTable.GiveRewardList.name"), replaceMap);
ItemStackUtils.applyDisplayLore(itemStack, this.plugin.getConfig().getStringList("Display.DropTable.GiveRewardList.lore"), replaceMap);
ItemStackUtils.applyDisplayName(itemStack, this.plugin.getConfig().getString("Display.DropTable.GivePositionList.name"), replaceMap);
ItemStackUtils.applyDisplayLore(itemStack, this.plugin.getConfig().getStringList("Display.DropTable.GivePositionList.lore"), replaceMap);
panel.setItem(realisticSlot, itemStack, event -> {
ClickType clickType = event.getClick();
@ -106,7 +106,7 @@ public class GiveRewardPositionListPanel extends SubVariablePanelHandler<DropTab
giveTableElement.setGiveRewards(rewards);
saveDropTable((Player) event.getWhoClicked(), dropTable, giveTableElement, BossAPI.convertObjectToJsonObject(giveTableElement));
} else {
//TODO OPEN REWARDREWARDSLIST
}
});
}
@ -117,7 +117,7 @@ public class GiveRewardPositionListPanel extends SubVariablePanelHandler<DropTab
return event -> {
Map<String, Map<String, GiveTableSubElement>> rewards = giveTableElement.getGiveRewards();
List<String> 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<DropTab
};
}
private int getNextAvailablePosition(List<String> keys) {
if(keys.isEmpty()) return 1;
List<Integer> 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();

View File

@ -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<DropTable, GiveTableElement, String> {
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<String, String> 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<String, Map<String, GiveTableSubElement>> rewardSections = giveTableElement.getGiveRewards();
Map<String, GiveTableSubElement> rewards = rewardSections.get(key);
List<String> 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<String> keys, Map<String, Map<String, GiveTableSubElement>> rewardSections) {
Map<String, GiveTableSubElement> 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<String, String> 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<String, Map<String, GiveTableSubElement>> rewards = giveTableElement.getGiveRewards();
Map<String, GiveTableSubElement> rewardSections = rewards.get(key);
List<String> 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);
}
}

View File

@ -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<String> keys) {
if (keys.isEmpty()) return 1;
List<Integer> 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;
}

View File

@ -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> T getValue(T input, T defaultValue) {
if(input == null) return defaultValue;
return input;
}
}

View File

@ -20,7 +20,7 @@
<properties>
<!--<plugin.version>maven-version-number-SNAPSHOT-U90</plugin.version>-->
<plugin.version>1.0.0-U154</plugin.version>
<plugin.version>1.0.0-U155</plugin.version>
<plugin.name>EpicBosses</plugin.name>
<plugin.main>com.songoda.epicbosses.CustomBosses</plugin.main>
<plugin.author>AMinecraftDev</plugin.author>