diff options
148 files changed, 3340 insertions, 3580 deletions
diff --git a/build.gradle b/build.gradle index 7bb52b03..c6183574 100644 --- a/build.gradle +++ b/build.gradle @@ -1,139 +1,29 @@ plugins { id 'java' - id 'com.github.johnrengelman.shadow' version '6.1.0' - id 'maven-publish' + id 'com.github.johnrengelman.shadow' version '7.0.0' } -group = 'com.leonardobishop' -version = '2.18' +defaultTasks 'allJar' -processResources { - duplicatesStrategy = 'include' - from(sourceSets.main.resources.srcDirs) { - include 'plugin.yml' - expand('version': project.version) - } -} +subprojects { + apply plugin: 'java' -repositories { - // Spigot - maven { url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' } - // ASkyBlock, BentoBox - maven { url = 'https://repo.codemc.org/repository/maven-public/' } - // uSkyBlock - maven { url = 'https://raw.github.com/rlf/uSkyBlock/mvn-repo/' } - // Citizens - maven { url = 'https://repo.citizensnpcs.co/' } - // MythicMobs - maven { url = 'https://mvn.lumine.io/repository/maven-public/' } - // PlaceholderAPI - maven { url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' } - // EssentialsX - maven { url = 'https://repo.essentialsx.net/releases/' } - // JitPack (IridiumSkyblock, ShopGUI+) - maven { url = 'https://jitpack.io' } - // CoreProtect - maven { url = 'https://maven.playpro.com/' } - // bStats - maven { url = uri('https://repo.codemc.org/repository/maven-public') } - mavenCentral() -} + group = 'com.leonardobishop' + version = '3.0' -dependencies { - // Spigot - compileOnly ('org.spigotmc:spigot-api:1.16.4-R0.1-SNAPSHOT') { - exclude group: 'net.md-5', module: 'bungeecord-chat' - exclude group: 'com.google.guava', module: 'guava' - exclude group: 'org.yaml', module: 'snakeyaml' - } - // ASkyBlock - compileOnly ('com.wasteofplastic:askyblock:3.0.9.4') { - exclude group: 'net.milkbowl.vault', module: 'VaultAPI' - } - // BentoBox (bSkyBlock) - compileOnly ('world.bentobox:bentobox:1.15.5-SNAPSHOT') { - exclude group: 'org.eclipse.jdt', module: 'org.eclipse.jdt.annotation' - exclude group: 'org.mongodb', module: 'mongodb-driver' - } - // IridiumSkyblock - // TODO fix whenever repo is up - // compileOnly 'com.github.Iridium-Development:IridiumSkyblock:master-SNAPSHOT' - // download from spigot and add to /libs/ yourself - // uSkyBlock - compileOnly 'com.github.rlf:uSkyBlock-API:2.6.4' - // MythicMobs - compileOnly 'io.lumine.xikage:MythicMobs:4.11.0-BETA' - // Citizens - compileOnly ('net.citizensnpcs:citizens:2.0.27-SNAPSHOT') { - exclude group: 'net.citizensnpcs', module: 'citizens-main' - exclude group: 'net.citizensnpcs', module: 'citizens-v1_8_R3' - exclude group: 'net.citizensnpcs', module: 'citizens-v1_12_R1' - exclude group: 'net.citizensnpcs', module: 'citizens-v1_13_R2' - exclude group: 'net.citizensnpcs', module: 'citizens-v1_14_R1' - exclude group: 'net.citizensnpcs', module: 'citizens-v1_15_R1' - exclude group: 'net.citizensnpcs', module: 'citizens-v1_16_R3' - } - // PlaceholderAPI - compileOnly 'me.clip:placeholderapi:2.10.9' - // EssentialsX - compileOnly "net.ess3:EssentialsX:2.18.2" - // ShopGUI+ - compileOnly 'com.github.brcdev-minecraft:shopgui-api:master-SNAPSHOT' - // CoreProtect - compileOnly ('net.coreprotect:coreprotect:2.18.2') { - exclude group: 'com.sk89q.worldedit', module: 'worldedit-bukkit' - } - // bStats - implementation 'org.bstats:bstats-bukkit-lite:1.8' - // HikariCP - implementation 'com.zaxxer:HikariCP:4.0.3' - // slf4j - implementation 'org.slf4j:slf4j-simple:1.7.30' + sourceCompatibility = 1.8 + targetCompatibility = 1.8 - compileOnly fileTree(dir: 'libs', includes: ['*.jar']) } -shadowJar { - relocate 'org.bstats', 'com.leonardobishop.quests.libs.bstats' - relocate 'com.zaxxer.hikari', 'com.leonardobishop.quests.libs.hikaricp' - relocate 'org.slf4j', 'com.leonardobishop.quests.libs.slf4j' - archiveClassifier.set('') -} - -publishing { - publications { - maven(MavenPublication) { - groupId = 'com.leonardobishop' - artifactId = 'quests' - version = project.version - - from components.java - pom.withXml { - asNode().dependencies.dependency.each { dep -> - dep.parent().remove(dep) - } - } - } - } - - repositories { - maven { - credentials { - username = project.findProperty('mavenUser') ?: System.getenv('MAVEN_USER') - password = project.findProperty('mavenPassword') ?: System.getenv('MAVEN_PASSWORD') - } - url = "https://repo.leonardobishop.com/releases/" +task allJar( type: Jar, dependsOn: subprojects.tasks['build'] ) { + subprojects.each { subproject -> + from subproject.configurations.archives.allArtifacts.files.collect { + zipTree(it) } } } -jar.enabled = true - -tasks.build { - dependsOn(tasks.shadowJar) -} - -compileJava { - sourceCompatibility = '1.8' - targetCompatibility = '1.8' +artifacts { + archives allJar } diff --git a/bukkit/build.gradle b/bukkit/build.gradle new file mode 100644 index 00000000..f12ab459 --- /dev/null +++ b/bukkit/build.gradle @@ -0,0 +1,102 @@ +plugins { + id 'java' + id 'com.github.johnrengelman.shadow' +} + +processResources { + duplicatesStrategy = 'include' + from(sourceSets.main.resources.srcDirs) { + include 'plugin.yml' + expand('version': project.version) + } +} + +repositories { + // Spigot + maven { url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' } + // ASkyBlock, BentoBox + maven { url = 'https://repo.codemc.org/repository/maven-public/' } + // uSkyBlock + maven { url = 'https://raw.github.com/rlf/uSkyBlock/mvn-repo/' } + // Citizens + maven { url = 'https://repo.citizensnpcs.co/' } + // MythicMobs + maven { url = 'https://mvn.lumine.io/repository/maven-public/' } + // PlaceholderAPI + maven { url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' } + // EssentialsX + maven { url = 'https://repo.essentialsx.net/releases/' } + // JitPack (IridiumSkyblock, ShopGUI+) + maven { url = 'https://jitpack.io' } + // CoreProtect + maven { url = 'https://maven.playpro.com/' } + // bStats + maven { url = uri('https://repo.codemc.org/repository/maven-public') } + mavenCentral() +} + +dependencies { + compileOnly project(':common') + // Spigot + compileOnly ('org.spigotmc:spigot-api:1.16.4-R0.1-SNAPSHOT') { + exclude group: 'net.md-5', module: 'bungeecord-chat' + exclude group: 'com.google.guava', module: 'guava' + exclude group: 'org.yaml', module: 'snakeyaml' + } + // ASkyBlock + compileOnly ('com.wasteofplastic:askyblock:3.0.9.4') { + exclude group: 'net.milkbowl.vault', module: 'VaultAPI' + } + // BentoBox (bSkyBlock) + compileOnly ('world.bentobox:bentobox:1.15.5-SNAPSHOT') { + exclude group: 'org.eclipse.jdt', module: 'org.eclipse.jdt.annotation' + exclude group: 'org.mongodb', module: 'mongodb-driver' + } + // IridiumSkyblock + // TODO fix whenever repo is up + // compileOnly 'com.github.Iridium-Development:IridiumSkyblock:master-SNAPSHOT' + // download from spigot and add to /libs/ yourself + // uSkyBlock + compileOnly 'com.github.rlf:uSkyBlock-API:2.6.4' + // MythicMobs + compileOnly 'io.lumine.xikage:MythicMobs:4.11.0-BETA' + // Citizens + compileOnly ('net.citizensnpcs:citizens:2.0.27-SNAPSHOT') { + exclude group: 'net.citizensnpcs', module: 'citizens-main' + exclude group: 'net.citizensnpcs', module: 'citizens-v1_8_R3' + exclude group: 'net.citizensnpcs', module: 'citizens-v1_12_R1' + exclude group: 'net.citizensnpcs', module: 'citizens-v1_13_R2' + exclude group: 'net.citizensnpcs', module: 'citizens-v1_14_R1' + exclude group: 'net.citizensnpcs', module: 'citizens-v1_15_R1' + exclude group: 'net.citizensnpcs', module: 'citizens-v1_16_R3' + } + // PlaceholderAPI + compileOnly 'me.clip:placeholderapi:2.10.9' + // EssentialsX + compileOnly "net.ess3:EssentialsX:2.18.2" + // ShopGUI+ + compileOnly 'com.github.brcdev-minecraft:shopgui-api:master-SNAPSHOT' + // CoreProtect + compileOnly ('net.coreprotect:coreprotect:2.18.2') { + exclude group: 'com.sk89q.worldedit', module: 'worldedit-bukkit' + } + // bStats + implementation 'org.bstats:bstats-bukkit-lite:1.8' + // HikariCP + implementation 'com.zaxxer:HikariCP:4.0.3' + // slf4j + implementation 'org.slf4j:slf4j-simple:1.7.30' + + compileOnly fileTree(dir: 'libs', includes: ['*.jar']) +} + +tasks.build { + dependsOn(tasks.shadowJar) +} + +shadowJar { + relocate 'org.bstats', 'com.leonardobishop.quests.libs.bstats' + relocate 'com.zaxxer.hikari', 'com.leonardobishop.quests.libs.hikaricp' + relocate 'org.slf4j', 'com.leonardobishop.quests.libs.slf4j' + archiveClassifier.set('') +}
\ No newline at end of file diff --git a/src/main/java/com/leonardobishop/quests/util/QuestsLogger.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsLogger.java index 426a2601..d50752fd 100644 --- a/src/main/java/com/leonardobishop/quests/util/QuestsLogger.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsLogger.java @@ -1,25 +1,28 @@ -package com.leonardobishop.quests.util; +package com.leonardobishop.quests.bukkit; -import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.common.logger.QuestsLogger; -public class QuestsLogger { +public class BukkitQuestsLogger implements QuestsLogger { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; private LoggingLevel serverLoggingLevel; - public QuestsLogger(Quests plugin, LoggingLevel serverLoggingLevel) { + public BukkitQuestsLogger(BukkitQuestsPlugin plugin) { this.plugin = plugin; - this.serverLoggingLevel = serverLoggingLevel; + serverLoggingLevel = LoggingLevel.INFO; } + @Override public LoggingLevel getServerLoggingLevel() { return serverLoggingLevel; } + @Override public void setServerLoggingLevel(LoggingLevel serverLoggingLevel) { this.serverLoggingLevel = serverLoggingLevel; } + @Override public void log(String str, LoggingLevel level) { if (serverLoggingLevel.getNumericVerbosity() < level.getNumericVerbosity()) { return; @@ -40,46 +43,24 @@ public class QuestsLogger { } } + @Override public void debug(String str) { log(str, LoggingLevel.DEBUG); } + @Override public void info(String str) { log(str, LoggingLevel.INFO); } + @Override public void warning(String str) { log(str, LoggingLevel.WARNING); } + @Override public void severe(String str) { log(str, LoggingLevel.ERROR); } - public enum LoggingLevel { - ERROR(0), - WARNING(1), - INFO(2), - DEBUG(3); - - private int numericVerbosity; - - LoggingLevel(int number) { - numericVerbosity = number; - } - - public int getNumericVerbosity() { - return numericVerbosity; - } - - static LoggingLevel fromNumber(int number) { - for (LoggingLevel level : LoggingLevel.values()) { - if (level.getNumericVerbosity() == number) { - return level; - } - } - return LoggingLevel.INFO; - } - } - } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java new file mode 100644 index 00000000..eeb359bc --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java @@ -0,0 +1,515 @@ +package com.leonardobishop.quests.bukkit; + +import com.leonardobishop.quests.bukkit.command.QuestsCommand; +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.config.BukkitQuestsLoader; +import com.leonardobishop.quests.bukkit.hook.coreprotect.AbstractCoreProtectHook; +import com.leonardobishop.quests.bukkit.hook.coreprotect.CoreProtectHook; +import com.leonardobishop.quests.bukkit.hook.coreprotect.CoreProtectNoHook; +import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter; +import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetterLatest; +import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter_1_13; +import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter_Late_1_8; +import com.leonardobishop.quests.bukkit.hook.papi.AbstractPlaceholderAPIHook; +import com.leonardobishop.quests.bukkit.hook.papi.PlaceholderAPIHook; +import com.leonardobishop.quests.bukkit.hook.title.Title; +import com.leonardobishop.quests.bukkit.hook.title.Title_Bukkit; +import com.leonardobishop.quests.bukkit.hook.title.Title_BukkitNoTimings; +import com.leonardobishop.quests.bukkit.hook.title.Title_Other; +import com.leonardobishop.quests.bukkit.listener.PlayerJoinListener; +import com.leonardobishop.quests.bukkit.listener.PlayerLeaveListener; +import com.leonardobishop.quests.bukkit.questcompleter.BukkitQuestCompleter; +import com.leonardobishop.quests.bukkit.menu.MenuController; +import com.leonardobishop.quests.bukkit.menu.itemstack.QItemStackRegistry; +import com.leonardobishop.quests.bukkit.questcontroller.NormalQuestController; +import com.leonardobishop.quests.bukkit.runnable.QuestsAutoSaveRunnable; +import com.leonardobishop.quests.bukkit.storage.MySqlStorageProvider; +import com.leonardobishop.quests.bukkit.storage.YamlStorageProvider; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskTypeManager; +import com.leonardobishop.quests.bukkit.tasktype.type.BreedingTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.BrewingTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.BuildingCertainTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.BuildingTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.CommandTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.DealDamageTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.DistancefromTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.EnchantingTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.ExpEarnTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.FishingTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.InventoryTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.MilkingTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.MiningCertainTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.MiningTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.MobkillingCertainTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.MobkillingTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.PermissionTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.PlayerkillingTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.PlaytimeTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.PositionTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.ShearingTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.TamingTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.WalkingTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.ASkyBlockLevelTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.BentoBoxLevelTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.CitizensDeliverTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.CitizensInteractTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.EssentialsBalanceTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.EssentialsMoneyEarnTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.MythicMobsKillingType; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.PlaceholderAPIEvaluateTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.ShopGUIPlusBuyCertainTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.ShopGUIPlusSellCertainTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.uSkyBlockLevelTaskType; +import com.leonardobishop.quests.bukkit.util.Messages; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.config.ConfigProblemDescriptions; +import com.leonardobishop.quests.common.config.QuestsConfig; +import com.leonardobishop.quests.common.logger.QuestsLogger; +import com.leonardobishop.quests.common.player.QPlayerManager; +import com.leonardobishop.quests.common.plugin.Quests; +import com.leonardobishop.quests.common.quest.QuestCompleter; +import com.leonardobishop.quests.common.quest.QuestManager; +import com.leonardobishop.quests.common.questcontroller.QuestController; +import com.leonardobishop.quests.common.scheduler.ServerScheduler; +import com.leonardobishop.quests.common.storage.StorageProvider; +import com.leonardobishop.quests.common.tasktype.TaskType; +import com.leonardobishop.quests.common.tasktype.TaskTypeManager; +import com.leonardobishop.quests.common.updater.Updater; +import org.bstats.bukkit.MetricsLite; +import org.bukkit.Bukkit; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitTask; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class BukkitQuestsPlugin extends JavaPlugin implements Quests { + + private QuestsLogger questsLogger; + private QuestManager questManager; + private TaskTypeManager taskTypeManager; + private QPlayerManager qPlayerManager; + private QuestController questController; + private QuestCompleter questCompleter; + private BukkitQuestsConfig questsConfig; + private Updater updater; + private ServerScheduler serverScheduler; + private StorageProvider storageProvider; + + private boolean validConfiguration; + private Map<String, List<ConfigProblem>> configProblems; + + private QItemStackRegistry qItemStackRegistry; + private MenuController menuController; + private AbstractPlaceholderAPIHook placeholderAPIHook; + private AbstractCoreProtectHook coreProtectHook; + private ItemGetter itemGetter; + private Title titleHandle; + + private BukkitTask questAutoSaveTask; + private BukkitTask questQueuePollTask; + + @Override + public QuestsLogger getQuestsLogger() { + return questsLogger; + } + + @Override + public QuestManager getQuestManager() { + return questManager; + } + + @Override + public TaskTypeManager getTaskTypeManager() { + return taskTypeManager; + } + + @Override + public QPlayerManager getPlayerManager() { + return qPlayerManager; + } + + @Override + public QuestController getQuestController() { + return questController; + } + + @Override + public QuestCompleter getQuestCompleter() { + return questCompleter; + } + + @Override + public QuestsConfig getQuestsConfig() { + return questsConfig; + } + + @Override + public Updater getUpdater() { + return updater; + } + + @Override + public StorageProvider getStorageProvider() { + return storageProvider; + } + + @Override + public ServerScheduler getScheduler() { + return serverScheduler; + } + + @Override + public void onEnable() { + this.questsLogger = new BukkitQuestsLogger(this); + this.generateConfigurations(); + this.questsConfig = new BukkitQuestsConfig(new File(super.getDataFolder() + File.separator + "config.yml")); + this.questManager = new QuestManager(this); + this.taskTypeManager = new BukkitTaskTypeManager(this); + this.serverScheduler = new BukkitServerSchedulerAdapter(this); + + if (!this.reloadBaseConfiguration()) { + questsLogger.severe("Plugin cannot start into a stable state as the configuration is broken!"); + super.getServer().getPluginManager().disablePlugin(this); + return; + } + + String configuredProvider = questsConfig.getString("options.storage.provider", "yaml"); + switch (configuredProvider.toLowerCase()) { + default: + questsLogger.warning("No valid storage provider is configured - Quests will use YAML storage as a default"); + case "yaml": + this.storageProvider = new YamlStorageProvider(this); + break; + case "mysql": + this.storageProvider = new MySqlStorageProvider(this, this.getConfig().getConfigurationSection("options.storage.database-settings")); + } + + try { + storageProvider.init(); + } catch (Exception e) { + questsLogger.severe("An error occurred initialising the storage provider."); + e.printStackTrace(); + } + + this.setupVersionSpecific(); + + Messages.setPlugin(this); + this.qPlayerManager = new QPlayerManager(this, storageProvider, questController); + this.menuController = new MenuController(this); + this.qItemStackRegistry = new QItemStackRegistry(); + this.questCompleter = new BukkitQuestCompleter(this); + + MetricsLite metrics = new MetricsLite(this, 3443); + if (metrics.isEnabled()) { + this.getQuestsLogger().info("Metrics started. This can be disabled at /plugins/bStats/config.yml."); + } + + if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { + this.placeholderAPIHook = new PlaceholderAPIHook(); + this.placeholderAPIHook.registerExpansion(this); + } + + if (Bukkit.getPluginManager().isPluginEnabled("CoreProtect")) { + this.coreProtectHook = new CoreProtectHook(); + } else { + this.coreProtectHook = new CoreProtectNoHook(); + } + + boolean ignoreUpdates = false; + try { + ignoreUpdates = new File(this.getDataFolder() + File.separator + "stfuQuestsUpdate").exists(); + } catch (Throwable ignored) { } + + + this.updater = new Updater(this, super.getDescription().getVersion(), !ignoreUpdates); + if (!ignoreUpdates) { + serverScheduler.doAsync(() -> { + updater.check(); + }); + } + + super.getCommand("quests").setExecutor(new QuestsCommand(this)); + + super.getServer().getPluginManager().registerEvents(new PlayerJoinListener(this), this); + super.getServer().getPluginManager().registerEvents(menuController, this); + super.getServer().getPluginManager().registerEvents(new PlayerLeaveListener(this), this); + + // register task types after the server has fully started + Bukkit.getScheduler().runTask(this, () -> { + taskTypeManager.registerTaskType(new MiningTaskType(this)); + taskTypeManager.registerTaskType(new MiningCertainTaskType(this)); + taskTypeManager.registerTaskType(new BuildingTaskType(this)); + taskTypeManager.registerTaskType(new BuildingCertainTaskType(this)); + taskTypeManager.registerTaskType(new MobkillingTaskType(this)); + taskTypeManager.registerTaskType(new MobkillingCertainTaskType(this)); + taskTypeManager.registerTaskType(new PlayerkillingTaskType(this)); + taskTypeManager.registerTaskType(new FishingTaskType(this)); + taskTypeManager.registerTaskType(new InventoryTaskType(this)); + taskTypeManager.registerTaskType(new WalkingTaskType(this)); + taskTypeManager.registerTaskType(new TamingTaskType(this)); + taskTypeManager.registerTaskType(new MilkingTaskType(this)); + taskTypeManager.registerTaskType(new ShearingTaskType(this)); + taskTypeManager.registerTaskType(new PositionTaskType(this)); + taskTypeManager.registerTaskType(new PlaytimeTaskType(this)); + taskTypeManager.registerTaskType(new BrewingTaskType(this)); + taskTypeManager.registerTaskType(new ExpEarnTaskType(this)); + taskTypeManager.registerTaskType(new BreedingTaskType(this)); + taskTypeManager.registerTaskType(new EnchantingTaskType(this)); + taskTypeManager.registerTaskType(new DealDamageTaskType(this)); + taskTypeManager.registerTaskType(new PermissionTaskType(this)); + taskTypeManager.registerTaskType(new DistancefromTaskType(this)); + taskTypeManager.registerTaskType(new CommandTaskType(this)); + // TODO: FIX + // taskTypeManager.registerTaskType(new BrewingCertainTaskType()); + if (Bukkit.getPluginManager().isPluginEnabled("ASkyBlock")) { + taskTypeManager.registerTaskType(new ASkyBlockLevelTaskType(this)); + } + if (Bukkit.getPluginManager().isPluginEnabled("BentoBox")) { + BentoBoxLevelTaskType.register(this, taskTypeManager); + } + //TODO FIX +// if (Bukkit.getPluginManager().isPluginEnabled("IridiumSkyblock")) { +// taskTypeManager.registerTaskType(new IridiumSkyblockValueType()); +// } + if (Bukkit.getPluginManager().isPluginEnabled("uSkyBlock")) { + taskTypeManager.registerTaskType(new uSkyBlockLevelTaskType(this)); + } + if (Bukkit.getPluginManager().isPluginEnabled("Citizens")) { + taskTypeManager.registerTaskType(new CitizensDeliverTaskType(this)); + taskTypeManager.registerTaskType(new CitizensInteractTaskType(this)); + } + if (Bukkit.getPluginManager().isPluginEnabled("MythicMobs")) { + taskTypeManager.registerTaskType(new MythicMobsKillingType(this)); + } + if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { + taskTypeManager.registerTaskType(new PlaceholderAPIEvaluateTaskType(this)); + } + if (Bukkit.getPluginManager().isPluginEnabled("Essentials")) { + taskTypeManager.registerTaskType(new EssentialsMoneyEarnTaskType(this)); + taskTypeManager.registerTaskType(new EssentialsBalanceTaskType(this)); + } + if (Bukkit.getPluginManager().isPluginEnabled("ShopGUIPlus")) { + // not tested + taskTypeManager.registerTaskType(new ShopGUIPlusBuyCertainTaskType(this)); + taskTypeManager.registerTaskType(new ShopGUIPlusSellCertainTaskType(this)); + } + + taskTypeManager.closeRegistrations(); + reloadQuests(); + + for (Player player : Bukkit.getOnlinePlayers()) { + qPlayerManager.loadPlayer(player.getUniqueId()); + } + }); + } + + @Override + public void reloadQuests() { + if (this.reloadBaseConfiguration()) { + BukkitQuestsLoader questsLoader = new BukkitQuestsLoader(this); + configProblems = questsLoader.loadQuests(new File(super.getDataFolder() + File.separator + "quests")); + + for (TaskType taskType : taskTypeManager.getTaskTypes()) { + try { + taskType.onReady(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } else { + configProblems = Collections.singletonMap("<MAIN CONFIG> config.yml", + Collections.singletonList(new ConfigProblem(ConfigProblem.ConfigProblemType.ERROR, ConfigProblemDescriptions.MALFORMED_YAML.getDescription()))); + } + } + + public ItemStack getItemStack(String path, ConfigurationSection config, ItemGetter.Filter... excludes) { + return itemGetter.getItem(path, config, excludes); + } + + private boolean reloadBaseConfiguration() { + this.validConfiguration = questsConfig.loadConfig(); + + if (validConfiguration) { + int loggingLevel = questsConfig.getInt("options.verbose-logging-level", 2); + questsLogger.setServerLoggingLevel(QuestsLogger.LoggingLevel.fromNumber(loggingLevel)); + + switch (questsConfig.getString("quest-mode.mode", "normal").toLowerCase()) { + default: + case "normal": + questController = new NormalQuestController(this); + //TODO the other one + } + + long autoSaveInterval = this.getConfig().getLong("options.performance-tweaking.quest-autosave-interval", 12000); + try { + if (questAutoSaveTask != null) questAutoSaveTask.cancel(); + questAutoSaveTask = Bukkit.getScheduler().runTaskTimer(this, () -> new QuestsAutoSaveRunnable(this), autoSaveInterval, autoSaveInterval); + } catch (Exception ex) { + questsLogger.debug("Cannot cancel and restart quest autosave task"); + } + + long queueExecuteInterval = this.getConfig().getLong("options.performance-tweaking.quest-queue-executor-interval", 1); + try { + if (questQueuePollTask != null) questQueuePollTask.cancel(); + questQueuePollTask = Bukkit.getScheduler().runTaskTimer(this, (BukkitQuestCompleter) questCompleter, queueExecuteInterval, queueExecuteInterval); + } catch (Exception ex) { + questsLogger.debug("Cannot cancel and restart queue executor task"); + } + } + return validConfiguration; + } + + private void setupVersionSpecific() { + String version; + try { + version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; + } catch (ArrayIndexOutOfBoundsException e) { + getQuestsLogger().warning("Failed to resolve server version - some features will not work!"); + titleHandle = new Title_Other(); + itemGetter = new ItemGetter_Late_1_8(); + return; + } + + getQuestsLogger().info("Your server is running version " + version + "."); + + if (version.startsWith("v1_7")) { + titleHandle = new Title_Other(); + } else if (version.startsWith("v1_8") || version.startsWith("v1_9") || version.startsWith("v1_10")) { + titleHandle = new Title_BukkitNoTimings(); + } else { + titleHandle = new Title_Bukkit(); + } + + if (version.startsWith("v1_7") || version.startsWith("v1_8") || version.startsWith("v1_9") + || version.startsWith("v1_10") || version.startsWith("v1_11") || version.startsWith("v1_12")) { + itemGetter = new ItemGetter_Late_1_8(); + } else if (version.startsWith("v1_13")) { + itemGetter = new ItemGetter_1_13(); + } else { + itemGetter = new ItemGetterLatest(); + } + + questsConfig.setItemGetter(itemGetter); + + if (titleHandle instanceof Title_Bukkit) { + getQuestsLogger().info("Titles have been enabled."); + } else if (titleHandle instanceof Title_BukkitNoTimings) { + getQuestsLogger().info("Titles have been enabled, although they have limited timings."); + } else { + getQuestsLogger().info("Titles are not supported for this version."); + } + } + + private void generateConfigurations() { + 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 = BukkitQuestsPlugin.class.getClassLoader().getResourceAsStream("resources/bukkit/config.yml"); + OutputStream out = new FileOutputStream(config)) { + byte[] buffer = new byte[1024]; + int lenght = in.read(buffer); + while (lenght != -1) { + out.write(buffer, 0, lenght); + lenght = in.read(buffer); + } + } catch (IOException e) { + e.printStackTrace(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + File questsDirectory = new File(this.getDataFolder() + File.separator + "quests"); + if (!questsDirectory.exists() && !questsDirectory.isDirectory()) { + questsDirectory.mkdir(); + + ArrayList<String> examples = new ArrayList<>(); + examples.add("example1.yml"); + examples.add("example2.yml"); + examples.add("example3.yml"); + examples.add("example4.yml"); + examples.add("example5.yml"); + examples.add("example6.yml"); + examples.add("example7.yml"); + examples.add("README.txt"); + + for (String name : examples) { + File file = new File(this.getDataFolder() + File.separator + "quests" + File.separator + name); + try { + file.createNewFile(); + try (InputStream in = BukkitQuestsPlugin.class.getClassLoader().getResourceAsStream("resources/bukkit/quests/" + name); + OutputStream out = new FileOutputStream(file)) { + byte[] buffer = new byte[1024]; + int lenght = in.read(buffer); + while (lenght != -1) { + out.write(buffer, 0, lenght); + lenght = in.read(buffer); + } + } catch (IOException e) { + e.printStackTrace(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public boolean isValidConfiguration() { + return validConfiguration; + } + + public Map<String, List<ConfigProblem>> getConfigProblems() { + return configProblems; + } + + public AbstractPlaceholderAPIHook getPlaceholderAPIHook() { + return placeholderAPIHook; + } + + public AbstractCoreProtectHook getCoreProtectHook() { + return coreProtectHook; + } + + public ItemGetter getItemGetter() { + return itemGetter; + } + + public Title getTitleHandle() { + return titleHandle; + } + + public QItemStackRegistry getQItemStackRegistry() { + return qItemStackRegistry; + } + + public MenuController getMenuController() { + return menuController; + } + + @NotNull + @Override + public FileConfiguration getConfig() { + return questsConfig.getConfig(); + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitServerSchedulerAdapter.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitServerSchedulerAdapter.java new file mode 100644 index 00000000..8619642b --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitServerSchedulerAdapter.java @@ -0,0 +1,22 @@ +package com.leonardobishop.quests.bukkit; + +import com.leonardobishop.quests.common.scheduler.ServerScheduler; + +public class BukkitServerSchedulerAdapter implements ServerScheduler { + + private final BukkitQuestsPlugin plugin; + + public BukkitServerSchedulerAdapter(BukkitQuestsPlugin plugin) { + this.plugin = plugin; + } + + @Override + public void doSync(Runnable runnable) { + plugin.getServer().getScheduler().runTask(plugin, runnable); + } + + @Override + public void doAsync(Runnable runnable) { + plugin.getServer().getScheduler().runTaskAsynchronously(plugin, runnable); + } +} diff --git a/src/main/java/com/leonardobishop/quests/api/events/PlayerCancelQuestEvent.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PlayerCancelQuestEvent.java index 58e46206..af431626 100644 --- a/src/main/java/com/leonardobishop/quests/api/events/PlayerCancelQuestEvent.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PlayerCancelQuestEvent.java @@ -1,7 +1,7 @@ -package com.leonardobishop.quests.api.events; +package com.leonardobishop.quests.bukkit.api.event; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/leonardobishop/quests/api/events/PlayerFinishQuestEvent.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PlayerFinishQuestEvent.java index 8bd4c5e6..d38d4f78 100644 --- a/src/main/java/com/leonardobishop/quests/api/events/PlayerFinishQuestEvent.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PlayerFinishQuestEvent.java @@ -1,7 +1,7 @@ -package com.leonardobishop.quests.api.events; +package com.leonardobishop.quests.bukkit.api.event; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/leonardobishop/quests/api/events/PlayerQuestEvent.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PlayerQuestEvent.java index b78726ef..a6a0a26a 100644 --- a/src/main/java/com/leonardobishop/quests/api/events/PlayerQuestEvent.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PlayerQuestEvent.java @@ -1,6 +1,6 @@ -package com.leonardobishop.quests.api.events; +package com.leonardobishop.quests.bukkit.api.event; -import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.common.player.QPlayer; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerEvent; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/leonardobishop/quests/api/events/PlayerStartQuestEvent.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PlayerStartQuestEvent.java index 3602979f..87f01ce1 100644 --- a/src/main/java/com/leonardobishop/quests/api/events/PlayerStartQuestEvent.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PlayerStartQuestEvent.java @@ -1,12 +1,13 @@ -package com.leonardobishop.quests.api.events; +package com.leonardobishop.quests.bukkit.api.event; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; public class PlayerStartQuestEvent extends PlayerQuestEvent { + private final static HandlerList handlers = new HandlerList(); private final QuestProgress questProgress; private String questStartMessage; diff --git a/src/main/java/com/leonardobishop/quests/api/events/PlayerStartTrackQuestEvent.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PlayerStartTrackQuestEvent.java index 70b14dce..107924a6 100644 --- a/src/main/java/com/leonardobishop/quests/api/events/PlayerStartTrackQuestEvent.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PlayerStartTrackQuestEvent.java @@ -1,10 +1,8 @@ -package com.leonardobishop.quests.api.events; +package com.leonardobishop.quests.bukkit.api.event; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.common.player.QPlayer; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; -import org.bukkit.event.player.PlayerEvent; import org.jetbrains.annotations.NotNull; public class PlayerStartTrackQuestEvent extends PlayerQuestEvent { diff --git a/src/main/java/com/leonardobishop/quests/api/events/PlayerStopTrackQuestEvent.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PlayerStopTrackQuestEvent.java index 42b3d263..288013b7 100644 --- a/src/main/java/com/leonardobishop/quests/api/events/PlayerStopTrackQuestEvent.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PlayerStopTrackQuestEvent.java @@ -1,10 +1,8 @@ -package com.leonardobishop.quests.api.events; +package com.leonardobishop.quests.bukkit.api.event; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.common.player.QPlayer; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; -import org.bukkit.event.player.PlayerEvent; import org.jetbrains.annotations.NotNull; public class PlayerStopTrackQuestEvent extends PlayerQuestEvent { diff --git a/src/main/java/com/leonardobishop/quests/api/events/PreStartQuestEvent.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PreStartQuestEvent.java index abbbd77d..b2513415 100644 --- a/src/main/java/com/leonardobishop/quests/api/events/PreStartQuestEvent.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/api/event/PreStartQuestEvent.java @@ -1,7 +1,7 @@ -package com.leonardobishop.quests.api.events; +package com.leonardobishop.quests.bukkit.api.event; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.common.enums.QuestStartResult; +import com.leonardobishop.quests.common.player.QPlayer; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommand.java index 0906b3c9..37a388fb 100644 --- a/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommand.java @@ -1,16 +1,16 @@ -package com.leonardobishop.quests.command; +package com.leonardobishop.quests.bukkit.command; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.quest.Category; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.util.Messages; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.util.Chat; +import com.leonardobishop.quests.bukkit.util.Messages; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.enums.QuestStartResult; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.common.quest.Category; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; +import com.leonardobishop.quests.common.tasktype.TaskType; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; @@ -35,9 +35,9 @@ import java.util.concurrent.ThreadLocalRandom; public class QuestsCommand implements TabExecutor { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; - public QuestsCommand(Quests plugin) { + public QuestsCommand(BukkitQuestsPlugin plugin) { this.plugin = plugin; } @@ -48,10 +48,10 @@ public class QuestsCommand implements TabExecutor { sender.sendMessage(ChatColor.RED + "Quests is not ready yet."); return true; } - if (plugin.isBrokenConfig() && - !(args.length >= 2 && - (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")) && - args[1].equalsIgnoreCase("reload"))) { + if (!plugin.isValidConfiguration() + && !(args.length >= 2 + && (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")) + && args[1].equalsIgnoreCase("reload"))) { sender.sendMessage(ChatColor.RED + "Quests cannot be used right now. Please speak to an administrator."); if (sender.hasPermission("quests.admin")) { showProblems(sender); @@ -73,7 +73,7 @@ public class QuestsCommand implements TabExecutor { player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage()); return true; } - qPlayer.openQuests(); + plugin.getMenuController().openMainMenu(qPlayer); return true; } else if (args.length >= 1) { if ((args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")) && sender.hasPermission("quests.admin")) { @@ -88,7 +88,7 @@ public class QuestsCommand implements TabExecutor { sender.sendMessage(ChatColor.GRAY + "Please note that some options, such as storage, require a full restart for chances to take effect."); plugin.reloadConfig(); plugin.reloadQuests(); - if (!plugin.getQuestsConfigLoader().getFilesWithProblems().isEmpty()) showProblems(sender); + if (!plugin.getConfigProblems().isEmpty()) showProblems(sender); sender.sendMessage(ChatColor.GREEN + "Quests successfully reloaded."); return true; } else if (args[1].equalsIgnoreCase("config")) { @@ -117,7 +117,7 @@ public class QuestsCommand implements TabExecutor { sender.sendMessage(ChatColor.DARK_GRAY + "View info using /q a types [type]."); return true; } else if (args[1].equalsIgnoreCase("info")) { - sender.sendMessage(ChatColor.RED + "Quest mode: " + plugin.getQuestMode().toString()); + sender.sendMessage(ChatColor.RED + "Quest controller: " + plugin.getQuestController().getName()); sender.sendMessage(ChatColor.GRAY + "Loaded quests:"); for (Quest quest : plugin.getQuestManager().getQuests().values()) { sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + quest.getId() + ChatColor.GRAY + " [" + quest.getTasks().size() + " tasks]"); @@ -129,7 +129,11 @@ public class QuestsCommand implements TabExecutor { Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> { plugin.getUpdater().check(); if (plugin.getUpdater().isUpdateReady()) { - sender.sendMessage(plugin.getUpdater().getMessage()); + String updateMessage = Messages.QUEST_UPDATER.getMessage() + .replace("{newver}", plugin.getUpdater().getReturnedVersion()) + .replace("{oldver}", plugin.getUpdater().getInstalledVersion()) + .replace("{link}", plugin.getUpdater().getUpdateLink()); + sender.sendMessage(updateMessage); } else { sender.sendMessage(ChatColor.GRAY + "No updates were found."); } @@ -206,12 +210,12 @@ public class QuestsCommand implements TabExecutor { } } else if (args.length == 4) { if (args[1].equalsIgnoreCase("opengui")) { - if (args[2].equalsIgnoreCase("q") || args[2].equalsIgnoreCase("quests")) { + if (args[2].equalsIgnoreCase("q") || args[2].equalsIgnoreCase("resources/bukkit/quests")) { Player player = Bukkit.getPlayer(args[3]); if (player != null) { QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer != null) { - qPlayer.openQuests(); + plugin.getMenuController().openMainMenu(qPlayer); sender.sendMessage(Messages.COMMAND_QUEST_OPENQUESTS_ADMIN_SUCCESS.getMessage().replace("{player}", player.getName())); return true; } @@ -240,7 +244,7 @@ public class QuestsCommand implements TabExecutor { } else if (args.length == 5) { if (args[1].equalsIgnoreCase("opengui")) { if (args[2].equalsIgnoreCase("c") || args[2].equalsIgnoreCase("category")) { - if (!Options.CATEGORIES_ENABLED.getBooleanValue()) { + if (!plugin.getQuestsConfig().getBoolean("options.categories-enabled")) { sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DISABLED.getMessage()); return true; } @@ -253,7 +257,7 @@ public class QuestsCommand implements TabExecutor { if (player != null) { QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer != null) { - if (qPlayer.openCategory(category, null, false) == 0) { + if (plugin.getMenuController().openQuestCategory(qPlayer, category, null, false) == 0) { sender.sendMessage(Messages.COMMAND_QUEST_OPENCATEGORY_ADMIN_SUCCESS.getMessage().replace("{player}", player.getName()) .replace("{category}", category.getId())); } else { @@ -327,7 +331,7 @@ public class QuestsCommand implements TabExecutor { showAdminHelp(sender, null); return true; } - if (sender instanceof Player && (args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("quests") || args[0].equalsIgnoreCase("quest"))) { + if (sender instanceof Player && (args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("resources/bukkit/quests") || args[0].equalsIgnoreCase("quest"))) { Player player = (Player) sender; if (args.length >= 3) { Quest quest = plugin.getQuestManager().getQuestById(args[1]); @@ -351,7 +355,7 @@ public class QuestsCommand implements TabExecutor { return true; } } else if (sender instanceof Player && (args[0].equalsIgnoreCase("c") || args[0].equalsIgnoreCase("category"))) { - if (!Options.CATEGORIES_ENABLED.getBooleanValue()) { + if (!plugin.getQuestsConfig().getBoolean("options.categories-enabled")) { sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DISABLED.getMessage()); return true; } @@ -366,7 +370,7 @@ public class QuestsCommand implements TabExecutor { if (category == null) { sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DOESNTEXIST.getMessage().replace("{category}", args[1])); } else { - qPlayer.openCategory(category, null, false); + plugin.getMenuController().openQuestCategory(qPlayer, category, null, false); return true; } return true; @@ -399,7 +403,7 @@ public class QuestsCommand implements TabExecutor { player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage()); return true; } - qPlayer.openStartedQuests(); + plugin.getMenuController().openStartedQuests(qPlayer); return true; } showHelp(sender); @@ -434,24 +438,25 @@ public class QuestsCommand implements TabExecutor { } private void showProblems(CommandSender sender) { - if (!plugin.getQuestsConfigLoader().getFilesWithProblems().isEmpty()) { + if (!plugin.getConfigProblems().isEmpty()) { // sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----"); sender.sendMessage(ChatColor.GRAY + "Detected problems and potential issues:"); - Set<QuestsConfigLoader.ConfigProblemType> problemTypes = new HashSet<>(); - for (Map.Entry<String, List<QuestsConfigLoader.ConfigProblem>> entry : plugin.getQuestsConfigLoader().getFilesWithProblems().entrySet()) { - HashMap<QuestsConfigLoader.ConfigProblemType, List<QuestsConfigLoader.ConfigProblem>> sortedProblems = new HashMap<>(); - for (QuestsConfigLoader.ConfigProblem problem : entry.getValue()) { + Set<ConfigProblem.ConfigProblemType> problemTypes = new HashSet<>(); + int count = 0; + for (Map.Entry<String, List<ConfigProblem>> entry : plugin.getConfigProblems().entrySet()) { + HashMap<ConfigProblem.ConfigProblemType, List<ConfigProblem>> sortedProblems = new HashMap<>(); + for (ConfigProblem problem : entry.getValue()) { if (sortedProblems.containsKey(problem.getType())) { sortedProblems.get(problem.getType()).add(problem); } else { - List<QuestsConfigLoader.ConfigProblem> specificProblems = new ArrayList<>(); + List<ConfigProblem> specificProblems = new ArrayList<>(); specificProblems.add(problem); sortedProblems.put(problem.getType(), specificProblems); } problemTypes.add(problem.getType()); } - QuestsConfigLoader.ConfigProblemType highest = null; - for (QuestsConfigLoader.ConfigProblemType type : QuestsConfigLoader.ConfigProblemType.values()) { + ConfigProblem.ConfigProblemType highest = null; + for (ConfigProblem.ConfigProblemType type : ConfigProblem.ConfigProblemType.values()) { if (sortedProblems.containsKey(type)) { highest = type; break; @@ -459,27 +464,30 @@ public class QuestsCommand implements TabExecutor { } ChatColor highestColor = ChatColor.WHITE; if (highest != null) { - highestColor = highest.getColor(); + highestColor = Chat.matchConfigProblemToColor(highest); } sender.sendMessage(highestColor + entry.getKey() + ChatColor.DARK_GRAY + " ----"); - for (QuestsConfigLoader.ConfigProblemType type : QuestsConfigLoader.ConfigProblemType.values()) { + for (ConfigProblem.ConfigProblemType type : ConfigProblem.ConfigProblemType.values()) { if (sortedProblems.containsKey(type)) { - for (QuestsConfigLoader.ConfigProblem problem : sortedProblems.get(type)) { - sender.sendMessage(ChatColor.DARK_GRAY + " | - " + problem.getType().getColor() + for (ConfigProblem problem : sortedProblems.get(type)) { + sender.sendMessage(ChatColor.DARK_GRAY + " | - " + Chat.matchConfigProblemToColor(problem.getType()) + problem.getType().getShortened() + ChatColor.DARK_GRAY + ": " + ChatColor.GRAY + problem.getDescription() + ChatColor.DARK_GRAY + " :" + problem.getLocation()); + count++; } } } } // sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----"); List<String> legend = new ArrayList<>(); - for (QuestsConfigLoader.ConfigProblemType type : QuestsConfigLoader.ConfigProblemType.values()) { - if (problemTypes.contains(type)) - legend.add(type.getColor() + type.getShortened() + ChatColor.DARK_GRAY + " = " + type.getColor() + type.getTitle()); + for (ConfigProblem.ConfigProblemType type : ConfigProblem.ConfigProblemType.values()) { + if (problemTypes.contains(type)) { + legend.add(Chat.matchConfigProblemToColor(type) + type.getShortened() + ChatColor.DARK_GRAY + " = " + Chat.matchConfigProblemToColor(type) + type.getTitle()); + } } sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----"); - sender.sendMessage(ChatColor.GRAY.toString() + plugin.getQuestsConfigLoader().getProblemsCount() + " problem(s) | " + String.join(ChatColor.DARK_GRAY + ", ", legend)); + + sender.sendMessage(ChatColor.GRAY.toString() + count + " problem(s) | " + String.join(ChatColor.DARK_GRAY + ", ", legend)); } else { sender.sendMessage(ChatColor.GRAY + "Quests did not detect any problems with your configuration."); } @@ -489,7 +497,7 @@ public class QuestsCommand implements TabExecutor { sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests v" + plugin .getDescription().getVersion() + " " + ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "]=------------"); sender.sendMessage(ChatColor.GRAY + "The following commands are available: "); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests " + ChatColor.DARK_GRAY + ": show quests"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/resources/bukkit/quests " + ChatColor.DARK_GRAY + ": show quests"); sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests c/category <categoryid> " + ChatColor.DARK_GRAY + ": open category by ID"); sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests q/quest <questid> <start|cancel|track>" + ChatColor.DARK_GRAY + ": start, cancel or track quest by ID"); sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a/admin " + ChatColor.DARK_GRAY + ": view help for admins"); @@ -563,7 +571,7 @@ public class QuestsCommand implements TabExecutor { @Nullable @Override public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { - if (!Options.TAB_COMPLETE_ENABLED.getBooleanValue(true)) { + if (!plugin.getQuestsConfig().getBoolean("options.tab-completion.enabled")) { return null; } if (sender instanceof Player) { @@ -603,7 +611,7 @@ public class QuestsCommand implements TabExecutor { } return matchTabComplete(args[2], options); } else if (args[1].equalsIgnoreCase("opengui")) { - List<String> options = Arrays.asList("quests", "category"); + List<String> options = Arrays.asList("resources/bukkit/quests", "category"); return matchTabComplete(args[2], options); } else if (args[1].equalsIgnoreCase("moddata")) { List<String> options = Arrays.asList("fullreset", "reset", "start", "complete"); diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsConfig.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsConfig.java new file mode 100644 index 00000000..add7c33e --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsConfig.java @@ -0,0 +1,91 @@ +package com.leonardobishop.quests.bukkit.config; + +import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter; +import com.leonardobishop.quests.common.config.QuestsConfig; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.inventory.ItemStack; + +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class BukkitQuestsConfig implements QuestsConfig { + + private final Map<String, ItemStack> cachedItemStacks = new HashMap<>(); + // this is faster than just relying on the YamlConfiguration to cache it for some reason + private final Map<String, Boolean> cachedBooleans = new HashMap<>(); + private YamlConfiguration config; + private File file; + private ItemGetter itemGetter; + + public BukkitQuestsConfig(File file) { + this.file = file; + } + + public void setItemGetter(ItemGetter itemGetter) { + this.itemGetter = itemGetter; + } + + @Override + public boolean loadConfig() { + this.cachedBooleans.clear(); + this.cachedItemStacks.clear(); + try { + config = YamlConfiguration.loadConfiguration(file); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public YamlConfiguration getConfig() { + return config; + } + + @Override + public String getString(String path) { + return config.getString(path); + } + + @Override + public String getString(String path, String def) { + return config.getString(path, def); + } + + @Override + public boolean getBoolean(String path) { + return config.getBoolean(path); + } + + @Override + public boolean getBoolean(String path, boolean def) { + return config.getBoolean(path, def); + } + + @Override + public int getInt(String path) { + return config.getInt(path); + } + + @Override + public int getInt(String path, int def) { + return config.getInt(path, def); + } + + @Override + public List<String> getStringList(String path) { + return config.getStringList(path); + } + + @Override + public List<String> getStringList(String path, List<String> def) { + List<String> list = config.getStringList(path); + return list.isEmpty() ? def : list; + } + + public ItemStack getItem(String path) { + return new ItemStack(cachedItemStacks.computeIfAbsent(path, s -> itemGetter.getItem(path, config))); + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java new file mode 100644 index 00000000..f80ec3f0 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java @@ -0,0 +1,331 @@ +package com.leonardobishop.quests.bukkit.config; + +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter; +import com.leonardobishop.quests.bukkit.menu.itemstack.QItemStack; +import com.leonardobishop.quests.bukkit.menu.itemstack.QItemStackRegistry; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.config.ConfigProblemDescriptions; +import com.leonardobishop.quests.common.config.QuestsLoader; +import com.leonardobishop.quests.common.logger.QuestsLogger; +import com.leonardobishop.quests.common.quest.Category; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.QuestManager; +import com.leonardobishop.quests.common.quest.Task; +import com.leonardobishop.quests.common.questcontroller.QuestController; +import com.leonardobishop.quests.common.tasktype.TaskType; +import com.leonardobishop.quests.common.tasktype.TaskTypeManager; +import org.apache.commons.lang.StringUtils; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.inventory.ItemStack; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class BukkitQuestsLoader implements QuestsLoader { + + private final BukkitQuestsPlugin plugin; + private final BukkitQuestsConfig questsConfig; + private final QuestManager questManager; + private final TaskTypeManager taskTypeManager; + private final QuestController questController; + private final QuestsLogger questsLogger; + private final QItemStackRegistry qItemStackRegistry; + + public BukkitQuestsLoader(BukkitQuestsPlugin plugin) { + this.plugin = plugin; + this.questsConfig = (BukkitQuestsConfig) plugin.getQuestsConfig(); + this.questManager = plugin.getQuestManager(); + this.taskTypeManager = plugin.getTaskTypeManager(); + this.questController = plugin.getQuestController(); + this.questsLogger = plugin.getQuestsLogger(); + this.qItemStackRegistry = plugin.getQItemStackRegistry(); + } + + @Override + public Map<String, List<ConfigProblem>> loadQuests(File root) { + qItemStackRegistry.clearRegistry(); + questManager.getQuests().clear(); + questManager.getCategories().clear(); + taskTypeManager.resetTaskTypes(); + + Map<String, List<ConfigProblem>> configProblems = new HashMap<>(); + HashMap<String, Quest> pathToQuest = new HashMap<>(); + HashMap<String, Map<String, Object>> globalTaskConfig = new HashMap<>(); + + if (questsConfig.getConfig().isConfigurationSection("global-task-configuration.types")) { + for (String type : questsConfig.getConfig().getConfigurationSection("global-task-configuration.types").getKeys(false)) { + HashMap<String, Object> configValues = new HashMap<>(); + for (String key : questsConfig.getConfig().getConfigurationSection("global-task-configuration.types." + type).getKeys(false)) { + configValues.put(key, questsConfig.getConfig().get("global-task-configuration.types." + type + "." + key)); + } + globalTaskConfig.putIfAbsent(type, configValues); + } + } + + for (String id : plugin.getConfig().getConfigurationSection("categories").getKeys(false)) { + ItemStack displayItem = plugin.getItemStack("categories." + id + ".display", plugin.getConfig()); + boolean permissionRequired = plugin.getConfig().getBoolean("categories." + id + ".permission-required", false); + + Category category = new Category(id, permissionRequired); + questManager.registerCategory(category); + qItemStackRegistry.register(category, displayItem); + } + + FileVisitor<Path> fileVisitor = new SimpleFileVisitor<Path>() { + @Override + public FileVisitResult visitFile(Path path, BasicFileAttributes attributes) { + try { + File questFile = new File(path.toUri()); + URI relativeLocation = root.toURI().relativize(path.toUri()); + + if (!questFile.getName().toLowerCase().endsWith(".yml")) return FileVisitResult.CONTINUE; + + YamlConfiguration config = new YamlConfiguration(); + // test QUEST file integrity + try { + config.load(questFile); + } catch (Exception ex) { + configProblems.put(relativeLocation.getPath(), Collections.singletonList(new ConfigProblem(ConfigProblem.ConfigProblemType.ERROR, ConfigProblemDescriptions.MALFORMED_YAML.getDescription()))); + return FileVisitResult.CONTINUE; + } + + String id = questFile.getName().replace(".yml", ""); + + List<ConfigProblem> problems = new ArrayList<>(); + + if (!StringUtils.isAlphanumeric(id)) { + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.ERROR, ConfigProblemDescriptions.INVALID_QUEST_ID.getDescription(id))); + } + + // CHECK EVERYTHING WRONG WITH THE QUEST FILE BEFORE ACTUALLY LOADING THE QUEST + + if (!config.isConfigurationSection("tasks")) { + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.ERROR, ConfigProblemDescriptions.NO_TASKS.getDescription(), "tasks")); + } else { //continue + int validTasks = 0; + for (String taskId : config.getConfigurationSection("tasks").getKeys(false)) { + boolean isValid = true; + String taskRoot = "tasks." + taskId; + String taskType = config.getString(taskRoot + ".type"); + + if (!config.isConfigurationSection(taskRoot)) { + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, ConfigProblemDescriptions.TASK_MALFORMED_NOT_SECTION.getDescription(taskId), taskRoot)); + continue; + } + + if (taskType == null) { + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, ConfigProblemDescriptions.NO_TASK_TYPE.getDescription(), taskRoot)); + continue; + } + + // check the tasks + TaskType t = taskTypeManager.getTaskType(taskType); + if (t != null) { + HashMap<String, Object> configValues = new HashMap<>(); + for (String key : config.getConfigurationSection(taskRoot).getKeys(false)) { + configValues.put(key, config.get(taskRoot + "." + key)); + } + + problems.addAll(t.validateConfig(taskRoot, configValues)); + } else { + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, ConfigProblemDescriptions.UNKNOWN_TASK_TYPE.getDescription(taskType), taskRoot)); + isValid = false; + } + + if (isValid) { + validTasks++; + } + } + if (validTasks == 0) { + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.ERROR, ConfigProblemDescriptions.NO_TASKS.getDescription(), "tasks")); + } + } + + boolean error = false; + for (ConfigProblem problem : problems) { + if (problem.getType() == ConfigProblem.ConfigProblemType.ERROR) { + error = true; + break; + } + } + + // END OF THE CHECKING + if (!error && !questsConfig.getBoolean("options.error-checking.override-errors", false)) { + QItemStack displayItem = getQItemStack("display", config); + List<String> rewards = config.getStringList("rewards"); + List<String> requirements = config.getStringList("options.requires"); + List<String> rewardString = config.getStringList("rewardstring"); + List<String> startString = config.getStringList("startstring"); + boolean repeatable = config.getBoolean("options.repeatable", false); + boolean cooldown = config.getBoolean("options.cooldown.enabled", false); + boolean permissionRequired = config.getBoolean("options.permission-required", false); + int cooldownTime = config.getInt("options.cooldown.time", 10); + int sortOrder = config.getInt("options.sort-order", 1); + String category = config.getString("options.category"); + Map<String, String> placeholders = new HashMap<>(); + + if (category == null) category = ""; + + if (questController.getName().equals("daily")) { + repeatable = true; + cooldown = true; + cooldownTime = 0; + requirements = Collections.emptyList(); + permissionRequired = false; + } + + Quest quest; + if (category.equals("")) { + quest = new Quest(id, rewards, requirements, repeatable, cooldown, cooldownTime, permissionRequired, rewardString, startString, placeholders, sortOrder); + } else { + quest = new Quest(id, rewards, requirements, repeatable, cooldown, cooldownTime, permissionRequired, rewardString, startString, placeholders, category, sortOrder); + Category c = questManager.getCategoryById(category); + if (c != null) { + c.registerQuestId(id); + } else { + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, ConfigProblemDescriptions.UNKNOWN_CATEGORY.getDescription(category), "options.category")); + } + } + + for (String taskId : config.getConfigurationSection("tasks").getKeys(false)) { + String taskRoot = "tasks." + taskId; + String taskType = config.getString(taskRoot + ".type"); + + Task task = new Task(taskId, taskType); + + for (String key : config.getConfigurationSection(taskRoot).getKeys(false)) { + task.addConfigValue(key, config.get(taskRoot + "." + key)); + } + + if (globalTaskConfig.containsKey(taskType)) { + for (Map.Entry<String, Object> entry : globalTaskConfig.get(taskType).entrySet()) { + if (questsConfig.getBoolean("options.global-task-configuration-override") && task.getConfigValue(entry.getKey()) != null) + continue; + task.addConfigValue(entry.getKey(), entry.getValue()); + } + } + + quest.registerTask(task); + } + + + for (String line : displayItem.getLoreNormal()) { + findInvalidTaskReferences(quest, line, problems, "display.lore-normal"); + } + for (String line : displayItem.getLoreStarted()) { + findInvalidTaskReferences(quest, line, problems, "display.lore-started"); + } + + if (config.isConfigurationSection("placeholders")) { + for (String p : config.getConfigurationSection("placeholders").getKeys(false)) { + placeholders.put(p, config.getString("placeholders." + p)); + findInvalidTaskReferences(quest, config.getString("placeholders." + p), problems, "placeholders." + p); + } + } + if (questsConfig.getBoolean("options.show-quest-registrations")) { + questsLogger.info("Registering quest " + quest.getId() + " with " + quest.getTasks().size() + " tasks."); + } + questManager.registerQuest(quest); + taskTypeManager.registerQuestTasksWithTaskTypes(quest); + qItemStackRegistry.register(quest, displayItem); + pathToQuest.put(relativeLocation.getPath(), quest); + } + if (!problems.isEmpty()) { + configProblems.put(relativeLocation.getPath(), problems); + } + } catch (Exception e) { + questsLogger.severe("An exception occurred when attempting to load quest '" + path + "' (will be ignored)"); + e.printStackTrace(); + } + return FileVisitResult.CONTINUE; + } + }; + + try { + Files.walkFileTree(root.toPath(), fileVisitor); + } catch (IOException e) { + e.printStackTrace(); + } + + // post-load checks + for (Map.Entry<String, Quest> loadedQuest : pathToQuest.entrySet()) { + List<ConfigProblem> problems = new ArrayList<>(); + for (String req : loadedQuest.getValue().getRequirements()) { + if (questManager.getQuestById(req) == null) { + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, ConfigProblemDescriptions.UNKNOWN_REQUIREMENT.getDescription(req), "options.requires")); + } + } + + if (!problems.isEmpty()) { + if (configProblems.containsKey(loadedQuest.getKey())) { + configProblems.get(loadedQuest.getKey()).addAll(problems); + } else { + configProblems.put(loadedQuest.getKey(), problems); + } + } + } + + return configProblems; + } + + private void findInvalidTaskReferences(Quest quest, String s, List<ConfigProblem> configProblems, String location) { + Pattern pattern = Pattern.compile("\\{([^}]+)}"); + + Matcher matcher = pattern.matcher(s); + while (matcher.find()) { + String[] parts = matcher.group(1).split(":"); + boolean match = false; + for (Task t : quest.getTasks()) { + if (t.getId().equals(parts[0])) { + match = true; + break; + } + } + if (!match) + configProblems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, + ConfigProblemDescriptions.UNKNOWN_TASK_REFERENCE.getDescription(parts[0]), location)); + } + } + + private QItemStack getQItemStack(String path, FileConfiguration config) { + String cName = config.getString(path + ".name", path + ".name"); + List<String> cLoreNormal = config.getStringList(path + ".lore-normal"); + List<String> cLoreStarted = config.getStringList(path + ".lore-started"); + + List<String> loreNormal = translateColoursInList(cLoreNormal); + List<String> loreStarted = translateColoursInList(cLoreStarted); + + String name; + name = ChatColor.translateAlternateColorCodes('&', cName); + + ItemStack is = plugin.getItemStack(path, config, + ItemGetter.Filter.DISPLAY_NAME, ItemGetter.Filter.LORE, ItemGetter.Filter.ENCHANTMENTS, ItemGetter.Filter.ITEM_FLAGS); + + return new QItemStack(plugin, name, loreNormal, loreStarted, is); + } + + private List<String> translateColoursInList(List<String> list) { + List<String> coloured = new ArrayList<>(); + for (String s : list) { + coloured.add(ChatColor.translateAlternateColorCodes('&', s)); + } + return coloured; + } +} diff --git a/src/main/java/com/leonardobishop/quests/hook/coreprotect/ICoreProtectHook.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/coreprotect/AbstractCoreProtectHook.java index 5dc1fa36..75f96ecd 100644 --- a/src/main/java/com/leonardobishop/quests/hook/coreprotect/ICoreProtectHook.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/coreprotect/AbstractCoreProtectHook.java @@ -1,8 +1,8 @@ -package com.leonardobishop.quests.hook.coreprotect; +package com.leonardobishop.quests.bukkit.hook.coreprotect; import org.bukkit.block.Block; -public interface ICoreProtectHook { +public interface AbstractCoreProtectHook { /** * Check whether or not the most recent edit to a block was the result of a player. diff --git a/src/main/java/com/leonardobishop/quests/hook/coreprotect/CoreProtectHook.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/coreprotect/CoreProtectHook.java index 60f4e0a4..1dbfe3bd 100644 --- a/src/main/java/com/leonardobishop/quests/hook/coreprotect/CoreProtectHook.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/coreprotect/CoreProtectHook.java @@ -1,4 +1,4 @@ -package com.leonardobishop.quests.hook.coreprotect; +package com.leonardobishop.quests.bukkit.hook.coreprotect; import net.coreprotect.CoreProtect; import net.coreprotect.CoreProtectAPI; @@ -7,7 +7,7 @@ import org.bukkit.block.Block; import java.util.List; -public class CoreProtectHook implements ICoreProtectHook { +public class CoreProtectHook implements AbstractCoreProtectHook { private final CoreProtectAPI api; diff --git a/src/main/java/com/leonardobishop/quests/hook/coreprotect/CoreProtectNoHook.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/coreprotect/CoreProtectNoHook.java index 32916934..4fc0eae9 100644 --- a/src/main/java/com/leonardobishop/quests/hook/coreprotect/CoreProtectNoHook.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/coreprotect/CoreProtectNoHook.java @@ -1,8 +1,8 @@ -package com.leonardobishop.quests.hook.coreprotect; +package com.leonardobishop.quests.bukkit.hook.coreprotect; import org.bukkit.block.Block; -public class CoreProtectNoHook implements ICoreProtectHook { +public class CoreProtectNoHook implements AbstractCoreProtectHook { @Override public boolean checkBlock(Block block, int time) { return false; diff --git a/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter.java index f3a6fc7e..efbd1a36 100644 --- a/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter.java @@ -1,6 +1,5 @@ -package com.leonardobishop.quests.hook.itemgetter; +package com.leonardobishop.quests.bukkit.hook.itemgetter; -import com.leonardobishop.quests.Quests; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; @@ -12,20 +11,19 @@ public interface ItemGetter { * * @param path the path to where the item is defined in the config (null if item is defined in second param) * @param config the configuration file - * @param plugin Quests plugin instance * @param excludes exclude certain fields in the configuration - * @return {@link org.bukkit.inventory.ItemStack} + * @return {@link ItemStack} */ - ItemStack getItem(String path, ConfigurationSection config, Quests plugin, Filter... excludes); + ItemStack getItem(String path, ConfigurationSection config, Filter... excludes); /** * Gets an ItemStack from a given string (which represents a material). * For pre-1.13 server implementations, the string may use a data code. * * @param material the string - * @return {@link org.bukkit.inventory.ItemStack} + * @return {@link ItemStack} */ - ItemStack getItemStack(String material, Quests plugin); + ItemStack getItemStack(String material); /** * Validates a material from a string. diff --git a/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetterLatest.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetterLatest.java index e1215388..4f87c2ac 100644 --- a/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetterLatest.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetterLatest.java @@ -1,6 +1,5 @@ -package com.leonardobishop.quests.hook.itemgetter; +package com.leonardobishop.quests.bukkit.hook.itemgetter; -import com.leonardobishop.quests.Quests; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.attribute.Attribute; @@ -34,7 +33,7 @@ public class ItemGetterLatest implements ItemGetter { requires at least API version 1.14 */ @Override - public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, ItemGetter.Filter... excludes) { + public ItemStack getItem(String path, ConfigurationSection config, ItemGetter.Filter... excludes) { if (path != null && !path.equals("")) { path = path + "."; } @@ -55,7 +54,7 @@ public class ItemGetterLatest implements ItemGetter { int data = 0; // material - ItemStack is = getItemStack(cType, plugin); + ItemStack is = getItemStack(cType); ItemMeta ism = is.getItemMeta(); // name @@ -177,7 +176,6 @@ public class ItemGetterLatest implements ItemGetter { for (String key : config.getStringList(path + "enchantments")) { String[] split = key.split(":"); if (split.length < 2) { - plugin.getQuestsLogger().debug("Enchantment does not follow format {namespace}:{name}:{level} : " + key); continue; } String namespace = split[0]; @@ -200,7 +198,6 @@ public class ItemGetterLatest implements ItemGetter { // } Enchantment enchantment; if ((enchantment = Enchantment.getByName(ench)) == null) { - plugin.getQuestsLogger().debug("Unrecognised enchantment: " + ench); continue; } @@ -221,12 +218,11 @@ public class ItemGetterLatest implements ItemGetter { } @Override - public ItemStack getItemStack(String material, Quests plugin) { + public ItemStack getItemStack(String material) { Material type; try { type = Material.valueOf(material); } catch (Exception e) { - plugin.getQuestsLogger().debug("Unrecognised material: " + material); type = Material.STONE; } return new ItemStack(type, 1); diff --git a/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter_1_13.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter_1_13.java index f25aab0c..a645f810 100644 --- a/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter_1_13.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter_1_13.java @@ -1,6 +1,5 @@ -package com.leonardobishop.quests.hook.itemgetter; +package com.leonardobishop.quests.bukkit.hook.itemgetter; -import com.leonardobishop.quests.Quests; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.attribute.Attribute; @@ -32,7 +31,7 @@ public class ItemGetter_1_13 implements ItemGetter { requires at least API version 1.13 */ @Override - public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, ItemGetter.Filter... excludes) { + public ItemStack getItem(String path, ConfigurationSection config, ItemGetter.Filter... excludes) { if (path != null && !path.equals("")) { path = path + "."; } @@ -51,7 +50,7 @@ public class ItemGetter_1_13 implements ItemGetter { int data = 0; // material - ItemStack is = getItemStack(cType, plugin); + ItemStack is = getItemStack(cType); ItemMeta ism = is.getItemMeta(); // name @@ -166,7 +165,6 @@ public class ItemGetter_1_13 implements ItemGetter { for (String key : config.getStringList(path + "enchantments")) { String[] split = key.split(":"); if (split.length < 2) { - plugin.getQuestsLogger().debug("Enchantment does not follow format {namespace}:{name}:{level} : " + key); continue; } String namespace = split[0]; @@ -189,7 +187,6 @@ public class ItemGetter_1_13 implements ItemGetter { // } Enchantment enchantment; if ((enchantment = Enchantment.getByName(ench)) == null) { - plugin.getQuestsLogger().debug("Unrecognised enchantment: " + ench); continue; } @@ -210,12 +207,11 @@ public class ItemGetter_1_13 implements ItemGetter { } @Override - public ItemStack getItemStack(String material, Quests plugin) { + public ItemStack getItemStack(String material) { Material type; try { type = Material.valueOf(material); } catch (Exception e) { - plugin.getQuestsLogger().debug("Unrecognised material: " + material); type = Material.STONE; } return new ItemStack(type, 1); diff --git a/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter_Late_1_8.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter_Late_1_8.java index 84525cfb..ea80deea 100644 --- a/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter_Late_1_8.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter_Late_1_8.java @@ -1,6 +1,5 @@ -package com.leonardobishop.quests.hook.itemgetter; +package com.leonardobishop.quests.bukkit.hook.itemgetter; -import com.leonardobishop.quests.Quests; import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -27,7 +26,7 @@ public class ItemGetter_Late_1_8 implements ItemGetter { requires at least API version 1.8 (?) */ @Override - public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, Filter... excludes) { + public ItemStack getItem(String path, ConfigurationSection config, Filter... excludes) { if (path != null && !path.equals("")) { path = path + "."; } @@ -44,7 +43,7 @@ public class ItemGetter_Late_1_8 implements ItemGetter { int data = 0; // material - ItemStack is = getItemStack(cType, plugin); + ItemStack is = getItemStack(cType); ItemMeta ism = is.getItemMeta(); // lore @@ -94,7 +93,6 @@ public class ItemGetter_Late_1_8 implements ItemGetter { Enchantment enchantment; if ((enchantment = Enchantment.getByName(ench)) == null) { - plugin.getQuestsLogger().debug("Unrecognised enchantment: " + ench); continue; } @@ -116,7 +114,7 @@ public class ItemGetter_Late_1_8 implements ItemGetter { @Override - public ItemStack getItemStack(String material, Quests plugin) { + public ItemStack getItemStack(String material) { Material type = null; int data = 0; @@ -135,7 +133,6 @@ public class ItemGetter_Late_1_8 implements ItemGetter { } if (type == null) { - plugin.getQuestsLogger().debug("Unrecognised material: " + material); type = Material.STONE; } return new ItemStack(type, 1, (short) data); diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/AbstractPlaceholderAPIHook.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/AbstractPlaceholderAPIHook.java new file mode 100644 index 00000000..144c2ecd --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/AbstractPlaceholderAPIHook.java @@ -0,0 +1,14 @@ +package com.leonardobishop.quests.bukkit.hook.papi; + +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import org.bukkit.entity.Player; + +public interface AbstractPlaceholderAPIHook { + + String replacePlaceholders(Player player, String text); + + void registerExpansion(BukkitQuestsPlugin plugin); + + void unregisterExpansion(); + +} diff --git a/src/main/java/com/leonardobishop/quests/hook/papi/PlaceholderAPIHook.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/PlaceholderAPIHook.java index 8fd86efc..c9102127 100644 --- a/src/main/java/com/leonardobishop/quests/hook/papi/PlaceholderAPIHook.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/PlaceholderAPIHook.java @@ -1,11 +1,10 @@ -package com.leonardobishop.quests.hook.papi; +package com.leonardobishop.quests.bukkit.hook.papi; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.QuestsPlaceholders; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.entity.Player; -public class PlaceholderAPIHook implements IPlaceholderAPIHook { +public class PlaceholderAPIHook implements AbstractPlaceholderAPIHook { private QuestsPlaceholders placeholder; @@ -14,7 +13,7 @@ public class PlaceholderAPIHook implements IPlaceholderAPIHook { } @Override - public void registerExpansion(Quests plugin) { + public void registerExpansion(BukkitQuestsPlugin plugin) { placeholder = new QuestsPlaceholders(plugin); placeholder.register(); } diff --git a/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/QuestsPlaceholders.java index 5c82cf6b..7428d860 100644 --- a/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/QuestsPlaceholders.java @@ -1,17 +1,19 @@ -package com.leonardobishop.quests.api; +package com.leonardobishop.quests.bukkit.hook.papi; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.menu.QItemStack; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.quest.Category; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.menu.itemstack.QItemStack; +import com.leonardobishop.quests.bukkit.util.Chat; +import com.leonardobishop.quests.common.enums.QuestStartResult; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.common.quest.Category; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.util.Format; import me.clip.placeholderapi.expansion.Cacheable; import me.clip.placeholderapi.expansion.PlaceholderExpansion; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -23,11 +25,11 @@ import java.util.concurrent.TimeUnit; public class QuestsPlaceholders extends PlaceholderExpansion implements Cacheable { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; private final Map<String, Map<String, String>> cache = new HashMap<>(); private final Map<String, SimpleDateFormat> formats = new HashMap<>(); - public QuestsPlaceholders(Quests plugin) { + public QuestsPlaceholders(BukkitQuestsPlugin plugin) { this.plugin = plugin; } @@ -39,7 +41,7 @@ public class QuestsPlaceholders extends PlaceholderExpansion implements Cacheabl @Override public String getIdentifier() { - return "quests"; + return "resources/bukkit/quests"; } @Override @@ -106,7 +108,10 @@ public class QuestsPlaceholders extends PlaceholderExpansion implements Cacheabl switch (args[1].toLowerCase()) { case "list": case "l": - plugin.getQuestManager().getCategories().forEach(c -> listCategories.add(c.getDisplayNameStripped())); + plugin.getQuestManager().getCategories().forEach(c -> { + ItemStack itemStack = plugin.getQItemStackRegistry().getCategoryItemStack(c); + listCategories.add(Chat.strip(itemStack.getItemMeta().getDisplayName())); + }); break; case "listid": case "lid": @@ -145,7 +150,7 @@ public class QuestsPlaceholders extends PlaceholderExpansion implements Cacheabl } if (args.length == 1) { - result = quest.getDisplayNameStripped(); + result = getQuestDisplayNameStripped(quest); } else { switch (args[1].toLowerCase()) { case "started": @@ -170,7 +175,7 @@ public class QuestsPlaceholders extends PlaceholderExpansion implements Cacheabl break; case "cooldown": if (qPlayer.getQuestProgressFile().getQuestProgress(quest).isCompleted()) { - final String time = plugin.convertToFormat(TimeUnit.SECONDS.convert(qPlayer.getQuestProgressFile().getCooldownFor(quest), TimeUnit.MILLISECONDS)); + final String time = Format.formatTime(TimeUnit.SECONDS.convert(qPlayer.getQuestProgressFile().getCooldownFor(quest), TimeUnit.MILLISECONDS)); if (!time.startsWith("-")) result = time; } else { result = "0"; @@ -214,7 +219,7 @@ public class QuestsPlaceholders extends PlaceholderExpansion implements Cacheabl if (placeholder == null) { return t[1] + " is not a valid placeholder within quest " + quest.getId(); } - placeholder = QItemStack.processPlaceholders(Options.color(placeholder), qPlayer.getQuestProgressFile().getQuestProgress(quest)); + placeholder = QItemStack.processPlaceholders(Chat.color(placeholder), qPlayer.getQuestProgressFile().getQuestProgress(quest)); return placeholder; } else { return args[0] + "_" + args[1] + " is not a valid placeholder"; @@ -224,14 +229,15 @@ public class QuestsPlaceholders extends PlaceholderExpansion implements Cacheabl break; case "category": case "c": - if (!Options.CATEGORIES_ENABLED.getBooleanValue()) return "Categories Disabled"; + if (!plugin.getQuestsConfig().getBoolean("options.categories-enabled")) return "Categories Disabled"; if (key.length == 1) return "Please specify category name"; final Category category = plugin.getQuestManager().getCategoryById(key[1]); if (category == null) return key[1] + " is not a category"; if (args.length == 1) { - result = category.getDisplayNameStripped(); + ItemStack itemStack = plugin.getQItemStackRegistry().getCategoryItemStack(category); + result = Chat.strip(itemStack.getItemMeta().getDisplayName()); } else { if (args.length > 2 && split.equals(args[2])) split = ","; switch (args[1].toLowerCase()) { @@ -294,7 +300,7 @@ public class QuestsPlaceholders extends PlaceholderExpansion implements Cacheabl switch (type.toLowerCase()) { case "list": case "l": - list.forEach(q -> quests.add(q.getDisplayNameStripped())); + list.forEach(q -> quests.add(getQuestDisplayNameStripped(q))); break; case "listid": case "lid": @@ -306,6 +312,12 @@ public class QuestsPlaceholders extends PlaceholderExpansion implements Cacheabl return String.join(separator, quests); } + private String getQuestDisplayNameStripped(Quest quest) { + QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(quest); + if (qItemStack != null) return Chat.strip(qItemStack.getName()); + return null; + } + private List<Quest> getCategoryQuests(QPlayer questP, Category category, QuestProgressFile.QuestsProgressFilter filter) { final List<Quest> categoryQuests = new ArrayList<>(); category.getRegisteredQuestIds().forEach(q -> { diff --git a/src/main/java/com/leonardobishop/quests/hook/title/Title.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/title/Title.java index ea8f1f57..49c4613b 100644 --- a/src/main/java/com/leonardobishop/quests/hook/title/Title.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/title/Title.java @@ -1,4 +1,4 @@ -package com.leonardobishop.quests.hook.title; +package com.leonardobishop.quests.bukkit.hook.title; import org.bukkit.entity.Player; diff --git a/src/main/java/com/leonardobishop/quests/hook/title/Title_Bukkit.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/title/Title_Bukkit.java index 34b22f6b..6975700e 100644 --- a/src/main/java/com/leonardobishop/quests/hook/title/Title_Bukkit.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/title/Title_Bukkit.java @@ -1,4 +1,4 @@ -package com.leonardobishop.quests.hook.title; +package com.leonardobishop.quests.bukkit.hook.title; import org.bukkit.entity.Player; diff --git a/src/main/java/com/leonardobishop/quests/hook/title/Title_BukkitNoTimings.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/title/Title_BukkitNoTimings.java index d0f44fe6..64c91ea6 100644 --- a/src/main/java/com/leonardobishop/quests/hook/title/Title_BukkitNoTimings.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/title/Title_BukkitNoTimings.java @@ -1,4 +1,4 @@ -package com.leonardobishop.quests.hook.title; +package com.leonardobishop.quests.bukkit.hook.title; import org.bukkit.entity.Player; diff --git a/src/main/java/com/leonardobishop/quests/hook/title/Title_Other.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/title/Title_Other.java index 419bf657..cdc8d7bf 100644 --- a/src/main/java/com/leonardobishop/quests/hook/title/Title_Other.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/title/Title_Other.java @@ -1,4 +1,4 @@ -package com.leonardobishop.quests.hook.title; +package com.leonardobishop.quests.bukkit.hook.title; import org.bukkit.entity.Player; diff --git a/src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/listener/PlayerJoinListener.java index 53916c32..2fe15860 100644 --- a/src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/listener/PlayerJoinListener.java @@ -1,9 +1,8 @@ -package com.leonardobishop.quests.listener; +package com.leonardobishop.quests.bukkit.listener; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.util.Messages; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.util.Messages; +import com.leonardobishop.quests.common.player.QPlayer; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -15,9 +14,9 @@ import java.util.UUID; public class PlayerJoinListener implements Listener { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; - public PlayerJoinListener(Quests plugin) { + public PlayerJoinListener(BukkitQuestsPlugin plugin) { this.plugin = plugin; } @@ -35,7 +34,11 @@ public class PlayerJoinListener implements Listener { } if (plugin.getUpdater().isUpdateReady() && event.getPlayer().hasPermission("quests.admin")) { // delay for a bit so they actually see the message - Bukkit.getScheduler().runTaskLater(this.plugin, () -> event.getPlayer().sendMessage(plugin.getUpdater().getMessage()), 50L); + String updateMessage = Messages.QUEST_UPDATER.getMessage() + .replace("{newver}", plugin.getUpdater().getReturnedVersion()) + .replace("{oldver}", plugin.getUpdater().getInstalledVersion()) + .replace("{link}", plugin.getUpdater().getUpdateLink()); + Bukkit.getScheduler().runTaskLater(this.plugin, () -> event.getPlayer().sendMessage(updateMessage), 50L); } QPlayer qPlayer = plugin.getPlayerManager().getPlayer(playerUuid); diff --git a/src/main/java/com/leonardobishop/quests/listener/PlayerLeaveListener.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/listener/PlayerLeaveListener.java index d246e1f6..1f41344a 100644 --- a/src/main/java/com/leonardobishop/quests/listener/PlayerLeaveListener.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/listener/PlayerLeaveListener.java @@ -1,18 +1,16 @@ -package com.leonardobishop.quests.listener; +package com.leonardobishop.quests.bukkit.listener; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import org.bukkit.Bukkit; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.common.player.QPlayer; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; public class PlayerLeaveListener implements Listener { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; - public PlayerLeaveListener(Quests plugin) { + public PlayerLeaveListener(BukkitQuestsPlugin plugin) { this.plugin = plugin; } diff --git a/src/main/java/com/leonardobishop/quests/menu/CancelQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CancelQMenu.java index 12186348..3c811bff 100644 --- a/src/main/java/com/leonardobishop/quests/menu/CancelQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CancelQMenu.java @@ -1,10 +1,10 @@ -package com.leonardobishop.quests.menu; +package com.leonardobishop.quests.bukkit.menu; -import com.leonardobishop.quests.listener.MenuController; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.util.Items; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.util.Chat; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.quest.Quest; import org.bukkit.Bukkit; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; @@ -16,13 +16,17 @@ import org.bukkit.inventory.meta.ItemMeta; */ public class CancelQMenu implements QMenu { + private final BukkitQuestsPlugin plugin; + private final BukkitQuestsConfig config; private final QMenu superMenu; private final QPlayer owner; private final Quest quest; - public CancelQMenu(QPlayer owner, QMenu superMenu, Quest quest) { - this.owner = owner; + public CancelQMenu(BukkitQuestsPlugin plugin, QMenu superMenu, QPlayer owner, Quest quest) { + this.plugin = plugin; + this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); this.superMenu = superMenu; + this.owner = owner; this.quest = quest; } @@ -36,12 +40,12 @@ public class CancelQMenu implements QMenu { } public Inventory toInventory(int page) { - String title = Options.color(Options.GUITITLE_QUEST_CANCEL.getStringValue()); + String title = Chat.color(config.getString("options.guinames.quest-cancel")); - ItemStack yes = Items.QUEST_CANCEL_YES.getItem(); - ItemStack no = Items.QUEST_CANCEL_NO.getItem(); + ItemStack yes = config.getItem("gui.quest-cancel-yes"); + ItemStack no = config.getItem("gui.quest-cancel-no"); - ItemStack background = Items.QUEST_CANCEL_BACKGROUND.getItem(); + ItemStack background = config.getItem("gui.quest-cancel-background"); ItemMeta backgroundMeta = background.getItemMeta(); backgroundMeta.setDisplayName(" "); background.setItemMeta(backgroundMeta); @@ -55,7 +59,7 @@ public class CancelQMenu implements QMenu { inventory.setItem(10, no); inventory.setItem(11, no); inventory.setItem(12, no); - inventory.setItem(13, quest.getDisplayItem().toItemStack(quest, owner, owner.getQuestProgressFile().getQuestProgress(quest))); + inventory.setItem(13, plugin.getQItemStackRegistry().getQuestItemStack(quest).toItemStack(quest, owner, owner.getQuestProgressFile().getQuestProgress(quest))); inventory.setItem(14, yes); inventory.setItem(15, yes); inventory.setItem(16, yes); diff --git a/src/main/java/com/leonardobishop/quests/menu/CategoryQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CategoryQMenu.java index 3afb4eb4..03693657 100644 --- a/src/main/java/com/leonardobishop/quests/menu/CategoryQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CategoryQMenu.java @@ -1,15 +1,15 @@ -package com.leonardobishop.quests.menu; +package com.leonardobishop.quests.bukkit.menu; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.listener.MenuController; -import com.leonardobishop.quests.menu.element.CategoryMenuElement; -import com.leonardobishop.quests.menu.element.CustomMenuElement; -import com.leonardobishop.quests.menu.element.MenuElement; -import com.leonardobishop.quests.menu.element.SpacerMenuElement; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.util.Items; -import com.leonardobishop.quests.util.Messages; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.menu.element.CategoryMenuElement; +import com.leonardobishop.quests.bukkit.menu.element.CustomMenuElement; +import com.leonardobishop.quests.bukkit.menu.element.MenuElement; +import com.leonardobishop.quests.bukkit.menu.element.SpacerMenuElement; +import com.leonardobishop.quests.bukkit.util.Chat; +import com.leonardobishop.quests.bukkit.util.MenuUtils; +import com.leonardobishop.quests.bukkit.util.Messages; +import com.leonardobishop.quests.common.player.QPlayer; import org.apache.commons.lang.math.NumberUtils; import org.bukkit.Bukkit; import org.bukkit.event.inventory.InventoryClickEvent; @@ -25,7 +25,8 @@ import java.util.Map; */ public class CategoryQMenu implements QMenu { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; + private final BukkitQuestsConfig config; private final HashMap<Integer, MenuElement> menuElements = new HashMap<>(); private final QPlayer owner; @@ -35,22 +36,23 @@ public class CategoryQMenu implements QMenu { private int pageNextLocation = -1; private int currentPage = -1; - public CategoryQMenu(Quests plugin, QPlayer owner) { + public CategoryQMenu(BukkitQuestsPlugin plugin, QPlayer owner) { this.plugin = plugin; + this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); this.owner = owner; } public void populate(List<QuestQMenu> menuQuests) { - if (plugin.getConfig().isConfigurationSection("custom-elements.categories")) { - for (String s : plugin.getConfig().getConfigurationSection("custom-elements.categories").getKeys(false)) { + if (config.getConfig().isConfigurationSection("custom-elements.categories")) { + for (String s : config.getConfig().getConfigurationSection("custom-elements.categories").getKeys(false)) { if (!NumberUtils.isNumber(s)) continue; int slot = Integer.parseInt(s); - int repeat = plugin.getConfig().getInt("custom-elements.categories." + s + ".repeat"); + int repeat = config.getInt("custom-elements.categories." + s + ".repeat"); MenuElement menuElement; - if (plugin.getConfig().contains("custom-elements.categories." + s + ".display")) { - ItemStack is = plugin.getItemStack("custom-elements.categories." + s + ".display", plugin.getConfig()); + if (config.getConfig().contains("custom-elements.categories." + s + ".display")) { + ItemStack is = config.getItem("custom-elements.categories." + s + ".display"); menuElement = new CustomMenuElement(is); - } else if (plugin.getConfig().getBoolean("custom-elements.categories." + s + ".spacer", false)) { + } else if (config.getBoolean("custom-elements.categories." + s + ".spacer", false)) { menuElement = new SpacerMenuElement(); } else continue; // user = idiot @@ -62,7 +64,7 @@ public class CategoryQMenu implements QMenu { int slot = 0; for (QuestQMenu questQMenu : menuQuests) { while (menuElements.containsKey(slot)) slot++; - if (Options.GUI_HIDE_CATEGORIES_NOPERMISSION.getBooleanValue() && plugin.getQuestManager().getCategoryById(questQMenu.getCategoryName()).isPermissionRequired()) { + if (config.getBoolean("options.gui-hide-categories-nopermission") && plugin.getQuestManager().getCategoryById(questQMenu.getCategoryName()).isPermissionRequired()) { if (!Bukkit.getPlayer(owner.getPlayerUUID()).hasPermission("quests.category." + questQMenu.getCategoryName())) { continue; } @@ -92,7 +94,7 @@ public class CategoryQMenu implements QMenu { currentPage = page; int pageMin = pageSize * (page - 1); int pageMax = pageSize * page; - String title = Options.color(Options.GUITITLE_QUESTS_CATEGORY.getStringValue()); + String title = Chat.color(config.getString("options.guinames.quests-category")); ItemStack pageIs; ItemStack pagePrevIs; @@ -114,10 +116,10 @@ public class CategoryQMenu implements QMenu { pageplaceholders.put("{prevpage}", String.valueOf(page - 1)); pageplaceholders.put("{nextpage}", String.valueOf(page + 1)); pageplaceholders.put("{page}", String.valueOf(page)); - pageIs = MenuUtil.applyPlaceholders(plugin, owner.getPlayerUUID(), Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); + pageIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-desc"), pageplaceholders); pageIs.setAmount(Math.min(page, 64)); - pagePrevIs = MenuUtil.applyPlaceholders(plugin, owner.getPlayerUUID(), Items.PAGE_PREV.getItem(), pageplaceholders); - pageNextIs = MenuUtil.applyPlaceholders(plugin, owner.getPlayerUUID(), Items.PAGE_NEXT.getItem(), pageplaceholders); + pagePrevIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-prev"), pageplaceholders); + pageNextIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-next"), pageplaceholders); if (maxElement > pageSize) { inventory.setItem(49, pageIs); @@ -129,7 +131,7 @@ public class CategoryQMenu implements QMenu { inventory.setItem(50, pageNextIs); pageNextLocation = 50; } - } else if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) { + } else if (config.getBoolean("options.trim-gui-size") && page == 1) { int inventorySize = highestOnPage + (9 - highestOnPage % 9) * Math.min(1, highestOnPage % 9); inventorySize = inventorySize <= 0 ? 9 : inventorySize; if (inventorySize == 54) { @@ -159,7 +161,8 @@ public class CategoryQMenu implements QMenu { if (element instanceof CategoryMenuElement) { CategoryMenuElement categoryMenuElement = (CategoryMenuElement) element; QuestQMenu questQMenu = categoryMenuElement.getQuestMenu(); - if (owner.openCategory(plugin.getQuestManager().getCategoryById(questQMenu.getCategoryName()), questQMenu) != 0) { + if (plugin.getMenuController().openQuestCategory(owner, + plugin.getQuestManager().getCategoryById(questQMenu.getCategoryName()), questQMenu) != 0) { event.getWhoClicked().sendMessage(Messages.QUEST_CATEGORY_PERMISSION.getMessage()); } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/DailyQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/DailyQMenu.java new file mode 100644 index 00000000..622137a4 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/DailyQMenu.java @@ -0,0 +1,97 @@ +//package com.leonardobishop.quests.bukkit.menu; +// +//import com.leonardobishop.quests.Quests; +//import com.leonardobishop.quests.common.enums.QuestStartResult; +//import com.leonardobishop.quests.common.player.QPlayer; +//import com.leonardobishop.quests.common.quest.Quest; +//import com.leonardobishop.quests.listener.MenuController; +//import com.leonardobishop.quests.menu.element.MenuElement; +//import com.leonardobishop.quests.menu.element.QuestMenuElement; +//import com.leonardobishop.quests.quest.controller.DailyQuestController; +//import com.leonardobishop.quests.util.Items; +//import com.leonardobishop.quests.util.Options; +//import org.bukkit.Bukkit; +//import org.bukkit.event.inventory.ClickType; +//import org.bukkit.event.inventory.InventoryClickEvent; +//import org.bukkit.inventory.Inventory; +//import org.bukkit.inventory.ItemStack; +//import org.bukkit.inventory.meta.ItemMeta; +// +//import java.util.HashMap; +//import java.util.List; +//import java.util.Map; +// +///** +// * Represents a cancellation confirmation menu for a specific quest. +// */ +//public class DailyQMenu implements QMenu { +// +// private final Map<Integer, MenuElement> menuElements = new HashMap<>(); +// private final Quests plugin; +// private final QPlayer owner; +// +// public DailyQMenu(Quests plugin, QPlayer owner) { +// this.plugin = plugin; +// this.owner = owner; +// } +// +// @Override +// public QPlayer getOwner() { +// return owner; +// } +// +// public void populate() { +// if (!(owner.getQuestController() instanceof DailyQuestController)) { +// return; +// } +// DailyQuestController dailyQuestController = (DailyQuestController) owner.getQuestController(); +// List<String> quests = dailyQuestController.getQuests(); +// for (int i = 0; i < quests.size(); i++) { +// menuElements.put(11 + i, new QuestMenuElement(plugin, owner, quests.get(i))); +// } +// } +// +// public Inventory toInventory(int page) { +// String title = Options.color(Options.GUITITLE_DAILY_QUESTS.getStringValue()); +// +// ItemStack background = Items.QUEST_CANCEL_BACKGROUND.getItem(); +// ItemMeta backgroundMeta = background.getItemMeta(); +// backgroundMeta.setDisplayName(" "); +// background.setItemMeta(backgroundMeta); +// +// Inventory inventory = Bukkit.createInventory(null, 27, title); +// +// for (int i = 0; i < inventory.getSize(); i++) { +// inventory.setItem(i, background); +// } +// +// for (int pointer = 0; pointer < 27; pointer++) { +// if (menuElements.containsKey(pointer)) { +// inventory.setItem(pointer, menuElements.get(pointer).asItemStack()); +// } +// } +// +// return inventory; +// } +// +// @Override +// public void handleClick(InventoryClickEvent event, MenuController controller) { +// if (menuElements.containsKey(event.getSlot())) { +// MenuElement menuElement = menuElements.get(event.getSlot()); +// if (menuElement instanceof QuestMenuElement) { +// QuestMenuElement questMenuElement = (QuestMenuElement) menuElement; +// Quest quest = plugin.getQuestManager().getQuestById(questMenuElement.getQuestId()); +// if (event.getClick() == ClickType.LEFT) { +// if (Options.QUEST_AUTOSTART.getBooleanValue()) return; +// if (owner.startQuest(quest) == QuestStartResult.QUEST_SUCCESS) { +// event.getWhoClicked().closeInventory(); //TODO Option to keep the menu open +// } +// } else if (event.getClick() == ClickType.MIDDLE && Options.ALLOW_QUEST_TRACK.getBooleanValue()) { +// MenuUtil.handleMiddleClick(this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); +// } +// } +// } +// } +// +// +//} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/MenuController.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/MenuController.java new file mode 100644 index 00000000..aeb543d6 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/MenuController.java @@ -0,0 +1,176 @@ +package com.leonardobishop.quests.bukkit.menu; + +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.quest.Category; +import com.leonardobishop.quests.common.quest.Quest; +import org.bukkit.Bukkit; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class MenuController implements Listener { + + private final HashMap<UUID, QMenu> tracker = new HashMap<>(); + private final BukkitQuestsPlugin plugin; + + public MenuController(BukkitQuestsPlugin plugin) { + this.plugin = plugin; + } + + public void openMenu(HumanEntity player, QMenu qMenu, int page) { + player.openInventory(qMenu.toInventory(page)); + tracker.put(player.getUniqueId(), qMenu); + } + + @EventHandler + private void onClose(InventoryCloseEvent event) { + tracker.remove(event.getPlayer().getUniqueId()); + } + + @EventHandler + private void onClick(InventoryClickEvent event) { + // check if the player has a quest menu open + if (tracker.containsKey(event.getWhoClicked().getUniqueId())) { + event.setCancelled(true); + if (event.getClickedInventory() == null) + return; //The player clicked outside the inventory + if (event.getClickedInventory().getType() == InventoryType.PLAYER) + return; //The clicked inventory is a player inventory type + + QMenu qMenu = tracker.get(event.getWhoClicked().getUniqueId()); + qMenu.handleClick(event, this); + } + } + + /** + * Opens a quest listing menu for the player. + * + * @return 0 if success, 1 if no permission, 2 is only data loaded, 3 if player not found + */ + public int openQuestCategory(QPlayer qPlayer, Category category, CategoryQMenu superMenu, boolean backButton) { + Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); + if (player == null) { + return 3; + } + + if (category.isPermissionRequired() && !player.hasPermission("quests.category." + category.getId())) { + return 1; + } + + // Using `this` instead of searching again for this QPlayer + QuestQMenu questQMenu = new QuestQMenu(plugin, qPlayer, category.getId(), superMenu); + List<Quest> quests = new ArrayList<>(); + for (String questid : category.getRegisteredQuestIds()) { + Quest quest = plugin.getQuestManager().getQuestById(questid); + if (quest != null) { + quests.add(quest); + } + } + questQMenu.populate(quests); + questQMenu.setBackButtonEnabled(backButton); + + openMenu(player, questQMenu, 1); + return 0; + } + + /** + * Opens a specific quest listing menu for the player. + * + * @return 0 if success, 1 if no permission, 2 is only data loaded, 3 if player not found + */ + public int openQuestCategory(QPlayer qPlayer, Category category, QuestQMenu questQMenu) { + Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); + if (player == null) { + return 3; + } + + if (category.isPermissionRequired() && !player.hasPermission("quests.category." + category.getId())) { + return 1; + } + + openMenu(player, questQMenu, 1); + return 0; + } + + /** + * Open the main menu for the player + * + * @param qPlayer player + */ + public void openMainMenu(QPlayer qPlayer) { + Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); + if (player == null) { + return; + } + + if (plugin.getQuestController().getName().equals("normal")) { + if (plugin.getQuestsConfig().getBoolean("options.categories-enabled")) { + CategoryQMenu categoryQMenu = new CategoryQMenu(plugin, qPlayer); + List<QuestQMenu> questMenus = new ArrayList<>(); + for (Category category : plugin.getQuestManager().getCategories()) { + QuestQMenu questQMenu = new QuestQMenu(plugin, qPlayer, category.getId(), categoryQMenu); + List<Quest> quests = new ArrayList<>(); + for (String questid : category.getRegisteredQuestIds()) { + Quest quest = plugin.getQuestManager().getQuestById(questid); + if (quest != null) { + quests.add(quest); + } + } + questQMenu.populate(quests); + questMenus.add(questQMenu); + } + categoryQMenu.populate(questMenus); + + plugin.getMenuController().openMenu(player, categoryQMenu, 1); + } else { + QuestQMenu questQMenu = new QuestQMenu(plugin, qPlayer, "", null); + List<Quest> quests = new ArrayList<>(); + for (Map.Entry<String, Quest> entry : plugin.getQuestManager().getQuests().entrySet()) { + quests.add(entry.getValue()); + } + questQMenu.populate(quests); + questQMenu.setBackButtonEnabled(false); + + plugin.getMenuController().openMenu(player, questQMenu, 1); + } + } +// } else { +// DailyQMenu dailyQMenu = new DailyQMenu(plugin, this); +// dailyQMenu.populate(); +// plugin.getMenuController().openMenu(player, dailyQMenu, 1); +// } + } + + /** + * Open the started menu for the player + * + * @param qPlayer player + */ + public void openStartedQuests(QPlayer qPlayer) { + Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); + if (player == null) { + return; + } + + StartedQMenu startedQMenu = new StartedQMenu(plugin, qPlayer); + List<QuestSortWrapper> quests = new ArrayList<>(); + for (Map.Entry<String, Quest> entry : plugin.getQuestManager().getQuests().entrySet()) { + quests.add(new QuestSortWrapper(plugin, entry.getValue())); + } + startedQMenu.populate(quests); + + plugin.getMenuController().openMenu(player, startedQMenu, 1); + } + +} diff --git a/src/main/java/com/leonardobishop/quests/menu/QMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QMenu.java index 6b793c77..0e3c9f78 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QMenu.java @@ -1,7 +1,6 @@ -package com.leonardobishop.quests.menu; +package com.leonardobishop.quests.bukkit.menu; -import com.leonardobishop.quests.listener.MenuController; -import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.common.player.QPlayer; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; diff --git a/src/main/java/com/leonardobishop/quests/menu/QuestQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java index af655886..be2125e8 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QuestQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java @@ -1,17 +1,17 @@ -package com.leonardobishop.quests.menu; +package com.leonardobishop.quests.bukkit.menu; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.listener.MenuController; -import com.leonardobishop.quests.menu.element.CustomMenuElement; -import com.leonardobishop.quests.menu.element.MenuElement; -import com.leonardobishop.quests.menu.element.QuestMenuElement; -import com.leonardobishop.quests.menu.element.SpacerMenuElement; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.util.Items; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.menu.element.CustomMenuElement; +import com.leonardobishop.quests.bukkit.menu.element.MenuElement; +import com.leonardobishop.quests.bukkit.menu.element.QuestMenuElement; +import com.leonardobishop.quests.bukkit.menu.element.SpacerMenuElement; +import com.leonardobishop.quests.bukkit.util.Chat; +import com.leonardobishop.quests.bukkit.util.MenuUtils; +import com.leonardobishop.quests.common.enums.QuestStartResult; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.quest.Quest; import org.apache.commons.lang.math.NumberUtils; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -33,7 +33,8 @@ import java.util.Map; */ public class QuestQMenu implements QMenu { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; + private final BukkitQuestsConfig config; private final HashMap<Integer, MenuElement> menuElements = new HashMap<>(); private final CategoryQMenu superMenu; private final String categoryName; @@ -47,8 +48,9 @@ public class QuestQMenu implements QMenu { private int currentPage = -1; private boolean backButtonEnabled = true; - public QuestQMenu(Quests plugin, QPlayer owner, String categoryName, CategoryQMenu superMenu) { + public QuestQMenu(BukkitQuestsPlugin plugin, QPlayer owner, String categoryName, CategoryQMenu superMenu) { this.plugin = plugin; + this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); this.owner = owner; this.categoryName = categoryName; this.superMenu = superMenu; @@ -56,7 +58,7 @@ public class QuestQMenu implements QMenu { public void populate(List<Quest> quests) { String path; - if (Options.CATEGORIES_ENABLED.getBooleanValue()) { + if (config.getBoolean("options.categories-enabled")) { path = "custom-elements.c:" + categoryName; } else { path = "custom-elements.quests"; @@ -84,14 +86,14 @@ public class QuestQMenu implements QMenu { int slot = 0; for (Quest quest : quests) { while (menuElements.containsKey(slot)) slot++; - if (Options.GUI_HIDE_LOCKED.getBooleanValue()) { + if (config.getBoolean("options.gui-hide-locked")) { QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); long cooldown = owner.getQuestProgressFile().getCooldownFor(quest); if (!owner.getQuestProgressFile().hasMetRequirements(quest) || (!quest.isRepeatable() && questProgress.isCompletedBefore()) || cooldown > 0) { continue; } } - if (Options.GUI_HIDE_QUESTS_NOPERMISSION.getBooleanValue() && quest.isPermissionRequired()) { + if (config.getBoolean("options.gui-hide-quests-nopermission") && quest.isPermissionRequired()) { if (!Bukkit.getPlayer(owner.getPlayerUUID()).hasPermission("quests.quest." + quest.getId())) { continue; } @@ -134,12 +136,12 @@ public class QuestQMenu implements QMenu { currentPage = page; int pageMin = pageSize * (page - 1); int pageMax = pageSize * page; - String title = Options.color(Options.GUITITLE_QUESTS.getStringValue()); + String title = Chat.color(config.getString("options.guinames.quests-menu")); ItemStack pageIs; ItemStack pagePrevIs; ItemStack pageNextIs; - ItemStack back = Items.BACK_BUTTON.getItem(); + ItemStack back = config.getItem("gui.back-button"); Inventory inventory = Bukkit.createInventory(null, 54, title); @@ -158,12 +160,12 @@ public class QuestQMenu implements QMenu { pageplaceholders.put("{prevpage}", String.valueOf(page - 1)); pageplaceholders.put("{nextpage}", String.valueOf(page + 1)); pageplaceholders.put("{page}", String.valueOf(page)); - pageIs = replaceItemStack(Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); + pageIs = replaceItemStack(config.getItem("gui.page-description"), pageplaceholders); pageIs.setAmount(Math.min(page, 64)); - pagePrevIs = replaceItemStack(Items.PAGE_PREV.getItem(), pageplaceholders); - pageNextIs = replaceItemStack(Items.PAGE_NEXT.getItem(), pageplaceholders); + pagePrevIs = replaceItemStack(config.getItem("gui.page-prev"), pageplaceholders); + pageNextIs = replaceItemStack(config.getItem("gui.page-next"), pageplaceholders); - if (Options.CATEGORIES_ENABLED.getBooleanValue() && backButtonEnabled) { + if (config.getBoolean("options.categories-enabled") && backButtonEnabled) { inventory.setItem(45, back); backButtonLocation = 45; } @@ -177,12 +179,12 @@ public class QuestQMenu implements QMenu { inventory.setItem(50, pageNextIs); pageNextLocation = 50; } - } else if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) { + } else if (config.getBoolean("options.trim-gui-size") && page == 1) { int inventorySize = highestOnPage + (9 - highestOnPage % 9) * Math.min(1, highestOnPage % 9); inventorySize = inventorySize <= 0 ? 9 : inventorySize; if (inventorySize == 54) { return inventory; - } else if (Options.CATEGORIES_ENABLED.getBooleanValue() && backButtonEnabled) { + } else if (config.getBoolean("options.categories-enabled") && backButtonEnabled) { inventorySize += 9; } @@ -190,7 +192,7 @@ public class QuestQMenu implements QMenu { for (int slot = 0; slot < trimmedInventory.getSize(); slot++) { if (slot >= (trimmedInventory.getSize() - 9) && backButtonEnabled){ - if (Options.CATEGORIES_ENABLED.getBooleanValue()) { + if (config.getBoolean("options.categories-enabled")) { trimmedInventory.setItem(slot, back); backButtonLocation = slot; } @@ -213,7 +215,7 @@ public class QuestQMenu implements QMenu { } else if (pageNextLocation == event.getSlot()) { controller.openMenu(event.getWhoClicked(), this, currentPage + 1); - } else if (Options.CATEGORIES_ENABLED.getBooleanValue() && backButtonLocation == event.getSlot()) { + } else if (config.getBoolean("options.categories-enabled") && backButtonLocation == event.getSlot()) { controller.openMenu(event.getWhoClicked(), superMenu, 1); } else if (event.getSlot() < pageSize && menuElements.containsKey(event.getSlot() + (((currentPage) - 1) * pageSize))) { @@ -222,15 +224,15 @@ public class QuestQMenu implements QMenu { QuestMenuElement questMenuElement = (QuestMenuElement) menuElement; Quest quest = plugin.getQuestManager().getQuestById(questMenuElement.getQuestId()); if (event.getClick() == ClickType.LEFT) { - if (Options.QUEST_AUTOSTART.getBooleanValue()) return; + if (config.getBoolean("options.quest-autostart")) return; if (owner.startQuest(quest) == QuestStartResult.QUEST_SUCCESS) { event.getWhoClicked().closeInventory(); //TODO Option to keep the menu open } - } else if (event.getClick() == ClickType.MIDDLE && Options.ALLOW_QUEST_TRACK.getBooleanValue()) { - MenuUtil.handleMiddleClick(this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); - } else if (event.getClick() == ClickType.RIGHT && Options.ALLOW_QUEST_CANCEL.getBooleanValue() + } else if (event.getClick() == ClickType.MIDDLE && config.getBoolean("options.quest-autostart")) { + MenuUtils.handleMiddleClick(plugin, this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); + } else if (event.getClick() == ClickType.RIGHT && config.getBoolean("options.allow-quest-cancel") && owner.hasStartedQuest(quest)) { - MenuUtil.handleRightClick(this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); + MenuUtils.handleRightClick(plugin, this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); } } } @@ -266,7 +268,7 @@ public class QuestQMenu implements QMenu { for (String s : lore) { for (Map.Entry<String, String> entry : placeholders.entrySet()) { s = s.replace(entry.getKey(), entry.getValue()); - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + if (plugin.getPlaceholderAPIHook() != null && plugin.getQuestsConfig().getBoolean("options.gui-use-placeholderapi")) { s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); } } @@ -275,7 +277,7 @@ public class QuestQMenu implements QMenu { } for (Map.Entry<String, String> entry : placeholders.entrySet()) { ism.setDisplayName(ism.getDisplayName().replace(entry.getKey(), entry.getValue())); - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + if (plugin.getPlaceholderAPIHook() != null && plugin.getQuestsConfig().getBoolean("options.gui-use-placeholderapi")) { ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); } } diff --git a/src/main/java/com/leonardobishop/quests/menu/QuestSortWrapper.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestSortWrapper.java index 2d15ac87..31d4f214 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QuestSortWrapper.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestSortWrapper.java @@ -1,8 +1,8 @@ -package com.leonardobishop.quests.menu; +package com.leonardobishop.quests.bukkit.menu; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.quest.Category; -import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.common.plugin.Quests; +import com.leonardobishop.quests.common.quest.Category; +import com.leonardobishop.quests.common.quest.Quest; public class QuestSortWrapper implements Comparable<QuestSortWrapper> { diff --git a/src/main/java/com/leonardobishop/quests/menu/StartedQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/StartedQMenu.java index 317d2839..01f99c79 100644 --- a/src/main/java/com/leonardobishop/quests/menu/StartedQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/StartedQMenu.java @@ -1,12 +1,12 @@ -package com.leonardobishop.quests.menu; +package com.leonardobishop.quests.bukkit.menu; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.listener.MenuController; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.util.Items; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.util.Chat; +import com.leonardobishop.quests.bukkit.util.MenuUtils; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.quest.Quest; import org.bukkit.Bukkit; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; @@ -23,7 +23,8 @@ import java.util.Map; */ public class StartedQMenu implements QMenu { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; + private final BukkitQuestsConfig config; private final HashMap<Integer, String> slotsToQuestIds = new HashMap<>(); private final int pageSize = 45; private final QPlayer owner; @@ -32,8 +33,9 @@ public class StartedQMenu implements QMenu { private int pageNextLocation = -1; private int currentPage = -1; - public StartedQMenu(Quests plugin, QPlayer owner) { + public StartedQMenu(BukkitQuestsPlugin plugin, QPlayer owner) { this.plugin = plugin; + this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); this.owner = owner; } @@ -77,12 +79,12 @@ public class StartedQMenu implements QMenu { currentPage = page; int pageMin = pageSize * (page - 1); int pageMax = pageSize * page; - String title = Options.color(Options.GUITITLE_QUESTS_STARTED.getStringValue()); + String title = Chat.color(config.getString("options.guinames.quests-started-menu")); ItemStack pageIs; ItemStack pagePrevIs; ItemStack pageNextIs; - ItemStack none = Items.NO_STARTED_QUESTS.getItem(); + ItemStack none = config.getItem("gui.no-started-quests"); Inventory inventory = Bukkit.createInventory(null, 54, title); @@ -93,8 +95,8 @@ public class StartedQMenu implements QMenu { Quest quest = plugin.getQuestManager().getQuestById(slotsToQuestIds.get(pointer)); QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); - inventory.setItem(invSlot, MenuUtil.applyPlaceholders(plugin, owner.getPlayerUUID(), plugin.getQuestManager().getQuestById( - quest.getId()).getDisplayItem().toItemStack(quest, owner, questProgress))); + inventory.setItem(invSlot, MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), + plugin.getQItemStackRegistry().getQuestItemStack(quest).toItemStack(quest, owner, questProgress))); } invSlot++; } @@ -109,10 +111,10 @@ public class StartedQMenu implements QMenu { pageplaceholders.put("{prevpage}", String.valueOf(page - 1)); pageplaceholders.put("{nextpage}", String.valueOf(page + 1)); pageplaceholders.put("{page}", String.valueOf(page)); - pageIs = MenuUtil.applyPlaceholders(plugin, owner.getPlayerUUID(), Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); + pageIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-description"), pageplaceholders); pageIs.setAmount(Math.min(page, 64)); - pagePrevIs = MenuUtil.applyPlaceholders(plugin, owner.getPlayerUUID(), Items.PAGE_PREV.getItem(), pageplaceholders); - pageNextIs = MenuUtil.applyPlaceholders(plugin, owner.getPlayerUUID(), Items.PAGE_NEXT.getItem(), pageplaceholders); + pagePrevIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-prev"), pageplaceholders); + pageNextIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-next"), pageplaceholders); if (slotsToQuestIds.size() > pageSize) { inventory.setItem(49, pageIs); @@ -124,7 +126,7 @@ public class StartedQMenu implements QMenu { inventory.setItem(50, pageNextIs); pageNextLocation = 50; } - } else if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) { + } else if (config.getBoolean("options.trim-gui-size") && page == 1) { int slotsUsed = 0; for (int pointer = 0; pointer < pageMax; pointer++) { if (inventory.getItem(pointer) != null) { @@ -162,11 +164,11 @@ public class StartedQMenu implements QMenu { // repeat from above String questid = slotsToQuestIds.get(event.getSlot() + (((currentPage) - 1) * pageSize)); Quest quest = plugin.getQuestManager().getQuestById(questid); - if (event.getClick() == ClickType.MIDDLE && Options.ALLOW_QUEST_TRACK.getBooleanValue()) { - MenuUtil.handleMiddleClick(this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); - } else if (event.getClick() == ClickType.RIGHT && Options.ALLOW_QUEST_CANCEL.getBooleanValue() + if (event.getClick() == ClickType.MIDDLE && config.getBoolean("options.allow-quest-track")) { + MenuUtils.handleMiddleClick(plugin, this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); + } else if (event.getClick() == ClickType.RIGHT && config.getBoolean("options.allow-quest-cancel") && owner.hasStartedQuest(quest)) { - MenuUtil.handleRightClick(this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); + MenuUtils.handleRightClick(plugin, this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); } } } diff --git a/src/main/java/com/leonardobishop/quests/menu/element/CategoryMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/CategoryMenuElement.java index 13d8a734..9aa2efb5 100644 --- a/src/main/java/com/leonardobishop/quests/menu/element/CategoryMenuElement.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/CategoryMenuElement.java @@ -1,9 +1,8 @@ -package com.leonardobishop.quests.menu.element; +package com.leonardobishop.quests.bukkit.menu.element; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.menu.QuestQMenu; -import com.leonardobishop.quests.quest.Category; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.menu.QuestQMenu; +import com.leonardobishop.quests.common.quest.Category; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -15,11 +14,11 @@ import java.util.UUID; public class CategoryMenuElement extends MenuElement { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; private final UUID owner; private final QuestQMenu questMenu; - public CategoryMenuElement(Quests plugin, UUID owner, QuestQMenu questMenu) { + public CategoryMenuElement(BukkitQuestsPlugin plugin, UUID owner, QuestQMenu questMenu) { this.plugin = plugin; this.owner = owner; this.questMenu = questMenu; @@ -37,13 +36,13 @@ public class CategoryMenuElement extends MenuElement { public ItemStack asItemStack() { Category category = plugin.getQuestManager().getCategoryById(questMenu.getCategoryName()); if (category != null) { - return replaceItemStack(category.getDisplayItem()); + return replaceItemStack(plugin.getQItemStackRegistry().getCategoryItemStack(category)); } return null; } private ItemStack replaceItemStack(ItemStack is) { - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + if (plugin.getPlaceholderAPIHook() != null && plugin.getQuestsConfig().getBoolean("options.gui-use-placeholderapi")) { ItemStack newItemStack = is.clone(); List<String> lore = newItemStack.getItemMeta().getLore(); List<String> newLore = new ArrayList<>(); diff --git a/src/main/java/com/leonardobishop/quests/menu/element/CustomMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/CustomMenuElement.java index d1986f18..0eee9e92 100644 --- a/src/main/java/com/leonardobishop/quests/menu/element/CustomMenuElement.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/CustomMenuElement.java @@ -1,4 +1,4 @@ -package com.leonardobishop.quests.menu.element; +package com.leonardobishop.quests.bukkit.menu.element; import org.bukkit.inventory.ItemStack; diff --git a/src/main/java/com/leonardobishop/quests/menu/element/MenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/MenuElement.java index a7ee580a..aa7ed46d 100644 --- a/src/main/java/com/leonardobishop/quests/menu/element/MenuElement.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/MenuElement.java @@ -1,4 +1,4 @@ -package com.leonardobishop.quests.menu.element; +package com.leonardobishop.quests.bukkit.menu.element; import org.bukkit.inventory.ItemStack; diff --git a/src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/QuestMenuElement.java index 6d13c0c5..215a93a1 100644 --- a/src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/QuestMenuElement.java @@ -1,12 +1,14 @@ -package com.leonardobishop.quests.menu.element; +package com.leonardobishop.quests.bukkit.menu.element; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.util.Items; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.menu.itemstack.QItemStack; +import com.leonardobishop.quests.bukkit.util.Chat; +import com.leonardobishop.quests.common.enums.QuestStartResult; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.util.Format; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -21,12 +23,14 @@ import java.util.concurrent.TimeUnit; public class QuestMenuElement extends MenuElement { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; + private final BukkitQuestsConfig config; private final QPlayer owner; private final String questId; - public QuestMenuElement(Quests plugin, QPlayer owner, String questId) { + public QuestMenuElement(BukkitQuestsPlugin plugin, QPlayer owner, String questId) { this.plugin = plugin; + this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); this.owner = owner; this.questId = questId; } @@ -45,38 +49,40 @@ public class QuestMenuElement extends MenuElement { QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); QuestStartResult status = owner.canStartQuest(quest); long cooldown = owner.getQuestProgressFile().getCooldownFor(quest); + QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(quest); + if (status == QuestStartResult.QUEST_LOCKED) { List<String> quests = new ArrayList<>(); for (String requirement : quest.getRequirements()) { - Quest requirementQuest = Quests.get().getQuestManager().getQuestById(requirement); + Quest requirementQuest = plugin.getQuestManager().getQuestById(requirement); if (!owner.getQuestProgressFile().hasQuestProgress(requirementQuest) || !owner.getQuestProgressFile().getQuestProgress(requirementQuest).isCompletedBefore()) { - quests.add(requirementQuest.getDisplayNameStripped()); + quests.add(Chat.strip(plugin.getQItemStackRegistry().getQuestItemStack(requirementQuest).getName())); } } Map<String, String> placeholders = new HashMap<>(); - placeholders.put("{quest}", quest.getDisplayNameStripped()); + placeholders.put("{quest}", Chat.strip(qItemStack.getName())); placeholders.put("{requirements}", String.join(", ", quests)); - ItemStack is = replaceItemStack(Items.QUEST_LOCKED.getItem(), placeholders); + ItemStack is = replaceItemStack(config.getItem("gui.quest-locked-display"), placeholders); return is; } else if (status == QuestStartResult.QUEST_ALREADY_COMPLETED) { Map<String, String> placeholders = new HashMap<>(); - placeholders.put("{quest}", quest.getDisplayNameStripped()); - ItemStack is = replaceItemStack(Items.QUEST_COMPLETED.getItem(), placeholders); + placeholders.put("{quest}", Chat.strip(qItemStack.getName())); + ItemStack is = replaceItemStack(config.getItem("gui.quest-completed-display"), placeholders); return is; } else if (status == QuestStartResult.QUEST_NO_PERMISSION) { Map<String, String> placeholders = new HashMap<>(); - placeholders.put("{quest}", quest.getDisplayNameStripped()); - ItemStack is = replaceItemStack(Items.QUEST_PERMISSION.getItem(), placeholders); + placeholders.put("{quest}", Chat.strip(qItemStack.getName())); + ItemStack is = replaceItemStack(config.getItem("gui.quest-permission-display"), placeholders); return is; } else if (cooldown > 0) { Map<String, String> placeholders = new HashMap<>(); - placeholders.put("{time}", plugin.convertToFormat(TimeUnit.SECONDS.convert(cooldown, TimeUnit.MILLISECONDS))); - placeholders.put("{quest}", quest.getDisplayNameStripped()); - ItemStack is = replaceItemStack(Items.QUEST_COOLDOWN.getItem(), placeholders); + placeholders.put("{time}", Format.formatTime(TimeUnit.SECONDS.convert(cooldown, TimeUnit.MILLISECONDS))); + placeholders.put("{quest}", Chat.strip(qItemStack.getName())); + ItemStack is = replaceItemStack(config.getItem("gui.quest-cooldown-display"), placeholders); return is; } else { - return replaceItemStack(quest.getDisplayItem().toItemStack(quest, owner, questProgress)); + return replaceItemStack(qItemStack.toItemStack(quest, owner, questProgress)); } } @@ -94,7 +100,7 @@ public class QuestMenuElement extends MenuElement { for (String s : lore) { for (Map.Entry<String, String> entry : placeholders.entrySet()) { s = s.replace(entry.getKey(), entry.getValue()); - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + if (plugin.getPlaceholderAPIHook() != null && plugin.getQuestsConfig().getBoolean("options.gui-use-placeholderapi")) { s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); } } @@ -103,7 +109,7 @@ public class QuestMenuElement extends MenuElement { } for (Map.Entry<String, String> entry : placeholders.entrySet()) { ism.setDisplayName(ism.getDisplayName().replace(entry.getKey(), entry.getValue())); - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + if (plugin.getPlaceholderAPIHook() != null && plugin.getQuestsConfig().getBoolean("options.gui-use-placeholderapi")) { ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); } } diff --git a/src/main/java/com/leonardobishop/quests/menu/element/SpacerMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/SpacerMenuElement.java index e2859718..a4c5d69a 100644 --- a/src/main/java/com/leonardobishop/quests/menu/element/SpacerMenuElement.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/SpacerMenuElement.java @@ -1,4 +1,4 @@ -package com.leonardobishop.quests.menu.element; +package com.leonardobishop.quests.bukkit.menu.element; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; diff --git a/src/main/java/com/leonardobishop/quests/menu/QItemStack.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/itemstack/QItemStack.java index 81568605..52059b29 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QItemStack.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/itemstack/QItemStack.java @@ -1,10 +1,10 @@ -package com.leonardobishop.quests.menu; +package com.leonardobishop.quests.bukkit.menu.itemstack; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.util.Chat; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.quest.Quest; import org.bukkit.Bukkit; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; @@ -19,7 +19,7 @@ import java.util.regex.Pattern; public class QItemStack { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; private String name; private List<String> loreNormal; @@ -30,17 +30,17 @@ public class QItemStack { private final List<String> globalLoreAppendTracked; private ItemStack startingItemStack; - public QItemStack(Quests plugin, String name, List<String> loreNormal, List<String> loreStarted, ItemStack startingItemStack) { + public QItemStack(BukkitQuestsPlugin plugin, String name, List<String> loreNormal, List<String> loreStarted, ItemStack startingItemStack) { this.plugin = plugin; this.name = name; this.loreNormal = loreNormal; this.loreStarted = loreStarted; this.startingItemStack = startingItemStack; - this.globalLoreAppendNormal = Options.color(Options.GLOBAL_QUEST_DISPLAY_LORE_APPEND_NORMAL.getStringListValue()); - this.globalLoreAppendNotStarted = Options.color(Options.GLOBAL_QUEST_DISPLAY_LORE_APPEND_NOT_STARTED.getStringListValue()); - this.globalLoreAppendStarted = Options.color(Options.GLOBAL_QUEST_DISPLAY_LORE_APPEND_STARTED.getStringListValue()); - this.globalLoreAppendTracked = Options.color(Options.GLOBAL_QUEST_DISPLAY_LORE_APPEND_TRACKED.getStringListValue()); + this.globalLoreAppendNormal = Chat.color(plugin.getQuestsConfig().getStringList("global-quest-display.lore.append-normal")); + this.globalLoreAppendNotStarted = Chat.color(plugin.getQuestsConfig().getStringList("global-quest-display.lore.append-not-started")); + this.globalLoreAppendStarted = Chat.color(plugin.getQuestsConfig().getStringList("global-quest-display.lore.append-started")); + this.globalLoreAppendTracked = Chat.color(plugin.getQuestsConfig().getStringList("global-quest-display.lore.append-tracked")); } public String getName() { @@ -83,17 +83,15 @@ public class QItemStack { List<String> formattedLore = new ArrayList<>(); List<String> tempLore = new ArrayList<>(); - if (Options.GLOBAL_QUEST_DISPLAY_CONFIGURATION_OVERRIDE.getBooleanValue() && !globalLoreAppendNormal.isEmpty()) { - tempLore.addAll(globalLoreAppendNormal); - } else { + if (!plugin.getQuestsConfig().getBoolean("options.global-task-configuration-override") || globalLoreAppendNormal.isEmpty()) { tempLore.addAll(loreNormal); - tempLore.addAll(globalLoreAppendNormal); } + tempLore.addAll(globalLoreAppendNormal); Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); if (qPlayer.hasStartedQuest(quest)) { boolean tracked = quest.getId().equals(qPlayer.getPlayerPreferences().getTrackedQuestId()); - if (!Options.GLOBAL_QUEST_DISPLAY_CONFIGURATION_OVERRIDE.getBooleanValue() || globalLoreAppendStarted.isEmpty()) { + if (!plugin.getQuestsConfig().getBoolean("options.global-task-configuration-override")|| globalLoreAppendStarted.isEmpty()) { tempLore.addAll(loreStarted); } if (tracked) { @@ -111,13 +109,13 @@ public class QItemStack { } else { tempLore.addAll(globalLoreAppendNotStarted); } - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + if (plugin.getPlaceholderAPIHook() != null && plugin.getQuestsConfig().getBoolean("options.gui-use-placeholderapi")) { ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); } if (questProgress != null) { for (String s : tempLore) { s = processPlaceholders(s, questProgress); - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + if (plugin.getPlaceholderAPIHook() != null && plugin.getQuestsConfig().getBoolean("options.gui-use-placeholderapi")) { s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); } formattedLore.add(s); diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/itemstack/QItemStackRegistry.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/itemstack/QItemStackRegistry.java new file mode 100644 index 00000000..703b8d21 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/itemstack/QItemStackRegistry.java @@ -0,0 +1,36 @@ +package com.leonardobishop.quests.bukkit.menu.itemstack; + +import com.leonardobishop.quests.common.quest.Category; +import com.leonardobishop.quests.common.quest.Quest; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.Map; + +public class QItemStackRegistry { + + private final Map<String, QItemStack> questRegistry = new HashMap<>(); + private final Map<String, ItemStack> categoryRegistry = new HashMap<>(); + + public QItemStack getQuestItemStack(Quest quest) { + return questRegistry.get(quest.getId()); + } + + public ItemStack getCategoryItemStack(Category category) { + return categoryRegistry.get(category.getId()); + } + + public void clearRegistry() { + questRegistry.clear(); + categoryRegistry.clear(); + } + + public void register(Quest quest, QItemStack qItemStack) { + questRegistry.put(quest.getId(), qItemStack); + } + + public void register(Category quest, ItemStack itemStack) { + categoryRegistry.put(quest.getId(), itemStack); + } + +} diff --git a/src/main/java/com/leonardobishop/quests/util/QuestCompleter.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcompleter/BukkitQuestCompleter.java index b6b942fd..32365a17 100644 --- a/src/main/java/com/leonardobishop/quests/util/QuestCompleter.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcompleter/BukkitQuestCompleter.java @@ -1,25 +1,28 @@ -package com.leonardobishop.quests.util; +package com.leonardobishop.quests.bukkit.questcompleter; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; + +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.QuestCompleter; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.util.LinkedList; import java.util.Queue; -public class QuestCompleter implements Runnable { +//TODO move complete effects here ? +public class BukkitQuestCompleter implements QuestCompleter, Runnable { private final Queue<QuestProgress> completionQueue = new LinkedList<>(); private final Queue<QuestProgressFile> fullCheckQueue = new LinkedList<>(); - private final Quests plugin; + private final BukkitQuestsPlugin plugin; - public QuestCompleter(Quests plugin) { + public BukkitQuestCompleter(BukkitQuestsPlugin plugin) { this.plugin = plugin; } @@ -38,6 +41,7 @@ public class QuestCompleter implements Runnable { QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) return; + plugin.getQuestsLogger().debug("Processing player (singular: " + questProgress.getQuestId() + ") " + qPlayer.getPlayerUUID()); Quest quest = plugin.getQuestManager().getQuestById(questProgress.getQuestId()); if (!qPlayer.hasStartedQuest(quest)) return; @@ -56,6 +60,7 @@ public class QuestCompleter implements Runnable { if (player != null && player.isOnline()) { QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) return; + plugin.getQuestsLogger().debug("Processing player (full check) " + qPlayer.getPlayerUUID()); for (QuestProgress questProgress : questProgressFile.getAllQuestProgress()) { Quest quest = plugin.getQuestManager().getQuestById(questProgress.getQuestId()); if (quest == null) continue; @@ -89,10 +94,12 @@ public class QuestCompleter implements Runnable { return complete; } + @Override public void queueSingular(QuestProgress questProgress) { completionQueue.add(questProgress); } + @Override public void queueFullCheck(QuestProgressFile questProgressFile) { fullCheckQueue.add(questProgressFile); } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/DailyQuestController.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/DailyQuestController.java new file mode 100644 index 00000000..c6e103bc --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/DailyQuestController.java @@ -0,0 +1,184 @@ +//package com.leonardobishop.quests.bukkit.questcontroller; +// +//import com.leonardobishop.quests.common.enums.QuestStartResult; +//import com.leonardobishop.quests.common.player.QPlayer; +//import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +//import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +//import com.leonardobishop.quests.common.plugin.Quests; +//import com.leonardobishop.quests.common.quest.Quest; +//import com.leonardobishop.quests.common.questcontroller.QuestController; +//import org.bukkit.Bukkit; +//import org.bukkit.ChatColor; +//import org.bukkit.entity.Player; +//import org.bukkit.scheduler.BukkitRunnable; +//import org.bukkit.scheduler.BukkitTask; +// +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Random; +//import java.util.stream.Collectors; +// +////TODO finish this +//public class DailyQuestController implements QuestController { +// +// private int refreshTaskId = -1; +// private long refreshTime; +// private long startTime; +// private Quests plugin; +// private Random random; +// private List<String> quests; +// +// public DailyQuestController(Quests plugin) { +// this.plugin = plugin; +// refreshDailyQuests(); +// scheduleNewTask(); +// } +// +// public void cancel() { +// Bukkit.getScheduler().cancelTask(refreshTaskId); +// } +// +// public List<String> getQuests() { +// return quests; +// } +// +// private void scheduleNewTask() { +// long diff = refreshTime - System.currentTimeMillis(); +// BukkitTask refreshTask; +// if (diff <= 10000) { //10 sec +// refreshTask = new DailyQuestRefreshTask(true).runTaskTimer(plugin, 1L, 1L); +// plugin.getQuestsLogger().debug("DailyQuestRefreshTask set repeating (diff=" + diff + ")"); +// } else { +// long sleepTime = diff >> 6; +// plugin.getQuestsLogger().debug("DailyQuestRefreshTask slept for " + sleepTime + " ticks (diff=" + diff + ")"); +// refreshTask = new DailyQuestRefreshTask(false).runTaskLater(plugin, sleepTime); +// } +// refreshTaskId = refreshTask.getTaskId(); +// } +// +// private void refreshDailyQuests() { +//// refreshTime = ((System.currentTimeMillis() / (86400000)) + 1) * 86400000; +// refreshTime = ((System.currentTimeMillis() / (300000)) + 1) * 300000; +// startTime = (System.currentTimeMillis() / (300000)) * 300000; +// random = new Random(refreshTime); +// quests = new ArrayList<>(); +// +// List<String> questIds = new ArrayList<>(plugin.getQuestManager().getQuests().keySet()); +// for (int i = 0; i < 5; i++) { +// int randInt = random.nextInt(questIds.size()); +// quests.add(questIds.get(randInt)); +// questIds = questIds.stream().filter(s -> !quests.contains(s)).collect(Collectors.toList()); +// } +// } +// +// @Override +// public QuestStartResult startQuestForPlayer(QPlayer qPlayer, Quest quest) { +// if (quests.contains(quest.getId())) { +// return QuestStartResult.QUEST_ALREADY_STARTED; +// } else { +// return QuestStartResult.QUEST_LIMIT_REACHED; +// } +// } +// +// @Override +// public QuestStartResult canPlayerStartQuest(QPlayer qPlayer, Quest quest) { +// if (!quests.contains(quest.getId())) return QuestStartResult.OTHER; +// long completionDate = qPlayer.getQuestProgressFile().getQuestProgress(quest).getCompletionDate(); +// if (Options.QUEST_AUTOSTART.getBooleanValue()) { +// if (completionDate > startTime && completionDate <= refreshTime) { +// return QuestStartResult.QUEST_ALREADY_COMPLETED; +// } +// } else { +// if (qPlayer.getQuestProgressFile().hasQuestProgress(quest)) { +// QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); +// if (questProgress.isStarted() && completionDate > startTime && completionDate <= refreshTime) { +// return QuestStartResult.QUEST_ALREADY_STARTED; +// } +// } +// } +// return QuestStartResult.QUEST_SUCCESS; +// } +// +// @Override +// public boolean completeQuestForPlayer(QPlayer qPlayer, Quest quest) { +// QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); +// questProgress.setStarted(false); +// for (TaskProgress taskProgress : questProgress.getTaskProgress()) { +// taskProgress.setCompleted(false); +// taskProgress.setProgress(null); +// } +// questProgress.setCompleted(true); +// questProgress.setCompletedBefore(true); +// questProgress.setCompletionDate(System.currentTimeMillis()); +// +// boolean trackedReset = quest.getId().equals(qPlayer.getPlayerPreferences().getTrackedQuestId()); +// if (trackedReset) { +// qPlayer.trackQuest(null); +// } +// +// Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); +// if (player != null) { +// String questFinishMessage = Messages.QUEST_COMPLETE.getMessage().replace("{quest}", quest.getDisplayNameStripped()); +// // PlayerFinishQuestEvent -- start +// PlayerFinishQuestEvent questFinishEvent = new PlayerFinishQuestEvent(player, qPlayer, questProgress, questFinishMessage); +// Bukkit.getPluginManager().callEvent(questFinishEvent); +// // PlayerFinishQuestEvent -- end +// Bukkit.getServer().getScheduler().runTask(plugin, () -> { +// for (String s : quest.getRewards()) { +// Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s.replace("{player}", player.getName())); //TODO PlaceholderAPI support +// } +// }); +// if (questFinishEvent.getQuestFinishMessage() != null) +// player.sendMessage(questFinishEvent.getQuestFinishMessage()); +// if (Options.TITLES_ENABLED.getBooleanValue()) { +// plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_COMPLETE_TITLE.getMessage().replace("{quest}", quest +// .getDisplayNameStripped()), Messages.TITLE_QUEST_COMPLETE_SUBTITLE.getMessage().replace("{quest}", quest +// .getDisplayNameStripped())); +// } +// for (String s : quest.getRewardString()) { +// player.sendMessage(ChatColor.translateAlternateColorCodes('&', s)); +// } +// } +// if (Options.QUEST_AUTOTRACK.getBooleanValue() && trackedReset) { +// for (String s : quests) { +// Quest nextQuest = plugin.getQuestManager().getQuestById(s); +// if (nextQuest != null && canPlayerStartQuest(qPlayer, nextQuest) == QuestStartResult.QUEST_SUCCESS) { +// qPlayer.trackQuest(nextQuest); +// break; +// } +// } +// } +// return true; +// } +// +// @Override +// public boolean hasPlayerStartedQuest(QPlayer qPlayer, Quest quest) { +// return canPlayerStartQuest(qPlayer, quest) == QuestStartResult.QUEST_SUCCESS; +// } +// +// @Override +// public boolean cancelQuestForPlayer(QPlayer qPlayer, Quest quest) { +// return false; +// } +// +// public class DailyQuestRefreshTask extends BukkitRunnable { +// +// private final boolean repeating; +// +// public DailyQuestRefreshTask(boolean repeating) { +// this.repeating = repeating; +// } +// +// @Override +// public void run() { +// if (System.currentTimeMillis() >= refreshTime) { +// this.cancel(); +// refreshDailyQuests(); +// } else { +// if (repeating) return; +// this.cancel(); +// } +// scheduleNewTask(); +// } +// } +//} diff --git a/src/main/java/com/leonardobishop/quests/quest/controller/NormalQuestController.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java index 055bbf97..e385ba9f 100644 --- a/src/main/java/com/leonardobishop/quests/quest/controller/NormalQuestController.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java @@ -1,18 +1,24 @@ -package com.leonardobishop.quests.quest.controller; +package com.leonardobishop.quests.bukkit.questcontroller; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.api.events.PlayerCancelQuestEvent; -import com.leonardobishop.quests.api.events.PlayerFinishQuestEvent; -import com.leonardobishop.quests.api.events.PlayerStartQuestEvent; -import com.leonardobishop.quests.api.events.PreStartQuestEvent; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.util.Messages; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.api.event.PlayerCancelQuestEvent; +import com.leonardobishop.quests.bukkit.api.event.PlayerFinishQuestEvent; +import com.leonardobishop.quests.bukkit.api.event.PlayerStartQuestEvent; +import com.leonardobishop.quests.bukkit.api.event.PlayerStartTrackQuestEvent; +import com.leonardobishop.quests.bukkit.api.event.PlayerStopTrackQuestEvent; +import com.leonardobishop.quests.bukkit.api.event.PreStartQuestEvent; +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.menu.itemstack.QItemStack; +import com.leonardobishop.quests.bukkit.util.Chat; +import com.leonardobishop.quests.bukkit.util.Messages; +import com.leonardobishop.quests.common.enums.QuestStartResult; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; +import com.leonardobishop.quests.common.questcontroller.QuestController; +import com.leonardobishop.quests.common.util.Format; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -21,10 +27,17 @@ import java.util.concurrent.TimeUnit; public class NormalQuestController implements QuestController { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; + private final BukkitQuestsConfig config; - public NormalQuestController(Quests plugin) { + public NormalQuestController(BukkitQuestsPlugin plugin) { this.plugin = plugin; + this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); + } + + @Override + public String getName() { + return "normal"; } @Override @@ -38,15 +51,15 @@ public class NormalQuestController implements QuestController { // This one is hacky break; case QUEST_LIMIT_REACHED: - questResultMessage = Messages.QUEST_START_LIMIT.getMessage().replace("{limit}", String.valueOf(Options.QUESTS_START_LIMIT.getIntValue())); + questResultMessage = Messages.QUEST_START_LIMIT.getMessage().replace("{limit}", String.valueOf(config.getInt("options.quest-started-limit"))); break; case QUEST_ALREADY_COMPLETED: questResultMessage = Messages.QUEST_START_DISABLED.getMessage(); break; case QUEST_COOLDOWN: long cooldown = qPlayer.getQuestProgressFile().getCooldownFor(quest); - questResultMessage = Messages.QUEST_START_COOLDOWN.getMessage().replace("{time}", String.valueOf(plugin.convertToFormat(TimeUnit.SECONDS.convert - (cooldown, TimeUnit.MILLISECONDS)))); + questResultMessage = Messages.QUEST_START_COOLDOWN.getMessage().replace("{time}", Format.formatTime(TimeUnit.SECONDS.convert + (cooldown, TimeUnit.MILLISECONDS))); break; case QUEST_LOCKED: questResultMessage = Messages.QUEST_START_LOCKED.getMessage(); @@ -75,22 +88,24 @@ public class NormalQuestController implements QuestController { taskProgress.setCompleted(false); taskProgress.setProgress(null); } - if (Options.ALLOW_QUEST_TRACK.getBooleanValue() && Options.QUEST_AUTOTRACK.getBooleanValue()) { + if (config.getBoolean("options.allow-quest-track") + && config.getBoolean("options.quest-autotrack")) { qPlayer.trackQuest(quest); } questProgress.setCompleted(false); if (player != null) { - String questStartMessage = Messages.QUEST_START.getMessage().replace("{quest}", quest.getDisplayNameStripped()); + QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(quest); + String displayName = Chat.strip(qItemStack.getName()); + String questStartMessage = Messages.QUEST_START.getMessage().replace("{quest}", displayName); // PlayerStartQuestEvent -- start PlayerStartQuestEvent questStartEvent = new PlayerStartQuestEvent(player, qPlayer, questProgress, questStartMessage); Bukkit.getPluginManager().callEvent(questStartEvent); // PlayerStartQuestEvent -- end if (questStartEvent.getQuestStartMessage() != null) player.sendMessage(questStartEvent.getQuestStartMessage()); //Don't send a message if the event message is null - if (Options.TITLES_ENABLED.getBooleanValue()) { - plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_START_TITLE.getMessage().replace("{quest}", quest - .getDisplayNameStripped()), Messages.TITLE_QUEST_START_SUBTITLE.getMessage().replace("{quest}", quest - .getDisplayNameStripped())); + if (config.getBoolean("options.titles-enabled")) { + plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_START_TITLE.getMessage().replace("{quest}", displayName), + Messages.TITLE_QUEST_START_SUBTITLE.getMessage().replace("{quest}", displayName)); } for (String s : quest.getStartString()) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', s)); @@ -110,7 +125,7 @@ public class NormalQuestController implements QuestController { @Override public QuestStartResult canPlayerStartQuest(QPlayer qPlayer, Quest quest) { Player p = Bukkit.getPlayer(qPlayer.getPlayerUUID()); - if (qPlayer.getQuestProgressFile().getStartedQuests().size() >= Options.QUESTS_START_LIMIT.getIntValue() && !Options.QUEST_AUTOSTART.getBooleanValue()) { + if (qPlayer.getQuestProgressFile().getStartedQuests().size() >= config.getInt("options.quest-started-limit") && !config.getBoolean("options.quest-autostart")) { return QuestStartResult.QUEST_LIMIT_REACHED; } QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); @@ -163,12 +178,15 @@ public class NormalQuestController implements QuestController { questProgress.setCompleted(true); questProgress.setCompletedBefore(true); questProgress.setCompletionDate(System.currentTimeMillis()); - if (Options.ALLOW_QUEST_TRACK.getBooleanValue() && Options.QUEST_AUTOTRACK.getBooleanValue() && !(quest.isRepeatable() && !quest.isCooldownEnabled())) { + if (config.getBoolean("options.allow-quest-track") && config.getBoolean("options.quest-autotrack") + && !(quest.isRepeatable() && !quest.isCooldownEnabled())) { qPlayer.trackQuest(null); } Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); if (player != null) { - String questFinishMessage = Messages.QUEST_COMPLETE.getMessage().replace("{quest}", quest.getDisplayNameStripped()); + QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(quest); + String displayName = Chat.strip(qItemStack.getName()); + String questFinishMessage = Messages.QUEST_COMPLETE.getMessage().replace("{quest}", displayName); // PlayerFinishQuestEvent -- start PlayerFinishQuestEvent questFinishEvent = new PlayerFinishQuestEvent(player, qPlayer, questProgress, questFinishMessage); Bukkit.getPluginManager().callEvent(questFinishEvent); @@ -180,17 +198,16 @@ public class NormalQuestController implements QuestController { }); if (questFinishEvent.getQuestFinishMessage() != null) player.sendMessage(questFinishEvent.getQuestFinishMessage()); - if (Options.TITLES_ENABLED.getBooleanValue()) { - plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_COMPLETE_TITLE.getMessage().replace("{quest}", quest - .getDisplayNameStripped()), Messages.TITLE_QUEST_COMPLETE_SUBTITLE.getMessage().replace("{quest}", quest - .getDisplayNameStripped())); + if (config.getBoolean("options.titles-enabled")) { + plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_COMPLETE_TITLE.getMessage().replace("{quest}", displayName), + Messages.TITLE_QUEST_COMPLETE_SUBTITLE.getMessage().replace("{quest}", displayName)); } for (String s : quest.getRewardString()) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', s)); } } - if ((Options.ALLOW_QUEST_TRACK.getBooleanValue() && Options.QUEST_AUTOTRACK.getBooleanValue() && !(quest.isRepeatable() && !quest.isCooldownEnabled())) - || (!Options.ALLOW_QUEST_TRACK.getBooleanValue() && Options.QUEST_AUTOTRACK.getBooleanValue())) { + if ((config.getBoolean("options.allow-quest-track") && config.getBoolean("options.quest-autotrack") && !(quest.isRepeatable() && !quest.isCooldownEnabled())) + || (!config.getBoolean("options.allow-quest-track") && config.getBoolean("options.quest-autotrack"))) { Quest nextQuest; if (qPlayer.getQuestProgressFile().getStartedQuests().size() > 0) { nextQuest = qPlayer.getQuestProgressFile().getStartedQuests().get(0); @@ -202,7 +219,7 @@ public class NormalQuestController implements QuestController { @Override public boolean hasPlayerStartedQuest(QPlayer qPlayer, Quest quest) { - if (Options.QUEST_AUTOSTART.getBooleanValue()) { + if (config.getBoolean("options.quest-autostart")) { QuestStartResult response = canPlayerStartQuest(qPlayer, quest); return response == QuestStartResult.QUEST_SUCCESS || response == QuestStartResult.QUEST_ALREADY_STARTED; } else { @@ -225,7 +242,9 @@ public class NormalQuestController implements QuestController { taskProgress.setProgress(null); } if (player != null) { - String questCancelMessage = Messages.QUEST_CANCEL.getMessage().replace("{quest}", quest.getDisplayNameStripped()); + QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(quest); + String displayName = Chat.strip(qItemStack.getName()); + String questCancelMessage = Messages.QUEST_CANCEL.getMessage().replace("{quest}", displayName); // PlayerCancelQuestEvent -- start PlayerCancelQuestEvent questCancelEvent = new PlayerCancelQuestEvent(player, qPlayer, questProgress, questCancelMessage); Bukkit.getPluginManager().callEvent(questCancelEvent); @@ -236,4 +255,31 @@ public class NormalQuestController implements QuestController { return true; } + @Override + public void trackQuestForPlayer(QPlayer qPlayer, Quest quest) { + Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); + + if (quest == null) { + String currentTrackedQuestId = qPlayer.getPlayerPreferences().getTrackedQuestId(); + qPlayer.getPlayerPreferences().setTrackedQuestId(null); + if (player != null) { + Bukkit.getPluginManager().callEvent(new PlayerStopTrackQuestEvent(player, qPlayer)); + Quest currentTrackedQuest; + if (currentTrackedQuestId != null && (currentTrackedQuest = plugin.getQuestManager().getQuestById(currentTrackedQuestId)) != null) { + QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(currentTrackedQuest); + String displayName = Chat.strip(qItemStack.getName()); + player.sendMessage(Messages.QUEST_TRACK_STOP.getMessage().replace("{quest}", displayName)); + } + } + } else if (qPlayer.hasStartedQuest(quest)) { + QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(quest); + String displayName = Chat.strip(qItemStack.getName()); + qPlayer.getPlayerPreferences().setTrackedQuestId(quest.getId()); + if (player != null) { + Bukkit.getPluginManager().callEvent(new PlayerStartTrackQuestEvent(player, qPlayer)); + player.sendMessage(Messages.QUEST_TRACK.getMessage().replace("{quest}", displayName)); + } + } + } + } diff --git a/src/main/java/com/leonardobishop/quests/util/QuestsAutosaveRunnable.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/runnable/QuestsAutoSaveRunnable.java index dbe0b3a9..34c1a5f6 100644 --- a/src/main/java/com/leonardobishop/quests/util/QuestsAutosaveRunnable.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/runnable/QuestsAutoSaveRunnable.java @@ -1,9 +1,6 @@ -package com.leonardobishop.quests.util; +package com.leonardobishop.quests.bukkit.runnable; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; @@ -12,12 +9,12 @@ import java.util.LinkedList; import java.util.Queue; import java.util.UUID; -public class QuestsAutosaveRunnable extends BukkitRunnable { +public class QuestsAutoSaveRunnable extends BukkitRunnable { private final Queue<UUID> queue = new LinkedList<>(); - private final Quests plugin; + private final BukkitQuestsPlugin plugin; - public QuestsAutosaveRunnable(Quests plugin) { + public QuestsAutoSaveRunnable(BukkitQuestsPlugin plugin) { for (Player player : Bukkit.getOnlinePlayers()) { queue.add(player.getUniqueId()); } diff --git a/src/main/java/com/leonardobishop/quests/storage/MySqlStorageProvider.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/storage/MySqlStorageProvider.java index 02692919..fd473af6 100644 --- a/src/main/java/com/leonardobishop/quests/storage/MySqlStorageProvider.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/storage/MySqlStorageProvider.java @@ -1,10 +1,10 @@ -package com.leonardobishop.quests.storage; +package com.leonardobishop.quests.bukkit.storage; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.storage.StorageProvider; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import org.bukkit.configuration.ConfigurationSection; @@ -16,9 +16,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.UUID; @@ -58,13 +56,13 @@ public class MySqlStorageProvider implements StorageProvider { "INSERT INTO `{prefix}task_progress` (uuid, quest_id, task_id, completed, progress, data_type) VALUES (?,?,?,?,?,?) ON DUPLICATE KEY UPDATE completed=?, progress=?, data_type=?"; private final ConfigurationSection configuration; - private final Quests plugin; + private final BukkitQuestsPlugin plugin; private HikariDataSource hikari; private String prefix; private Function<String, String> statementProcessor; private boolean fault; - public MySqlStorageProvider(Quests plugin, ConfigurationSection configuration) { + public MySqlStorageProvider(BukkitQuestsPlugin plugin, ConfigurationSection configuration) { this.plugin = plugin; if (configuration == null) { configuration = new YamlConfiguration(); diff --git a/src/main/java/com/leonardobishop/quests/storage/YamlStorageProvider.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/storage/YamlStorageProvider.java index 8ba30a4e..75e271f9 100644 --- a/src/main/java/com/leonardobishop/quests/storage/YamlStorageProvider.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/storage/YamlStorageProvider.java @@ -1,9 +1,10 @@ -package com.leonardobishop.quests.storage; +package com.leonardobishop.quests.bukkit.storage; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.storage.StorageProvider; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; @@ -18,9 +19,9 @@ import java.util.concurrent.locks.ReentrantLock; public class YamlStorageProvider implements StorageProvider { private final Map<UUID, ReentrantLock> locks = new ConcurrentHashMap<>(); - private Quests plugin; + private BukkitQuestsPlugin plugin; - public YamlStorageProvider(Quests plugin) { + public YamlStorageProvider(BukkitQuestsPlugin plugin) { this.plugin = plugin; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/BukkitTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/BukkitTaskType.java new file mode 100644 index 00000000..81f312c7 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/BukkitTaskType.java @@ -0,0 +1,16 @@ +package com.leonardobishop.quests.bukkit.tasktype; + +import com.leonardobishop.quests.common.tasktype.TaskType; +import org.bukkit.event.Listener; + +public abstract class BukkitTaskType extends TaskType implements Listener { + + public BukkitTaskType(String type, String author, String description) { + super(type, author, description); + } + + public BukkitTaskType(String type) { + super(type); + } + +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/BukkitTaskTypeManager.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/BukkitTaskTypeManager.java new file mode 100644 index 00000000..67c9ab7d --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/BukkitTaskTypeManager.java @@ -0,0 +1,25 @@ +package com.leonardobishop.quests.bukkit.tasktype; + +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.common.tasktype.TaskType; +import com.leonardobishop.quests.common.tasktype.TaskTypeManager; + +public class BukkitTaskTypeManager extends TaskTypeManager { + + private final BukkitQuestsPlugin plugin; + + public BukkitTaskTypeManager(BukkitQuestsPlugin plugin) { + super(plugin); + this.plugin = plugin; + } + + @Override + public void registerTaskType(TaskType taskType) { + if (!(taskType instanceof BukkitTaskType)) throw new RuntimeException("task type must be instance of BukkitTaskType!"); + + BukkitTaskType bukkitTaskType = (BukkitTaskType) taskType; + super.registerTaskType(taskType); + plugin.getServer().getPluginManager().registerEvents(bukkitTaskType, plugin); + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BreedingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BreedingTaskType.java index 501a6aa1..c4d05eed 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BreedingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BreedingTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -21,29 +20,23 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class BreedingTaskType extends TaskType { +public final class BreedingTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public BreedingTaskType() { + public BreedingTaskType(BukkitQuestsPlugin plugin) { super("breeding", TaskUtils.TASK_ATTRIBUTION_STRING, "Breed a set amount of animals."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of animals to be bred")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBreed(CreatureSpawnEvent e) { if (!e.getSpawnReason().equals(SpawnReason.BREEDING)) { @@ -60,7 +53,7 @@ public final class BreedingTaskType extends TaskType { for (Entity current : entList) { if (current instanceof Player && !current.hasMetadata("NPC")) { Player player = (Player) current; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { continue; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingCertainTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BrewingCertainTaskType.java index 2c36f55a..aeda362c 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingCertainTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BrewingCertainTaskType.java @@ -1,4 +1,4 @@ -// TODO: fix +package com.leonardobishop.quests.bukkit.tasktype.type;// TODO: fix // //package me.fatpigsarefat.quests.quests.tasktypes.types; // diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BrewingTaskType.java index 7a0da7de..d6ede688 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BrewingTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -26,30 +25,24 @@ import java.util.HashMap; import java.util.List; import java.util.UUID; -public final class BrewingTaskType extends TaskType { +public final class BrewingTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); - private HashMap<Location, UUID> brewingStands = new HashMap<>(); + private final BukkitQuestsPlugin plugin; + private final HashMap<Location, UUID> brewingStands = new HashMap<>(); - public BrewingTaskType() { + public BrewingTaskType(BukkitQuestsPlugin plugin) { super("brewing", TaskUtils.TASK_ATTRIBUTION_STRING, "Brew a potion."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of potions to be brewed.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockPlace(PlayerInteractEvent event) { if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { @@ -69,7 +62,7 @@ public final class BrewingTaskType extends TaskType { return; } - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingCertainTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BuildingCertainTaskType.java index 1e97de3f..550e6435 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingCertainTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BuildingCertainTaskType.java @@ -1,15 +1,15 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.config.ConfigProblemDescriptions; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.event.EventHandler; @@ -21,23 +21,18 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class BuildingCertainTaskType extends TaskType { +public final class BuildingCertainTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public BuildingCertainTaskType() { + public BuildingCertainTaskType(BukkitQuestsPlugin plugin) { super("blockplacecertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Place a set amount of a specific block."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be placed.")); - this.creatorConfigValues.add(new ConfigValue("block", true, "Name or ID of block.")); - this.creatorConfigValues.add(new ConfigValue("data", false, "Data code for block.")); - this.creatorConfigValues.add(new ConfigValue("reverse-if-broken", false, "Will reverse progression if block of same type is broken.")); - this.creatorConfigValues.add(new ConfigValue("use-similar-blocks", false, "(Deprecated) If true, this will ignore orientation of doors, logs etc.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); if (config.get("block") == null && config.get("blocks") == null) { @@ -61,8 +56,8 @@ public final class BuildingCertainTaskType extends TaskType { for (String materialName : checkBlocks) { String[] split = materialName.split(":"); if (Material.getMaterial(String.valueOf(split[0])) == null) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(materialName), root + "." + source)); + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, + ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(materialName), root + "." + source)); } } } @@ -72,16 +67,11 @@ public final class BuildingCertainTaskType extends TaskType { return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockPlace(BlockPlaceEvent event) { if (event.getPlayer().hasMetadata("NPC")) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); if (qPlayer == null) { return; } @@ -112,7 +102,7 @@ public final class BuildingCertainTaskType extends TaskType { public void onBlockBreak(BlockBreakEvent event) { if (event.getPlayer().hasMetadata("NPC")) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BuildingTaskType.java index 851c152e..fe0e3ee7 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BuildingTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockPlaceEvent; @@ -18,34 +17,28 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class BuildingTaskType extends TaskType { +public final class BuildingTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public BuildingTaskType() { + public BuildingTaskType(BukkitQuestsPlugin plugin) { super("blockplace", TaskUtils.TASK_ATTRIBUTION_STRING, "Place a set amount of blocks."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be placed.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockPlace(BlockPlaceEvent event) { if (event.getPlayer().hasMetadata("NPC")) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/CommandTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/CommandTaskType.java index 5e1522fe..db44f8d6 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/CommandTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/CommandTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -19,37 +18,30 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class CommandTaskType extends TaskType { +public final class CommandTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public CommandTaskType() { + public CommandTaskType(BukkitQuestsPlugin plugin) { super("command", TaskUtils.TASK_ATTRIBUTION_STRING, "Execute a certain command."); - this.creatorConfigValues.add(new ConfigValue("command", true, "The command to execute.")); - this.creatorConfigValues.add(new ConfigValue("ignore-case", false, "Ignore the casing of the command.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); TaskUtils.configValidateExists(root + ".command", config.get("command"), problems, "command", super.getType()); TaskUtils.configValidateBoolean(root + ".ignore-case", config.get("ignore-case"), problems, true, "ignore-case", super.getType()); return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR) public void onCommand(PlayerCommandPreprocessEvent e) { if (e.getPlayer().hasMetadata("NPC")) return; Player player = e.getPlayer(); - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DealDamageTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/DealDamageTaskType.java index 6affa258..950a50ad 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DealDamageTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/DealDamageTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -19,29 +18,23 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class DealDamageTaskType extends TaskType { +public final class DealDamageTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public DealDamageTaskType() { + public DealDamageTaskType(BukkitQuestsPlugin plugin) { super("dealdamage", TaskUtils.TASK_ATTRIBUTION_STRING, "Deal a certain amount of damage."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of damage you need to deal")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onDamage(EntityDamageByEntityEvent e) { if (!(e.getDamager() instanceof Player)) { @@ -53,7 +46,7 @@ public final class DealDamageTaskType extends TaskType { if (player.hasMetadata("NPC")) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DistancefromTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/DistancefromTaskType.java index 604ea556..b0b4b9e9 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DistancefromTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/DistancefromTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -22,22 +21,18 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class DistancefromTaskType extends TaskType { +public final class DistancefromTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public DistancefromTaskType() { + public DistancefromTaskType(BukkitQuestsPlugin plugin) { super("distancefrom", TaskUtils.TASK_ATTRIBUTION_STRING, "Distance yourself from a set of co-ordinates."); - this.creatorConfigValues.add(new ConfigValue("x", true, "X position.")); - this.creatorConfigValues.add(new ConfigValue("y", true, "Y position.")); - this.creatorConfigValues.add(new ConfigValue("z", true, "Z position.")); - this.creatorConfigValues.add(new ConfigValue("world", true, "Name of world.")); - this.creatorConfigValues.add(new ConfigValue("distance", true, "Distance the player needs to be from the co-ordinates.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".x", config.get("x"), problems, "x", super.getType())) TaskUtils.configValidateInt(root + ".x", config.get("x"), problems, false, false, "x"); if (TaskUtils.configValidateExists(root + ".y", config.get("y"), problems, "y", super.getType())) @@ -49,11 +44,6 @@ public final class DistancefromTaskType extends TaskType { return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - // private HashMap<String, HashMap<String, Integer>> distanceSquaredCache = new HashMap<>(); // // @Override @@ -78,7 +68,7 @@ public final class DistancefromTaskType extends TaskType { if (event.getPlayer().hasMetadata("NPC")) return; Player player = event.getPlayer(); - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/EnchantingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/EnchantingTaskType.java index fc0b2421..5293960f 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/EnchantingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/EnchantingTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -19,36 +18,30 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class EnchantingTaskType extends TaskType { +public final class EnchantingTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public EnchantingTaskType() { + public EnchantingTaskType(BukkitQuestsPlugin plugin) { super("enchanting", TaskUtils.TASK_ATTRIBUTION_STRING, "Enchant a certain amount of items."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of items you need to enchant.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onEnchant(EnchantItemEvent e) { if (e.getEnchanter().hasMetadata("NPC")) return; Player player = e.getEnchanter(); - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ExpEarnTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/ExpEarnTaskType.java index d99688c8..81653d86 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ExpEarnTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/ExpEarnTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerExpChangeEvent; @@ -18,34 +17,28 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class ExpEarnTaskType extends TaskType { - - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); - - public ExpEarnTaskType() { +public final class ExpEarnTaskType extends BukkitTaskType { + + private final BukkitQuestsPlugin plugin; + + public ExpEarnTaskType(BukkitQuestsPlugin plugin) { super("expearn", TaskUtils.TASK_ATTRIBUTION_STRING, "Earn a set amount of exp."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of exp that needs to be earned.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); return problems; } - - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onExpEarn(PlayerExpChangeEvent e) { if (e.getPlayer().hasMetadata("NPC")) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(e.getPlayer().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(e.getPlayer().getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FarmingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FarmingTaskType.java index 62223e6d..cdc92930 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FarmingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FarmingTaskType.java @@ -1,37 +1,26 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.material.Crops; -import java.util.ArrayList; -import java.util.List; +public final class FarmingTaskType extends BukkitTaskType { -public final class FarmingTaskType extends TaskType { + private final BukkitQuestsPlugin plugin; - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); - - public FarmingTaskType() { + public FarmingTaskType(BukkitQuestsPlugin plugin) { super("farming", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of a crop."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of crops to be broken.")); - this.creatorConfigValues.add(new ConfigValue("crop", true, "Name or ID of crop.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; + this.plugin = plugin; } @SuppressWarnings("deprecation") @@ -43,7 +32,7 @@ public final class FarmingTaskType extends TaskType { } Crops crop = (Crops) event.getBlock().getState(); - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FishingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FishingTaskType.java index c35044af..bbaa59c7 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FishingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FishingTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -19,29 +18,23 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class FishingTaskType extends TaskType { +public final class FishingTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public FishingTaskType() { + public FishingTaskType(BukkitQuestsPlugin plugin) { super("fishing", TaskUtils.TASK_ATTRIBUTION_STRING, "Catch a set amount of items from the sea."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of fish to be caught.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onFishCaught(PlayerFishEvent event) { if (event.getPlayer().hasMetadata("NPC")) return; @@ -57,7 +50,7 @@ public final class FishingTaskType extends TaskType { Player player = event.getPlayer(); - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/InventoryTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/InventoryTaskType.java index 4ee6e605..55df10de 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/InventoryTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/InventoryTaskType.java @@ -1,16 +1,15 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.config.ConfigProblemDescriptions; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; @@ -25,26 +24,18 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class InventoryTaskType extends TaskType { +public final class InventoryTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); - private final Quests plugin; + private final BukkitQuestsPlugin plugin; - public InventoryTaskType(Quests plugin) { + public InventoryTaskType(BukkitQuestsPlugin plugin) { super("inventory", TaskUtils.TASK_ATTRIBUTION_STRING, "Obtain a set of items."); this.plugin = plugin; - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of item to retrieve.")); - this.creatorConfigValues.add(new ConfigValue("item", true, "Name or ID of item.")); - this.creatorConfigValues.add(new ConfigValue("data", false, "Data of item.")); - this.creatorConfigValues.add(new ConfigValue("remove-items-when-complete", false, "Take the items away from the player on completion (true/false, " + - "default = false).")); - this.creatorConfigValues.add(new ConfigValue("update-progress", false, "Update the displayed progress (if this causes lag then disable it).")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType())) { Object configBlock = config.get("item"); if (configBlock instanceof ConfigurationSection) { @@ -54,19 +45,19 @@ public final class InventoryTaskType extends TaskType { itemloc = "type"; } if (!section.contains(itemloc)) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item.type")); + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, + ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item.type")); } else { String type = String.valueOf(section.get(itemloc)); if (!plugin.getItemGetter().isValidMaterial(type)) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + ".item." + itemloc)); + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, + ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + ".item." + itemloc)); } } } else { if (Material.getMaterial(String.valueOf(configBlock)) == null) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(configBlock)), root + ".item.item")); + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, + ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(configBlock)), root + ".item.item")); } } } @@ -78,12 +69,6 @@ public final class InventoryTaskType extends TaskType { return problems; } - - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @SuppressWarnings("deprecation") @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onItemPickup(PlayerPickupItemEvent event) { @@ -103,7 +88,7 @@ public final class InventoryTaskType extends TaskType { return; } - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { return; } @@ -129,7 +114,7 @@ public final class InventoryTaskType extends TaskType { ItemStack is; if (configBlock instanceof ConfigurationSection) { - is = plugin.getItemStack("", (org.bukkit.configuration.ConfigurationSection) configBlock); + is = plugin.getItemStack("", (ConfigurationSection) configBlock); } else { material = Material.getMaterial(String.valueOf(configBlock)); diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MilkingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MilkingTaskType.java index 0d883ac2..79dc975b 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MilkingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MilkingTaskType.java @@ -1,16 +1,15 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.Material; import org.bukkit.entity.Cow; import org.bukkit.entity.Player; @@ -22,29 +21,23 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class MilkingTaskType extends TaskType { +public final class MilkingTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public MilkingTaskType() { + public MilkingTaskType(BukkitQuestsPlugin plugin) { super("milking", TaskUtils.TASK_ATTRIBUTION_STRING, "Milk a set amount of cows."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of cows to be milked.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @SuppressWarnings("deprecation") @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onMilk(PlayerInteractEntityEvent event) { @@ -56,7 +49,7 @@ public final class MilkingTaskType extends TaskType { Player player = event.getPlayer(); - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningCertainTaskType.java index 7639ad95..9c881f01 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningCertainTaskType.java @@ -1,16 +1,15 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.config.ConfigProblemDescriptions; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.event.EventHandler; @@ -22,28 +21,18 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class MiningCertainTaskType extends TaskType { +public final class MiningCertainTaskType extends BukkitTaskType { - private final Quests plugin; - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public MiningCertainTaskType(Quests plugin) { + public MiningCertainTaskType(BukkitQuestsPlugin plugin) { super("blockbreakcertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of a specific block."); this.plugin = plugin; - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be broken.")); - this.creatorConfigValues.add(new ConfigValue("block", true, "Name or ID of block.", "block")); // Can use name:datacode - this.creatorConfigValues.add(new ConfigValue("blocks", true, "List of blocks (alias for block for config readability).", "block")); - this.creatorConfigValues.add(new ConfigValue("data", false, "Data code for block.")); // only used if no datacode provided in block or blocks - this.creatorConfigValues.add(new ConfigValue("reverse-if-placed", false, "Will reverse progression if block of same type is placed.")); - this.creatorConfigValues.add(new ConfigValue("check-coreprotect", false, "Use coreprotect to check for blocks placed by a player")); - this.creatorConfigValues.add(new ConfigValue("check-coreprotect-time", false, "Time period for coreprotect check")); - this.creatorConfigValues.add(new ConfigValue("use-similar-blocks", false, "(Deprecated) If true, this will ignore orientation of doors, logs etc.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); if (config.get("block") == null && config.get("blocks") == null) { @@ -67,8 +56,8 @@ public final class MiningCertainTaskType extends TaskType { for (String materialName : checkBlocks) { String[] split = materialName.split(":"); if (Material.getMaterial(String.valueOf(split[0])) == null) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(materialName), root + "." + source)); + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, + ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(materialName), root + "." + source)); } } } @@ -80,16 +69,11 @@ public final class MiningCertainTaskType extends TaskType { return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { if (event.getPlayer().hasMetadata("NPC")) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); if (qPlayer == null) { return; } @@ -126,7 +110,7 @@ public final class MiningCertainTaskType extends TaskType { public void onBlockPlace(BlockPlaceEvent event) { if (event.getPlayer().hasMetadata("NPC")) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningTaskType.java index e25adcff..519cf87a 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockBreakEvent; @@ -18,37 +17,29 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class MiningTaskType extends TaskType { +public final class MiningTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public MiningTaskType() { + public MiningTaskType(BukkitQuestsPlugin plugin) { // type, author, description super("blockbreak", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of blocks."); - - // config values for the quest creator to use, if unspecified then the quest creator will not know what to put here (and will require users to - // go into the config and manually configure there) - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be broken.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { if (event.getPlayer().hasMetadata("NPC")) return; // citizens also causes these events to fire - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); // get the qplayer so you can get their progress + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); // get the qplayer so you can get their progress if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingCertainTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MobkillingCertainTaskType.java index 86bd7fea..1dca3e8b 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingCertainTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MobkillingCertainTaskType.java @@ -1,15 +1,15 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.config.ConfigProblemDescriptions; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.ChatColor; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -22,26 +22,24 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class MobkillingCertainTaskType extends TaskType { +public final class MobkillingCertainTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public MobkillingCertainTaskType() { + public MobkillingCertainTaskType(BukkitQuestsPlugin plugin) { super("mobkillingcertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Kill a set amount of a specific entity type."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of mobs to be killed.")); - this.creatorConfigValues.add(new ConfigValue("mob", true, "Name of mob.")); - this.creatorConfigValues.add(new ConfigValue("name", false, "Only allow a specific name for mob (unspecified = any name allowed).")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".mob", config.get("mob"), problems, "mob", super.getType())) { try { EntityType.valueOf(String.valueOf(config.get("mob"))); } catch (IllegalArgumentException ex) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_ENTITY_TYPE.getDescription(String.valueOf(config.get("mob"))), root + ".mob")); + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, + ConfigProblemDescriptions.UNKNOWN_ENTITY_TYPE.getDescription(String.valueOf(config.get("mob"))), root + ".mob")); } } if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) @@ -49,12 +47,6 @@ public final class MobkillingCertainTaskType extends TaskType { return problems; } - - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onMobKill(EntityDeathEvent event) { Player killer = event.getEntity().getKiller(); @@ -70,7 +62,7 @@ public final class MobkillingCertainTaskType extends TaskType { if (killer.hasMetadata("NPC")) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(killer.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(killer.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MobkillingTaskType.java index dd43bd60..c1dfbe2a 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MobkillingTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.entity.Animals; import org.bukkit.entity.Entity; import org.bukkit.entity.Monster; @@ -22,30 +21,24 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class MobkillingTaskType extends TaskType { +public final class MobkillingTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public MobkillingTaskType() { + public MobkillingTaskType(BukkitQuestsPlugin plugin) { super("mobkilling", TaskUtils.TASK_ATTRIBUTION_STRING, "Kill a set amount of entities."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of mobs to be killed.")); - this.creatorConfigValues.add(new ConfigValue("hostile", false, "Only allow hostile or non-hostile mobs (unspecified = any type allowed).")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); TaskUtils.configValidateBoolean(root + ".hostile", config.get("hostile"), problems, true, "hostile"); return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onMobKill(EntityDeathEvent event) { Player killer = event.getEntity().getKiller(); //The killer is a player @@ -61,7 +54,7 @@ public final class MobkillingTaskType extends TaskType { if (killer.hasMetadata("NPC")) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(killer.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(killer.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PermissionTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PermissionTaskType.java index 3043aeb0..33dc0db9 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PermissionTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PermissionTaskType.java @@ -1,33 +1,26 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; -import java.util.ArrayList; -import java.util.List; +public final class PermissionTaskType extends BukkitTaskType { -public final class PermissionTaskType extends TaskType { - - private Quests plugin; + private final BukkitQuestsPlugin plugin; private BukkitTask poll; - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); - public PermissionTaskType(Quests plugin) { + public PermissionTaskType(BukkitQuestsPlugin plugin) { super("permission", TaskUtils.TASK_ATTRIBUTION_STRING, "Test if a player has a permission"); this.plugin = plugin; - this.creatorConfigValues.add(new ConfigValue("permission", true, "The required permission.")); } @Override @@ -36,7 +29,7 @@ public final class PermissionTaskType extends TaskType { @Override public void run() { for (Player player : Bukkit.getOnlinePlayers()) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { continue; } @@ -69,8 +62,4 @@ public final class PermissionTaskType extends TaskType { } } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlayerkillingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PlayerkillingTaskType.java index 60bb1321..db9fda8b 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlayerkillingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PlayerkillingTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -20,28 +19,23 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class PlayerkillingTaskType extends TaskType { +public final class PlayerkillingTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public PlayerkillingTaskType() { + public PlayerkillingTaskType(BukkitQuestsPlugin plugin) { super("playerkilling", TaskUtils.TASK_ATTRIBUTION_STRING, "Kill a set amount of players."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of players to be killed.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onMobKill(EntityDeathEvent event) { Player killer = event.getEntity().getKiller(); @@ -57,7 +51,7 @@ public final class PlayerkillingTaskType extends TaskType { if (killer.hasMetadata("NPC")) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(killer.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(killer.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlaytimeTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PlaytimeTaskType.java index 450365cb..28ecced4 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlaytimeTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PlaytimeTaskType.java @@ -1,16 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; @@ -20,21 +18,19 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class PlaytimeTaskType extends TaskType { +public final class PlaytimeTaskType extends BukkitTaskType { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; private BukkitTask poll; - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); - public PlaytimeTaskType(Quests plugin) { + public PlaytimeTaskType(BukkitQuestsPlugin plugin) { super("playtime", TaskUtils.TASK_ATTRIBUTION_STRING, "Track the amount of playing time a user has been on"); this.plugin = plugin; - this.creatorConfigValues.add(new ConfigValue("minutes", true, "Time in minutes.")); } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".minutes", config.get("minutes"), problems, "minutes", super.getType())) TaskUtils.configValidateInt(root + ".minutes", config.get("minutes"), problems, false, true, "minutes"); return problems; @@ -48,7 +44,7 @@ public final class PlaytimeTaskType extends TaskType { @Override public void run() { for (Player player : Bukkit.getOnlinePlayers()) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { continue; } @@ -88,8 +84,4 @@ public final class PlaytimeTaskType extends TaskType { // } } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PositionTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PositionTaskType.java index 546cdb10..876081ae 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PositionTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PositionTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -22,22 +21,18 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class PositionTaskType extends TaskType { +public final class PositionTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public PositionTaskType() { + public PositionTaskType(BukkitQuestsPlugin plugin) { super("position", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a set of co-ordinates."); - this.creatorConfigValues.add(new ConfigValue("x", true, "X position.")); - this.creatorConfigValues.add(new ConfigValue("y", true, "Y position.")); - this.creatorConfigValues.add(new ConfigValue("z", true, "Z position.")); - this.creatorConfigValues.add(new ConfigValue("world", true, "Name of world.")); - this.creatorConfigValues.add(new ConfigValue("distance-padding", false, "Padding zone in meters/blocks (default/unspecified = 0).")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); TaskUtils.configValidateExists(root + ".world", config.get("world"), problems, "world", super.getType()); if (TaskUtils.configValidateExists(root + ".x", config.get("x"), problems, "x", super.getType())) TaskUtils.configValidateInt(root + ".x", config.get("x"), problems, false, false, "x"); @@ -49,11 +44,6 @@ public final class PositionTaskType extends TaskType { return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onMove(PlayerMoveEvent event) { if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { @@ -64,7 +54,7 @@ public final class PositionTaskType extends TaskType { Player player = event.getPlayer(); - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ShearingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/ShearingTaskType.java index ca4856a4..6778ae69 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ShearingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/ShearingTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.entity.Player; import org.bukkit.entity.Sheep; import org.bukkit.event.EventHandler; @@ -20,29 +19,23 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class ShearingTaskType extends TaskType { +public final class ShearingTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public ShearingTaskType() { + public ShearingTaskType(BukkitQuestsPlugin plugin) { super("shearing", TaskUtils.TASK_ATTRIBUTION_STRING, "Shear a set amount of sheep."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of cows to be milked.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); return problems; } - - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onShear(PlayerShearEntityEvent event) { if (!(event.getEntity() instanceof Sheep)) { @@ -53,7 +46,7 @@ public final class ShearingTaskType extends TaskType { Player player = event.getPlayer(); - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/TamingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/TamingTaskType.java index 663ca403..7555e60c 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/TamingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/TamingTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -19,29 +18,23 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class TamingTaskType extends TaskType { +public final class TamingTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public TamingTaskType() { + public TamingTaskType(BukkitQuestsPlugin plugin) { super("taming", TaskUtils.TASK_ATTRIBUTION_STRING, "Tame a set amount of animals."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of animals to be tamed.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); return problems; } - - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onTame(EntityTameEvent event) { if (!(event.getOwner() instanceof Player)) { @@ -52,7 +45,7 @@ public final class TamingTaskType extends TaskType { if (player.hasMetadata("NPC")) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/WalkingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/WalkingTaskType.java index 4faebdb0..cc0db63d 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/WalkingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/WalkingTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type; +package com.leonardobishop.quests.bukkit.tasktype.type; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -19,29 +18,23 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class WalkingTaskType extends TaskType { +public final class WalkingTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public WalkingTaskType() { + public WalkingTaskType(BukkitQuestsPlugin plugin) { super("walking", TaskUtils.TASK_ATTRIBUTION_STRING, "Walk a set distance."); - this.creatorConfigValues.add(new ConfigValue("distance", true, "Amount of meters (blocks) to be travelled.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".distance", config.get("distance"), problems, "distance", super.getType())) TaskUtils.configValidateInt(root + ".distance", config.get("distance"), problems, false, true, "distance"); return problems; } - - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onMove(PlayerMoveEvent event) { if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { @@ -52,7 +45,7 @@ public final class WalkingTaskType extends TaskType { if (player.hasMetadata("NPC")) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ASkyBlockLevelType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/ASkyBlockLevelTaskType.java index bd0aba60..3953a95f 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ASkyBlockLevelType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/ASkyBlockLevelTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type.dependent; +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import com.wasteofplastic.askyblock.events.IslandPostLevelEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -18,31 +17,26 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class ASkyBlockLevelType extends TaskType { +public final class ASkyBlockLevelTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public ASkyBlockLevelType() { + public ASkyBlockLevelTaskType(BukkitQuestsPlugin plugin) { super("askyblock_level", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island level for ASkyBlock."); - this.creatorConfigValues.add(new ConfigValue("level", true, "Minimum island level needed.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".level", config.get("level"), problems, "level", super.getType())) TaskUtils.configValidateInt(root + ".level", config.get("level"), problems, false, false, "level"); return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onIslandLevel(IslandPostLevelEvent event) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/BentoBoxLevelTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BentoBoxLevelTaskType.java index 00f4e12f..ba662166 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/BentoBoxLevelTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BentoBoxLevelTaskType.java @@ -1,16 +1,15 @@ -package com.leonardobishop.quests.quest.tasktype.type.dependent; +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskTypeManager; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; +import com.leonardobishop.quests.common.tasktype.TaskTypeManager; import org.bukkit.event.EventHandler; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.events.BentoBoxEvent; @@ -24,32 +23,28 @@ import java.util.Map; import java.util.UUID; import java.util.concurrent.atomic.AtomicLong; -public final class BentoBoxLevelTaskType extends TaskType { +public final class BentoBoxLevelTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; private Field levelField = null; - public BentoBoxLevelTaskType() { + public BentoBoxLevelTaskType(BukkitQuestsPlugin plugin) { super("bentobox_level", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island level in the level addon for BentoBox."); - this.creatorConfigValues.add(new ConfigValue("level", true, "Minimum island level needed.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".level", config.get("level"), problems, "level", super.getType())) TaskUtils.configValidateInt(root + ".level", config.get("level"), problems, false, false, "level"); return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - public static void register(TaskTypeManager manager) { + public static void register(BukkitQuestsPlugin plugin, TaskTypeManager manager) { if (BentoBox.getInstance().getAddonsManager().getAddonByName("Level").isPresent()) { - manager.registerTaskType(new BentoBoxLevelTaskType()); + manager.registerTaskType(new BentoBoxLevelTaskType(plugin)); } } @@ -61,7 +56,7 @@ public final class BentoBoxLevelTaskType extends TaskType { Island island = (Island) keyValues.get("island"); for (UUID member : island.getMemberSet()) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(member); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(member); if (qPlayer == null) { continue; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensDeliverTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CitizensDeliverTaskType.java index 5110d51d..cc4aafa4 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensDeliverTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CitizensDeliverTaskType.java @@ -1,15 +1,15 @@ -package com.leonardobishop.quests.quest.tasktype.type.dependent; +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.config.ConfigProblemDescriptions; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import net.citizensnpcs.api.event.NPCRightClickEvent; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -24,25 +24,18 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class CitizensDeliverTaskType extends TaskType { +public final class CitizensDeliverTaskType extends BukkitTaskType { - private final Quests plugin; - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public CitizensDeliverTaskType(Quests plugin) { + public CitizensDeliverTaskType(BukkitQuestsPlugin plugin) { super("citizens_deliver", TaskUtils.TASK_ATTRIBUTION_STRING, "Deliver a set of items to a NPC."); this.plugin = plugin; - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of item to retrieve.")); - this.creatorConfigValues.add(new ConfigValue("item", true, "Name or ID of item.")); - this.creatorConfigValues.add(new ConfigValue("npc-name", true, "Name of the NPC.")); - this.creatorConfigValues.add(new ConfigValue("remove-items-when-complete", false, "Take the items away from the player on completion (true/false, " + - "default = false).")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType())) { Object configBlock = config.get("item"); if (configBlock instanceof ConfigurationSection) { @@ -52,19 +45,19 @@ public final class CitizensDeliverTaskType extends TaskType { itemloc = "type"; } if (!section.contains(itemloc)) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item.type")); + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, + ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item.type")); } else { String type = String.valueOf(section.get(itemloc)); if (!plugin.getItemGetter().isValidMaterial(type)) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + ".item." + itemloc)); + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, + ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + ".item." + itemloc)); } } } else { if (Material.getMaterial(String.valueOf(configBlock)) == null) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(configBlock)), root + ".item.item")); + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, + ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(configBlock)), root + ".item.item")); } } } @@ -75,11 +68,6 @@ public final class CitizensDeliverTaskType extends TaskType { return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onNPCClick(NPCRightClickEvent event) { Bukkit.getScheduler().runTaskLater(plugin, () -> checkInventory(event.getClicker(), event.getNPC().getName()), 1L); @@ -120,7 +108,7 @@ public final class CitizensDeliverTaskType extends TaskType { ItemStack is; if (configBlock instanceof ConfigurationSection) { - is = Quests.get().getItemStack("", (org.bukkit.configuration.ConfigurationSection) configBlock); + is = plugin.getItemStack("", (ConfigurationSection) configBlock); } else { material = Material.getMaterial(String.valueOf(configBlock)); diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensInteractTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CitizensInteractTaskType.java index 08440b05..5c6e6be2 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensInteractTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CitizensInteractTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type.dependent; +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import net.citizensnpcs.api.event.NPCRightClickEvent; import org.bukkit.ChatColor; import org.bukkit.event.EventHandler; @@ -19,33 +18,26 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class CitizensInteractTaskType extends TaskType { +public final class CitizensInteractTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public CitizensInteractTaskType() { + public CitizensInteractTaskType(BukkitQuestsPlugin plugin) { super("citizens_interact", TaskUtils.TASK_ATTRIBUTION_STRING, "Interact with an NPC to complete the quest."); - this.creatorConfigValues.add(new ConfigValue("npc-name", true, "Name of the NPC.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); TaskUtils.configValidateExists(root + ".npc-name", config.get("npc-name"), problems, "npc-name", super.getType()); TaskUtils.configValidateBoolean(root + ".remove-items-when-complete", config.get("remove-items-when-complete"), problems, true, "remove-items-when-complete", super.getType()); return problems; } - - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onNPCClick(NPCRightClickEvent event) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getClicker().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getClicker().getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/EssentialsBalanceTaskType.java index eaf6ba13..f207a499 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/EssentialsBalanceTaskType.java @@ -1,17 +1,16 @@ -package com.leonardobishop.quests.quest.tasktype.type.dependent; +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; import com.earth2me.essentials.Essentials; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import net.ess3.api.events.UserBalanceUpdateEvent; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -24,18 +23,18 @@ import java.util.HashMap; import java.util.List; import java.util.UUID; -public class EssentialsBalanceTaskType extends TaskType { +public class EssentialsBalanceTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public EssentialsBalanceTaskType() { + public EssentialsBalanceTaskType(BukkitQuestsPlugin plugin) { super("essentials_balance", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a set amount of money."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of money to reach.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, false, "amount"); return problems; @@ -46,7 +45,7 @@ public class EssentialsBalanceTaskType extends TaskType { Player player = Bukkit.getPlayer(playerUUID); Essentials ess = (Essentials) Bukkit.getPluginManager().getPlugin("Essentials"); if (player != null && player.isOnline() && ess != null) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(playerUUID); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(playerUUID); if (qPlayer == null) { return; } @@ -63,14 +62,9 @@ public class EssentialsBalanceTaskType extends TaskType { } } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onMoneyEarn(UserBalanceUpdateEvent event) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsMoneyEarnTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/EssentialsMoneyEarnTaskType.java index 6b080f13..5f4c2a0e 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsMoneyEarnTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/EssentialsMoneyEarnTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type.dependent; +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import net.ess3.api.events.UserBalanceUpdateEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -19,32 +18,26 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public class EssentialsMoneyEarnTaskType extends TaskType { +public class EssentialsMoneyEarnTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public EssentialsMoneyEarnTaskType() { + public EssentialsMoneyEarnTaskType(BukkitQuestsPlugin plugin) { super("essentials_moneyearn", TaskUtils.TASK_ATTRIBUTION_STRING, "Earn a set amount of money."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of money to earn.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, false, "amount"); return problems; } - - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onMoneyEarn(UserBalanceUpdateEvent event) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); if (qPlayer == null) { return; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/IridiumSkyblockValueType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/IridiumSkyblockValueType.java new file mode 100644 index 00000000..35934250 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/IridiumSkyblockValueType.java @@ -0,0 +1,87 @@ +//package com.leonardobishop.quests.bukkit.tasktype.type.dependent; +// +//import com.iridium.iridiumskyblock.Island; +//import com.iridium.iridiumskyblock.api.IslandWorthCalculatedEvent; +//import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +//import com.leonardobishop.quests.util.QuestsConfigLoader; +//import com.leonardobishop.quests.api.QuestsAPI; +//import com.leonardobishop.quests.player.QPlayer; +//import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +//import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +//import com.leonardobishop.quests.quest.Quest; +//import com.leonardobishop.quests.quest.Task; +//import com.leonardobishop.quests.tasktype.ConfigValue; +//import com.leonardobishop.quests.tasktype.TaskType; +//import com.leonardobishop.quests.tasktype.TaskUtils; +//import org.bukkit.event.EventHandler; +//import org.bukkit.event.EventPriority; +// +//import java.util.ArrayList; +//import java.util.HashMap; +//import java.util.List; +//import java.util.UUID; +// +//TODO update to latest ver +//public final class IridiumSkyblockValueType extends BukkitTaskType { +// +// private List<ConfigValue> creatorConfigValues = new ArrayList<>(); +// +// public IridiumSkyblockValueType() { +// super("iridiumskyblock_value", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island value for Iridium Skyblock."); +// this.creatorConfigValues.add(new ConfigValue("value", true, "Minimum island value needed.")); +// } +// +// @Override +// public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { +// ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); +// if (TaskUtils.configValidateExists(root + ".value", config.get("value"), problems, "value", super.getType())) +// TaskUtils.configValidateInt(root + ".value", config.get("value"), problems, false, false, "value"); +// return problems; +// } +// +// @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) +// public void onIslandLevel(IslandWorthCalculatedEvent event) { +// Island island = event.getIsland(); +// for (String player : island.members) { +// UUID uuid; +// try { +// uuid = UUID.fromString(player); +// } catch (Exception e) { +// continue; +// } +// QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(uuid); +// if (qPlayer == null) { +// continue; +// } +// +// for (Quest quest : IridiumSkyblockValueType.super.getRegisteredQuests()) { +// if (qPlayer.hasStartedQuest(quest)) { +// QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); +// +// for (Task task : quest.getTasksOfType(IridiumSkyblockValueType.super.getType())) { +// TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); +// +// if (taskProgress.isCompleted()) { +// continue; +// } +// +// int islandValueNeeded = (int) task.getConfigValue("value"); +// +// taskProgress.setProgress(event.getIslandWorth()); +// +// if (((double) taskProgress.getProgress()) >= islandValueNeeded) { +// taskProgress.setCompleted(true); +// } +// } +// } +// } +// } +// +// } +// +// @Override +// public List<ConfigValue> getCreatorConfigValues() { +// return creatorConfigValues; +// } +// +//} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/MythicMobsKillingType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/MythicMobsKillingType.java index 47245665..1e4ede3e 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/MythicMobsKillingType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/MythicMobsKillingType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type.dependent; +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -20,20 +19,18 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class MythicMobsKillingType extends TaskType { +public final class MythicMobsKillingType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public MythicMobsKillingType() { + public MythicMobsKillingType(BukkitQuestsPlugin plugin) { super("mythicmobs_killing", TaskUtils.TASK_ATTRIBUTION_STRING, "Kill a set amount of a MythicMobs entity."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of mobs to be killed.")); - this.creatorConfigValues.add(new ConfigValue("name", true, "The 'internal name' of the MythicMob.")); - this.creatorConfigValues.add(new ConfigValue("min-level", true, "The minimum level for the MythicMob.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); TaskUtils.configValidateExists(root + ".name", config.get("name"), problems, "name", super.getType()); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); @@ -42,11 +39,6 @@ public final class MythicMobsKillingType extends TaskType { return problems; } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onMobKill(MythicMobDeathEvent event) { Entity killer = event.getKiller(); @@ -63,7 +55,7 @@ public final class MythicMobsKillingType extends TaskType { String mobName = event.getMobType().getInternalName(); double level = event.getMobLevel(); - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(killer.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(killer.getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/PlaceholderAPIEvaluateTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/PlaceholderAPIEvaluateTaskType.java index 137844d5..fed42bf4 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/PlaceholderAPIEvaluateTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/PlaceholderAPIEvaluateTaskType.java @@ -1,16 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type.dependent; +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -21,23 +19,19 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class PlaceholderAPIEvaluateTaskType extends TaskType { +public final class PlaceholderAPIEvaluateTaskType extends BukkitTaskType { - private final Quests plugin; + private final BukkitQuestsPlugin plugin; private BukkitTask poll; - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); - public PlaceholderAPIEvaluateTaskType(Quests plugin) { + public PlaceholderAPIEvaluateTaskType(BukkitQuestsPlugin plugin) { super("placeholderapi_evaluate", TaskUtils.TASK_ATTRIBUTION_STRING, "Evaluate the result of a placeholder"); this.plugin = plugin; - this.creatorConfigValues.add(new ConfigValue("placeholder", true, "The placeholder string (including %%).")); - this.creatorConfigValues.add(new ConfigValue("evaluates", true, "What it should evaluate to be marked as complete.")); - this.creatorConfigValues.add(new ConfigValue("operator", false, "Comparison method.")); } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); TaskUtils.configValidateExists(root + ".placeholder", config.get("placeholder"), problems, "placeholder", super.getType()); boolean evalExists = TaskUtils.configValidateExists(root + ".evaluates", config.get("evaluates"), problems, "evaluates", super.getType()); @@ -47,7 +41,7 @@ public final class PlaceholderAPIEvaluateTaskType extends TaskType { try { operator = Operator.valueOf(operatorStr); } catch (IllegalArgumentException ex) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, "Operator '" + operatorStr + "' does not exist.", root + ".operator")); } if (operator != null && evalExists) { @@ -55,7 +49,7 @@ public final class PlaceholderAPIEvaluateTaskType extends TaskType { try { Double.parseDouble(evalStr); } catch (IllegalArgumentException ex) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, "Numeric operator specified, but placeholder evaluation '" + evalStr + "' is not numeric.", root + ".evaluates")); } } @@ -69,7 +63,7 @@ public final class PlaceholderAPIEvaluateTaskType extends TaskType { @Override public void run() { for (Player player : Bukkit.getOnlinePlayers()) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { continue; } @@ -148,11 +142,6 @@ public final class PlaceholderAPIEvaluateTaskType extends TaskType { } } - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - enum Operator { GREATER_THAN, LESS_THAN, diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusBuyCertainTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/ShopGUIPlusBuyCertainTaskType.java index 664c0ab6..c7944232 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusBuyCertainTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/ShopGUIPlusBuyCertainTaskType.java @@ -1,14 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type.dependent; +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import net.brcdev.shopgui.event.ShopPreTransactionEvent; import net.brcdev.shopgui.shop.ShopManager; import org.bukkit.event.EventHandler; @@ -18,15 +18,18 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public class ShopGUIPlusBuyCertainTaskType extends TaskType { +public class ShopGUIPlusBuyCertainTaskType extends BukkitTaskType { - public ShopGUIPlusBuyCertainTaskType() { + private final BukkitQuestsPlugin plugin; + + public ShopGUIPlusBuyCertainTaskType(BukkitQuestsPlugin plugin) { super("shopguiplus_buycertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Purchase a given item from a ShopGUI+ shop"); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, false, "amount"); TaskUtils.configValidateExists(root + ".id", config.get("id"), problems, "id", super.getType()); @@ -37,7 +40,7 @@ public class ShopGUIPlusBuyCertainTaskType extends TaskType { public void onMobKill(ShopPreTransactionEvent event) { if (event.getShopAction() != ShopManager.ShopAction.BUY) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusSellCertainTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/ShopGUIPlusSellCertainTaskType.java index 441c306d..9b2ba441 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusSellCertainTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/ShopGUIPlusSellCertainTaskType.java @@ -1,14 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type.dependent; +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import net.brcdev.shopgui.event.ShopPreTransactionEvent; import net.brcdev.shopgui.shop.ShopManager; import org.bukkit.event.EventHandler; @@ -18,15 +18,18 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public class ShopGUIPlusSellCertainTaskType extends TaskType { +public class ShopGUIPlusSellCertainTaskType extends BukkitTaskType { - public ShopGUIPlusSellCertainTaskType() { + private final BukkitQuestsPlugin plugin; + + public ShopGUIPlusSellCertainTaskType(BukkitQuestsPlugin plugin) { super("shopguiplus_sellcertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Sell a given item from to a ShopGUI+ shop"); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, false, "amount"); TaskUtils.configValidateExists(root + ".id", config.get("id"), problems, "id", super.getType()); @@ -37,7 +40,7 @@ public class ShopGUIPlusSellCertainTaskType extends TaskType { public void onMobKill(ShopPreTransactionEvent event) { if (event.getShopAction() != ShopManager.ShopAction.SELL || event.getShopAction() != ShopManager.ShopAction.SELL_ALL) return; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); if (qPlayer == null) { return; } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/uSkyBlockLevelType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/uSkyBlockLevelTaskType.java index a88ca6dc..ac093522 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/uSkyBlockLevelType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/uSkyBlockLevelTaskType.java @@ -1,15 +1,14 @@ -package com.leonardobishop.quests.quest.tasktype.type.dependent; +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import us.talabrek.ultimateskyblock.api.event.uSkyBlockScoreChangedEvent; @@ -18,32 +17,26 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public final class uSkyBlockLevelType extends TaskType { +public final class uSkyBlockLevelTaskType extends BukkitTaskType { - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); + private final BukkitQuestsPlugin plugin; - public uSkyBlockLevelType() { + public uSkyBlockLevelTaskType(BukkitQuestsPlugin plugin) { super("uskyblock_level", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island level for uSkyBlock."); - this.creatorConfigValues.add(new ConfigValue("level", true, "Minimum island level needed.")); + this.plugin = plugin; } @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); if (TaskUtils.configValidateExists(root + ".level", config.get("level"), problems, "level", super.getType())) TaskUtils.configValidateInt(root + ".level", config.get("level"), problems, false, false, "level"); return problems; } - - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onIslandLevel(uSkyBlockScoreChangedEvent event) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); if (qPlayer == null) { return; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/Chat.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/Chat.java new file mode 100644 index 00000000..36fe0d2d --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/Chat.java @@ -0,0 +1,40 @@ +package com.leonardobishop.quests.bukkit.util; + +import com.leonardobishop.quests.common.config.ConfigProblem; +import org.bukkit.ChatColor; + +import java.util.ArrayList; +import java.util.List; + +public class Chat { + + public static String color(String s) { + return ChatColor.translateAlternateColorCodes('&', s); + } + + public static List<String> color(List<String> s) { + if (s == null || s.size() == 0) return s; + + List<String> colored = new ArrayList<>(); + for (String line : s) { + colored.add(ChatColor.translateAlternateColorCodes('&', line)); + } + return colored; + } + + public static String strip(String s) { + return ChatColor.stripColor(s); + } + + public static ChatColor matchConfigProblemToColor(ConfigProblem.ConfigProblemType configProblem) { + switch (configProblem) { + case ERROR: + return ChatColor.RED; + case WARNING: + return ChatColor.YELLOW; + default: + return ChatColor.WHITE; + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/menu/MenuUtil.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/MenuUtils.java index 2f04a4f2..2cce530f 100644 --- a/src/main/java/com/leonardobishop/quests/menu/MenuUtil.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/MenuUtils.java @@ -1,9 +1,10 @@ -package com.leonardobishop.quests.menu; +package com.leonardobishop.quests.bukkit.util; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.listener.MenuController; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.menu.CancelQMenu; +import com.leonardobishop.quests.bukkit.menu.MenuController; +import com.leonardobishop.quests.bukkit.menu.QMenu; +import com.leonardobishop.quests.common.quest.Quest; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -15,13 +16,13 @@ import java.util.List; import java.util.Map; import java.util.UUID; -public class MenuUtil { +public class MenuUtils { - public static ItemStack applyPlaceholders(Quests plugin, UUID owner, ItemStack is) { + public static ItemStack applyPlaceholders(BukkitQuestsPlugin plugin, UUID owner, ItemStack is) { return applyPlaceholders(plugin, owner, is, Collections.emptyMap()); } - public static ItemStack applyPlaceholders(Quests plugin, UUID owner, ItemStack is, Map<String, String> placeholders) { + public static ItemStack applyPlaceholders(BukkitQuestsPlugin plugin, UUID owner, ItemStack is, Map<String, String> placeholders) { ItemStack newItemStack = is.clone(); List<String> lore = newItemStack.getItemMeta().getLore(); List<String> newLore = new ArrayList<>(); @@ -31,7 +32,7 @@ public class MenuUtil { for (String s : lore) { for (Map.Entry<String, String> entry : placeholders.entrySet()) { s = s.replace(entry.getKey(), entry.getValue()); - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + if (plugin.getPlaceholderAPIHook() != null && plugin.getQuestsConfig().getBoolean("options.gui-use-placeholderapi")) { s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); } } @@ -40,7 +41,7 @@ public class MenuUtil { } for (Map.Entry<String, String> entry : placeholders.entrySet()) { ism.setDisplayName(ism.getDisplayName().replace(entry.getKey(), entry.getValue())); - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + if (plugin.getPlaceholderAPIHook() != null && plugin.getQuestsConfig().getBoolean("options.gui-use-placeholderapi")) { ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); } } @@ -49,7 +50,7 @@ public class MenuUtil { return newItemStack; } - public static void handleMiddleClick(QMenu menu, Quest quest, Player player, MenuController controller) { + public static void handleMiddleClick(BukkitQuestsPlugin plugin, QMenu menu, Quest quest, Player player, MenuController controller) { if (menu.getOwner().hasStartedQuest(quest)) { String tracked = menu.getOwner().getPlayerPreferences().getTrackedQuestId(); @@ -62,10 +63,10 @@ public class MenuUtil { } } - public static void handleRightClick(QMenu menu, Quest quest, Player player, MenuController controller) { + public static void handleRightClick(BukkitQuestsPlugin plugin, QMenu menu, Quest quest, Player player, MenuController controller) { if (menu.getOwner().hasStartedQuest(quest)) { - if (Options.QUEST_AUTOSTART.getBooleanValue()) return; - CancelQMenu cancelQMenu = new CancelQMenu(menu.getOwner(), menu, quest); + if (plugin.getQuestsConfig().getBoolean("options.allow-quest-cancel")) return; + CancelQMenu cancelQMenu = new CancelQMenu(plugin, menu, menu.getOwner(), quest); controller.openMenu(player, cancelQMenu, 1); } } diff --git a/src/main/java/com/leonardobishop/quests/util/Messages.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/Messages.java index a86a4144..be99920e 100644 --- a/src/main/java/com/leonardobishop/quests/util/Messages.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/Messages.java @@ -1,8 +1,9 @@ -package com.leonardobishop.quests.util; +package com.leonardobishop.quests.bukkit.util; -import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; import org.bukkit.ChatColor; +//TODO refactor this public enum Messages { TIME_FORMAT("messages.time-format"), @@ -58,15 +59,21 @@ public enum Messages { COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS("messages.command-quest-admin-complete-success"), COMMAND_QUEST_ADMIN_RESET_SUCCESS("messages.command-quest-admin-reset-success"); + private static BukkitQuestsPlugin plugin; + private final String path; Messages(String path) { this.path = path; } + public static void setPlugin(BukkitQuestsPlugin plugin) { + Messages.plugin = plugin; + } + public String getMessage() { - if (Quests.get().getConfig().contains(path)) { - String message = Quests.get().getConfig().getString(path); + if (plugin.getConfig().contains(path)) { + String message = plugin.getQuestsConfig().getString(path); if (message != null) { return ChatColor.translateAlternateColorCodes('&', message); } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskUtils.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java index 405db7ff..ce930639 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskUtils.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java @@ -1,7 +1,8 @@ -package com.leonardobishop.quests.quest.tasktype; +package com.leonardobishop.quests.bukkit.util; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.config.ConfigProblemDescriptions; +import com.leonardobishop.quests.common.quest.Task; import org.bukkit.entity.Player; import java.util.List; @@ -40,10 +41,10 @@ public class TaskUtils { return true; } - public static void configValidateInt(String path, Object object, List<QuestsConfigLoader.ConfigProblem> problems, boolean allowNull, boolean greaterThanZero, String... args) { + public static void configValidateInt(String path, Object object, List<ConfigProblem> problems, boolean allowNull, boolean greaterThanZero, String... args) { if (object == null) { if (!allowNull) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.ERROR, String.format("Expected an integer for '%s', but got null instead", (Object[]) args), path)); } return; @@ -52,19 +53,19 @@ public class TaskUtils { try { Integer i = (Integer) object; if (greaterThanZero && i <= 0) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.ERROR, String.format("Value for field '%s' must be greater than 0", (Object[]) args), path)); } } catch (ClassCastException ex) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.ERROR, String.format("Expected an integer for '%s', but got '" + object + "' instead", (Object[]) args), path)); } } - public static void configValidateBoolean(String path, Object object, List<QuestsConfigLoader.ConfigProblem> problems, boolean allowNull, String... args) { + public static void configValidateBoolean(String path, Object object, List<ConfigProblem> problems, boolean allowNull, String... args) { if (object == null) { if (!allowNull) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.ERROR, String.format("Expected a boolean for '%s', but got null instead", (Object[]) args), path)); } return; @@ -73,15 +74,15 @@ public class TaskUtils { try { Boolean b = (Boolean) object; } catch (ClassCastException ex) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.ERROR, String.format("Expected a boolean for '%s', but got '" + object + "' instead", (Object[]) args), path)); } } - public static boolean configValidateExists(String path, Object object, List<QuestsConfigLoader.ConfigProblem> problems, String... args) { + public static boolean configValidateExists(String path, Object object, List<ConfigProblem> problems, String... args) { if (object == null) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, - String.format(QuestsConfigLoader.ConfigProblemDescriptions.TASK_MISSING_FIELD.getDescription(args), (Object[]) args), path)); + problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.ERROR, + String.format(ConfigProblemDescriptions.TASK_MISSING_FIELD.getDescription(args), (Object[]) args), path)); return false; } return true; diff --git a/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml index 4c7b7389..5cb81473 100644 --- a/src/main/resources/plugin.yml +++ b/bukkit/src/main/resources/plugin.yml @@ -3,7 +3,7 @@ name: Quests # This will be replaced with the property "version" in build.gradle version: ${version} -main: com.leonardobishop.quests.Quests +main: com.leonardobishop.quests.bukkit.BukkitQuestsPlugin website: https://github.com/LMBishop/Quests author: "LMBishop & contributors" softdepend: [ASkyBlock, BentoBox, IridiumSkyblock, uSkyBlock, Citizens, MythicMobs, PlaceholderAPI, Essentials, ShopGUIPlus, CoreProtect] @@ -12,7 +12,7 @@ api-version: "1.13" # allows new API features but Quests will still work pre-1.1 commands: quests: - description: Main command + description: Interact with your quests usage: /quests permission: quests.command aliases: [q, quest] diff --git a/src/main/resources/config.yml b/bukkit/src/main/resources/resources/bukkit/config.yml index f7084505..f7084505 100644 --- a/src/main/resources/config.yml +++ b/bukkit/src/main/resources/resources/bukkit/config.yml diff --git a/src/main/resources/quests/README.txt b/bukkit/src/main/resources/resources/bukkit/quests/README.txt index 779dd6bb..779dd6bb 100644 --- a/src/main/resources/quests/README.txt +++ b/bukkit/src/main/resources/resources/bukkit/quests/README.txt diff --git a/src/main/resources/quests/example1.yml b/bukkit/src/main/resources/resources/bukkit/quests/example1.yml index ca57f714..ca57f714 100644 --- a/src/main/resources/quests/example1.yml +++ b/bukkit/src/main/resources/resources/bukkit/quests/example1.yml diff --git a/src/main/resources/quests/example2.yml b/bukkit/src/main/resources/resources/bukkit/quests/example2.yml index 7ad82bea..7ad82bea 100644 --- a/src/main/resources/quests/example2.yml +++ b/bukkit/src/main/resources/resources/bukkit/quests/example2.yml diff --git a/src/main/resources/quests/example3.yml b/bukkit/src/main/resources/resources/bukkit/quests/example3.yml index dbd893e4..dbd893e4 100644 --- a/src/main/resources/quests/example3.yml +++ b/bukkit/src/main/resources/resources/bukkit/quests/example3.yml diff --git a/src/main/resources/quests/example4.yml b/bukkit/src/main/resources/resources/bukkit/quests/example4.yml index 4e9c27a8..4e9c27a8 100644 --- a/src/main/resources/quests/example4.yml +++ b/bukkit/src/main/resources/resources/bukkit/quests/example4.yml diff --git a/src/main/resources/quests/example5.yml b/bukkit/src/main/resources/resources/bukkit/quests/example5.yml index cb92f0f1..cb92f0f1 100644 --- a/src/main/resources/quests/example5.yml +++ b/bukkit/src/main/resources/resources/bukkit/quests/example5.yml diff --git a/src/main/resources/quests/example6.yml b/bukkit/src/main/resources/resources/bukkit/quests/example6.yml index 0913a7cb..0913a7cb 100644 --- a/src/main/resources/quests/example6.yml +++ b/bukkit/src/main/resources/resources/bukkit/quests/example6.yml diff --git a/src/main/resources/quests/example7.yml b/bukkit/src/main/resources/resources/bukkit/quests/example7.yml index 32bb7e04..32bb7e04 100644 --- a/src/main/resources/quests/example7.yml +++ b/bukkit/src/main/resources/resources/bukkit/quests/example7.yml diff --git a/bungee/build.gradle b/bungee/build.gradle new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/bungee/build.gradle diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/common/build.gradle diff --git a/common/src/main/java/com/leonardobishop/quests/common/config/ConfigProblem.java b/common/src/main/java/com/leonardobishop/quests/common/config/ConfigProblem.java new file mode 100644 index 00000000..d9f30c09 --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/config/ConfigProblem.java @@ -0,0 +1,63 @@ +package com.leonardobishop.quests.common.config; + +public final class ConfigProblem { + + private final ConfigProblemType type; + private final String description; + private final String location; + + public ConfigProblem(ConfigProblemType type, String description, String location) { + this.type = type; + this.description = description == null ? "?" : description; + ; + this.location = location == null ? "?" : location; + } + + public ConfigProblem(ConfigProblemType type, String description) { + this.type = type; + this.description = description == null ? "?" : description; + ; + this.location = "?"; + } + + public ConfigProblemType getType() { + return type; + } + + public String getDescription() { + return description; + } + + public String getLocation() { + return location; + } + + public enum ConfigProblemType { + + ERROR("Error", "E", 1), + WARNING("Warning", "W", 2); + + private final String title; + private final String shortened; + private final int priority; + + ConfigProblemType(String title, String shortened, int priority) { + this.title = title; + this.shortened = shortened; + this.priority = priority; + } + + public String getTitle() { + return title; + } + + public String getShortened() { + return shortened; + } + + public int getPriority() { + return priority; + } + + } +}
\ No newline at end of file diff --git a/common/src/main/java/com/leonardobishop/quests/common/config/ConfigProblemDescriptions.java b/common/src/main/java/com/leonardobishop/quests/common/config/ConfigProblemDescriptions.java new file mode 100644 index 00000000..868bdfbb --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/config/ConfigProblemDescriptions.java @@ -0,0 +1,35 @@ +package com.leonardobishop.quests.common.config; + +public enum ConfigProblemDescriptions { + + MALFORMED_YAML("Malformed YAML file, cannot read config"), + INVALID_QUEST_ID("ID '%s' is invalid, must be alphanumeric, unique and with no spaces"), + NO_TASKS("Quest contains no valid tasks"), + NO_TASK_TYPE("Task type not specified"), + UNKNOWN_TASK_TYPE("Task type '%s' does not exist"), + NO_DISPLAY_NAME("No name specified"), + NO_DISPLAY_MATERIAL("No material specified"), + UNKNOWN_MATERIAL("Material '%s' does not exist"), + UNKNOWN_ENTITY_TYPE("Entity type '%s' does not exist"), + TASK_MALFORMED_NOT_SECTION("Task '%s' is not a configuration section (has no fields)"), + TASK_MISSING_FIELD("Required field '%s' is missing for task type '%s'"), + UNKNOWN_TASK_REFERENCE("Attempt to reference unknown task '%s'"), + UNKNOWN_CATEGORY("Category '%s' does not exist"), + UNKNOWN_REQUIREMENT("Quest requirement '%s' does not exist"); + + private final String description; + + ConfigProblemDescriptions(String description) { + this.description = description; + } + + @Override + public String toString() { + return getDescription(); + } + + public String getDescription(String... format) { + return String.format(description, (Object[]) format); + } + +}
\ No newline at end of file diff --git a/common/src/main/java/com/leonardobishop/quests/common/config/QuestsConfig.java b/common/src/main/java/com/leonardobishop/quests/common/config/QuestsConfig.java new file mode 100644 index 00000000..be93ed83 --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/config/QuestsConfig.java @@ -0,0 +1,25 @@ +package com.leonardobishop.quests.common.config; + +import java.util.List; + +public interface QuestsConfig { + + boolean loadConfig(); + + String getString(String path); + + String getString(String path, String def); + + boolean getBoolean(String path); + + boolean getBoolean(String path, boolean def); + + int getInt(String path); + + int getInt(String path, int def); + + List<String> getStringList(String path); + + List<String> getStringList(String path, List<String> def); + +} diff --git a/common/src/main/java/com/leonardobishop/quests/common/config/QuestsLoader.java b/common/src/main/java/com/leonardobishop/quests/common/config/QuestsLoader.java new file mode 100644 index 00000000..09db3c52 --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/config/QuestsLoader.java @@ -0,0 +1,11 @@ +package com.leonardobishop.quests.common.config; + +import java.io.File; +import java.util.List; +import java.util.Map; + +public interface QuestsLoader { + + Map<String, List<ConfigProblem>> loadQuests(File root); + +} diff --git a/src/main/java/com/leonardobishop/quests/api/enums/QuestStartResult.java b/common/src/main/java/com/leonardobishop/quests/common/enums/QuestStartResult.java index 7241668d..28d8a43c 100644 --- a/src/main/java/com/leonardobishop/quests/api/enums/QuestStartResult.java +++ b/common/src/main/java/com/leonardobishop/quests/common/enums/QuestStartResult.java @@ -1,4 +1,4 @@ -package com.leonardobishop.quests.api.enums; +package com.leonardobishop.quests.common.enums; public enum QuestStartResult { QUEST_SUCCESS, //0 diff --git a/common/src/main/java/com/leonardobishop/quests/common/logger/QuestsLogger.java b/common/src/main/java/com/leonardobishop/quests/common/logger/QuestsLogger.java new file mode 100644 index 00000000..b4a192cf --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/logger/QuestsLogger.java @@ -0,0 +1,44 @@ +package com.leonardobishop.quests.common.logger; + +public interface QuestsLogger { + + LoggingLevel getServerLoggingLevel(); + + void setServerLoggingLevel(LoggingLevel serverLoggingLevel); + + void log(String str, LoggingLevel level); + + void debug(String str); + + void info(String str); + + void warning(String str); + + void severe(String str); + + enum LoggingLevel { + ERROR(0), + WARNING(1), + INFO(2), + DEBUG(3); + + private int numericVerbosity; + + LoggingLevel(int number) { + numericVerbosity = number; + } + + public int getNumericVerbosity() { + return numericVerbosity; + } + + public static LoggingLevel fromNumber(int number) { + for (LoggingLevel level : LoggingLevel.values()) { + if (level.getNumericVerbosity() == number) { + return level; + } + } + return LoggingLevel.INFO; + } + } +} diff --git a/common/src/main/java/com/leonardobishop/quests/common/player/QPlayer.java b/common/src/main/java/com/leonardobishop/quests/common/player/QPlayer.java new file mode 100644 index 00000000..0792a0fc --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/player/QPlayer.java @@ -0,0 +1,127 @@ +package com.leonardobishop.quests.common.player; + +import com.leonardobishop.quests.common.questcontroller.QuestController; +import com.leonardobishop.quests.common.enums.QuestStartResult; +import com.leonardobishop.quests.common.plugin.Quests; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.common.quest.Quest; + +import java.util.UUID; + +/** + * Represents a player. + */ +public class QPlayer { + + private final Quests plugin; + private final UUID uuid; + private final QPlayerPreferences playerPreferences; + private final QuestProgressFile questProgressFile; + private QuestController questController; + + public QPlayer(Quests plugin, UUID uuid, QPlayerPreferences playerPreferences, QuestProgressFile questProgressFile, QuestController questController) { + this.plugin = plugin; + this.uuid = uuid; + this.playerPreferences = playerPreferences; + this.questProgressFile = questProgressFile; + this.questController = questController; + } + + public UUID getPlayerUUID() { + return this.uuid; + } + + /** + * Attempt to complete a quest for the player. This will also play all effects (such as titles, messages etc.) + * and also dispatches all rewards for the player. + * + * @param quest the quest to complete + * @return true (always) + */ + public boolean completeQuest(Quest quest) { + return questController.completeQuestForPlayer(this, quest); + } + + /** + * Attempt to track a quest for the player. This will also play all effects (such as titles, messages etc.) + ** + * @param quest the quest to track + */ + public void trackQuest(Quest quest) { + questController.trackQuestForPlayer(this, quest); + } + + /** + * Gets whether or not the player has started a specific quest. + * + * @param quest the quest to test for + * @return true if the quest is started or quest autostart is enabled and the quest is ready to start, false otherwise + */ + public boolean hasStartedQuest(Quest quest) { + return questController.hasPlayerStartedQuest(this, quest); + } + + /** + * Attempt to start a quest for the player. This will also play all effects (such as titles, messages etc.) + * + * Warning: will fail if the player is not online. + * + * @param quest the quest to start + * @return the quest start result -- {@code QuestStartResult.QUEST_SUCCESS} indicates success + */ + // TODO PlaceholderAPI support + public QuestStartResult startQuest(Quest quest) { + return questController.startQuestForPlayer(this, quest); + } + + /** + * Attempt to cancel a quest for the player. This will also play all effects (such as titles, messages etc.) + * + * @param quest the quest to start + * @return true if the quest was cancelled, false otherwise + */ + public boolean cancelQuest(Quest quest) { + return questController.cancelQuestForPlayer(this, quest); + } + + /** + * Check if the player can start a quest. + * + * Warning: will fail if the player is not online. + * + * @param quest the quest to check + * @return the quest start result + */ + public QuestStartResult canStartQuest(Quest quest) { + return questController.canPlayerStartQuest(this, quest); + } + + + public QuestProgressFile getQuestProgressFile() { + return questProgressFile; + } + + public QPlayerPreferences getPlayerPreferences() { + return playerPreferences; + } + + public QuestController getQuestController() { + return questController; + } + + public void setQuestController(QuestController questController) { + this.questController = questController; + } + + @Override //Used by java GC + public boolean equals(Object o) { + if (!(o instanceof QPlayer)) return false; + QPlayer qPlayer = (QPlayer) o; + return this.uuid == qPlayer.getPlayerUUID(); + } + + @Override //Used by java GC + public int hashCode() { + return uuid.hashCode() * 73; //uuid hash * prime number + } +} diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java b/common/src/main/java/com/leonardobishop/quests/common/player/QPlayerManager.java index 182b5666..28a46ae1 100644 --- a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java +++ b/common/src/main/java/com/leonardobishop/quests/common/player/QPlayerManager.java @@ -1,15 +1,10 @@ -package com.leonardobishop.quests.player; +package com.leonardobishop.quests.common.player; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.util.QuestsLogger; -import com.leonardobishop.quests.player.questprogressfile.QPlayerPreferences; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.quest.controller.NormalQuestController; -import com.leonardobishop.quests.quest.controller.QuestController; -import com.leonardobishop.quests.storage.MySqlStorageProvider; -import com.leonardobishop.quests.storage.StorageProvider; -import com.leonardobishop.quests.storage.YamlStorageProvider; -import org.bukkit.Bukkit; +import com.leonardobishop.quests.common.logger.QuestsLogger; +import com.leonardobishop.quests.common.storage.StorageProvider; +import com.leonardobishop.quests.common.plugin.Quests; +import com.leonardobishop.quests.common.questcontroller.QuestController; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile; import java.util.Collection; import java.util.Map; @@ -20,29 +15,13 @@ public class QPlayerManager { private final Map<UUID, QPlayer> qPlayers = new ConcurrentHashMap<>(); private final Quests plugin; - private StorageProvider storageProvider; + private final StorageProvider storageProvider; private QuestController activeQuestController; - - public QPlayerManager(Quests plugin) { + public QPlayerManager(Quests plugin, StorageProvider storageProvider, QuestController questController) { this.plugin = plugin; - - String configuredProvider = plugin.getConfig().getString("options.storage.provider", "yaml"); - if (configuredProvider.equalsIgnoreCase("yaml")) { - this.storageProvider = new YamlStorageProvider(plugin); - } else if (configuredProvider.equalsIgnoreCase("mysql")) { - this.storageProvider = new MySqlStorageProvider(plugin, plugin.getConfig().getConfigurationSection("options.storage.database-settings")); - } else { - plugin.getQuestsLogger().warning("No valid storage provider is configured - Quests will use YAML storage as a default"); - this.storageProvider = new YamlStorageProvider(plugin); - } - try { - storageProvider.init(); - } catch (Exception ignored) { - plugin.getQuestsLogger().severe("An error occurred initialising the storage provider."); - } - - this.activeQuestController = new NormalQuestController(plugin); + this.storageProvider = storageProvider; + this.activeQuestController = questController; } /** @@ -68,7 +47,7 @@ public class QPlayerManager { * @param uuid the uuid of the player */ public void removePlayer(UUID uuid) { - plugin.getQuestsLogger().debug("Unloading and saving player " + uuid + ". Main thread: " + Bukkit.isPrimaryThread()); + plugin.getQuestsLogger().debug("Unloading and saving player " + uuid + "."); qPlayers.computeIfPresent(uuid, (mapUUID, qPlayer) -> { savePlayer(uuid); return null; @@ -97,7 +76,7 @@ public class QPlayerManager { public void savePlayer(UUID uuid, QuestProgressFile originalProgressFile) { QuestProgressFile clonedProgressFile = new QuestProgressFile(originalProgressFile); originalProgressFile.resetModified(); - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> save(uuid, clonedProgressFile)); + plugin.getScheduler().doAsync(() -> save(uuid, clonedProgressFile)); } /** @@ -124,7 +103,7 @@ public class QPlayerManager { } private void save(UUID uuid, QuestProgressFile questProgressFile) { - plugin.getQuestsLogger().debug("Saving player " + uuid + ". Main thread: " + Bukkit.isPrimaryThread()); + plugin.getQuestsLogger().debug("Saving player " + uuid + "."); storageProvider.saveProgressFile(uuid, questProgressFile); } @@ -149,7 +128,7 @@ public class QPlayerManager { * @param uuid the uuid of the player */ public void loadPlayer(UUID uuid) { - plugin.getQuestsLogger().debug("Loading player " + uuid + ". Main thread: " + Bukkit.isPrimaryThread()); + plugin.getQuestsLogger().debug("Loading player " + uuid + "."); qPlayers.computeIfAbsent(uuid, s -> { QuestProgressFile questProgressFile = storageProvider.loadProgressFile(uuid); if (questProgressFile == null) return null; diff --git a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QPlayerPreferences.java b/common/src/main/java/com/leonardobishop/quests/common/player/QPlayerPreferences.java index 764189f9..5278ae09 100644 --- a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QPlayerPreferences.java +++ b/common/src/main/java/com/leonardobishop/quests/common/player/QPlayerPreferences.java @@ -1,4 +1,4 @@ -package com.leonardobishop.quests.player.questprogressfile; +package com.leonardobishop.quests.common.player; public class QPlayerPreferences { diff --git a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgress.java b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/QuestProgress.java index d7cac084..d0e0627d 100644 --- a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgress.java +++ b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/QuestProgress.java @@ -1,6 +1,6 @@ -package com.leonardobishop.quests.player.questprogressfile; +package com.leonardobishop.quests.common.player.questprogressfile; -import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.common.plugin.Quests; import java.util.Collection; import java.util.HashMap; diff --git a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/QuestProgressFile.java index 3f6d9900..a0c51d9c 100644 --- a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java +++ b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/QuestProgressFile.java @@ -1,15 +1,10 @@ -package com.leonardobishop.quests.player.questprogressfile; +package com.leonardobishop.quests.common.player.questprogressfile; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.util.Options; -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.YamlConfiguration; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.plugin.Quests; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; -import java.io.File; -import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -41,9 +36,10 @@ public class QuestProgressFile { } public void addQuestProgress(QuestProgress questProgress) { - if (Options.VERIFY_QUEST_EXISTS_ON_LOAD.getBooleanValue(true) && plugin.getQuestManager().getQuestById(questProgress.getQuestId()) == null) { - return; - } + //TODO don't do here +// if (Options.VERIFY_QUEST_EXISTS_ON_LOAD.getBooleanValue(true) && plugin.getQuestManager().getQuestById(questProgress.getQuestId()) == null) { +// return; +// } this.questProgress.put(questProgress.getQuestId(), questProgress); } diff --git a/src/main/java/com/leonardobishop/quests/player/questprogressfile/TaskProgress.java b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/TaskProgress.java index e0943ff3..cb7f3fec 100644 --- a/src/main/java/com/leonardobishop/quests/player/questprogressfile/TaskProgress.java +++ b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/TaskProgress.java @@ -1,4 +1,4 @@ -package com.leonardobishop.quests.player.questprogressfile; +package com.leonardobishop.quests.common.player.questprogressfile; import java.util.UUID; diff --git a/common/src/main/java/com/leonardobishop/quests/common/plugin/Quests.java b/common/src/main/java/com/leonardobishop/quests/common/plugin/Quests.java new file mode 100644 index 00000000..f6eb67c5 --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/plugin/Quests.java @@ -0,0 +1,38 @@ +package com.leonardobishop.quests.common.plugin; + +import com.leonardobishop.quests.common.questcontroller.QuestController; +import com.leonardobishop.quests.common.logger.QuestsLogger; +import com.leonardobishop.quests.common.player.QPlayerManager; +import com.leonardobishop.quests.common.quest.QuestCompleter; +import com.leonardobishop.quests.common.quest.QuestManager; +import com.leonardobishop.quests.common.scheduler.ServerScheduler; +import com.leonardobishop.quests.common.storage.StorageProvider; +import com.leonardobishop.quests.common.tasktype.TaskTypeManager; +import com.leonardobishop.quests.common.updater.Updater; +import com.leonardobishop.quests.common.config.QuestsConfig; + +public interface Quests { + + QuestsLogger getQuestsLogger(); + + QuestManager getQuestManager(); + + QPlayerManager getPlayerManager(); + + QuestController getQuestController(); + + TaskTypeManager getTaskTypeManager(); + + QuestCompleter getQuestCompleter(); + + QuestsConfig getQuestsConfig(); + + Updater getUpdater(); + + ServerScheduler getScheduler(); + + StorageProvider getStorageProvider(); + + void reloadQuests(); + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/Category.java b/common/src/main/java/com/leonardobishop/quests/common/quest/Category.java index d09143dc..7bd8f10d 100644 --- a/src/main/java/com/leonardobishop/quests/quest/Category.java +++ b/common/src/main/java/com/leonardobishop/quests/common/quest/Category.java @@ -1,7 +1,4 @@ -package com.leonardobishop.quests.quest; - -import org.bukkit.ChatColor; -import org.bukkit.inventory.ItemStack; +package com.leonardobishop.quests.common.quest; import java.util.ArrayList; import java.util.List; @@ -9,13 +6,11 @@ import java.util.List; public class Category { private final String id; - private final ItemStack displayItem; private final boolean permissionRequired; private final List<String> registeredQuestIds = new ArrayList<>(); - public Category(String id, ItemStack displayItem, boolean permissionRequired) { + public Category(String id, boolean permissionRequired) { this.id = id; - this.displayItem = displayItem; this.permissionRequired = permissionRequired; } @@ -27,10 +22,6 @@ public class Category { return permissionRequired; } - public ItemStack getDisplayItem() { - return displayItem; - } - public void registerQuestId(String questid) { registeredQuestIds.add(questid); } @@ -39,8 +30,4 @@ public class Category { return registeredQuestIds; } - - public String getDisplayNameStripped() { - return ChatColor.stripColor(this.displayItem.getItemMeta().getDisplayName()); - } } diff --git a/src/main/java/com/leonardobishop/quests/quest/Quest.java b/common/src/main/java/com/leonardobishop/quests/common/quest/Quest.java index c286a45a..510e88d9 100644 --- a/src/main/java/com/leonardobishop/quests/quest/Quest.java +++ b/common/src/main/java/com/leonardobishop/quests/common/quest/Quest.java @@ -1,7 +1,4 @@ -package com.leonardobishop.quests.quest; - -import com.leonardobishop.quests.menu.QItemStack; -import org.bukkit.ChatColor; +package com.leonardobishop.quests.common.quest; import java.util.ArrayList; import java.util.Collection; @@ -13,7 +10,6 @@ public class Quest implements Comparable<Quest> { private Map<String, Task> tasks = new HashMap<>(); private final String id; - private final QItemStack displayItem; private final List<String> rewards; private final List<String> requirements; private final List<String> rewardString; @@ -27,14 +23,13 @@ public class Quest implements Comparable<Quest> { private String categoryid; - public Quest(String id, QItemStack displayItem, List<String> rewards, List<String> requirements, boolean repeatable, boolean cooldownEnabled, int cooldown, boolean permissionRequired, List<String> rewardString, List<String> startString, Map<String, String> placeholders, String categoryid, int sortOrder) { - this(id, displayItem, rewards, requirements, repeatable, cooldownEnabled, cooldown, permissionRequired, rewardString, startString, placeholders, sortOrder); + public Quest(String id, List<String> rewards, List<String> requirements, boolean repeatable, boolean cooldownEnabled, int cooldown, boolean permissionRequired, List<String> rewardString, List<String> startString, Map<String, String> placeholders, String categoryid, int sortOrder) { + this(id, rewards, requirements, repeatable, cooldownEnabled, cooldown, permissionRequired, rewardString, startString, placeholders, sortOrder); this.categoryid = categoryid; } - public Quest(String id, QItemStack displayItem, List<String> rewards, List<String> requirements, boolean repeatable, boolean cooldownEnabled, int cooldown, boolean permissionRequired, List<String> rewardString, List<String> startString, Map<String, String> placeholders, int sortOrder) { + public Quest(String id, List<String> rewards, List<String> requirements, boolean repeatable, boolean cooldownEnabled, int cooldown, boolean permissionRequired, List<String> rewardString, List<String> startString, Map<String, String> placeholders, int sortOrder) { this.id = id; - this.displayItem = displayItem; this.rewards = rewards; this.requirements = requirements; this.repeatable = repeatable; @@ -86,10 +81,6 @@ public class Quest implements Comparable<Quest> { return id; } - public QItemStack getDisplayItem() { - return displayItem; - } - public List<String> getRewards() { return rewards; } @@ -114,10 +105,6 @@ public class Quest implements Comparable<Quest> { return categoryid; } - public String getDisplayNameStripped() { - return ChatColor.stripColor(this.displayItem.getName()); - } - public Map<String, String> getPlaceholders() { return placeholders; } diff --git a/common/src/main/java/com/leonardobishop/quests/common/quest/QuestCompleter.java b/common/src/main/java/com/leonardobishop/quests/common/quest/QuestCompleter.java new file mode 100644 index 00000000..db9cd36c --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/quest/QuestCompleter.java @@ -0,0 +1,11 @@ +package com.leonardobishop.quests.common.quest; + +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile; + +public interface QuestCompleter { + + void queueSingular(QuestProgress questProgress); + void queueFullCheck(QuestProgressFile questProgressFile); + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/QuestManager.java b/common/src/main/java/com/leonardobishop/quests/common/quest/QuestManager.java index 2aaea571..ebace123 100644 --- a/src/main/java/com/leonardobishop/quests/quest/QuestManager.java +++ b/common/src/main/java/com/leonardobishop/quests/common/quest/QuestManager.java @@ -1,6 +1,6 @@ -package com.leonardobishop.quests.quest; +package com.leonardobishop.quests.common.quest; -import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.common.plugin.Quests; import java.util.ArrayList; import java.util.LinkedHashMap; diff --git a/src/main/java/com/leonardobishop/quests/quest/Task.java b/common/src/main/java/com/leonardobishop/quests/common/quest/Task.java index edac070d..8189e06e 100644 --- a/src/main/java/com/leonardobishop/quests/quest/Task.java +++ b/common/src/main/java/com/leonardobishop/quests/common/quest/Task.java @@ -1,4 +1,4 @@ -package com.leonardobishop.quests.quest; +package com.leonardobishop.quests.common.quest; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/leonardobishop/quests/quest/controller/QuestController.java b/common/src/main/java/com/leonardobishop/quests/common/questcontroller/QuestController.java index b4b76baa..0f5b6e8f 100644 --- a/src/main/java/com/leonardobishop/quests/quest/controller/QuestController.java +++ b/common/src/main/java/com/leonardobishop/quests/common/questcontroller/QuestController.java @@ -1,15 +1,23 @@ -package com.leonardobishop.quests.quest.controller; +package com.leonardobishop.quests.common.questcontroller; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.common.enums.QuestStartResult; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.quest.Quest; public interface QuestController { + String getName(); + QuestStartResult startQuestForPlayer(QPlayer qPlayer, Quest quest); + QuestStartResult canPlayerStartQuest(QPlayer qPlayer, Quest quest); + boolean completeQuestForPlayer(QPlayer qPlayer, Quest quest); + boolean hasPlayerStartedQuest(QPlayer qPlayer, Quest quest); + boolean cancelQuestForPlayer(QPlayer qPlayer, Quest quest); + void trackQuestForPlayer(QPlayer qPlayer, Quest quest); + } diff --git a/common/src/main/java/com/leonardobishop/quests/common/scheduler/ServerScheduler.java b/common/src/main/java/com/leonardobishop/quests/common/scheduler/ServerScheduler.java new file mode 100644 index 00000000..0de30f51 --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/scheduler/ServerScheduler.java @@ -0,0 +1,8 @@ +package com.leonardobishop.quests.common.scheduler; + +public interface ServerScheduler { + + void doSync(Runnable runnable); + void doAsync(Runnable runnable); + +} diff --git a/src/main/java/com/leonardobishop/quests/storage/StorageProvider.java b/common/src/main/java/com/leonardobishop/quests/common/storage/StorageProvider.java index f1d00203..4ea885be 100644 --- a/src/main/java/com/leonardobishop/quests/storage/StorageProvider.java +++ b/common/src/main/java/com/leonardobishop/quests/common/storage/StorageProvider.java @@ -1,14 +1,17 @@ -package com.leonardobishop.quests.storage; +package com.leonardobishop.quests.common.storage; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile; import java.util.UUID; public interface StorageProvider { void init(); + void shutdown(); + QuestProgressFile loadProgressFile(UUID uuid); + void saveProgressFile(UUID uuid, QuestProgressFile questProgressFile); } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskType.java b/common/src/main/java/com/leonardobishop/quests/common/tasktype/TaskType.java index fb7b8b61..79c7a0b0 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskType.java +++ b/common/src/main/java/com/leonardobishop/quests/common/tasktype/TaskType.java @@ -1,9 +1,8 @@ -package com.leonardobishop.quests.quest.tasktype; +package com.leonardobishop.quests.common.tasktype; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import org.bukkit.event.Listener; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import java.util.ArrayList; import java.util.Collections; @@ -17,7 +16,7 @@ import java.util.UUID; * which is of this type. This is so you do not have to * iterate through every single quest. */ -public abstract class TaskType implements Listener { +public abstract class TaskType { private final List<Quest> quests = new ArrayList<>(); private final String type; @@ -80,13 +79,6 @@ public abstract class TaskType implements Listener { return description; } - //TODO rework this - @Deprecated - public List<ConfigValue> getCreatorConfigValues() { - // not implemented here - return Collections.emptyList(); - } - /** * Called when Quests has finished registering all quests to the task type * May be called several times if an operator uses /quests admin reload @@ -109,7 +101,7 @@ public abstract class TaskType implements Listener { /** * Called when Quests reloads the configuration - used to detect errors in the configuration of your task type */ - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + public List<ConfigProblem> validateConfig(String root, HashMap<String, Object> config) { // not implemented here return Collections.emptyList(); } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskTypeManager.java b/common/src/main/java/com/leonardobishop/quests/common/tasktype/TaskTypeManager.java index 0b1fced9..dfa5124e 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskTypeManager.java +++ b/common/src/main/java/com/leonardobishop/quests/common/tasktype/TaskTypeManager.java @@ -1,13 +1,12 @@ -package com.leonardobishop.quests.quest.tasktype; +package com.leonardobishop.quests.common.tasktype; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import org.bukkit.Bukkit; +import com.leonardobishop.quests.common.plugin.Quests; +import com.leonardobishop.quests.common.quest.Quest; +import com.leonardobishop.quests.common.quest.Task; import java.util.ArrayList; -public class TaskTypeManager { +public abstract class TaskTypeManager { private final Quests plugin; private boolean allowRegistrations; @@ -41,7 +40,6 @@ public class TaskTypeManager { if (!allowRegistrations) { throw new IllegalStateException("No longer accepting new task types (must be done before quests are loaded)"); } - Bukkit.getPluginManager().registerEvents(taskType, plugin); plugin.getQuestsLogger().info("Task type " + taskType.getType() + " has been registered."); taskTypes.add(taskType); } diff --git a/src/main/java/com/leonardobishop/quests/updater/Updater.java b/common/src/main/java/com/leonardobishop/quests/common/updater/Updater.java index 6bd28b49..70660735 100644 --- a/src/main/java/com/leonardobishop/quests/updater/Updater.java +++ b/common/src/main/java/com/leonardobishop/quests/common/updater/Updater.java @@ -1,7 +1,6 @@ -package com.leonardobishop.quests.updater; +package com.leonardobishop.quests.common.updater; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.util.Messages; +import com.leonardobishop.quests.common.plugin.Quests; import java.io.BufferedReader; import java.io.IOException; @@ -15,17 +14,17 @@ public class Updater { private static final int PROJECT_ID = 23696; private final String installedVersion; - private final Quests plugin; private final boolean enabled; + private final Quests plugin; private String returnedVersion; private URL api; private boolean updateReady; private long lastCheck; - public Updater(Quests plugin, boolean enabled) { + public Updater(Quests plugin, String installedVersion, boolean enabled) { this.plugin = plugin; - this.installedVersion = plugin.getDescription().getVersion(); + this.installedVersion = installedVersion; this.enabled = enabled; try { this.api = new URL(getApiUrl()); @@ -39,7 +38,15 @@ public class Updater { public String getApiUrl() { return "https://api.spigotmc.org/legacy/update.php?resource=" + PROJECT_ID; } - + + public String getInstalledVersion() { + return installedVersion; + } + + public String getReturnedVersion() { + return returnedVersion; + } + public void check() { if (!enabled) { return; @@ -68,7 +75,4 @@ public class Updater { return updateReady; } - public String getMessage() { - return Messages.QUEST_UPDATER.getMessage().replace("{newver}", returnedVersion).replace("{oldver}", installedVersion).replace("{link}", getUpdateLink()); - } }
\ No newline at end of file diff --git a/common/src/main/java/com/leonardobishop/quests/common/util/Format.java b/common/src/main/java/com/leonardobishop/quests/common/util/Format.java new file mode 100644 index 00000000..410462ee --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/util/Format.java @@ -0,0 +1,21 @@ +package com.leonardobishop.quests.common.util; + +public class Format { + + //TODO reimplement customisation + public static String formatTime(long sec) { + long hours = sec / 3600; + long minutes = (sec % 3600) / 60; + long seconds = ((sec % 3600) % 60) % 60; + +// return Messages.TIME_FORMAT.getMessage() +// .replace("{hours}", String.format("%02d", hours)) +// .replace("{minutes}", String.format("%02d", minutes)) +// .replace("{seconds}", String.format("%02d", seconds)); + return "{houes}h {minutes}m {seconds}s" + .replace("{hours}", String.format("%02d", hours)) + .replace("{minutes}", String.format("%02d", minutes)) + .replace("{seconds}", String.format("%02d", seconds)); + } + +} diff --git a/settings.gradle b/settings.gradle index b0609435..2493873b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,5 @@ rootProject.name = 'Quests' +include 'common' +include 'bungee' +include 'bukkit' + diff --git a/src/main/java/com/leonardobishop/quests/Quests.java b/src/main/java/com/leonardobishop/quests/Quests.java deleted file mode 100644 index db842b0c..00000000 --- a/src/main/java/com/leonardobishop/quests/Quests.java +++ /dev/null @@ -1,493 +0,0 @@ -package com.leonardobishop.quests; - -import com.leonardobishop.quests.command.QuestsCommand; -import com.leonardobishop.quests.listener.PlayerJoinListener; -import com.leonardobishop.quests.listener.PlayerLeaveListener; -import com.leonardobishop.quests.listener.MenuController; -import com.leonardobishop.quests.hook.coreprotect.CoreProtectHook; -import com.leonardobishop.quests.hook.coreprotect.CoreProtectNoHook; -import com.leonardobishop.quests.hook.coreprotect.ICoreProtectHook; -import com.leonardobishop.quests.hook.itemgetter.ItemGetter; -import com.leonardobishop.quests.hook.itemgetter.ItemGetterLatest; -import com.leonardobishop.quests.hook.itemgetter.ItemGetter_1_13; -import com.leonardobishop.quests.hook.itemgetter.ItemGetter_Late_1_8; -import com.leonardobishop.quests.hook.papi.IPlaceholderAPIHook; -import com.leonardobishop.quests.hook.papi.PlaceholderAPIHook; -import com.leonardobishop.quests.hook.title.Title; -import com.leonardobishop.quests.hook.title.Title_Bukkit; -import com.leonardobishop.quests.hook.title.Title_BukkitNoTimings; -import com.leonardobishop.quests.hook.title.Title_Other; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.QPlayerManager; -import com.leonardobishop.quests.quest.QuestManager; -import com.leonardobishop.quests.quest.controller.NormalQuestController; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskTypeManager; -import com.leonardobishop.quests.quest.tasktype.type.BreedingTaskType; -import com.leonardobishop.quests.quest.tasktype.type.BrewingTaskType; -import com.leonardobishop.quests.quest.tasktype.type.BuildingCertainTaskType; -import com.leonardobishop.quests.quest.tasktype.type.BuildingTaskType; -import com.leonardobishop.quests.quest.tasktype.type.CommandTaskType; -import com.leonardobishop.quests.quest.tasktype.type.DealDamageTaskType; -import com.leonardobishop.quests.quest.tasktype.type.DistancefromTaskType; -import com.leonardobishop.quests.quest.tasktype.type.EnchantingTaskType; -import com.leonardobishop.quests.quest.tasktype.type.ExpEarnTaskType; -import com.leonardobishop.quests.quest.tasktype.type.FishingTaskType; -import com.leonardobishop.quests.quest.tasktype.type.InventoryTaskType; -import com.leonardobishop.quests.quest.tasktype.type.MilkingTaskType; -import com.leonardobishop.quests.quest.tasktype.type.MiningCertainTaskType; -import com.leonardobishop.quests.quest.tasktype.type.MiningTaskType; -import com.leonardobishop.quests.quest.tasktype.type.MobkillingCertainTaskType; -import com.leonardobishop.quests.quest.tasktype.type.MobkillingTaskType; -import com.leonardobishop.quests.quest.tasktype.type.PermissionTaskType; -import com.leonardobishop.quests.quest.tasktype.type.PlayerkillingTaskType; -import com.leonardobishop.quests.quest.tasktype.type.PlaytimeTaskType; -import com.leonardobishop.quests.quest.tasktype.type.PositionTaskType; -import com.leonardobishop.quests.quest.tasktype.type.ShearingTaskType; -import com.leonardobishop.quests.quest.tasktype.type.TamingTaskType; -import com.leonardobishop.quests.quest.tasktype.type.WalkingTaskType; -import com.leonardobishop.quests.quest.tasktype.type.dependent.ASkyBlockLevelType; -import com.leonardobishop.quests.quest.tasktype.type.dependent.BentoBoxLevelTaskType; -import com.leonardobishop.quests.quest.tasktype.type.dependent.CitizensDeliverTaskType; -import com.leonardobishop.quests.quest.tasktype.type.dependent.CitizensInteractTaskType; -import com.leonardobishop.quests.quest.tasktype.type.dependent.EssentialsBalanceTaskType; -import com.leonardobishop.quests.quest.tasktype.type.dependent.EssentialsMoneyEarnTaskType; -import com.leonardobishop.quests.quest.tasktype.type.dependent.IridiumSkyblockValueType; -import com.leonardobishop.quests.quest.tasktype.type.dependent.MythicMobsKillingType; -import com.leonardobishop.quests.quest.tasktype.type.dependent.PlaceholderAPIEvaluateTaskType; -import com.leonardobishop.quests.quest.tasktype.type.dependent.ShopGUIPlusBuyCertainTaskType; -import com.leonardobishop.quests.quest.tasktype.type.dependent.ShopGUIPlusSellCertainTaskType; -import com.leonardobishop.quests.quest.tasktype.type.dependent.uSkyBlockLevelType; -import com.leonardobishop.quests.updater.Updater; -import com.leonardobishop.quests.util.Messages; -import com.leonardobishop.quests.util.QuestCompleter; -import com.leonardobishop.quests.util.QuestMode; -import com.leonardobishop.quests.util.QuestsAutosaveRunnable; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.util.QuestsLogger; -import org.bstats.bukkit.MetricsLite; -import org.bukkit.Bukkit; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitTask; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; - -public class Quests extends JavaPlugin { - - private static Quests instance; - - /** Handles anything to do with loaded quests */ - private QuestManager questManager; - /** Handles anything to do with task types */ - private TaskTypeManager taskTypeManager; - /** Handles anything to do with players */ - private QPlayerManager qPlayerManager; - - /** Checks and records ready plugin updates */ - private Updater updater; - /** Abstract title handle to allow for cross version compatibility */ - private Title titleHandle; - /** Abstract item handle to allow for cross version compatibility */ - private ItemGetter itemGetter; - /** Task which checks quests and marks them as complete if requirements are satisfied */ - private QuestCompleter questCompleter; - /** Loads configurations and tracks errors */ - private QuestsConfigLoader questsConfigLoader; - /** Quests logger to allow for configurable logging levels */ - private QuestsLogger questsLogger; - /** Handles menu tracking and clicks */ - private MenuController menuController; - - private IPlaceholderAPIHook placeholderAPIHook; - private ICoreProtectHook coreProtectHook; - - /** If true, the plugin should be inoperable */ - private boolean brokenConfig = false; - private BukkitTask questAutosaveTask; - private BukkitTask questQueuePollTask; - private QuestMode questMode; - - public static Quests get() { - return instance; - } - - public QuestManager getQuestManager() { - return questManager; - } - - public QPlayerManager getPlayerManager() { - return qPlayerManager; - } - - public TaskTypeManager getTaskTypeManager() { - return taskTypeManager; - } - - public boolean isBrokenConfig() { - return brokenConfig; - } - - public void setBrokenConfig(boolean brokenConfig) { - this.brokenConfig = brokenConfig; - } - - public Title getTitleHandle() { - return titleHandle; - } - - public Updater getUpdater() { - return updater; - } - - public QuestsConfigLoader getQuestsConfigLoader() { - return questsConfigLoader; - } - - public MenuController getMenuController() { - return menuController; - } - - public QuestMode getQuestMode() { - return questMode; - } - - public void setQuestMode(QuestMode questMode) { - this.questMode = questMode; - } - - public String convertToFormat(long m) { //seconds please - long hours = m / 3600; - long minutes = (m % 3600) / 60; - long seconds = ((m % 3600) % 60) % 60; - - return Messages.TIME_FORMAT.getMessage() - .replace("{hours}", String.format("%02d", hours)) - .replace("{minutes}", String.format("%02d", minutes)) - .replace("{seconds}", String.format("%02d", seconds)); - } - - @Override - public void onEnable() { - instance = this; - questMode = QuestMode.NORMAL; - - questsLogger = new QuestsLogger(this, QuestsLogger.LoggingLevel.INFO); - questCompleter = new QuestCompleter(this); - - this.generateConfigurations(); - this.setupVersionSpecific(); - - taskTypeManager = new TaskTypeManager(this); - questManager = new QuestManager(this); - qPlayerManager = new QPlayerManager(this); - menuController = new MenuController(this); - - super.getCommand("quests").setExecutor(new QuestsCommand(this)); - Bukkit.getPluginManager().registerEvents(new PlayerJoinListener(this), this); - Bukkit.getPluginManager().registerEvents(menuController, this); - Bukkit.getPluginManager().registerEvents(new PlayerLeaveListener(this), this); - - MetricsLite metrics = new MetricsLite(this, 3443); - if (metrics.isEnabled()) { - this.getQuestsLogger().info("Metrics started. This can be disabled at /plugins/bStats/config.yml."); - } - - questsConfigLoader = new QuestsConfigLoader(this); - - // register task types after the server has fully started - Bukkit.getScheduler().runTask(this, () -> { - taskTypeManager.registerTaskType(new MiningTaskType()); - taskTypeManager.registerTaskType(new MiningCertainTaskType(this)); - 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 InventoryTaskType(this)); - taskTypeManager.registerTaskType(new WalkingTaskType()); - taskTypeManager.registerTaskType(new TamingTaskType()); - taskTypeManager.registerTaskType(new MilkingTaskType()); - taskTypeManager.registerTaskType(new ShearingTaskType()); - taskTypeManager.registerTaskType(new PositionTaskType()); - taskTypeManager.registerTaskType(new PlaytimeTaskType(this)); - taskTypeManager.registerTaskType(new BrewingTaskType()); - taskTypeManager.registerTaskType(new ExpEarnTaskType()); - taskTypeManager.registerTaskType(new BreedingTaskType()); - taskTypeManager.registerTaskType(new EnchantingTaskType()); - taskTypeManager.registerTaskType(new DealDamageTaskType()); - taskTypeManager.registerTaskType(new PermissionTaskType(this)); - taskTypeManager.registerTaskType(new DistancefromTaskType()); - taskTypeManager.registerTaskType(new CommandTaskType()); - // TODO: FIX - // taskTypeManager.registerTaskType(new BrewingCertainTaskType()); - if (Bukkit.getPluginManager().isPluginEnabled("ASkyBlock")) { - taskTypeManager.registerTaskType(new ASkyBlockLevelType()); - } - if (Bukkit.getPluginManager().isPluginEnabled("BentoBox")) { - BentoBoxLevelTaskType.register(taskTypeManager); - } - if (Bukkit.getPluginManager().isPluginEnabled("IridiumSkyblock")) { - taskTypeManager.registerTaskType(new IridiumSkyblockValueType()); - } - if (Bukkit.getPluginManager().isPluginEnabled("uSkyBlock")) { - taskTypeManager.registerTaskType(new uSkyBlockLevelType()); - } - if (Bukkit.getPluginManager().isPluginEnabled("Citizens")) { - taskTypeManager.registerTaskType(new CitizensDeliverTaskType(this)); - taskTypeManager.registerTaskType(new CitizensInteractTaskType()); - } - if (Bukkit.getPluginManager().isPluginEnabled("MythicMobs")) { - taskTypeManager.registerTaskType(new MythicMobsKillingType()); - } - if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { - taskTypeManager.registerTaskType(new PlaceholderAPIEvaluateTaskType(this)); - } - if (Bukkit.getPluginManager().isPluginEnabled("Essentials")) { - taskTypeManager.registerTaskType(new EssentialsMoneyEarnTaskType()); - taskTypeManager.registerTaskType(new EssentialsBalanceTaskType()); - } - if (Bukkit.getPluginManager().isPluginEnabled("ShopGUIPlus")) { - // not tested - taskTypeManager.registerTaskType(new ShopGUIPlusBuyCertainTaskType()); - taskTypeManager.registerTaskType(new ShopGUIPlusSellCertainTaskType()); - } - - taskTypeManager.closeRegistrations(); - reloadQuests(); - - for (Player player : Bukkit.getOnlinePlayers()) { - qPlayerManager.loadPlayer(player.getUniqueId()); - } - }); - - if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { - this.placeholderAPIHook = new PlaceholderAPIHook(); - this.placeholderAPIHook.registerExpansion(this); - } - - if (Bukkit.getPluginManager().isPluginEnabled("CoreProtect")) { - this.coreProtectHook = new CoreProtectHook(); - } else { - this.coreProtectHook = new CoreProtectNoHook(); - } - - // this intentionally should not be documented - boolean ignoreUpdates = false; - try { - ignoreUpdates = new File(this.getDataFolder() + File.separator + "stfuQuestsUpdate").exists(); - } catch (Throwable ignored) { } - - - updater = new Updater(this, !ignoreUpdates); - if (!ignoreUpdates) { - Bukkit.getScheduler().runTaskAsynchronously(this, () -> { - updater.check(); - }); - } - } - - public IPlaceholderAPIHook getPlaceholderAPIHook() { - return placeholderAPIHook; - } - - public ICoreProtectHook getCoreProtectHook() { - return coreProtectHook; - } - - @Override - public void onDisable() { - for (TaskType taskType : getTaskTypeManager().getTaskTypes()) { - try { - taskType.onDisable(); - } catch (Exception ignored) { } - } - for (QPlayer qPlayer : qPlayerManager.getQPlayers()) { - try { - qPlayerManager.savePlayerSync(qPlayer.getPlayerUUID()); - } catch (Exception ignored) { } - } - if (placeholderAPIHook != null) placeholderAPIHook.unregisterExpansion(); - try { - qPlayerManager.getStorageProvider().shutdown(); - } catch (Exception ignored) { } - } - - public void reloadQuests() { - questManager.getQuests().clear(); - questManager.getCategories().clear(); - taskTypeManager.resetTaskTypes(); - - questsConfigLoader.loadConfig(); - - switch (this.questMode) { -// TODO -// case DAILY: -// qPlayerManager.setActiveQuestController(new DailyQuestController(this)); -// break; - default: - case NORMAL: - qPlayerManager.setActiveQuestController(new NormalQuestController(this)); - break; - } - - long autosaveInterval = 12000; - if (!isBrokenConfig()) { - autosaveInterval = this.getConfig().getLong("options.performance-tweaking.quest-autosave-interval", 12000); - } - boolean autosaveTaskCancelled = true; - if (questAutosaveTask != null) { - try { - questAutosaveTask.cancel(); - } catch (Exception ex) { - questsLogger.debug("Cannot cancel and restart quest autosave task"); - autosaveTaskCancelled = false; - } - } - if (autosaveTaskCancelled) { - questAutosaveTask = Bukkit.getScheduler().runTaskTimer(this, () -> new QuestsAutosaveRunnable(this), autosaveInterval, autosaveInterval); - } - - boolean queuePollTaskCancelled = true; - long queueExecuteInterval = 1; - if (!isBrokenConfig()) { - queueExecuteInterval = this.getConfig().getLong("options.performance-tweaking.quest-queue-executor-interval", 1); - } - if (questQueuePollTask != null) { - try { - questQueuePollTask.cancel(); - } catch (Exception ex) { - questsLogger.debug("Cannot cancel and restart quest autosave task"); - queuePollTaskCancelled = false; - } - } - if (queuePollTaskCancelled) { - questQueuePollTask = Bukkit.getScheduler().runTaskTimer(this, questCompleter, queueExecuteInterval, queueExecuteInterval); - } - } - - public ItemStack getItemStack(String path, ConfigurationSection config, ItemGetter.Filter... excludes) { - return itemGetter.getItem(path, config, this, excludes); - } - - public ItemGetter getItemGetter() { - return itemGetter; - } - - private void setupVersionSpecific() { - String version; - try { - version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; - } catch (ArrayIndexOutOfBoundsException e) { - getQuestsLogger().warning("Failed to resolve server version - some features will not work!"); - titleHandle = new Title_Other(); - itemGetter = new ItemGetter_Late_1_8(); - return; - } - - getQuestsLogger().info("Your server is running version " + version + "."); - - if (version.startsWith("v1_7")) { - titleHandle = new Title_Other(); - } else if (version.startsWith("v1_8") || version.startsWith("v1_9") || version.startsWith("v1_10")) { - titleHandle = new Title_BukkitNoTimings(); - } else { - titleHandle = new Title_Bukkit(); - } - - if (version.startsWith("v1_7") || version.startsWith("v1_8") || version.startsWith("v1_9") - || version.startsWith("v1_10") || version.startsWith("v1_11") || version.startsWith("v1_12")) { - itemGetter = new ItemGetter_Late_1_8(); - } else if (version.startsWith("v1_13")) { - itemGetter = new ItemGetter_1_13(); - } else { - itemGetter = new ItemGetterLatest(); - } - - if (titleHandle instanceof Title_Bukkit) { - getQuestsLogger().info("Titles have been enabled."); - } else if (titleHandle instanceof Title_BukkitNoTimings) { - getQuestsLogger().info("Titles have been enabled, although they have limited timings."); - } else { - getQuestsLogger().info("Titles are not supported for this version."); - } - } - - private void generateConfigurations() { - 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 = this.getResource("config.yml")) { - OutputStream out = new FileOutputStream(config); - byte[] buffer = new byte[1024]; - int lenght = in.read(buffer); - while (lenght != -1) { - out.write(buffer, 0, lenght); - lenght = in.read(buffer); - } - } catch (IOException e) { - e.printStackTrace(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - File questsDirectory = new File(this.getDataFolder() + File.separator + "quests"); - if (!questsDirectory.exists() && !questsDirectory.isDirectory()) { - questsDirectory.mkdir(); - - ArrayList<String> examples = new ArrayList<>(); - examples.add("example1.yml"); - examples.add("example2.yml"); - examples.add("example3.yml"); - examples.add("example4.yml"); - examples.add("example5.yml"); - examples.add("example6.yml"); - examples.add("example7.yml"); - examples.add("README.txt"); - - for (String name : examples) { - File file = new File(this.getDataFolder() + File.separator + "quests" + File.separator + name); - try { - file.createNewFile(); - try (InputStream in = this.getResource("quests/" + name)) { - OutputStream out = new FileOutputStream(file); - byte[] buffer = new byte[1024]; - int lenght = in.read(buffer); - while (lenght != -1) { - out.write(buffer, 0, lenght); - lenght = in.read(buffer); - } - } catch (IOException e) { - e.printStackTrace(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - public QuestCompleter getQuestCompleter() { - return questCompleter; - } - - public QuestsLogger getQuestsLogger() { - return questsLogger; - } -} diff --git a/src/main/java/com/leonardobishop/quests/api/QuestsAPI.java b/src/main/java/com/leonardobishop/quests/api/QuestsAPI.java deleted file mode 100644 index db7ed470..00000000 --- a/src/main/java/com/leonardobishop/quests/api/QuestsAPI.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.leonardobishop.quests.api; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.player.QPlayerManager; -import com.leonardobishop.quests.quest.QuestManager; -import com.leonardobishop.quests.quest.tasktype.TaskTypeManager; -import org.bukkit.Bukkit; - -/** - * This contains some methods from the main Quests class which - * will be useful in task type development. This is no different than - * simply getting an instance of the main class, however this is the - * preferred method of obtaining an instance of Quest classes outside - * of the core plugin itself. - * - * It is recommended to use this over {@code Quests.get()}, unless there - * are methods there that you absolutely need. - */ -public class QuestsAPI { - - private final static Quests plugin = (Quests) Bukkit.getPluginManager().getPlugin("Quests") ; - - public static QuestManager getQuestManager() { - return plugin.getQuestManager(); - } - - public static QPlayerManager getPlayerManager() { - return plugin.getPlayerManager(); - } - - public static TaskTypeManager getTaskTypeManager() { - return plugin.getTaskTypeManager(); - } - -} diff --git a/src/main/java/com/leonardobishop/quests/blocktype/Block.java b/src/main/java/com/leonardobishop/quests/blocktype/Block.java deleted file mode 100644 index 4b3b7d6a..00000000 --- a/src/main/java/com/leonardobishop/quests/blocktype/Block.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.leonardobishop.quests.blocktype; - -import org.bukkit.Material; - -@Deprecated -public class Block { - - private Material material; - private short data; - - public Block(Material material, short data) { - this.material = material; - this.data = data; - } - - public Block(Material material) { - this.material = material; - } - - public Material getMaterial() { - return material; - } - - public short getData() { - return data; - } - - public void setMaterial(Material material) { - this.material = material; - } - - public void setData(short data) { - this.data = data; - } -} diff --git a/src/main/java/com/leonardobishop/quests/blocktype/SimilarBlocks.java b/src/main/java/com/leonardobishop/quests/blocktype/SimilarBlocks.java deleted file mode 100644 index fc910170..00000000 --- a/src/main/java/com/leonardobishop/quests/blocktype/SimilarBlocks.java +++ /dev/null @@ -1,93 +0,0 @@ -//package com.leonardobishop.quests.blocktype; -// -//import org.bukkit.Material; -// -//import java.util.HashMap; -//import java.util.Map; -// -//public class SimilarBlocks { -// -// private static HashMap<Block, Block> similarBlocks = new HashMap<>(); -// -// static { -// // Redstone Ore -// similarBlocks.put(new Block(Material.REDSTONE_ORE), new Block(Material.GLOWING_REDSTONE_ORE)); -// similarBlocks.put(new Block(Material.GLOWING_REDSTONE_ORE), new Block(Material.REDSTONE_ORE)); -// -// // Oak Door -// similarBlocks.put(new Block(Material.WOODEN_DOOR, (short) 0), new Block(Material.WOODEN_DOOR)); -// similarBlocks.put(new Block(Material.WOODEN_DOOR, (short) 1), new Block(Material.WOODEN_DOOR)); -// similarBlocks.put(new Block(Material.WOODEN_DOOR, (short) 2), new Block(Material.WOODEN_DOOR)); -// similarBlocks.put(new Block(Material.WOODEN_DOOR, (short) 3), new Block(Material.WOODEN_DOOR)); -// -// // Dark Oak Door -// similarBlocks.put(new Block(Material.DARK_OAK_DOOR, (short) 0), new Block(Material.DARK_OAK_DOOR)); -// similarBlocks.put(new Block(Material.DARK_OAK_DOOR, (short) 1), new Block(Material.DARK_OAK_DOOR)); -// similarBlocks.put(new Block(Material.DARK_OAK_DOOR, (short) 2), new Block(Material.DARK_OAK_DOOR)); -// similarBlocks.put(new Block(Material.DARK_OAK_DOOR, (short) 3), new Block(Material.DARK_OAK_DOOR)); -// -// // Acacia Door -// similarBlocks.put(new Block(Material.ACACIA_DOOR, (short) 0), new Block(Material.ACACIA_DOOR)); -// similarBlocks.put(new Block(Material.ACACIA_DOOR, (short) 1), new Block(Material.ACACIA_DOOR)); -// similarBlocks.put(new Block(Material.ACACIA_DOOR, (short) 2), new Block(Material.ACACIA_DOOR)); -// similarBlocks.put(new Block(Material.ACACIA_DOOR, (short) 3), new Block(Material.ACACIA_DOOR)); -// -// // Birch Door -// similarBlocks.put(new Block(Material.BIRCH_DOOR, (short) 0), new Block(Material.BIRCH_DOOR)); -// similarBlocks.put(new Block(Material.BIRCH_DOOR, (short) 1), new Block(Material.BIRCH_DOOR)); -// similarBlocks.put(new Block(Material.BIRCH_DOOR, (short) 2), new Block(Material.BIRCH_DOOR)); -// similarBlocks.put(new Block(Material.BIRCH_DOOR, (short) 3), new Block(Material.BIRCH_DOOR)); -// -// // Jungle Door -// similarBlocks.put(new Block(Material.JUNGLE_DOOR, (short) 0), new Block(Material.JUNGLE_DOOR)); -// similarBlocks.put(new Block(Material.JUNGLE_DOOR, (short) 1), new Block(Material.JUNGLE_DOOR)); -// similarBlocks.put(new Block(Material.JUNGLE_DOOR, (short) 2), new Block(Material.JUNGLE_DOOR)); -// similarBlocks.put(new Block(Material.JUNGLE_DOOR, (short) 3), new Block(Material.JUNGLE_DOOR)); -// -// // Spruce Door -// similarBlocks.put(new Block(Material.SPRUCE_DOOR, (short) 0), new Block(Material.SPRUCE_DOOR)); -// similarBlocks.put(new Block(Material.SPRUCE_DOOR, (short) 1), new Block(Material.SPRUCE_DOOR)); -// similarBlocks.put(new Block(Material.SPRUCE_DOOR, (short) 2), new Block(Material.SPRUCE_DOOR)); -// similarBlocks.put(new Block(Material.SPRUCE_DOOR, (short) 3), new Block(Material.SPRUCE_DOOR)); -// -// // Iron Door -// similarBlocks.put(new Block(Material.IRON_DOOR, (short) 0), new Block(Material.IRON_DOOR)); -// similarBlocks.put(new Block(Material.IRON_DOOR, (short) 1), new Block(Material.IRON_DOOR)); -// similarBlocks.put(new Block(Material.IRON_DOOR, (short) 2), new Block(Material.IRON_DOOR)); -// similarBlocks.put(new Block(Material.IRON_DOOR, (short) 3), new Block(Material.IRON_DOOR)); -// -// // Oak Log -// similarBlocks.put(new Block(Material.LOG, (short) 4), new Block(Material.LOG, (short) 0)); -// similarBlocks.put(new Block(Material.LOG, (short) 8), new Block(Material.LOG, (short) 0)); -// -// // Spruce Log -// similarBlocks.put(new Block(Material.LOG, (short) 5), new Block(Material.LOG, (short) 1)); -// similarBlocks.put(new Block(Material.LOG, (short) 9), new Block(Material.LOG, (short) 1)); -// -// // Birch Log -// similarBlocks.put(new Block(Material.LOG, (short) 6), new Block(Material.LOG, (short) 2)); -// similarBlocks.put(new Block(Material.LOG, (short) 10), new Block(Material.LOG, (short) 2)); -// -// // Jungle Log -// similarBlocks.put(new Block(Material.LOG, (short) 7), new Block(Material.LOG, (short) 3)); -// similarBlocks.put(new Block(Material.LOG, (short) 11), new Block(Material.LOG, (short) 3)); -// -// // Acacia Log -// similarBlocks.put(new Block(Material.LOG_2, (short) 4), new Block(Material.LOG, (short) 0)); -// similarBlocks.put(new Block(Material.LOG_2, (short) 8), new Block(Material.LOG, (short) 0)); -// -// // Dark Oak Log -// similarBlocks.put(new Block(Material.LOG_2, (short) 5), new Block(Material.LOG, (short) 1)); -// similarBlocks.put(new Block(Material.LOG_2, (short) 9), new Block(Material.LOG, (short) 1)); -// } -// -// public static Block getSimilarBlock(Block block) { -// for (Map.Entry<Block, Block> entry : similarBlocks.entrySet()) { -// if (entry.getKey().getMaterial() == block.getMaterial() && entry.getKey().getData() == block.getData()) { -// return entry.getValue(); -// } -// } -// return null; -// } -// -//} diff --git a/src/main/java/com/leonardobishop/quests/hook/papi/IPlaceholderAPIHook.java b/src/main/java/com/leonardobishop/quests/hook/papi/IPlaceholderAPIHook.java deleted file mode 100644 index 454ee02e..00000000 --- a/src/main/java/com/leonardobishop/quests/hook/papi/IPlaceholderAPIHook.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.leonardobishop.quests.hook.papi; - -import com.leonardobishop.quests.Quests; -import org.bukkit.entity.Player; - -public interface IPlaceholderAPIHook { - - String replacePlaceholders(Player player, String text); - - void registerExpansion(Quests plugin); - - void unregisterExpansion(); - -} diff --git a/src/main/java/com/leonardobishop/quests/listener/MenuController.java b/src/main/java/com/leonardobishop/quests/listener/MenuController.java deleted file mode 100644 index 117a797c..00000000 --- a/src/main/java/com/leonardobishop/quests/listener/MenuController.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.leonardobishop.quests.listener; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.menu.QMenu; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.event.inventory.InventoryType; - -import java.util.HashMap; -import java.util.UUID; - -public class MenuController implements Listener { - - private final HashMap<UUID, QMenu> tracker = new HashMap<>(); - private final Quests plugin; - - public MenuController(Quests plugin) { - this.plugin = plugin; - } - - public void openMenu(HumanEntity player, QMenu qMenu, int page) { - player.openInventory(qMenu.toInventory(page)); - tracker.put(player.getUniqueId(), qMenu); - } - - @EventHandler - private void onClose(InventoryCloseEvent event) { - tracker.remove(event.getPlayer().getUniqueId()); - } - - @EventHandler - private void onClick(InventoryClickEvent event) { - // check if the player has a quest menu open - if (tracker.containsKey(event.getWhoClicked().getUniqueId())) { - event.setCancelled(true); - if (event.getClickedInventory() == null) - return; //The player clicked outside the inventory - if (event.getClickedInventory().getType() == InventoryType.PLAYER) - return; //The clicked inventory is a player inventory type - - QMenu qMenu = tracker.get(event.getWhoClicked().getUniqueId()); - qMenu.handleClick(event, this); - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/menu/DailyQMenu.java b/src/main/java/com/leonardobishop/quests/menu/DailyQMenu.java deleted file mode 100644 index 0d6080cd..00000000 --- a/src/main/java/com/leonardobishop/quests/menu/DailyQMenu.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.leonardobishop.quests.menu; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.listener.MenuController; -import com.leonardobishop.quests.menu.element.MenuElement; -import com.leonardobishop.quests.menu.element.QuestMenuElement; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.controller.DailyQuestController; -import com.leonardobishop.quests.quest.controller.QuestController; -import com.leonardobishop.quests.util.Items; -import com.leonardobishop.quests.util.Options; -import org.bukkit.Bukkit; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Represents a cancellation confirmation menu for a specific quest. - */ -public class DailyQMenu implements QMenu { - - private final Map<Integer, MenuElement> menuElements = new HashMap<>(); - private final Quests plugin; - private final QPlayer owner; - - public DailyQMenu(Quests plugin, QPlayer owner) { - this.plugin = plugin; - this.owner = owner; - } - - @Override - public QPlayer getOwner() { - return owner; - } - - public void populate() { - if (!(owner.getQuestController() instanceof DailyQuestController)) { - return; - } - DailyQuestController dailyQuestController = (DailyQuestController) owner.getQuestController(); - List<String> quests = dailyQuestController.getQuests(); - for (int i = 0; i < quests.size(); i++) { - menuElements.put(11 + i, new QuestMenuElement(plugin, owner, quests.get(i))); - } - } - - public Inventory toInventory(int page) { - String title = Options.color(Options.GUITITLE_DAILY_QUESTS.getStringValue()); - - ItemStack background = Items.QUEST_CANCEL_BACKGROUND.getItem(); - ItemMeta backgroundMeta = background.getItemMeta(); - backgroundMeta.setDisplayName(" "); - background.setItemMeta(backgroundMeta); - - Inventory inventory = Bukkit.createInventory(null, 27, title); - - for (int i = 0; i < inventory.getSize(); i++) { - inventory.setItem(i, background); - } - - for (int pointer = 0; pointer < 27; pointer++) { - if (menuElements.containsKey(pointer)) { - inventory.setItem(pointer, menuElements.get(pointer).asItemStack()); - } - } - - return inventory; - } - - @Override - public void handleClick(InventoryClickEvent event, MenuController controller) { - if (menuElements.containsKey(event.getSlot())) { - MenuElement menuElement = menuElements.get(event.getSlot()); - if (menuElement instanceof QuestMenuElement) { - QuestMenuElement questMenuElement = (QuestMenuElement) menuElement; - Quest quest = plugin.getQuestManager().getQuestById(questMenuElement.getQuestId()); - if (event.getClick() == ClickType.LEFT) { - if (Options.QUEST_AUTOSTART.getBooleanValue()) return; - if (owner.startQuest(quest) == QuestStartResult.QUEST_SUCCESS) { - event.getWhoClicked().closeInventory(); //TODO Option to keep the menu open - } - } else if (event.getClick() == ClickType.MIDDLE && Options.ALLOW_QUEST_TRACK.getBooleanValue()) { - MenuUtil.handleMiddleClick(this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); - } - } - } - } - - -} diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayer.java b/src/main/java/com/leonardobishop/quests/player/QPlayer.java deleted file mode 100644 index e8dc3306..00000000 --- a/src/main/java/com/leonardobishop/quests/player/QPlayer.java +++ /dev/null @@ -1,279 +0,0 @@ -package com.leonardobishop.quests.player; - -import com.leonardobishop.quests.util.QuestMode; -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.api.events.PlayerFinishQuestEvent; -import com.leonardobishop.quests.api.events.PlayerStartTrackQuestEvent; -import com.leonardobishop.quests.api.events.PlayerStopTrackQuestEvent; -import com.leonardobishop.quests.menu.CategoryQMenu; -import com.leonardobishop.quests.menu.DailyQMenu; -import com.leonardobishop.quests.menu.QuestQMenu; -import com.leonardobishop.quests.menu.QuestSortWrapper; -import com.leonardobishop.quests.menu.StartedQMenu; -import com.leonardobishop.quests.player.questprogressfile.QPlayerPreferences; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.quest.Category; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.controller.QuestController; -import com.leonardobishop.quests.util.Messages; -import com.leonardobishop.quests.util.Options; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -/** - * Represents a player. - */ -public class QPlayer { - - private final Quests plugin; - private final UUID uuid; - private final QPlayerPreferences playerPreferences; - private final QuestProgressFile questProgressFile; - private QuestController questController; - - public QPlayer(Quests plugin, UUID uuid, QPlayerPreferences playerPreferences, QuestProgressFile questProgressFile, QuestController questController) { - this.plugin = plugin; - this.uuid = uuid; - this.playerPreferences = playerPreferences; - this.questProgressFile = questProgressFile; - this.questController = questController; - } - - public UUID getPlayerUUID() { - return this.uuid; - } - - /** - * Attempt to complete a quest for the player. This will also play all effects (such as titles, messages etc.) - * and also dispatches all rewards for the player. - * - * Warning: rewards will not be sent and the {@link PlayerFinishQuestEvent} will not be fired if the - * player is not online - * - * @param quest the quest to complete - * @return true (always) - */ - public boolean completeQuest(Quest quest) { - return questController.completeQuestForPlayer(this, quest); - } - - /** - * Attempt to track a quest for the player. This will also play all effects (such as titles, messages etc.) - * - * Warning: {@link PlayerStopTrackQuestEvent} is not fired if the player is not online - * - * @param quest the quest to track - */ - public void trackQuest(Quest quest) { - Player player = Bukkit.getPlayer(uuid); - if (quest == null) { - String currentTrackedQuestId = playerPreferences.getTrackedQuestId(); - playerPreferences.setTrackedQuestId(null); - if (player != null) { - Bukkit.getPluginManager().callEvent(new PlayerStopTrackQuestEvent(player, this)); - Quest currentTrackedQuest; - if (currentTrackedQuestId != null && (currentTrackedQuest = plugin.getQuestManager().getQuestById(currentTrackedQuestId)) != null) { - player.sendMessage(Messages.QUEST_TRACK_STOP.getMessage().replace("{quest}", currentTrackedQuest.getDisplayNameStripped())); - } - } - } else if (hasStartedQuest(quest)) { - playerPreferences.setTrackedQuestId(quest.getId()); - if (player != null) { - Bukkit.getPluginManager().callEvent(new PlayerStartTrackQuestEvent(player, this)); - player.sendMessage(Messages.QUEST_TRACK.getMessage().replace("{quest}", quest.getDisplayNameStripped())); - } - } - } - - /** - * Gets whether or not the player has started a specific quest. - * - * @param quest the quest to test for - * @return true if the quest is started or quest autostart is enabled and the quest is ready to start, false otherwise - */ - public boolean hasStartedQuest(Quest quest) { - return questController.hasPlayerStartedQuest(this, quest); - } - - /** - * Attempt to start a quest for the player. This will also play all effects (such as titles, messages etc.) - * - * Warning: will fail if the player is not online. - * - * @param quest the quest to start - * @return the quest start result -- {@code QuestStartResult.QUEST_SUCCESS} indicates success - */ - // TODO PlaceholderAPI support - public QuestStartResult startQuest(Quest quest) { - return questController.startQuestForPlayer(this, quest); - } - - /** - * Attempt to cancel a quest for the player. This will also play all effects (such as titles, messages etc.) - * - * @param quest the quest to start - * @return true if the quest was cancelled, false otherwise - */ - public boolean cancelQuest(Quest quest) { - return questController.cancelQuestForPlayer(this, quest); - } - - /** - * Check if the player can start a quest. - * - * Warning: will fail if the player is not online. - * - * @param quest the quest to check - * @return the quest start result - */ - public QuestStartResult canStartQuest(Quest quest) { - return questController.canPlayerStartQuest(this, quest); - } - - /** - * Opens a category menu for the player. - * - * @return 0 if success, 1 if no permission, 2 is only data loaded, 3 if player not found - */ - public int openCategory(Category category, CategoryQMenu superMenu, boolean backButton) { - Player player = Bukkit.getPlayer(this.uuid); - if (player == null) { - return 3; - } - - if (category.isPermissionRequired() && !player.hasPermission("quests.category." + category.getId())) { - return 1; - } - - // Using `this` instead of searching again for this QPlayer - QuestQMenu questQMenu = new QuestQMenu(plugin, this, category.getId(), superMenu); - List<Quest> quests = new ArrayList<>(); - for (String questid : category.getRegisteredQuestIds()) { - Quest quest = plugin.getQuestManager().getQuestById(questid); - if (quest != null) { - quests.add(quest); - } - } - questQMenu.populate(quests); - questQMenu.setBackButtonEnabled(backButton); - return openCategory(category, questQMenu); - } - - /** - * Opens a category menu for the player. - * - * @return 0 if success, 1 if no permission, 2 is only data loaded, 3 if player not found - */ - public int openCategory(Category category, QuestQMenu questQMenu) { - Player player = Bukkit.getPlayer(this.uuid); - if (player == null) { - return 3; - } - - if (category.isPermissionRequired() && !player.hasPermission("quests.category." + category.getId())) { - return 1; - } - - plugin.getMenuController().openMenu(player, questQMenu, 1); - return 0; - } - - public void openQuests() { - if (this.uuid == null) { - return; - } - Player player = Bukkit.getPlayer(this.uuid); - if (player == null) { - return; - } - - if (plugin.getQuestMode() == QuestMode.NORMAL) { - if (Options.CATEGORIES_ENABLED.getBooleanValue()) { - CategoryQMenu categoryQMenu = new CategoryQMenu(plugin, this); - List<QuestQMenu> questMenus = new ArrayList<>(); - for (Category category : plugin.getQuestManager().getCategories()) { - QuestQMenu questQMenu = new QuestQMenu(plugin, this, category.getId(), categoryQMenu); - List<Quest> quests = new ArrayList<>(); - for (String questid : category.getRegisteredQuestIds()) { - Quest quest = plugin.getQuestManager().getQuestById(questid); - if (quest != null) { - quests.add(quest); - } - } - questQMenu.populate(quests); - questMenus.add(questQMenu); - } - categoryQMenu.populate(questMenus); - - plugin.getMenuController().openMenu(player, categoryQMenu, 1); - } else { - QuestQMenu questQMenu = new QuestQMenu(plugin, this, "", null); - List<Quest> quests = new ArrayList<>(); - for (Map.Entry<String, Quest> entry : plugin.getQuestManager().getQuests().entrySet()) { - quests.add(entry.getValue()); - } - questQMenu.populate(quests); - questQMenu.setBackButtonEnabled(false); - - plugin.getMenuController().openMenu(player, questQMenu, 1); - } - } else { - DailyQMenu dailyQMenu = new DailyQMenu(plugin, this); - dailyQMenu.populate(); - plugin.getMenuController().openMenu(player, dailyQMenu, 1); - } - } - - public void openStartedQuests() { - if (this.uuid == null) { - return; - } - Player player = Bukkit.getPlayer(this.uuid); - if (player == null) { - return; - } - - StartedQMenu startedQMenu = new StartedQMenu(plugin, this); - List<QuestSortWrapper> quests = new ArrayList<>(); - for (Map.Entry<String, Quest> entry : plugin.getQuestManager().getQuests().entrySet()) { - quests.add(new QuestSortWrapper(plugin, entry.getValue())); - } - startedQMenu.populate(quests); - - plugin.getMenuController().openMenu(player, startedQMenu, 1); - } - - public QuestProgressFile getQuestProgressFile() { - return questProgressFile; - } - - public QPlayerPreferences getPlayerPreferences() { - return playerPreferences; - } - - public QuestController getQuestController() { - return questController; - } - - public void setQuestController(QuestController questController) { - this.questController = questController; - } - - @Override //Used by java GC - public boolean equals(Object o) { - if (!(o instanceof QPlayer)) return false; - QPlayer qPlayer = (QPlayer) o; - return this.uuid == qPlayer.getPlayerUUID(); - } - - @Override //Used by java GC - public int hashCode() { - return uuid.hashCode() * 73; //uuid hash * prime number - } -} diff --git a/src/main/java/com/leonardobishop/quests/quest/controller/DailyQuestController.java b/src/main/java/com/leonardobishop/quests/quest/controller/DailyQuestController.java deleted file mode 100644 index d2ffd192..00000000 --- a/src/main/java/com/leonardobishop/quests/quest/controller/DailyQuestController.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.leonardobishop.quests.quest.controller; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.api.events.PlayerFinishQuestEvent; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.util.Messages; -import com.leonardobishop.quests.util.Options; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.stream.Collectors; - -//TODO finish this -public class DailyQuestController implements QuestController { - - private int refreshTaskId = -1; - private long refreshTime; - private long startTime; - private Quests plugin; - private Random random; - private List<String> quests; - - public DailyQuestController(Quests plugin) { - this.plugin = plugin; - refreshDailyQuests(); - scheduleNewTask(); - } - - public void cancel() { - Bukkit.getScheduler().cancelTask(refreshTaskId); - } - - public List<String> getQuests() { - return quests; - } - - private void scheduleNewTask() { - long diff = refreshTime - System.currentTimeMillis(); - BukkitTask refreshTask; - if (diff <= 10000) { //10 sec - refreshTask = new DailyQuestRefreshTask(true).runTaskTimer(plugin, 1L, 1L); - plugin.getQuestsLogger().debug("DailyQuestRefreshTask set repeating (diff=" + diff + ")"); - } else { - long sleepTime = diff >> 6; - plugin.getQuestsLogger().debug("DailyQuestRefreshTask slept for " + sleepTime + " ticks (diff=" + diff + ")"); - refreshTask = new DailyQuestRefreshTask(false).runTaskLater(plugin, sleepTime); - } - refreshTaskId = refreshTask.getTaskId(); - } - - private void refreshDailyQuests() { -// refreshTime = ((System.currentTimeMillis() / (86400000)) + 1) * 86400000; - refreshTime = ((System.currentTimeMillis() / (300000)) + 1) * 300000; - startTime = (System.currentTimeMillis() / (300000)) * 300000; - random = new Random(refreshTime); - quests = new ArrayList<>(); - - List<String> questIds = new ArrayList<>(plugin.getQuestManager().getQuests().keySet()); - for (int i = 0; i < 5; i++) { - int randInt = random.nextInt(questIds.size()); - quests.add(questIds.get(randInt)); - questIds = questIds.stream().filter(s -> !quests.contains(s)).collect(Collectors.toList()); - } - } - - @Override - public QuestStartResult startQuestForPlayer(QPlayer qPlayer, Quest quest) { - if (quests.contains(quest.getId())) { - return QuestStartResult.QUEST_ALREADY_STARTED; - } else { - return QuestStartResult.QUEST_LIMIT_REACHED; - } - } - - @Override - public QuestStartResult canPlayerStartQuest(QPlayer qPlayer, Quest quest) { - if (!quests.contains(quest.getId())) return QuestStartResult.OTHER; - long completionDate = qPlayer.getQuestProgressFile().getQuestProgress(quest).getCompletionDate(); - if (Options.QUEST_AUTOSTART.getBooleanValue()) { - if (completionDate > startTime && completionDate <= refreshTime) { - return QuestStartResult.QUEST_ALREADY_COMPLETED; - } - } else { - if (qPlayer.getQuestProgressFile().hasQuestProgress(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - if (questProgress.isStarted() && completionDate > startTime && completionDate <= refreshTime) { - return QuestStartResult.QUEST_ALREADY_STARTED; - } - } - } - return QuestStartResult.QUEST_SUCCESS; - } - - @Override - public boolean completeQuestForPlayer(QPlayer qPlayer, Quest quest) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - questProgress.setStarted(false); - for (TaskProgress taskProgress : questProgress.getTaskProgress()) { - taskProgress.setCompleted(false); - taskProgress.setProgress(null); - } - questProgress.setCompleted(true); - questProgress.setCompletedBefore(true); - questProgress.setCompletionDate(System.currentTimeMillis()); - - boolean trackedReset = quest.getId().equals(qPlayer.getPlayerPreferences().getTrackedQuestId()); - if (trackedReset) { - qPlayer.trackQuest(null); - } - - Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); - if (player != null) { - String questFinishMessage = Messages.QUEST_COMPLETE.getMessage().replace("{quest}", quest.getDisplayNameStripped()); - // PlayerFinishQuestEvent -- start - PlayerFinishQuestEvent questFinishEvent = new PlayerFinishQuestEvent(player, qPlayer, questProgress, questFinishMessage); - Bukkit.getPluginManager().callEvent(questFinishEvent); - // PlayerFinishQuestEvent -- end - Bukkit.getServer().getScheduler().runTask(plugin, () -> { - for (String s : quest.getRewards()) { - Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s.replace("{player}", player.getName())); //TODO PlaceholderAPI support - } - }); - if (questFinishEvent.getQuestFinishMessage() != null) - player.sendMessage(questFinishEvent.getQuestFinishMessage()); - if (Options.TITLES_ENABLED.getBooleanValue()) { - plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_COMPLETE_TITLE.getMessage().replace("{quest}", quest - .getDisplayNameStripped()), Messages.TITLE_QUEST_COMPLETE_SUBTITLE.getMessage().replace("{quest}", quest - .getDisplayNameStripped())); - } - for (String s : quest.getRewardString()) { - player.sendMessage(ChatColor.translateAlternateColorCodes('&', s)); - } - } - if (Options.QUEST_AUTOTRACK.getBooleanValue() && trackedReset) { - for (String s : quests) { - Quest nextQuest = plugin.getQuestManager().getQuestById(s); - if (nextQuest != null && canPlayerStartQuest(qPlayer, nextQuest) == QuestStartResult.QUEST_SUCCESS) { - qPlayer.trackQuest(nextQuest); - break; - } - } - } - return true; - } - - @Override - public boolean hasPlayerStartedQuest(QPlayer qPlayer, Quest quest) { - return canPlayerStartQuest(qPlayer, quest) == QuestStartResult.QUEST_SUCCESS; - } - - @Override - public boolean cancelQuestForPlayer(QPlayer qPlayer, Quest quest) { - return false; - } - - public class DailyQuestRefreshTask extends BukkitRunnable { - - private final boolean repeating; - - public DailyQuestRefreshTask(boolean repeating) { - this.repeating = repeating; - } - - @Override - public void run() { - if (System.currentTimeMillis() >= refreshTime) { - this.cancel(); - refreshDailyQuests(); - } else { - if (repeating) return; - this.cancel(); - } - scheduleNewTask(); - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/ConfigValue.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/ConfigValue.java deleted file mode 100644 index 764e771c..00000000 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/ConfigValue.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.leonardobishop.quests.quest.tasktype; - -/** - * This is for the quest creator and is purely cosmetic. - */ -public final class ConfigValue { - - private final String key; - private final boolean required; - private final String description; - private final String[] requirementExceptions; - - public ConfigValue(String key, boolean required, String description, String... requirementExceptions) { - this.key = key; - this.required = required; - this.description = description; - this.requirementExceptions = requirementExceptions; - } - - public String getKey() { - return key; - } - - public boolean isRequired() { - return required; - } - - public String getDescription() { - return description; - } - - public String[] getRequirementExceptions() { - return requirementExceptions; - } -} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/IridiumSkyblockValueType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/IridiumSkyblockValueType.java deleted file mode 100644 index 3647a3e7..00000000 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/IridiumSkyblockValueType.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.leonardobishop.quests.quest.tasktype.type.dependent; - -import com.iridium.iridiumskyblock.Island; -import com.iridium.iridiumskyblock.api.IslandWorthCalculatedEvent; -import com.leonardobishop.quests.util.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.ConfigValue; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import com.leonardobishop.quests.quest.tasktype.TaskUtils; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.UUID; - -public final class IridiumSkyblockValueType extends TaskType { - - private List<ConfigValue> creatorConfigValues = new ArrayList<>(); - - public IridiumSkyblockValueType() { - super("iridiumskyblock_value", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island value for Iridium Skyblock."); - this.creatorConfigValues.add(new ConfigValue("value", true, "Minimum island value needed.")); - } - - @Override - public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { - ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".value", config.get("value"), problems, "value", super.getType())) - TaskUtils.configValidateInt(root + ".value", config.get("value"), problems, false, false, "value"); - return problems; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onIslandLevel(IslandWorthCalculatedEvent event) { - Island island = event.getIsland(); - for (String player : island.members) { - UUID uuid; - try { - uuid = UUID.fromString(player); - } catch (Exception e) { - continue; - } - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(uuid); - if (qPlayer == null) { - continue; - } - - for (Quest quest : IridiumSkyblockValueType.super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(IridiumSkyblockValueType.super.getType())) { - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int islandValueNeeded = (int) task.getConfigValue("value"); - - taskProgress.setProgress(event.getIslandWorth()); - - if (((double) taskProgress.getProgress()) >= islandValueNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - - } - - @Override - public List<ConfigValue> getCreatorConfigValues() { - return creatorConfigValues; - } - -} diff --git a/src/main/java/com/leonardobishop/quests/util/Items.java b/src/main/java/com/leonardobishop/quests/util/Items.java deleted file mode 100644 index be34d72c..00000000 --- a/src/main/java/com/leonardobishop/quests/util/Items.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.leonardobishop.quests.util; - -import com.leonardobishop.quests.Quests; -import org.bukkit.inventory.ItemStack; - -import java.util.HashMap; -import java.util.Map; - -public enum Items { - - BACK_BUTTON("gui.back-button"), - QUEST_LOCKED("gui.quest-locked-display"), - QUEST_COOLDOWN("gui.quest-cooldown-display"), - QUEST_COMPLETED("gui.quest-completed-display"), - QUEST_PERMISSION("gui.quest-permission-display"), - PAGE_PREV("gui.page-prev"), - PAGE_NEXT("gui.page-next"), - PAGE_DESCRIPTION("gui.page-desc"), - NO_STARTED_QUESTS("gui.no-started-quests"), - QUEST_CANCEL_YES("gui.quest-cancel-yes"), - QUEST_CANCEL_NO("gui.quest-cancel-no"), - QUEST_CANCEL_BACKGROUND("gui.quest-cancel-background"); - - private static final Map<String, ItemStack> cachedItemStacks = new HashMap<>(); - - private final String path; - - Items(String path) { - this.path = path; - } - - public ItemStack getItem() { - return new ItemStack(cachedItemStacks.computeIfAbsent(path, s -> Quests.get().getItemStack(path, Quests.get().getConfig()))); - } - -} diff --git a/src/main/java/com/leonardobishop/quests/util/Options.java b/src/main/java/com/leonardobishop/quests/util/Options.java deleted file mode 100644 index 0ad0a41d..00000000 --- a/src/main/java/com/leonardobishop/quests/util/Options.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.leonardobishop.quests.util; - -import com.leonardobishop.quests.Quests; -import org.bukkit.ChatColor; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public enum Options { - - CATEGORIES_ENABLED("options.categories-enabled"), - TRIM_GUI_SIZE("options.trim-gui-size"), - QUESTS_START_LIMIT("options.quest-started-limit"), - TITLES_ENABLED("options.titles-enabled"), - GUI_HIDE_LOCKED("options.gui-hide-locked"), - GUI_HIDE_QUESTS_NOPERMISSION("options.gui-hide-quests-nopermission"), - GUI_HIDE_CATEGORIES_NOPERMISSION("options.gui-hide-categories-nopermission"), - GUI_USE_PLACEHOLDERAPI("options.gui-use-placeholderapi"), - GUITITLE_QUESTS_CATEGORY("options.guinames.quests-category"), - GUITITLE_QUESTS("options.guinames.quests-menu"), - GUITITLE_QUESTS_STARTED("options.guinames.quests-started-menu"), - GUITITLE_DAILY_QUESTS("options.guinames.daily-quests"), - GUITITLE_QUEST_CANCEL("options.guinames.quest-cancel"), - ALLOW_QUEST_CANCEL("options.allow-quest-cancel"), - ALLOW_QUEST_TRACK("options.allow-quest-track"), - VERIFY_QUEST_EXISTS_ON_LOAD("options.verify-quest-exists-on-load"), - TAB_COMPLETE_ENABLED("options.tab-completion.enabled"), - ERROR_CHECKING_OVERRIDE("options.error-checking.override-errors"), - QUEST_AUTOSTART("options.quest-autostart"), - QUEST_AUTOTRACK("options.quest-autotrack"), - GLOBAL_TASK_CONFIGURATION_OVERRIDE("options.global-task-configuration-override"), - GLOBAL_QUEST_DISPLAY_CONFIGURATION_OVERRIDE("options.global-quest-display-configuration-override"), - GLOBAL_QUEST_DISPLAY_LORE_APPEND_NORMAL("global-quest-display.lore.append-normal"), - GLOBAL_QUEST_DISPLAY_LORE_APPEND_NOT_STARTED("global-quest-display.lore.append-not-started"), - GLOBAL_QUEST_DISPLAY_LORE_APPEND_STARTED("global-quest-display.lore.append-started"), - GLOBAL_QUEST_DISPLAY_LORE_APPEND_TRACKED("global-quest-display.lore.append-tracked"); - - private static final Map<String, Boolean> cachedBooleans = new ConcurrentHashMap<>(); - - private final String path; - - Options(String path) { - this.path = path; - } - - public int getIntValue() { - return Quests.get().getConfig().getInt(path); - } - - public int getIntValue(int def) { - return Quests.get().getConfig().getInt(path, def); - } - - public String getStringValue() { - return Quests.get().getConfig().getString(path); - } - - public String getStringValue(String def) { - return Quests.get().getConfig().getString(path, def); - } - - public boolean getBooleanValue() { - return cachedBooleans.computeIfAbsent(path, s -> Quests.get().getConfig().getBoolean(path)); - } - - public boolean getBooleanValue(boolean def) { - return Quests.get().getConfig().getBoolean(path, def); - } - - public List<String> getStringListValue() { - return Quests.get().getConfig().getStringList(path); - } - - public static String color(String s) { - return ChatColor.translateAlternateColorCodes('&', s); - } - - public static List<String> color(List<String> s) { - if (s == null || s.size() == 0) return s; - - List<String> colored = new ArrayList<>(); - for (String line : s) { - colored.add(ChatColor.translateAlternateColorCodes('&', line)); - } - return colored; - } - - public static void invalidateCaches() { - cachedBooleans.clear(); - } -} diff --git a/src/main/java/com/leonardobishop/quests/util/QuestMode.java b/src/main/java/com/leonardobishop/quests/util/QuestMode.java deleted file mode 100644 index e942d909..00000000 --- a/src/main/java/com/leonardobishop/quests/util/QuestMode.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.leonardobishop.quests.util; - -public enum QuestMode { - - NORMAL, - DAILY; - -} diff --git a/src/main/java/com/leonardobishop/quests/util/QuestsConfigLoader.java b/src/main/java/com/leonardobishop/quests/util/QuestsConfigLoader.java deleted file mode 100644 index 9c5215bc..00000000 --- a/src/main/java/com/leonardobishop/quests/util/QuestsConfigLoader.java +++ /dev/null @@ -1,454 +0,0 @@ -package com.leonardobishop.quests.util; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.hook.itemgetter.ItemGetter; -import com.leonardobishop.quests.menu.QItemStack; -import com.leonardobishop.quests.quest.Category; -import com.leonardobishop.quests.quest.Quest; -import com.leonardobishop.quests.quest.Task; -import com.leonardobishop.quests.quest.tasktype.TaskType; -import org.apache.commons.lang.StringUtils; -import org.bukkit.ChatColor; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.inventory.ItemStack; - -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.nio.file.FileVisitResult; -import java.nio.file.FileVisitor; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class QuestsConfigLoader { - - private final Map<String, List<ConfigProblem>> filesWithProblems = new HashMap<>(); - private final Quests plugin; - private int problemsCount; - - public QuestsConfigLoader(Quests plugin) { - this.plugin = plugin; - } - - /** - * Loads and parses config into memory including the quests folder. - */ - public void loadConfig() { - plugin.reloadConfig(); - Options.invalidateCaches(); - filesWithProblems.clear(); - plugin.setBrokenConfig(false); - - // test CONFIG file integrity - try { - YamlConfiguration config = new YamlConfiguration(); - config.load(new File(plugin.getDataFolder() + File.separator + "config.yml")); - } catch (Exception ex) { - filesWithProblems.put("<MAIN CONFIG> config.yml", Collections.singletonList(new ConfigProblem(ConfigProblemType.ERROR, ConfigProblemDescriptions.MALFORMED_YAML.getDescription()))); - plugin.setBrokenConfig(true); - } - - - if (!plugin.isBrokenConfig()) { - HashMap<String, Map<String, Object>> globalTaskConfig = new HashMap<>(); - for (String id : plugin.getConfig().getConfigurationSection("categories").getKeys(false)) { - ItemStack displayItem = plugin.getItemStack("categories." + id + ".display", plugin.getConfig()); - boolean permissionRequired = plugin.getConfig().getBoolean("categories." + id + ".permission-required", false); - - Category category = new Category(id, displayItem, permissionRequired); - plugin.getQuestManager().registerCategory(category); - } - plugin.getQuestsLogger().setServerLoggingLevel(QuestsLogger.LoggingLevel.fromNumber(plugin.getConfig().getInt("options.verbose-logging-level", 2))); - - HashMap<String, Quest> pathToQuest = new HashMap<>(); - - if (plugin.getConfig().isConfigurationSection("global-task-configuration.types")) { - for (String type : plugin.getConfig().getConfigurationSection("global-task-configuration.types").getKeys(false)) { - HashMap<String, Object> configValues = new HashMap<>(); - for (String key : plugin.getConfig().getConfigurationSection("global-task-configuration.types." + type).getKeys(false)) { - configValues.put(key, plugin.getConfig().get("global-task-configuration.types." + type + "." + key)); - } - globalTaskConfig.putIfAbsent(type, configValues); - } - } - - try { - plugin.setQuestMode(QuestMode.valueOf(plugin.getConfig().getString("quest-mode.mode", "NORMAL").toUpperCase())); - } catch (IllegalArgumentException ex) { - plugin.setQuestMode(QuestMode.NORMAL); - } - - FileVisitor<Path> fileVisitor = new SimpleFileVisitor<Path>() { - final URI questsRoot = Paths.get(plugin.getDataFolder() + File.separator + "quests").toUri(); - - @Override - public FileVisitResult visitFile(Path path, BasicFileAttributes attributes) { - try { - File questFile = new File(path.toUri()); - URI relativeLocation = questsRoot.relativize(path.toUri()); - - if (!questFile.getName().toLowerCase().endsWith(".yml")) return FileVisitResult.CONTINUE; - - YamlConfiguration config = new YamlConfiguration(); - // test QUEST file integrity - try { - config.load(questFile); - } catch (Exception ex) { - filesWithProblems.put(relativeLocation.getPath(), Collections.singletonList(new ConfigProblem(ConfigProblemType.ERROR, ConfigProblemDescriptions.MALFORMED_YAML.getDescription()))); - return FileVisitResult.CONTINUE; - } - - String id = questFile.getName().replace(".yml", ""); - - List<ConfigProblem> configProblems = new ArrayList<>(); - - if (!StringUtils.isAlphanumeric(id)) { - configProblems.add(new ConfigProblem(ConfigProblemType.ERROR, ConfigProblemDescriptions.INVALID_QUEST_ID.getDescription(id))); - } - - // CHECK EVERYTHING WRONG WITH THE QUEST FILE BEFORE ACTUALLY LOADING THE QUEST - - if (!config.isConfigurationSection("tasks")) { - configProblems.add(new ConfigProblem(ConfigProblemType.ERROR, ConfigProblemDescriptions.NO_TASKS.getDescription(), "tasks")); - } else { //continue - int validTasks = 0; - for (String taskId : config.getConfigurationSection("tasks").getKeys(false)) { - boolean isValid = true; - String taskRoot = "tasks." + taskId; - String taskType = config.getString(taskRoot + ".type"); - - if (!config.isConfigurationSection(taskRoot)) { - configProblems.add(new ConfigProblem(ConfigProblemType.WARNING, ConfigProblemDescriptions.TASK_MALFORMED_NOT_SECTION.getDescription(taskId), taskRoot)); - continue; - } - - if (taskType == null) { - configProblems.add(new ConfigProblem(ConfigProblemType.WARNING, ConfigProblemDescriptions.NO_TASK_TYPE.getDescription(), taskRoot)); - continue; - } - - // check the tasks - TaskType t = plugin.getTaskTypeManager().getTaskType(taskType); - if (t != null) { - HashMap<String, Object> configValues = new HashMap<>(); - for (String key : config.getConfigurationSection(taskRoot).getKeys(false)) { - configValues.put(key, config.get(taskRoot + "." + key)); - } - - configProblems.addAll(t.detectProblemsInConfig(taskRoot, configValues)); - } else { - configProblems.add(new ConfigProblem(ConfigProblemType.WARNING, ConfigProblemDescriptions.UNKNOWN_TASK_TYPE.getDescription(taskType), taskRoot)); - isValid = false; - } - - if (isValid) { - validTasks++; - } - } - if (validTasks == 0) { - configProblems.add(new ConfigProblem(ConfigProblemType.ERROR, ConfigProblemDescriptions.NO_TASKS.getDescription(), "tasks")); - } - } - - boolean error = false; - for (ConfigProblem problem : configProblems) { - if (problem.getType() == ConfigProblemType.ERROR) { - error = true; - break; - } - } - - // END OF THE CHECKING - if (!error && !Options.ERROR_CHECKING_OVERRIDE.getBooleanValue(false)) { - QItemStack displayItem = getQItemStack("display", config); - List<String> rewards = config.getStringList("rewards"); - List<String> requirements = config.getStringList("options.requires"); - List<String> rewardString = config.getStringList("rewardstring"); - List<String> startString = config.getStringList("startstring"); - boolean repeatable = config.getBoolean("options.repeatable", false); - boolean cooldown = config.getBoolean("options.cooldown.enabled", false); - boolean permissionRequired = config.getBoolean("options.permission-required", false); - int cooldownTime = config.getInt("options.cooldown.time", 10); - int sortOrder = config.getInt("options.sort-order", 1); - String category = config.getString("options.category"); - Map<String, String> placeholders = new HashMap<>(); - - if (category == null) category = ""; - - if (plugin.getQuestMode() == QuestMode.DAILY) { - repeatable = true; - cooldown = true; - cooldownTime = 0; - requirements = Collections.emptyList(); - permissionRequired = false; - } - - Quest quest; - if (category.equals("")) { - quest = new Quest(id, displayItem, rewards, requirements, repeatable, cooldown, cooldownTime, permissionRequired, rewardString, startString, placeholders, sortOrder); - } else { - quest = new Quest(id, displayItem, rewards, requirements, repeatable, cooldown, cooldownTime, permissionRequired, rewardString, startString, placeholders, category, sortOrder); - Category c = plugin.getQuestManager().getCategoryById(category); - if (c != null) { - c.registerQuestId(id); - } else { - configProblems.add(new ConfigProblem(ConfigProblemType.WARNING, ConfigProblemDescriptions.UNKNOWN_CATEGORY.getDescription(category), "options.category")); - } - } - - for (String taskId : config.getConfigurationSection("tasks").getKeys(false)) { - String taskRoot = "tasks." + taskId; - String taskType = config.getString(taskRoot + ".type"); - - Task task = new Task(taskId, taskType); - - for (String key : config.getConfigurationSection(taskRoot).getKeys(false)) { - task.addConfigValue(key, config.get(taskRoot + "." + key)); - } - - if (globalTaskConfig.containsKey(taskType)) { - for (Map.Entry<String, Object> entry : globalTaskConfig.get(taskType).entrySet()) { - if (Options.GLOBAL_TASK_CONFIGURATION_OVERRIDE.getBooleanValue() && task.getConfigValue(entry.getKey()) != null) - continue; - task.addConfigValue(entry.getKey(), entry.getValue()); - } - } - - quest.registerTask(task); - } - - - for (String line : displayItem.getLoreNormal()) { - findInvalidTaskReferences(quest, line, configProblems, "display.lore-normal"); - } - for (String line : displayItem.getLoreStarted()) { - findInvalidTaskReferences(quest, line, configProblems, "display.lore-started"); - } - - if (config.isConfigurationSection("placeholders")) { - for (String p : config.getConfigurationSection("placeholders").getKeys(false)) { - placeholders.put(p, config.getString("placeholders." + p)); - findInvalidTaskReferences(quest, config.getString("placeholders." + p), configProblems, "placeholders." + p); - } - } - if (plugin.getConfig().getBoolean("options.show-quest-registrations")) { - plugin.getQuestsLogger().info("Registering quest " + quest.getId() + " with " + quest.getTasks().size() + " tasks."); - } - plugin.getQuestManager().registerQuest(quest); - plugin.getTaskTypeManager().registerQuestTasksWithTaskTypes(quest); - pathToQuest.put(relativeLocation.getPath(), quest); - } - if (!configProblems.isEmpty()) { - filesWithProblems.put(relativeLocation.getPath(), configProblems); - } - } catch (Exception e) { - plugin.getQuestsLogger().severe("An exception occurred when attempting to load quest '" + path + "' (will be ignored)"); - e.printStackTrace(); - } - return FileVisitResult.CONTINUE; - } - }; - - try { - Files.walkFileTree(Paths.get(plugin.getDataFolder() + File.separator + "quests"), fileVisitor); - } catch (IOException e) { - e.printStackTrace(); - } - - // post-load checks - for (Map.Entry<String, Quest> loadedQuest : pathToQuest.entrySet()) { - List<ConfigProblem> configProblems = new ArrayList<>(); - for (String req : loadedQuest.getValue().getRequirements()) { - if (plugin.getQuestManager().getQuestById(req) == null) { - configProblems.add(new ConfigProblem(ConfigProblemType.WARNING, ConfigProblemDescriptions.UNKNOWN_REQUIREMENT.getDescription(req), "options.requires")); - } - } - - if (!configProblems.isEmpty()) { - if (filesWithProblems.containsKey(loadedQuest.getKey())) { - filesWithProblems.get(loadedQuest.getKey()).addAll(configProblems); - } else { - filesWithProblems.put(loadedQuest.getKey(), configProblems); - } - } - } - - for (TaskType taskType : plugin.getTaskTypeManager().getTaskTypes()) { - try { - taskType.onReady(); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - problemsCount = 0; - for (List<QuestsConfigLoader.ConfigProblem> problemList : plugin.getQuestsConfigLoader().getFilesWithProblems().values()) { - problemsCount = problemsCount + problemList.size(); - } - } - - public Map<String, List<ConfigProblem>> getFilesWithProblems() { - return filesWithProblems; - } - - public int getProblemsCount() { - return problemsCount; - } - - private void findInvalidTaskReferences(Quest quest, String s, List<ConfigProblem> configProblems, String location) { - Pattern pattern = Pattern.compile("\\{([^}]+)}"); - - Matcher matcher = pattern.matcher(s); - while (matcher.find()) { - String[] parts = matcher.group(1).split(":"); - boolean match = false; - for (Task t : quest.getTasks()) { - if (t.getId().equals(parts[0])) { - match = true; - break; - } - } - if (!match) - configProblems.add(new ConfigProblem(ConfigProblemType.WARNING, - ConfigProblemDescriptions.UNKNOWN_TASK_REFERENCE.getDescription(parts[0]), location)); - } - } - - private QItemStack getQItemStack(String path, FileConfiguration config) { - String cName = config.getString(path + ".name", path + ".name"); - List<String> cLoreNormal = config.getStringList(path + ".lore-normal"); - List<String> cLoreStarted = config.getStringList(path + ".lore-started"); - - List<String> loreNormal = translateColoursInList(cLoreNormal); - List<String> loreStarted = translateColoursInList(cLoreStarted); - - String name; - name = ChatColor.translateAlternateColorCodes('&', cName); - - ItemStack is = plugin.getItemStack(path, config, - ItemGetter.Filter.DISPLAY_NAME, ItemGetter.Filter.LORE, ItemGetter.Filter.ENCHANTMENTS, ItemGetter.Filter.ITEM_FLAGS); - - return new QItemStack(plugin, name, loreNormal, loreStarted, is); - } - - private List<String> translateColoursInList(List<String> list) { - List<String> coloured = new ArrayList<>(); - for (String s : list) { - coloured.add(ChatColor.translateAlternateColorCodes('&', s)); - } - return coloured; - } - - public enum ConfigProblemDescriptions { - - MALFORMED_YAML("Malformed YAML file, cannot read config"), - INVALID_QUEST_ID("ID '%s' is invalid, must be alphanumeric, unique and with no spaces"), - NO_TASKS("Quest contains no valid tasks"), - NO_TASK_TYPE("Task type not specified"), - UNKNOWN_TASK_TYPE("Task type '%s' does not exist"), - NO_DISPLAY_NAME("No name specified"), - NO_DISPLAY_MATERIAL("No material specified"), - UNKNOWN_MATERIAL("Material '%s' does not exist"), - UNKNOWN_ENTITY_TYPE("Entity type '%s' does not exist"), - TASK_MALFORMED_NOT_SECTION("Task '%s' is not a configuration section (has no fields)"), - TASK_MISSING_FIELD("Required field '%s' is missing for task type '%s'"), - UNKNOWN_TASK_REFERENCE("Attempt to reference unknown task '%s'"), - UNKNOWN_CATEGORY("Category '%s' does not exist"), - UNKNOWN_REQUIREMENT("Quest requirement '%s' does not exist"); - - private final String description; - - ConfigProblemDescriptions(String description) { - this.description = description; - } - - @Override - public String toString() { - return getDescription(); - } - - public String getDescription(String... format) { - return String.format(description, (Object[]) format); - } - } - - public enum ConfigProblemType { - - ERROR("Error", "E", ChatColor.RED, 1), - WARNING("Warning", "W", ChatColor.YELLOW, 2); - - private final String title; - private final String shortened; - private final ChatColor color; - private final int priority; - - ConfigProblemType(String title, String shortened, ChatColor color, int priority) { - this.title = title; - this.shortened = shortened; - this.color = color; - this.priority = priority; - } - - public String getTitle() { - return title; - } - - public String getShortened() { - return shortened; - } - - public ChatColor getColor() { - return color; - } - - public int getPriority() { - return priority; - } - - } - - public static class ConfigProblem { - - private final ConfigProblemType type; - private final String description; - private final String location; - - public ConfigProblem(ConfigProblemType type, String description, String location) { - this.type = type; - this.description = description == null ? "?" : description; - ; - this.location = location == null ? "?" : location; - } - - public ConfigProblem(ConfigProblemType type, String description) { - this.type = type; - this.description = description == null ? "?" : description; - ; - this.location = "?"; - } - - public ConfigProblemType getType() { - return type; - } - - public String getDescription() { - return description; - } - - public String getLocation() { - return location; - } - } -} |
