addon-challenges/src/main/java/bskyblock/addon/challenges/ChallengesManager.java

367 lines
13 KiB
Java
Raw Normal View History

package bskyblock.addon.challenges;
2017-11-26 03:17:16 +01:00
import java.util.ArrayList;
2018-04-09 00:37:29 +02:00
import java.util.HashSet;
import java.util.LinkedHashMap;
2017-11-26 03:17:16 +01:00
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
2018-04-09 00:37:29 +02:00
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
2017-11-26 03:17:16 +01:00
import org.bukkit.Bukkit;
2017-11-26 03:17:16 +01:00
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.inventory.Inventory;
2017-11-26 03:17:16 +01:00
import org.bukkit.inventory.ItemStack;
2018-02-25 06:29:09 +01:00
import bskyblock.addon.challenges.commands.admin.SurroundChallengeBuilder;
import bskyblock.addon.challenges.database.object.ChallengeLevels;
import bskyblock.addon.challenges.database.object.Challenges;
import bskyblock.addon.challenges.database.object.Challenges.ChallengeType;
import bskyblock.addon.challenges.panel.ChallengesPanels;
import us.tastybento.bskyblock.BSkyBlock;
2018-02-26 07:44:57 +01:00
import us.tastybento.bskyblock.api.configuration.BSBConfig;
2018-03-12 01:36:06 +01:00
import us.tastybento.bskyblock.api.user.User;
2018-03-24 18:55:48 +01:00
import us.tastybento.bskyblock.util.Util;
2017-11-26 03:17:16 +01:00
public class ChallengesManager {
2017-11-26 03:17:16 +01:00
public static final String FREE = "Free";
2018-04-09 00:37:29 +02:00
private LinkedHashMap<ChallengeLevels, Set<Challenges>> challengeList;
2018-02-26 07:44:57 +01:00
private BSBConfig<Challenges> chConfig;
private BSBConfig<ChallengeLevels> lvConfig;
private ChallengesPanels challengesPanels;
2017-11-26 03:17:16 +01:00
2018-02-26 07:44:57 +01:00
public ChallengesManager(ChallengesAddon addon) {
// Set up the configs
chConfig = new BSBConfig<Challenges>(addon, Challenges.class);
lvConfig = new BSBConfig<ChallengeLevels>(addon, ChallengeLevels.class);
challengeList = new LinkedHashMap<>();
// Start panels
2018-02-26 07:44:57 +01:00
challengesPanels = new ChallengesPanels(addon, this);
2017-11-26 03:17:16 +01:00
load();
}
2018-04-09 01:28:56 +02:00
public long checkChallengeTimes(User user, Challenges challenge) {
// TODO Auto-generated method stub
return 0;
2018-04-09 00:37:29 +02:00
}
/**
2018-04-09 01:28:56 +02:00
* Creates a simple example description of the requirements
* @param user - user of this command
* @param requiredItems - list of items
* @return Description list
2018-04-09 00:37:29 +02:00
*/
2018-04-09 01:28:56 +02:00
private List<String> createDescription(User user, List<ItemStack> requiredItems) {
2018-04-09 00:37:29 +02:00
List<String> result = new ArrayList<>();
2018-04-09 01:28:56 +02:00
result.add(user.getTranslation("challenges.admin.create.description"));
for (ItemStack item : requiredItems) {
result.add(user.getTranslation("challenges.admin.create.description-item-color") + item.getAmount() + " x " + Util.prettifyText(item.getType().toString()));
}
2018-04-09 00:37:29 +02:00
return result;
}
2017-11-26 03:17:16 +01:00
/**
2018-02-26 07:44:57 +01:00
* Creates an inventory challenge
* @param user - the user who is making the challenge
* @param inventory - the inventory that will be used to make the challenge
2017-11-26 03:17:16 +01:00
*/
2018-02-26 07:44:57 +01:00
public boolean createInvChallenge(User user, Inventory inventory) {
if (inventory.getContents().length == 0) {
return false;
}
Challenges newChallenge = new Challenges();
newChallenge.setChallengeType(ChallengeType.INVENTORY);
newChallenge.setFriendlyName(inventory.getTitle());
newChallenge.setDeployed(false);
List<ItemStack> requiredItems = new ArrayList<>();
inventory.forEach(item -> {
if (item != null && !item.getType().equals(Material.AIR)) {
requiredItems.add(item);
2017-11-26 03:17:16 +01:00
}
2018-02-26 07:44:57 +01:00
});
newChallenge.setRequiredItems(requiredItems);
newChallenge.setTakeItems(true);
newChallenge.setUniqueId(inventory.getTitle());
newChallenge.setIcon(new ItemStack(Material.EMPTY_MAP));
newChallenge.setLevel(FREE);
2018-03-24 18:55:48 +01:00
newChallenge.setDescription(createDescription(user, requiredItems));
2018-02-26 07:44:57 +01:00
// Move all the items back to the player's inventory
inventory.forEach(item -> {
if (item != null) {
Map<Integer, ItemStack> 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
if (!chConfig.saveConfigObject(newChallenge)) {
user.sendRawMessage(ChatColor.RED + "Challenge creation failed!");
return false;
2017-11-26 03:17:16 +01:00
}
2018-02-26 07:44:57 +01:00
user.sendRawMessage("Success");
return true;
2017-11-26 03:17:16 +01:00
}
2018-02-26 07:44:57 +01:00
2017-11-26 03:17:16 +01:00
/**
2018-02-26 07:44:57 +01:00
* Create a surrounding challenge
* @param challengeInfo - info on the challenge from the builder
* @return true if successful, false if not
2017-11-26 03:17:16 +01:00
*/
2018-02-26 07:44:57 +01:00
public boolean createSurroundingChallenge(SurroundChallengeBuilder challengeInfo) {
if (challengeInfo.getReqBlocks().isEmpty() && challengeInfo.getReqEntities().isEmpty()) {
challengeInfo.getOwner().sendMessage("challenges.error.no-items-clicked");
return false;
2017-11-26 03:17:16 +01:00
}
2018-02-26 07:44:57 +01:00
Challenges newChallenge = new Challenges();
2018-04-09 00:37:29 +02:00
newChallenge.setChallengeType(ChallengeType.ISLAND);
2018-02-26 07:44:57 +01:00
newChallenge.setFriendlyName(challengeInfo.getName());
newChallenge.setDeployed(true);
newChallenge.setRequiredBlocks(challengeInfo.getReqBlocks());
newChallenge.setRequiredEntities(challengeInfo.getReqEntities());
newChallenge.setUniqueId(challengeInfo.getName());
newChallenge.setIcon(new ItemStack(Material.ARMOR_STAND));
newChallenge.setLevel(FREE);
2017-11-26 03:17:16 +01:00
2018-02-26 07:44:57 +01:00
// Save the challenge
if (!chConfig.saveConfigObject(newChallenge)) {
challengeInfo.getOwner().sendMessage("challenges.error.could-not-save");
return false;
}
return true;
2017-11-26 03:17:16 +01:00
}
2018-04-09 01:28:56 +02:00
/**
* Get the list of all challenge unique names.
* Used for checking admin commands and tab complete
* @return List of challenge names
*/
public List<String> getAllChallengesList() {
List<String> result = new ArrayList<>();
challengeList.values().forEach(ch -> ch.forEach(c -> result.add(c.getUniqueId())));
return result;
}
/**
* Get challenge by name
* @param name - unique name of challenge
* @return - challenge or null if it does not exist
*/
public Challenges getChallenge(String name) {
for (Set<Challenges> ch : challengeList.values()) {
Optional<Challenges> challenge = ch.stream().filter(c -> c.getUniqueId().equalsIgnoreCase(name)).findFirst();
if (challenge.isPresent()) {
return challenge.get();
}
}
return null;
}
2017-11-26 03:17:16 +01:00
/**
2018-02-26 07:44:57 +01:00
* Get the status on every level
* @param user
* @return Level name, how many challenges still to do on which level
2017-11-26 03:17:16 +01:00
*/
2018-02-26 07:44:57 +01:00
public List<LevelStatus> getChallengeLevelStatus(User user) {
List<LevelStatus> result = new ArrayList<>();
ChallengeLevels previousLevel = null;
2018-04-09 00:37:29 +02:00
for (Entry<ChallengeLevels, Set<Challenges>> en : challengeList.entrySet()) {
2018-02-26 07:44:57 +01:00
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));
2017-11-26 03:17:16 +01:00
}
2018-02-26 07:44:57 +01:00
return result;
2017-11-26 03:17:16 +01:00
}
2018-04-09 01:28:56 +02:00
/**
* @return the challengeList
*/
public LinkedHashMap<ChallengeLevels, Set<Challenges>> getChallengeList() {
return challengeList;
}
/**
2018-04-09 00:37:29 +02:00
* Get the set of challenges for this level
* @param level - the level required
2018-04-09 00:37:29 +02:00
* @return the set of challenges for this level, or the first set of challenges if level is blank, or a blank list if there are no challenges
*/
2018-04-09 00:37:29 +02:00
public Set<Challenges> getChallenges(String level) {
return challengeList.getOrDefault(level, challengeList.isEmpty() ? new HashSet<Challenges>() : challengeList.values().iterator().next());
2017-11-26 03:17:16 +01:00
}
/**
2018-02-26 07:44:57 +01:00
* @return the challengesPanels
*/
2018-02-26 07:44:57 +01:00
public ChallengesPanels getChallengesPanels() {
return challengesPanels;
}
2018-02-26 07:44:57 +01:00
/**
* Get the previous level to the one supplied
* @param currentLevel - the current level
* @return the previous level, or null if there is none
*/
public ChallengeLevels getPreviousLevel(ChallengeLevels currentLevel) {
ChallengeLevels result = null;
for (ChallengeLevels level : challengeList.keySet()) {
2018-02-26 07:44:57 +01:00
if (level.equals(currentLevel)) {
return result;
}
result = level;
}
return result;
2017-11-26 03:17:16 +01:00
}
2018-02-25 06:29:09 +01:00
2018-04-09 01:28:56 +02:00
/**
* Check if a challenge exists - case insensitive
* @param name - name of challenge
* @return true if it exists, otherwise false
*/
public boolean isChallenge(String name) {
for (Set<Challenges> ch : challengeList.values()) {
if (ch.stream().filter(c -> c.getUniqueId().equalsIgnoreCase(name)).findFirst().isPresent()) {
return true;
}
}
return false;
}
2017-11-26 03:17:16 +01:00
/**
2018-02-26 07:44:57 +01:00
* Checks if a challenge is complete or not
* @param uniqueId - unique ID - player's UUID
* @param uniqueId2 - Challenge id
* @return - true if completed
2017-11-26 03:17:16 +01:00
*/
2018-02-26 07:44:57 +01:00
public boolean isChallengeComplete(User user, String uniqueId2) {
// TODO Auto-generated method stub
return false;
2017-11-26 03:17:16 +01:00
}
2018-02-25 06:29:09 +01:00
2018-04-09 01:28:56 +02:00
/**
* Checks number of challenges
* @return true if no challenges
*/
public boolean isFirstTime() {
return challengeList.isEmpty();
}
2018-02-26 07:44:57 +01:00
public boolean isLevelAvailable(User user, String level) {
// TODO
return false;
}
2018-02-25 06:29:09 +01:00
2018-02-26 07:44:57 +01:00
public boolean isLevelComplete(User user, ChallengeLevels otherLevel) {
// TODO Auto-generated method stub
return false;
2017-11-26 03:17:16 +01:00
}
/**
2018-02-26 07:44:57 +01:00
* Clear and reload all challenges
*/
2018-02-26 07:44:57 +01:00
public void load() {
// Load the challenges
challengeList.clear();
2018-03-24 18:55:48 +01:00
Bukkit.getLogger().info("Loading challenges...");
2018-02-26 07:44:57 +01:00
for (Challenges challenge : chConfig.loadConfigObjects()) {
Bukkit.getLogger().info("Loading challenge " + challenge.getFriendlyName() + " level " + challenge.getLevel());
2018-04-09 00:37:29 +02:00
storeChallenge(challenge);
}
2018-04-09 00:37:29 +02:00
sortChallenges();
}
2018-04-09 01:28:56 +02:00
private void save() {
challengeList.entrySet().forEach(en -> {
lvConfig.saveConfigObject(en.getKey());
en.getValue().forEach(chConfig::saveConfigObject);
});
}
/**
* Save to the database
* @param async - if true, saving will be done async
*/
public void save(boolean async) {
if (async) {
BSkyBlock.getInstance().getServer().getScheduler().runTaskAsynchronously(BSkyBlock.getInstance(), () -> save());
} else {
save();
}
}
/**
* Sets the challenge as complete and increments the number of times it has been completed
* @param user
* @param uniqueId
*/
public void setChallengeComplete(User user, String uniqueId) {
// TODO Auto-generated method stub
}
/**
* @param challengeList the challengeList to set
*/
public void setChallengeList(LinkedHashMap<ChallengeLevels, Set<Challenges>> challengeList) {
this.challengeList = challengeList;
}
2018-04-09 00:37:29 +02:00
public void sortChallenges() {
2018-02-26 07:44:57 +01:00
// 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));
2018-04-09 00:37:29 +02:00
}
/**
* Stores the challenge. If a challenge already exists with the same name, it is overwritten.
* @param challenge
*/
public void storeChallenge(Challenges challenge) {
// See if we have this level already
ChallengeLevels level;
if (lvConfig.configObjectExists(challenge.getLevel())) {
//Bukkit.getLogger().info("DEBUG: Level contains level " + challenge.getLevel());
// Get it from the database
level = lvConfig.loadConfigObject(challenge.getLevel());
} else {
//Bukkit.getLogger().info("DEBUG: Level does not contains level " + challenge.getLevel());
// Make it
level = new ChallengeLevels();
level.setUniqueId(challenge.getLevel());
//Bukkit.getLogger().info("DEBUG: Level unique Id set to " + level.getUniqueId());
lvConfig.saveConfigObject(level);
}
if (challengeList.containsKey(level)) {
//Bukkit.getLogger().info("DEBUG: Challenge contains level " + level.getUniqueId());
// Replace if this challenge uniqueId already exists
if (challengeList.get(level).contains(challenge)) {
challengeList.get(level).remove(challenge);
}
challengeList.get(level).add(challenge);
} else {
//Bukkit.getLogger().info("DEBUG: No key found");
// First challenge of this level type
Set<Challenges> challenges = new HashSet<>();
challenges.add(challenge);
challengeList.put(level, challenges);
}
}
2018-04-09 00:37:29 +02:00
/**
2018-04-09 01:28:56 +02:00
* Store a challenge level
* @param level the challenge level
2018-04-09 00:37:29 +02:00
*/
2018-04-09 01:28:56 +02:00
public void storeLevel(ChallengeLevels level) {
lvConfig.saveConfigObject(level);
2018-04-09 00:37:29 +02:00
}
2017-11-26 03:17:16 +01:00
}