WIP: Stubbed out a lot of the classes.

Compiles, but still a lot of functions need to be added.
This commit is contained in:
Tastybento 2017-11-26 23:13:17 -08:00
parent 38a98043d5
commit 3b74b17283
8 changed files with 429 additions and 139 deletions

View File

@ -6,3 +6,51 @@
### Credits ### ### Credits ###
# Tastybento: maintainer # Tastybento: maintainer
challenges:
complete: "Complete"
expReward: "Exp reward"
firstTimeRewards: "First time reward(s)"
guititle: "BSkyBlock Challenges"
help1: "Use /c <name> to view information about a challenge."
help2: "Use /c complete <name> 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"

View File

@ -10,8 +10,6 @@ import bskyblock.addin.challenges.config.LocaleManager;
import bskyblock.addin.challenges.config.PluginConfig; import bskyblock.addin.challenges.config.PluginConfig;
import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.BSkyBlock;
import us.tastybento.bskyblock.config.BSBLocale; 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 * Addin to BSkyBlock that enables challenges
@ -20,24 +18,14 @@ import us.tastybento.bskyblock.database.flatfile.FlatFileDatabase;
*/ */
public class Challenges extends JavaPlugin { public class Challenges extends JavaPlugin {
private static final boolean DEBUG = true;
// The BSkyBlock plugin instance. // The BSkyBlock plugin instance.
private BSkyBlock bSkyBlock; private BSkyBlock bSkyBlock;
// Locale manager for this plugin // Locale manager for this plugin
private LocaleManager localeManager; private LocaleManager localeManager;
// The BSkyBlock database object
private BSBDatabase database;
private ChallengesManager manager; private ChallengesManager manager;
private FlatFileDatabase flatFile;
@SuppressWarnings("unchecked")
@Override @Override
public void onEnable() { public void onEnable() {
// Load the plugin's config // Load the plugin's config
@ -58,7 +46,7 @@ public class Challenges extends JavaPlugin {
// Register commands // Register commands
new ChallengesCommand(this); new ChallengesCommand(this);
// Register Listener // Register Listener
getServer().getPluginManager().registerEvents(manager, this); getServer().getPluginManager().registerEvents(manager.getChallengesPanels(), this);
// Done // Done
} }

View File

@ -5,57 +5,56 @@ import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; 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.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import bskyblock.addin.challenges.database.object.ChallengesDO; import bskyblock.addin.challenges.database.object.ChallengesDO;
import bskyblock.addin.challenges.database.object.LevelsDO; import bskyblock.addin.challenges.database.object.LevelsDO;
import bskyblock.addin.challenges.panel.Panel; import bskyblock.addin.challenges.panel.ChallengesPanels;
import bskyblock.addin.challenges.panel.Panel.PanelBuilder;
import bskyblock.addin.challenges.panel.Panel.PanelItem;
import us.tastybento.bskyblock.database.flatfile.FlatFileDatabase; import us.tastybento.bskyblock.database.flatfile.FlatFileDatabase;
import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler; import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler;
import us.tastybento.bskyblock.util.Util; 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 Challenges plugin;
private HashMap<UUID, Panel> challengePanels; private LinkedHashMap<LevelsDO, List<ChallengesDO>> challengeList;
private AbstractDatabaseHandler<ChallengesDO> chHandler; private AbstractDatabaseHandler<ChallengesDO> chHandler;
private HashMap<String,ChallengesDO> challenges;
private AbstractDatabaseHandler<LevelsDO> lvHandler; private AbstractDatabaseHandler<LevelsDO> lvHandler;
private HashMap<String,LevelsDO> levels;
private ChallengesPanels challengesPanels;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public ChallengesManager(Challenges plugin){ public ChallengesManager(Challenges plugin) {
this.plugin = plugin; this.plugin = plugin;
// Set up the database handler to store and retrieve Challenges // Set up the database handler to store and retrieve Challenges
chHandler = (AbstractDatabaseHandler<ChallengesDO>) new FlatFileDatabase().getHandler(plugin, ChallengesDO.class); chHandler = (AbstractDatabaseHandler<ChallengesDO>) new FlatFileDatabase().getHandler(plugin, ChallengesDO.class);
lvHandler = (AbstractDatabaseHandler<LevelsDO>) new FlatFileDatabase().getHandler(plugin, LevelsDO.class); lvHandler = (AbstractDatabaseHandler<LevelsDO>) new FlatFileDatabase().getHandler(plugin, LevelsDO.class);
challenges = new HashMap<>(); challengeList = new LinkedHashMap<>();
levels = new HashMap<>(); // Start panels
challengePanels = new HashMap<>(); challengesPanels = new ChallengesPanels(plugin, this);
load(); load();
} }
/**
* @return the challengesPanels
*/
public ChallengesPanels getChallengesPanels() {
return challengesPanels;
}
public AbstractDatabaseHandler<ChallengesDO> getHandler() { public AbstractDatabaseHandler<ChallengesDO> getHandler() {
return chHandler; return chHandler;
} }
@ -64,28 +63,40 @@ public class ChallengesManager implements Listener {
* Clear and reload all challenges * Clear and reload all challenges
*/ */
public void load() { public void load() {
levels.clear(); // Load the challenges
try { challengeList.clear();
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();
try { try {
for (ChallengesDO challenge : chHandler.loadObjects()) { 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<ChallengesDO> challenges = new ArrayList<>();
challenges.add(challenge);
challengeList.put(level, challenges);
}
} }
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException | SecurityException | ClassNotFoundException | IntrospectionException | InvocationTargetException | SecurityException | ClassNotFoundException | IntrospectionException
| SQLException e) { | SQLException | NoSuchMethodException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); 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){ public void save(boolean async){
if(async){ if(async){
Runnable save = () -> { Runnable save = () -> {
int index = 1; for (Entry<LevelsDO, List<ChallengesDO>> en : challengeList.entrySet()) {
for(ChallengesDO challenge : challenges.values()){
plugin.getLogger().info("DEBUG: saving challenges async " + index++);
try { try {
chHandler.saveObject(challenge); lvHandler.saveObject(en.getKey());
} catch (Exception e) { } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
| SecurityException | InstantiationException | NoSuchMethodException
| IntrospectionException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace(); 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); plugin.getServer().getScheduler().runTaskAsynchronously(plugin, save);
} else { } else {
int index = 1; for (Entry<LevelsDO, List<ChallengesDO>> en : challengeList.entrySet()) {
for(ChallengesDO challenge : challenges.values()){
plugin.getLogger().info("DEBUG: saving challenges sync " + index++);
try { try {
chHandler.saveObject(challenge); lvHandler.saveObject(en.getKey());
} catch (Exception e) { } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
| SecurityException | InstantiationException | NoSuchMethodException | IntrospectionException
| SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace(); 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(){ public void shutdown(){
save(false); save(false);
challenges.clear(); challengeList.clear();
} }
/** /**
@ -175,83 +206,102 @@ public class ChallengesManager implements Listener {
return; return;
} }
Util.sendMessage(player, "Challenge accepted!"); 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 * Get the list of challenges for this level
// Build panel * @param level - the level required
PanelBuilder panelBuilder = Panel.builder(plugin) * @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
.name(plugin.getLocale(player).get("challenges.guiTitle")); */
for (ChallengesDO challenge: challenges.values()) { public List<ChallengesDO> getChallenges(String level) {
plugin.getLogger().info("Adding challenge " + challenge.getUniqueId()); return challengeList.getOrDefault(level, challengeList.isEmpty() ? new ArrayList<ChallengesDO>() : challengeList.values().iterator().next());
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
} }
@EventHandler(priority = EventPriority.LOWEST) /**
public void onInventoryClose(InventoryCloseEvent event) { * Checks if a challenge is complete or not
challengePanels.remove(event.getPlayer().getUniqueId()); * @param uniqueId - player's UUID
plugin.getLogger().info("DEBUG: removing inv " + challengePanels.size()); * @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 * Get the status on every level
* @param event * @param player
* @return Level name, how many challenges still to do on which level
*/ */
@EventHandler(priority = EventPriority.LOWEST) public List<LevelStatus> getChallengeLevelStatus(Player player) {
public void onInventoryOpen(InventoryOpenEvent event) { List<LevelStatus> result = new ArrayList<>();
Player player = (Player) event.getPlayer(); LevelsDO previousLevel = null;
UUID playerUUID = player.getUniqueId(); for (Entry<LevelsDO, List<ChallengesDO>> en : challengeList.entrySet()) {
Inventory inventory = event.getInventory(); // The inventory that was int challsToDo = 0; // TODO - calculate how many challenges still to do for this player
if (inventory.getName() == null || !inventory.getName().equals(plugin.getLocale(player).get("challenges.guiTitle"))) { boolean complete = false; // TODO
challengePanels.remove(playerUUID); result.add(new LevelStatus(en.getKey(), previousLevel, challsToDo, complete));
plugin.getLogger().info("DEBUG: removing inv " + challengePanels.size());
} }
return result;
} }
@EventHandler(priority = EventPriority.NORMAL) public class LevelStatus {
public void onLogOut(PlayerQuitEvent event) { private final LevelsDO level;
challengePanels.remove(event.getPlayer().getUniqueId()); private final LevelsDO previousLevel;
plugin.getLogger().info("DEBUG: removing inv " + challengePanels.size()); 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;
}
} }
} }

View File

@ -43,7 +43,7 @@ public class ChallengesCommand extends AbstractCommand implements Listener {
public void execute(CommandSender sender, String[] args) { public void execute(CommandSender sender, String[] args) {
// Open up the challenges GUI // Open up the challenges GUI
if (isPlayer) { if (isPlayer) {
player.openInventory(plugin.getManager().getChallenges(player)); player.openInventory(plugin.getManager().getChallengesPanels().getChallenges(player));
} else { } else {
// TODO // TODO
} }

View File

@ -138,7 +138,6 @@ public class ChallengesDO extends DataObject {
private int searchRadius = 10; private int searchRadius = 10;
/** /**
* Inventory slot where this challenge should be placed. 0 to 49. * Inventory slot where this challenge should be placed. 0 to 49.
*
*/ */
private int slot; private int slot;
/** /**

View File

@ -5,7 +5,7 @@ import java.util.List;
import us.tastybento.bskyblock.database.objects.DataObject; import us.tastybento.bskyblock.database.objects.DataObject;
public class LevelsDO extends DataObject { public class LevelsDO extends DataObject implements Comparable<LevelsDO> {
/** /**
* A friendly name for the level. If blank, level name is used. * 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; private int waiveramount = 1;
/**
* The ordering of the levels, lowest to highest
*/
private int order = 0;
public String getFriendlyName() { public String getFriendlyName() {
return friendlyName; return friendlyName;
} }
@ -58,4 +63,17 @@ public class LevelsDO extends DataObject {
this.waiveramount = waiveramount; 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);
}
} }

View File

@ -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<UUID, Panel> 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<ChallengesDO> 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());
}
}

View File

@ -87,19 +87,22 @@ public class Panel {
} }
public static class PanelItem { public static class PanelItem {
private final Integer slot; private final int slot;
// The current index of the icon // The current index of the icon
private int index = 0; private int index = 0;
// There is a list of icons for every toggle option // There is a list of icons for every toggle option
private final List<ItemStack> icon; private final List<ItemStack> icon;
// Command to run when clicked
private final List<String> commands;
public PanelItem(ItemStack icon, String description, String name, Integer slot, List<String> toggleItems, boolean glow) { public PanelItem(ItemStack icon, String description, String name, int slot, List<String> toggleItems, boolean glow, List<String> commands) {
this.slot = slot; this.slot = slot;
this.commands = commands;
List<ItemStack> result = new ArrayList<>(); List<ItemStack> result = new ArrayList<>();
if (toggleItems.isEmpty()) { if (toggleItems.isEmpty()) {
// Create the icon // Create the icon
ItemMeta meta = icon.getItemMeta(); ItemMeta meta = icon.getItemMeta();
meta.setDisplayName(name); meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));
meta.setLore(chop(description)); meta.setLore(chop(description));
// Set flags to neaten up the view // Set flags to neaten up the view
meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
@ -115,7 +118,7 @@ public class Panel {
for (int i = 0; i < toggleItems.size(); i++) { for (int i = 0; i < toggleItems.size(); i++) {
// Create the icon(s) // Create the icon(s)
ItemMeta meta = icon.getItemMeta(); ItemMeta meta = icon.getItemMeta();
meta.setDisplayName(name); meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));
List<String> desc = chop(description); List<String> desc = chop(description);
desc.addAll(chop(toggleItems.get(i))); desc.addAll(chop(toggleItems.get(i)));
meta.setLore(desc); meta.setLore(desc);
@ -151,15 +154,19 @@ public class Panel {
return slot; return slot;
} }
public List<String> getCommands() {
return commands;
}
} }
public static class PanelItemBuilder { public static class PanelItemBuilder {
private ItemStack icon; private ItemStack icon;
private String description; private String description;
private String name; private String name;
private Integer slot; private int slot;
private List<String> toggleItems = new ArrayList<>(); private List<String> toggleItems = new ArrayList<>();
private boolean glow; private boolean glow;
private List<String> command = new ArrayList<>();
public PanelItemBuilder setIcon(ItemStack icon) { public PanelItemBuilder setIcon(ItemStack icon) {
this.icon = icon; this.icon = icon;
@ -173,7 +180,7 @@ public class Panel {
this.name = name; this.name = name;
return this; return this;
} }
public PanelItemBuilder setSlot(Integer slot) { public PanelItemBuilder setSlot(int slot) {
this.slot = slot; this.slot = slot;
return this; return this;
} }
@ -185,8 +192,12 @@ public class Panel {
this.glow = glow; this.glow = glow;
return this; return this;
} }
public PanelItemBuilder setCommand(String command) {
this.command.add(command);
return this;
}
public PanelItem build() { public PanelItem build() {
return new PanelItem(icon, description, name, slot, toggleItems, glow); return new PanelItem(icon, description, name, slot, toggleItems, glow, command);
} }