summaryrefslogtreecommitdiffstats
path: root/src/me/fatpigsarefat/quests/Quests.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/me/fatpigsarefat/quests/Quests.java')
-rw-r--r--src/me/fatpigsarefat/quests/Quests.java426
1 files changed, 426 insertions, 0 deletions
diff --git a/src/me/fatpigsarefat/quests/Quests.java b/src/me/fatpigsarefat/quests/Quests.java
new file mode 100644
index 00000000..2c3a7880
--- /dev/null
+++ b/src/me/fatpigsarefat/quests/Quests.java
@@ -0,0 +1,426 @@
+package me.fatpigsarefat.quests;
+
+import com.google.common.io.ByteStreams;
+import me.fatpigsarefat.quests.bstats.Metrics;
+import me.fatpigsarefat.quests.commands.CommandQuests;
+import me.fatpigsarefat.quests.events.EventInventory;
+import me.fatpigsarefat.quests.events.EventPlayerJoin;
+import me.fatpigsarefat.quests.events.EventPlayerLeave;
+import me.fatpigsarefat.quests.obj.misc.QItemStack;
+import me.fatpigsarefat.quests.player.QPlayer;
+import me.fatpigsarefat.quests.player.QPlayerManager;
+import me.fatpigsarefat.quests.player.questprogressfile.QuestProgress;
+import me.fatpigsarefat.quests.player.questprogressfile.QuestProgressFile;
+import me.fatpigsarefat.quests.player.questprogressfile.TaskProgress;
+import me.fatpigsarefat.quests.quests.Category;
+import me.fatpigsarefat.quests.quests.Quest;
+import me.fatpigsarefat.quests.quests.QuestManager;
+import me.fatpigsarefat.quests.quests.Task;
+import me.fatpigsarefat.quests.quests.tasktypes.*;
+import me.fatpigsarefat.quests.title.*;
+import me.fatpigsarefat.quests.updater.Updater;
+import org.apache.commons.lang.StringUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+
+public class Quests extends JavaPlugin {
+
+ private static Quests instance;
+ private static QuestManager questManager;
+ private static QPlayerManager qPlayerManager;
+ private static TaskTypeManager taskTypeManager;
+ private static Updater updater;
+ private static Title title;
+ private boolean brokenConfig = false;
+
+ public static Quests getInstance() {
+ return instance;
+ }
+
+ public static QuestManager getQuestManager() {
+ return questManager;
+ }
+
+ public static QPlayerManager getPlayerManager() {
+ return qPlayerManager;
+ }
+
+ public static TaskTypeManager getTaskTypeManager() {
+ return taskTypeManager;
+ }
+
+ public boolean isBrokenConfig() {
+ return brokenConfig;
+ }
+
+ public static Title getTitle() {
+ return title;
+ }
+
+ public static Updater getUpdater() {
+ return updater;
+ }
+
+ public static String convertToFormat(long m) {
+ long hours = m / 60;
+ long minutesLeft = m - hours * 60;
+
+ String formattedTime = "";
+
+ if (hours < 10)
+ formattedTime = formattedTime + "0";
+ formattedTime = formattedTime + hours + "h";
+
+ formattedTime = formattedTime + " ";
+
+ if (minutesLeft < 10)
+ formattedTime = formattedTime + "0";
+ formattedTime = formattedTime + minutesLeft + "m";
+
+ return formattedTime;
+ }
+
+ @Override
+ public void onEnable() {
+ instance = this;
+ taskTypeManager = new TaskTypeManager();
+ questManager = new QuestManager();
+ qPlayerManager = new QPlayerManager();
+
+ dataGenerator();
+ setupTitle();
+
+ taskTypeManager.registerTaskType(new MiningTaskType());
+ taskTypeManager.registerTaskType(new MiningCertainTaskType());
+ taskTypeManager.registerTaskType(new BuildingTaskType());
+ taskTypeManager.registerTaskType(new BuildingCertainTaskType());
+ taskTypeManager.registerTaskType(new MobkillingTaskType());
+ taskTypeManager.registerTaskType(new MobkillingCertainTaskType());
+ taskTypeManager.registerTaskType(new PlayerkillingTaskType());
+ taskTypeManager.registerTaskType(new FishingTaskType());
+ taskTypeManager.registerTaskType(new WalkingTaskType());
+ taskTypeManager.registerTaskType(new TamingTaskType());
+ taskTypeManager.registerTaskType(new MilkingTaskType());
+ taskTypeManager.registerTaskType(new ShearingTaskType());
+ if (Bukkit.getPluginManager().isPluginEnabled("ASkyBlock")) {
+ taskTypeManager.registerTaskType(new ASkyBlockLevelType());
+ }
+ if (Bukkit.getPluginManager().isPluginEnabled("uSkyBlock")) {
+ taskTypeManager.registerTaskType(new uSkyBlockLevelType());
+ }
+
+ Bukkit.getPluginCommand("quests").setExecutor(new CommandQuests());
+ Bukkit.getPluginManager().registerEvents(new EventPlayerJoin(), this);
+ Bukkit.getPluginManager().registerEvents(new EventInventory(), this);
+ Bukkit.getPluginManager().registerEvents(new EventPlayerLeave(), this);
+
+ Metrics metrics = new Metrics(this);
+ this.getLogger().log(Level.INFO, "Metrics started. This can be disabled at /plugins/bStats/config.yml.");
+
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ reloadQuests();
+
+ for (Player player : Bukkit.getOnlinePlayers()) {
+ qPlayerManager.loadPlayer(player.getUniqueId());
+ }
+ }
+ }.runTask(this);
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ for (QPlayer qPlayer : qPlayerManager.getQPlayers()) {
+ qPlayer.getQuestProgressFile().saveToDisk();
+ }
+ }
+ }.runTaskTimerAsynchronously(this, 12000L, 12000L);
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ for (QPlayer qPlayer : qPlayerManager.getQPlayers()) {
+ QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile();
+ for (Map.Entry<String, Quest> entry : Quests.getQuestManager().getQuests().entrySet()) {
+ String id = entry.getKey();
+ Quest quest = entry.getValue();
+ QuestProgress questProgress = questProgressFile.getQuestProgress(quest);
+ if (questProgress != null && questProgress.isStarted()) {
+ boolean complete = true;
+ for (TaskProgress taskProgress : questProgress.getTaskProgress()) {
+ if (!taskProgress.isCompleted()) {
+ complete = false;
+ break;
+ }
+ }
+ if (complete) {
+ questProgressFile.completeQuest(quest);
+ }
+ }
+ }
+ }
+ }
+ }.runTaskTimerAsynchronously(this, 20L, 20L);
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ updater = new Updater(Quests.this);
+ updater.check();
+ }
+ }.runTaskAsynchronously(this);
+ }
+
+ @Override
+ public void onDisable() {
+ for (QPlayer qPlayer : qPlayerManager.getQPlayers()) {
+ qPlayer.getQuestProgressFile().saveToDisk();
+ }
+ }
+
+ public void reloadQuests() {
+ questManager.getQuests().clear();
+ questManager.getCategories().clear();
+ taskTypeManager.resetTaskTypes();
+
+ // test file integrity
+ try {
+ YamlConfiguration config = new YamlConfiguration();
+ config.load(new File(String.valueOf(Quests.this.getDataFolder() + File.separator + "config.yml")));
+ } catch (Exception ex) {
+ Quests.this.getLogger().log(Level.SEVERE, "You have a YAML error in your Quests config. If this is your first time using Quests, please remove the Quests folder and RESTART (not reload!) the server and try again.");
+ brokenConfig = true;
+ }
+
+ for (String id : getConfig().getConfigurationSection("categories").getKeys(false)) {
+ ItemStack displayItem = getItemStack("categories." + id + ".display");
+ Category category = new Category(id, displayItem);
+ questManager.registerCategory(category);
+ }
+
+ for (String id : getConfig().getConfigurationSection("quests").getKeys(false)) {
+ String root = "quests." + id;
+
+ QItemStack displayItem = getQItemStack(root + ".display");
+ List<String> rewards = getConfig().getStringList(root + ".rewards");
+ List<String> requirements = getConfig().getStringList(root + ".options.requires");
+ List<String> rewardString = getConfig().getStringList(root + ".options.rewardstring");
+ boolean repeatable = getConfig().getBoolean(root + ".options.repeatable", false);
+ boolean cooldown = getConfig().getBoolean(root + ".options.cooldown.enabled", false);
+ int cooldownTime = getConfig().getInt(root + ".options.cooldown.time", 10);
+ String category = getConfig().getString(root + ".options.category");
+
+ if (rewardString == null) {
+ rewardString = new ArrayList<>();
+ }
+ if (requirements == null) {
+ rewardString = new ArrayList<>();
+ }
+ if (rewards == null) {
+ rewardString = new ArrayList<>();
+ }
+ if (category == null) {
+ category = "";
+ }
+
+
+ Quest quest;
+ if (category.equals("")) {
+ quest = new Quest(id, displayItem, rewards, requirements, repeatable, cooldown, cooldownTime, rewardString);
+ } else {
+ quest = new Quest(id, displayItem, rewards, requirements, repeatable, cooldown, cooldownTime, rewardString, category);
+ Category c = questManager.getCategoryById(category);
+ if (c != null) {
+ c.registerQuestId(id);
+ }
+ }
+
+ for (String taskId : getConfig().getConfigurationSection(root + ".tasks").getKeys(false)) {
+ String taskRoot = root + ".tasks." + taskId;
+ String taskType = getConfig().getString(taskRoot + ".type");
+
+ Task task = new Task(taskId, taskType);
+
+ for (String key : getConfig().getConfigurationSection(taskRoot).getKeys(false)) {
+ task.addConfigValue(key, getConfig().get(taskRoot + "." + key));
+ }
+
+ quest.registerTask(task);
+ }
+
+ this.getLogger().log(Level.INFO, "Registering quest " + quest.getId() + " with " + quest.getTasks().size() + " tasks.");
+ questManager.registerQuest(quest);
+ taskTypeManager.registerQuestTasksWithTaskTypes(quest);
+ }
+ }
+
+ private QItemStack getQItemStack(String path) {
+ String cName = this.getConfig().getString(path + ".name", path + ".name");
+ String cType = this.getConfig().getString(path + ".type", path + ".type");
+ List<String> cLoreNormal = this.getConfig().getStringList(path + ".lore-normal");
+ List<String> cLoreStarted = this.getConfig().getStringList(path + ".lore-started");
+
+ String name;
+ Material type = null;
+ int data = 0;
+ List<String> loreNormal = new ArrayList<>();
+ if (cLoreNormal != null) {
+ for (String s : cLoreNormal) {
+ loreNormal.add(ChatColor.translateAlternateColorCodes('&', s));
+ }
+ }
+ List<String> loreStarted = new ArrayList<>();
+ if (cLoreStarted != null) {
+ for (String s : cLoreStarted) {
+ loreStarted.add(ChatColor.translateAlternateColorCodes('&', s));
+ }
+ }
+ name = ChatColor.translateAlternateColorCodes('&', cName);
+
+ if (StringUtils.isNumeric(cType)) {
+ type = Material.getMaterial(Integer.parseInt(cType));
+ } else if (Material.getMaterial(cType) != null) {
+ type = Material.getMaterial(cType);
+ } else if (cType.contains(":")) {
+ String[] parts = cType.split(":");
+ if (parts.length > 1) {
+ if (StringUtils.isNumeric(parts[0])) {
+ type = Material.getMaterial(Integer.parseInt(parts[0]));
+ } else if (Material.getMaterial(parts[0]) != null) {
+ type = Material.getMaterial(parts[0]);
+ }
+ if (StringUtils.isNumeric(parts[1])) {
+ data = Integer.parseInt(parts[1]);
+ }
+ }
+ }
+
+ if (type == null) {
+ type = Material.STONE;
+ }
+
+ QItemStack is = new QItemStack(name, loreNormal, loreStarted, type, data);
+
+ return is;
+ }
+
+ public ItemStack getItemStack(String path) {
+ String cName = this.getConfig().getString(path + ".name", path + ".name");
+ String cType = this.getConfig().getString(path + ".type", path + ".type");
+ List<String> cLore = this.getConfig().getStringList(path + ".lore");
+
+ String name;
+ Material type = null;
+ int data = 0;
+ List<String> lore = new ArrayList<>();
+ if (cLore != null) {
+ for (String s : cLore) {
+ lore.add(ChatColor.translateAlternateColorCodes('&', s));
+ }
+ }
+ name = ChatColor.translateAlternateColorCodes('&', cName);
+
+ if (StringUtils.isNumeric(cType)) {
+ type = Material.getMaterial(Integer.parseInt(cType));
+ } else if (Material.getMaterial(cType) != null) {
+ type = Material.getMaterial(cType);
+ } else if (cType.contains(":")) {
+ String[] parts = cType.split(":");
+ if (parts.length > 1) {
+ if (StringUtils.isNumeric(parts[0])) {
+ type = Material.getMaterial(Integer.parseInt(parts[0]));
+ } else if (Material.getMaterial(parts[0]) != null) {
+ type = Material.getMaterial(parts[0]);
+ }
+ if (StringUtils.isNumeric(parts[1])) {
+ data = Integer.parseInt(parts[1]);
+ }
+ }
+ }
+
+ if (type == null) {
+ type = Material.STONE;
+ }
+
+ ItemStack is = new ItemStack(type, 1, (short) data);
+ ItemMeta ism = is.getItemMeta();
+ ism.setLore(lore);
+ ism.setDisplayName(name);
+ is.setItemMeta(ism);
+
+ return is;
+ }
+
+ private boolean setupTitle() {
+ String version;
+ try {
+ version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
+ } catch (ArrayIndexOutOfBoundsException e) {
+ return false;
+ }
+ boolean success = false;
+ getLogger().info("Your server is running version " + version);
+ if (version.equals("v1_8_R3")) {
+ title = new Title_v1_8_R3();
+ success = true;
+ } else if (version.equals("v1_8_R2")) {
+ title = new Title_v1_8_R2();
+ success = true;
+ } else if (version.equals("v1_8_R1")) {
+ title = new Title_v1_8_R1();
+ success = true;
+ } else if (version.equals("v1_9_R2")) {
+ title = new Title_v1_9_R2();
+ success = true;
+ } else if (version.equals("v1_9_R1")) {
+ title = new Title_v1_9_R1();
+ success = true;
+ } else if (version.equals("v1_10_R1")) {
+ title = new Title_v1_10_R1();
+ success = true;
+ } else if (version.equals("v1_11_R1")) {
+ title = new Title_v1_11_R1();
+ success = true;
+ } else if (version.equals("v1_12_R1")) {
+ title = new Title_v1_12_R1();
+ success = true;
+ } else {
+ title = new Title_Other();
+ }
+ return success;
+ }
+
+ private void dataGenerator() {
+ File directory = new File(String.valueOf(this.getDataFolder()));
+ if (!directory.exists() && !directory.isDirectory()) {
+ directory.mkdir();
+ }
+
+ File config = new File(this.getDataFolder() + File.separator + "config.yml");
+ if (!config.exists()) {
+ try {
+ config.createNewFile();
+ try (InputStream in = Quests.class.getClassLoader().getResourceAsStream("config.yml")) {
+ OutputStream out = new FileOutputStream(config);
+ ByteStreams.copy(in, out);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ return;
+ }
+ }
+ }
+}