1
0
mirror of https://github.com/Zrips/Jobs.git synced 2025-01-09 17:57:45 +01:00
Jobs/com/gamingmesh/jobs/config/JobConfig.java
Zrips afa7d00939 Added option to turn off MythicMob support, as it will brake if you
using old version of it.
Optimized Jobs long shutdown caused by Explorer feature recording to
data base taking to much time. Now its more or less instantaneous.
Fixed (fingers crossed) issue with limited items, now its should work
properly.
Changed item name in itemList.yml for flint
Changed default jobConfig.yml file, now there will be job with name of
exampleJob witch one will be ignored even if left in config file.Put
proper Woodcutter job beneath it to serve as correct woodcutter job.
2016-01-30 14:45:13 +02:00

562 lines
21 KiB
Java

/**
* Jobs Plugin for Bukkit
* Copyright (C) 2011 Zak Ford <zak.j.ford@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.gamingmesh.jobs.config;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.lang.StringEscapeUtils;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import com.gamingmesh.jobs.Jobs;
import com.gamingmesh.jobs.JobsPlugin;
import com.gamingmesh.jobs.container.ActionType;
import com.gamingmesh.jobs.container.DisplayMethod;
import com.gamingmesh.jobs.container.Job;
import com.gamingmesh.jobs.container.JobCommands;
import com.gamingmesh.jobs.container.JobConditions;
import com.gamingmesh.jobs.container.JobInfo;
import com.gamingmesh.jobs.container.JobItems;
import com.gamingmesh.jobs.container.JobLimitedItems;
import com.gamingmesh.jobs.container.JobPermission;
import com.gamingmesh.jobs.resources.jfep.Parser;
import com.gamingmesh.jobs.stuff.ChatColor;
public class JobConfig {
private JobsPlugin plugin;
public JobConfig(JobsPlugin plugin) {
this.plugin = plugin;
}
public void reload() throws IOException {
// job settings
loadJobSettings();
}
/**
* Method to load the jobs configuration
*
* loads from Jobs/jobConfig.yml
* @throws IOException
*/
@SuppressWarnings("deprecation")
private void loadJobSettings() throws IOException {
File f = new File(plugin.getDataFolder(), "jobConfig.yml");
InputStreamReader s = new InputStreamReader(new FileInputStream(f), "UTF-8");
ArrayList<Job> jobs = new ArrayList<Job>();
Jobs.setJobs(jobs);
Jobs.setNoneJob(null);
if (!f.exists()) {
try {
f.createNewFile();
} catch (IOException e) {
Jobs.getPluginLogger().severe("Unable to create jobConfig.yml! No jobs were loaded!");
s.close();
return;
}
}
YamlConfiguration conf = new YamlConfiguration();
conf.options().pathSeparator('/');
try {
conf.load(s);
s.close();
} catch (Exception e) {
Bukkit.getServer().getLogger().severe("==================== Jobs ====================");
Bukkit.getServer().getLogger().severe("Unable to load jobConfig.yml!");
Bukkit.getServer().getLogger().severe("Check your config for formatting issues!");
Bukkit.getServer().getLogger().severe("No jobs were loaded!");
Bukkit.getServer().getLogger().severe("Error: " + e.getMessage());
Bukkit.getServer().getLogger().severe("==============================================");
return;
}
//conf.options().header(new StringBuilder().append("Jobs configuration.").append(System.getProperty("line.separator")).append(System.getProperty("line.separator")).append("Stores information about each job.").append(System.getProperty("line.separator")).append(System.getProperty("line.separator")).append("For example configurations, visit http://dev.bukkit.org/bukkit-plugins/jobs-reborn/.").append(System.getProperty("line.separator")).toString());
ConfigurationSection jobsSection = conf.getConfigurationSection("Jobs");
//if (jobsSection == null) {
// jobsSection = conf.createSection("Jobs");
//}
for (String jobKey : jobsSection.getKeys(false)) {
// Ignoring example job
if (jobKey.equalsIgnoreCase("exampleJob"))
continue;
ConfigurationSection jobSection = jobsSection.getConfigurationSection(jobKey);
String jobName = jobSection.getString("fullname");
// Translating unicode
jobName = StringEscapeUtils.unescapeJava(jobName);
if (jobName == null) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid fullname property. Skipping job!");
continue;
}
int maxLevel = jobSection.getInt("max-level", 0);
if (maxLevel < 0)
maxLevel = 0;
int vipmaxLevel = jobSection.getInt("vip-max-level", 0);
if (vipmaxLevel < 0)
vipmaxLevel = 0;
Integer maxSlots = jobSection.getInt("slots", 0);
if (maxSlots.intValue() <= 0) {
maxSlots = null;
}
String jobShortName = jobSection.getString("shortname");
if (jobShortName == null) {
Jobs.getPluginLogger().warning("Job " + jobKey + " is missing the shortname property. Skipping job!");
continue;
}
String description = org.bukkit.ChatColor.translateAlternateColorCodes('&', jobSection.getString("description", ""));
ChatColor color = ChatColor.WHITE;
if (jobSection.contains("ChatColour")) {
color = ChatColor.matchColor(jobSection.getString("ChatColour", ""));
if (color == null) {
color = ChatColor.WHITE;
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid ChatColour property. Defaulting to WHITE!");
}
}
DisplayMethod displayMethod = DisplayMethod.matchMethod(jobSection.getString("chat-display", ""));
if (displayMethod == null) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid chat-display property. Defaulting to None!");
displayMethod = DisplayMethod.NONE;
}
Parser maxExpEquation;
String maxExpEquationInput = jobSection.getString("leveling-progression-equation");
try {
maxExpEquation = new Parser(maxExpEquationInput);
// test equation
maxExpEquation.setVariable("numjobs", 1);
maxExpEquation.setVariable("joblevel", 1);
maxExpEquation.getValue();
} catch (Exception e) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid leveling-progression-equation property. Skipping job!");
continue;
}
Parser incomeEquation;
String incomeEquationInput = jobSection.getString("income-progression-equation");
try {
incomeEquation = new Parser(incomeEquationInput);
// test equation
incomeEquation.setVariable("numjobs", 1);
incomeEquation.setVariable("joblevel", 1);
incomeEquation.setVariable("baseincome", 1);
incomeEquation.getValue();
} catch (Exception e) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid income-progression-equation property. Skipping job!");
continue;
}
Parser expEquation;
String expEquationInput = jobSection.getString("experience-progression-equation");
try {
expEquation = new Parser(expEquationInput);
// test equation
expEquation.setVariable("numjobs", 1);
expEquation.setVariable("joblevel", 1);
expEquation.setVariable("baseexperience", 1);
expEquation.getValue();
} catch (Exception e) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid experience-progression-equation property. Skipping job!");
continue;
}
// Gui item
ItemStack GUIitem = new ItemStack(Material.getMaterial(35), 1, (byte) 13);
if (jobSection.contains("Gui")) {
ConfigurationSection guiSection = jobSection.getConfigurationSection("Gui");
if (guiSection.contains("Id") && guiSection.contains("Data") && guiSection.isInt("Id") && guiSection.isInt("Data")) {
GUIitem = new ItemStack(Material.getMaterial(guiSection.getInt("Id")), 1, (byte) guiSection.getInt("Data"));
} else
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid Gui property. Please fix this if you want to use it!");
}
// Permissions
ArrayList<JobPermission> jobPermissions = new ArrayList<JobPermission>();
ConfigurationSection permissionsSection = jobSection.getConfigurationSection("permissions");
if (permissionsSection != null) {
for (String permissionKey : permissionsSection.getKeys(false)) {
ConfigurationSection permissionSection = permissionsSection.getConfigurationSection(permissionKey);
String node = permissionKey.toLowerCase();
if (permissionSection == null) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid permission key" + permissionKey + "!");
continue;
}
boolean value = permissionSection.getBoolean("value", true);
int levelRequirement = permissionSection.getInt("level", 0);
jobPermissions.add(new JobPermission(node, value, levelRequirement));
}
}
// Conditions
ArrayList<JobConditions> jobConditions = new ArrayList<JobConditions>();
ConfigurationSection conditionsSection = jobSection.getConfigurationSection("conditions");
if (conditionsSection != null) {
for (String ConditionKey : conditionsSection.getKeys(false)) {
ConfigurationSection permissionSection = conditionsSection.getConfigurationSection(ConditionKey);
String node = ConditionKey.toLowerCase();
if (permissionSection == null) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid condition key " + ConditionKey + "!");
continue;
}
if (!permissionSection.contains("requires") || !permissionSection.contains("perform")) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid condition requirement " + ConditionKey + "!");
continue;
}
List<String> requires = permissionSection.getStringList("requires");
List<String> perform = permissionSection.getStringList("perform");
jobConditions.add(new JobConditions(node, requires, perform));
}
}
// Command on leave
List<String> JobsCommandOnLeave = new ArrayList<String>();
if (jobSection.isList("cmd-on-leave")) {
JobsCommandOnLeave = jobSection.getStringList("cmd-on-leave");
}
// Command on join
List<String> JobsCommandOnJoin = new ArrayList<String>();
if (jobSection.isList("cmd-on-join")) {
JobsCommandOnJoin = jobSection.getStringList("cmd-on-join");
}
// Commands
ArrayList<JobCommands> jobCommand = new ArrayList<JobCommands>();
ConfigurationSection commandsSection = jobSection.getConfigurationSection("commands");
if (commandsSection != null) {
for (String commandKey : commandsSection.getKeys(false)) {
ConfigurationSection commandSection = commandsSection.getConfigurationSection(commandKey);
String node = commandKey.toLowerCase();
if (commandSection == null) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid command key" + commandKey + "!");
continue;
}
String command = commandSection.getString("command");
int levelFrom = commandSection.getInt("levelFrom");
int levelUntil = commandSection.getInt("levelUntil");
jobCommand.add(new JobCommands(node, command, levelFrom, levelUntil));
}
}
// Items
ArrayList<JobItems> jobItems = new ArrayList<JobItems>();
ConfigurationSection itemsSection = jobSection.getConfigurationSection("items");
if (itemsSection != null) {
for (String itemKey : itemsSection.getKeys(false)) {
ConfigurationSection itemSection = itemsSection.getConfigurationSection(itemKey);
String node = itemKey.toLowerCase();
if (itemSection == null) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid item key " + itemKey + "!");
continue;
}
int id = itemSection.getInt("id");
String name = null;
if (itemSection.isString("name"))
name = itemSection.getString("name");
List<String> lore = new ArrayList<String>();
if (itemSection.getStringList("lore") != null)
for (String eachLine : itemSection.getStringList("lore")) {
lore.add(org.bukkit.ChatColor.translateAlternateColorCodes('&', eachLine));
}
HashMap<Enchantment, Integer> enchants = new HashMap<Enchantment, Integer>();
if (itemSection.getStringList("enchants") != null)
for (String eachLine : itemSection.getStringList("enchants")) {
if (!eachLine.contains("="))
continue;
Enchantment ench = Enchantment.getByName(eachLine.split("=")[0]);
Integer level = -1;
try {
level = Integer.parseInt(eachLine.split("=")[1]);
} catch (NumberFormatException e) {
continue;
}
if (ench != null && level != -1)
enchants.put(ench, level);
}
Double moneyBoost = itemSection.getDouble("moneyBoost");
Double expBoost = itemSection.getDouble("expBoost");
jobItems.add(new JobItems(node, id, name, lore, enchants, moneyBoost, expBoost));
}
}
// Limited Items
ArrayList<JobLimitedItems> jobLimitedItems = new ArrayList<JobLimitedItems>();
ConfigurationSection LimitedItemsSection = jobSection.getConfigurationSection("limitedItems");
if (LimitedItemsSection != null) {
for (String itemKey : LimitedItemsSection.getKeys(false)) {
ConfigurationSection itemSection = LimitedItemsSection.getConfigurationSection(itemKey);
String node = itemKey.toLowerCase();
if (itemSection == null) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid item key " + itemKey + "!");
continue;
}
int id = itemSection.getInt("id");
String name = null;
if (itemSection.isString("name"))
name = itemSection.getString("name");
List<String> lore = new ArrayList<String>();
if (itemSection.getStringList("lore") != null)
for (String eachLine : itemSection.getStringList("lore")) {
lore.add(org.bukkit.ChatColor.translateAlternateColorCodes('&', eachLine));
}
HashMap<Enchantment, Integer> enchants = new HashMap<Enchantment, Integer>();
if (itemSection.getStringList("enchants") != null)
for (String eachLine : itemSection.getStringList("enchants")) {
if (!eachLine.contains("="))
continue;
Enchantment ench = Enchantment.getByName(eachLine.split("=")[0]);
Integer level = -1;
try {
level = Integer.parseInt(eachLine.split("=")[1]);
} catch (NumberFormatException e) {
continue;
}
if (ench != null && level != -1)
enchants.put(ench, level);
}
int level = itemSection.getInt("level");
jobLimitedItems.add(new JobLimitedItems(node, id, name, lore, enchants, level));
}
}
Job job = new Job(jobName, jobShortName, description, color, maxExpEquation, displayMethod, maxLevel, vipmaxLevel, maxSlots, jobPermissions, jobCommand,
jobConditions, jobItems, jobLimitedItems, JobsCommandOnJoin, JobsCommandOnLeave, GUIitem);
for (ActionType actionType : ActionType.values()) {
ConfigurationSection typeSection = jobSection.getConfigurationSection(actionType.getName());
ArrayList<JobInfo> jobInfo = new ArrayList<JobInfo>();
if (typeSection != null) {
for (String key : typeSection.getKeys(false)) {
ConfigurationSection section = typeSection.getConfigurationSection(key);
String myKey = key;
String type = null;
String subType = "";
String meta = "";
int id = 0;
if (myKey.contains("-")) {
// uses subType
subType = ":" + myKey.split("-")[1];
meta = myKey.split("-")[1];
myKey = myKey.split("-")[0];
}
Material material = Material.matchMaterial(myKey);
if (material == null)
material = Material.getMaterial(myKey.replace(" ", "_").toUpperCase());
if (material == null) {
// try integer method
Integer matId = null;
try {
matId = Integer.valueOf(myKey);
} catch (NumberFormatException e) {
}
if (matId != null) {
material = Material.getMaterial(matId);
if (material != null) {
Jobs.getPluginLogger().warning("Job " + jobKey + " " + actionType.getName() + " is using ID: " + key + "!");
Jobs.getPluginLogger().warning("Please use the Material name instead: " + material.toString() + "!");
}
}
}
if (actionType == ActionType.EXPLORE)
material = null;
if (material != null) {
// Break and Place actions MUST be blocks
if (actionType == ActionType.BREAK || actionType == ActionType.PLACE) {
if (!material.isBlock()) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid " + actionType.getName() + " type property: " + key
+ "! Material must be a block!");
continue;
}
}
// START HACK
/*
* Historically, GLOWING_REDSTONE_ORE would ONLY work as REDSTONE_ORE, and putting
* GLOWING_REDSTONE_ORE in the configuration would not work. Unfortunately, this is
* completely backwards and wrong.
*
* To maintain backwards compatibility, all instances of REDSTONE_ORE should normalize
* to GLOWING_REDSTONE_ORE, and warn the user to change their configuration. In the
* future this hack may be removed and anybody using REDSTONE_ORE will have their
* configurations broken.
*/
if (material == Material.REDSTONE_ORE && actionType == ActionType.BREAK) {
Jobs.getPluginLogger().warning("Job " + jobKey + " is using REDSTONE_ORE instead of GLOWING_REDSTONE_ORE.");
Jobs.getPluginLogger().warning("Automatically changing block to GLOWING_REDSTONE_ORE. Please update your configuration.");
Jobs.getPluginLogger().warning("In vanilla minecraft, REDSTONE_ORE changes to GLOWING_REDSTONE_ORE when interacted with.");
Jobs.getPluginLogger().warning("In the future, Jobs using REDSTONE_ORE instead of GLOWING_REDSTONE_ORE may fail to work correctly.");
material = Material.GLOWING_REDSTONE_ORE;
}
// END HACK
type = material.toString();
id = material.getId();
} else if (actionType == ActionType.KILL || actionType == ActionType.TAME || actionType == ActionType.BREED || actionType == ActionType.MILK) {
// check entities
EntityType entity = EntityType.fromName(key);
if (entity == null) {
try {
entity = EntityType.valueOf(key.toUpperCase());
} catch (IllegalArgumentException e) {
}
}
if (entity != null && entity.isAlive()) {
type = entity.toString();
id = entity.getTypeId();
// using breeder finder
if (actionType == ActionType.BREED)
ConfigManager.getJobsConfiguration().setBreederFinder(true);
}
// Just to recognize wither skeleton
if (key.equalsIgnoreCase("WitherSkeleton")) {
type = "WitherSkeleton";
id = 51;
meta = "1";
}
// Just to recognize Zombie Villager
if (key.equalsIgnoreCase("ZombieVillager")) {
type = "ZombieVillager";
id = 54;
meta = "1";
}
// Just to recognize Elder Guardian
if (key.equalsIgnoreCase("ElderGuardian")) {
type = "ElderGuardian";
id = 68;
meta = "1";
}
} else if (actionType == ActionType.ENCHANT && material == null) {
Enchantment enchant = Enchantment.getByName(myKey);
if (enchant != null)
id = enchant.getId();
type = myKey;
} else if (actionType == ActionType.CUSTOMKILL || actionType == ActionType.SHEAR || actionType == ActionType.MMKILL) {
type = myKey;
} else if (actionType == ActionType.EXPLORE) {
type = myKey;
int amount = 10;
try {
amount = Integer.valueOf(myKey);
} catch (NumberFormatException e) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid " + actionType.getName() + " type property: " + key + "!");
continue;
}
Jobs.getExplore().setExploreEnabled();
Jobs.getExplore().setPlayerAmount(amount + 1);
}
if (type == null) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid " + actionType.getName() + " type property: " + key + "!");
continue;
}
if (actionType == ActionType.TNTBREAK)
ConfigManager.getJobsConfiguration().setTntFinder(true);
double income = section.getDouble("income", 0.0);
double experience = section.getDouble("experience", 0.0);
int fromlevel = 1;
if (section.isInt("from-level"))
fromlevel = section.getInt("from-level");
int untilLevel = -1;
if (section.isInt("until-level")) {
untilLevel = section.getInt("until-level");
if (untilLevel < fromlevel) {
Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid until-level in " + actionType.getName() + " for type property: " + key
+ "! It will be not set.");
untilLevel = -1;
}
}
jobInfo.add(new JobInfo(actionType, id, meta, type + subType, income, incomeEquation, experience, expEquation, fromlevel, untilLevel));
}
}
job.setJobInfo(actionType, jobInfo);
}
if (jobKey.equalsIgnoreCase("none")) {
Jobs.setNoneJob(job);
} else {
jobs.add(job);
}
}
//try {
// conf.save(f);
//} catch (IOException e) {
// e.printStackTrace();
//}
}
}