mirror of
https://github.com/BentoBoxWorld/Challenges.git
synced 2024-09-25 13:12:57 +02:00
233 lines
10 KiB
Java
233 lines
10 KiB
Java
|
package bskyblock.addon.challenges;
|
||
|
|
||
|
import java.io.File;
|
||
|
import java.io.IOException;
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.HashMap;
|
||
|
import java.util.List;
|
||
|
import java.util.Map;
|
||
|
|
||
|
import org.apache.commons.lang.StringUtils;
|
||
|
import org.bukkit.Material;
|
||
|
import org.bukkit.configuration.ConfigurationSection;
|
||
|
import org.bukkit.configuration.InvalidConfigurationException;
|
||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||
|
import org.bukkit.entity.EntityType;
|
||
|
import org.bukkit.inventory.ItemStack;
|
||
|
import org.bukkit.inventory.meta.PotionMeta;
|
||
|
import org.bukkit.inventory.meta.SpawnEggMeta;
|
||
|
import org.bukkit.potion.PotionData;
|
||
|
import org.bukkit.potion.PotionType;
|
||
|
|
||
|
import bskyblock.addon.challenges.database.object.Challenges;
|
||
|
|
||
|
public class FreshSqueezedChallenges {
|
||
|
|
||
|
private static final boolean DEBUG = false;
|
||
|
ChallengesAddon addon;
|
||
|
|
||
|
public FreshSqueezedChallenges(ChallengesAddon challengesAddon) {
|
||
|
this.addon = challengesAddon;
|
||
|
makeChallenges();
|
||
|
addon.getChallengesManager().save(true);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Makes the level 1 challenges
|
||
|
*/
|
||
|
private void makeChallenges() {
|
||
|
File challengeFile = new File(addon.getDataFolder(), "challenges.yml");
|
||
|
if (!challengeFile.exists()) {
|
||
|
addon.saveResource("challenges.yml",false);
|
||
|
}
|
||
|
YamlConfiguration chal = new YamlConfiguration();
|
||
|
try {
|
||
|
chal.load(challengeFile);
|
||
|
} catch (IOException | InvalidConfigurationException e) {
|
||
|
addon.getLogger().severe("Could not set up initial challenges");
|
||
|
}
|
||
|
// Parse the challenge file
|
||
|
ConfigurationSection chals = chal.getConfigurationSection("challenges.challengeList");
|
||
|
for (String challenge : chals.getKeys(false)) {
|
||
|
Challenges newChallenge = new Challenges();
|
||
|
newChallenge.setUniqueId(challenge);
|
||
|
ConfigurationSection details = chals.getConfigurationSection(challenge);
|
||
|
newChallenge.setFriendlyName(details.getString("friendlyname", challenge));
|
||
|
newChallenge.setDescription(details.getString("description", ""));
|
||
|
newChallenge.setIcon(parseItem(details.getString("icon") + ":1"));
|
||
|
newChallenge.setLevel(details.getString("level", ChallengesManager.FREE));
|
||
|
newChallenge.setChallengeType(Challenges.ChallengeType.valueOf(details.getString("type","INVENTORY").toUpperCase()));
|
||
|
newChallenge.setTakeItems(details.getBoolean("takeItems",true));
|
||
|
newChallenge.setRewardText(details.getString("rewardText", ""));
|
||
|
newChallenge.setRewardCommands(details.getStringList("rewardcommands"));
|
||
|
newChallenge.setMoneyReward(details.getInt("moneyReward",0));
|
||
|
newChallenge.setExpReward(details.getInt("expReward"));
|
||
|
newChallenge.setRepeatable(details.getBoolean("repeatable"));
|
||
|
newChallenge.setRepeatRewardText(details.getString("repeatRewardText",""));
|
||
|
newChallenge.setRepeatMoneyReward(details.getInt("repearMoneyReward"));
|
||
|
newChallenge.setRepeatExpReward(details.getInt("repeatExpReward"));
|
||
|
newChallenge.setRepeatRewardCommands(details.getStringList("repeatrewardcommands"));
|
||
|
newChallenge.setMaxTimes(details.getInt("maxtimes"));
|
||
|
// TODO reset allowed
|
||
|
newChallenge.setReqMoney(details.getInt("requiredMoney"));
|
||
|
newChallenge.setReqExp(details.getInt("requiredExp"));
|
||
|
if (newChallenge.getChallengeType().equals(Challenges.ChallengeType.INVENTORY)) {
|
||
|
newChallenge.setRequiredItems(parseItems(details.getString("requiredItems","")));
|
||
|
} else if (newChallenge.getChallengeType().equals(Challenges.ChallengeType.LEVEL)) {
|
||
|
newChallenge.setReqIslandlevel(Long.parseLong(details.getString("requiredItems","")));
|
||
|
} else if (newChallenge.getChallengeType().equals(Challenges.ChallengeType.ISLAND)) {
|
||
|
parseEntities(newChallenge, details.getString("requiredItems",""));
|
||
|
}
|
||
|
newChallenge.setItemReward(parseItems(details.getString("itemReward")));
|
||
|
newChallenge.setRepeatItemReward(parseItems(details.getString("repeatItemReward")));
|
||
|
// Save
|
||
|
addon.getChallengesManager().storeChallenge(newChallenge);
|
||
|
}
|
||
|
addon.getChallengesManager().sortChallenges();
|
||
|
}
|
||
|
|
||
|
private void parseEntities(Challenges challenge, String string) {
|
||
|
Map<EntityType, Integer> req = new HashMap<>();
|
||
|
Map<Material, Integer> blocks = new HashMap<>();
|
||
|
if (!string.isEmpty()) {
|
||
|
for (String s : string.split(" ")) {
|
||
|
String[] part = s.split(":");
|
||
|
try {
|
||
|
for (EntityType type : EntityType.values()) {
|
||
|
if (type.toString().equalsIgnoreCase(part[0])) {
|
||
|
req.put(type, Integer.valueOf(part[1]));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
for (Material type : Material.values()) {
|
||
|
if (type.toString().equalsIgnoreCase(part[0])) {
|
||
|
blocks.put(type, Integer.valueOf(part[1]));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} catch (Exception e) {
|
||
|
addon.getLogger().severe("Cannot parse '" + s + "'. Skipping...");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
challenge.setRequiredEntities(req);
|
||
|
challenge.setRequiredBlocks(blocks);
|
||
|
}
|
||
|
|
||
|
private List<ItemStack> parseItems(String reqList) {
|
||
|
List<ItemStack> result = new ArrayList<>();
|
||
|
if (!reqList.isEmpty()) {
|
||
|
for (String s : reqList.split(" ")) {
|
||
|
ItemStack item = parseItem(s);
|
||
|
if (item != null) {
|
||
|
result.add(item);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
@SuppressWarnings("deprecation")
|
||
|
private ItemStack parseItem(String s) {
|
||
|
Material reqItem = null;
|
||
|
int reqAmount = 0;
|
||
|
String[] part = s.split(":");
|
||
|
// Correct some common mistakes
|
||
|
if (part[0].equalsIgnoreCase("potato")) {
|
||
|
part[0] = "POTATO_ITEM";
|
||
|
} else if (part[0].equalsIgnoreCase("brewing_stand")) {
|
||
|
part[0] = "BREWING_STAND_ITEM";
|
||
|
} else if (part[0].equalsIgnoreCase("carrot")) {
|
||
|
part[0] = "CARROT_ITEM";
|
||
|
} else if (part[0].equalsIgnoreCase("cauldron")) {
|
||
|
part[0] = "CAULDRON_ITEM";
|
||
|
} else if (part[0].equalsIgnoreCase("skull")) {
|
||
|
part[0] = "SKULL_ITEM";
|
||
|
}
|
||
|
// TODO: add netherwart vs. netherstalk?
|
||
|
// Material:Qty
|
||
|
if (part.length == 2) {
|
||
|
try {
|
||
|
if (StringUtils.isNumeric(part[0])) {
|
||
|
reqItem = Material.getMaterial(Integer.parseInt(part[0]));
|
||
|
} else {
|
||
|
reqItem = Material.getMaterial(part[0].toUpperCase());
|
||
|
}
|
||
|
reqAmount = Integer.parseInt(part[1]);
|
||
|
ItemStack item = new ItemStack(reqItem);
|
||
|
if (DEBUG) {
|
||
|
addon.getLogger().info("DEBUG: required item = " + reqItem.toString());
|
||
|
addon.getLogger().info("DEBUG: item amount = " + reqAmount);
|
||
|
}
|
||
|
return item;
|
||
|
|
||
|
} catch (Exception e) {
|
||
|
addon.getLogger().severe("Problem with " + s + " in challenges.yml!");
|
||
|
}
|
||
|
} else if (part.length == 3) {
|
||
|
if (DEBUG)
|
||
|
addon.getLogger().info("DEBUG: Item with durability");
|
||
|
if (StringUtils.isNumeric(part[0])) {
|
||
|
reqItem = Material.getMaterial(Integer.parseInt(part[0]));
|
||
|
} else {
|
||
|
reqItem = Material.getMaterial(part[0].toUpperCase());
|
||
|
}
|
||
|
reqAmount = Integer.parseInt(part[2]);
|
||
|
ItemStack item = new ItemStack(reqItem);
|
||
|
int reqDurability = 0;
|
||
|
if (StringUtils.isNumeric(part[1])) {
|
||
|
reqDurability = Integer.parseInt(part[1]);
|
||
|
item.setDurability((short) reqDurability);
|
||
|
} else if (reqItem.equals(Material.MONSTER_EGG)) {
|
||
|
reqDurability = -1; // non existent
|
||
|
// Check if this is a string
|
||
|
EntityType entityType = EntityType.valueOf(part[1]);
|
||
|
item = new ItemStack(Material.MONSTER_EGG);
|
||
|
SpawnEggMeta meta = ((SpawnEggMeta)item.getItemMeta());
|
||
|
meta.setSpawnedType(entityType);
|
||
|
item.setItemMeta(meta);
|
||
|
}
|
||
|
return item;
|
||
|
} else if (part.length == 6 && part[0].contains("POTION")) {
|
||
|
try {
|
||
|
reqAmount = Integer.parseInt(part[5]);
|
||
|
if (DEBUG)
|
||
|
addon.getLogger().info("DEBUG: required amount is " + reqAmount);
|
||
|
} catch (Exception e) {
|
||
|
addon.getLogger().severe("Could not parse the quantity of the potion item " + s);
|
||
|
return null;
|
||
|
}
|
||
|
/*
|
||
|
* # Format POTION:NAME:<LEVEL>:<EXTENDED>:<SPLASH/LINGER>:QTY
|
||
|
# LEVEL, EXTENDED, SPLASH, LINGER are optional.
|
||
|
# LEVEL is a number, 1 or 2
|
||
|
# LINGER is for V1.9 servers and later
|
||
|
# Examples:
|
||
|
# POTION:STRENGTH:1:EXTENDED:SPLASH:1
|
||
|
# POTION:INSTANT_DAMAGE:2::LINGER:2
|
||
|
# POTION:JUMP:2:NOTEXTENDED:NOSPLASH:1
|
||
|
# POTION:WEAKNESS::::1 - any weakness potion
|
||
|
*/
|
||
|
ItemStack item = part[4].isEmpty() ? new ItemStack(Material.POTION) : part[4].equalsIgnoreCase("SPLASH")
|
||
|
? new ItemStack(Material.SPLASH_POTION) : new ItemStack(Material.LINGERING_POTION);
|
||
|
PotionMeta potionMeta = (PotionMeta)(item.getItemMeta());
|
||
|
PotionType type = PotionType.valueOf(part[1].toUpperCase());
|
||
|
boolean isExtended = part[3].equalsIgnoreCase("EXTENDED") ? true : false;
|
||
|
boolean isUpgraded = (part[4].isEmpty() || part[4].equalsIgnoreCase("1")) ? false: true;
|
||
|
PotionData data = new PotionData(type, isExtended, isUpgraded);
|
||
|
potionMeta.setBasePotionData(data);
|
||
|
|
||
|
item.setAmount(reqAmount);
|
||
|
return item;
|
||
|
|
||
|
} else {
|
||
|
addon.getLogger().severe("Problem with " + s + " in challenges.yml!");
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|