aboutsummaryrefslogtreecommitdiffstats
path: root/bukkit/src/main/java/com/leonardobishop
diff options
context:
space:
mode:
Diffstat (limited to 'bukkit/src/main/java/com/leonardobishop')
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java4
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/FabledSkyBlockLevelTaskType.java131
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/FabledSkyblockLevelTaskType.java72
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/CompatUtils.java10
4 files changed, 143 insertions, 74 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
index 3587e8ec..d396ed32 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
@@ -94,7 +94,7 @@ import com.leonardobishop.quests.bukkit.tasktype.type.dependent.CitizensInteract
import com.leonardobishop.quests.bukkit.tasktype.type.dependent.EcoBossesKillingTaskType;
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.FabledSkyblockLevelTaskType;
+import com.leonardobishop.quests.bukkit.tasktype.type.dependent.FabledSkyBlockLevelTaskType;
import com.leonardobishop.quests.bukkit.tasktype.type.dependent.IridiumSkyblockValueTaskType;
import com.leonardobishop.quests.bukkit.tasktype.type.dependent.MythicMobsKillingTaskType;
import com.leonardobishop.quests.bukkit.tasktype.type.dependent.NuVotifierVoteTaskType;
@@ -428,7 +428,7 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
taskTypeManager.registerTaskType(() -> new EcoBossesKillingTaskType(this), () -> CompatUtils.isPluginEnabled("EcoBosses"));
taskTypeManager.registerTaskType(() -> new EssentialsBalanceTaskType(this), () -> CompatUtils.isPluginEnabled("Essentials"));
taskTypeManager.registerTaskType(() -> new EssentialsMoneyEarnTaskType(this), () -> CompatUtils.isPluginEnabled("Essentials"));
- taskTypeManager.registerTaskType(() -> new FabledSkyblockLevelTaskType(this), () -> CompatUtils.isPluginEnabled("FabledSkyblock")); // not tested
+ taskTypeManager.registerTaskType(() -> new FabledSkyBlockLevelTaskType(this), () -> CompatUtils.isPluginEnabled("FabledSkyBlock")); // not tested
taskTypeManager.registerTaskType(() -> new PlaceholderAPIEvaluateTaskType(this), () -> CompatUtils.isPluginEnabled("PlaceholderAPI"));
taskTypeManager.registerTaskType(() -> new PlayerPointsEarnTaskType(this), () -> CompatUtils.isPluginEnabled("PlayerPoints"));
taskTypeManager.registerTaskType(() -> new PyroFishingProFishingTaskType(this), () -> CompatUtils.isPluginEnabled("PyroFishingPro") && CompatUtils.classExists("me.arsmagica.API.PyroFishCatchEvent"));
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/FabledSkyBlockLevelTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/FabledSkyBlockLevelTaskType.java
new file mode 100644
index 00000000..b89cc032
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/FabledSkyBlockLevelTaskType.java
@@ -0,0 +1,131 @@
+package com.leonardobishop.quests.bukkit.tasktype.type.dependent;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType;
+import com.leonardobishop.quests.bukkit.util.CompatUtils;
+import com.leonardobishop.quests.bukkit.util.TaskUtils;
+import com.leonardobishop.quests.common.player.QPlayer;
+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.Event;
+import org.bukkit.event.EventPriority;
+import org.bukkit.plugin.EventExecutor;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Set;
+import java.util.UUID;
+
+public final class FabledSkyBlockLevelTaskType extends BukkitTaskType {
+
+ private final BukkitQuestsPlugin plugin;
+ private Method getIslandMethod;
+ private Method getOwnerUUIDMethod;
+ private Method getCoopPlayersMethod;
+ private Method getIslandLevelMethod;
+ private Method getLevelMethod;
+
+ @SuppressWarnings("unchecked")
+ public FabledSkyBlockLevelTaskType(BukkitQuestsPlugin plugin) {
+ super("fabledskyblock_level", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island level for FabledSkyBlock.");
+ this.plugin = plugin;
+
+ super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "level"));
+ super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "level"));
+
+ Class<? extends Event> eventClass = (Class<? extends Event>) CompatUtils.getFirstClassAvailable(
+ "com.craftaro.skyblock.api.event.island.IslandLevelChangeEvent", // FabledSkyBlock 3
+ "com.songoda.skyblock.api.event.island.IslandLevelChangeEvent" // FabledSkyBlock 2
+ );
+
+ if (eventClass == null) {
+ plugin.getLogger().severe("Failed to register event handler for FabledSkyBlock task type!");
+ plugin.getLogger().severe("FabledSkyBlock version detected: " + CompatUtils.getPluginVersion("FabledSkyBlock"));
+ return;
+ }
+
+ try {
+ getIslandMethod = eventClass.getDeclaredMethod("getIsland");
+ getOwnerUUIDMethod = getIslandMethod.getReturnType().getDeclaredMethod("getOwnerUUID");
+ getCoopPlayersMethod = getIslandMethod.getReturnType().getDeclaredMethod("getCoopPlayers");
+ getIslandLevelMethod = eventClass.getDeclaredMethod("getLevel");
+ getLevelMethod = getIslandLevelMethod.getReturnType().getDeclaredMethod("getLevel");
+ } catch (NoSuchMethodException e) {
+ plugin.getLogger().severe("Failed to register event handler for FabledSkyBlock task type!");
+ plugin.getLogger().severe("FabledSkyBlock version detected: " + CompatUtils.getPluginVersion("FabledSkyBlock"));
+ return;
+ }
+
+ Method handleMethod;
+ try {
+ handleMethod = getClass().getDeclaredMethod("handle", Object.class);
+ } catch (NoSuchMethodException ignored) {
+ return;
+ }
+
+ plugin.getServer().getPluginManager().registerEvent(eventClass, this, EventPriority.MONITOR, EventExecutor.create(handleMethod, eventClass), plugin, true);
+ }
+
+ @SuppressWarnings("unchecked")
+ private void handle(Object event) {
+ ArrayList<UUID> members;
+ long level;
+
+ try {
+ Object island = getIslandMethod.invoke(event);
+ UUID ownerUUID = (UUID) getOwnerUUIDMethod.invoke(island);
+ Set<UUID> coopPlayers = (Set<UUID>) getCoopPlayersMethod.invoke(island);
+
+ members = new ArrayList<>(coopPlayers);
+ members.add(ownerUUID);
+
+ Object islandLevel = getIslandLevelMethod.invoke(event);
+ level = (long) getLevelMethod.invoke(islandLevel);
+ } catch (IllegalAccessException | InvocationTargetException e) {
+ return;
+ }
+
+ for (UUID member : members) {
+ Player player = plugin.getServer().getPlayer(member);
+ if (player == null) {
+ continue;
+ }
+
+ handle(player, level);
+ }
+ }
+
+ private void handle(Player player, long level) {
+ if (player.hasMetadata("NPC")) {
+ return;
+ }
+
+ QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
+ if (qPlayer == null) {
+ return;
+ }
+
+ for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(player, qPlayer, this)) {
+ Quest quest = pendingTask.quest();
+ Task task = pendingTask.task();
+ TaskProgress taskProgress = pendingTask.taskProgress();
+
+ super.debug("Player island level updated to " + level, quest.getId(), task.getId(), player.getUniqueId());
+
+ taskProgress.setProgress(level);
+ super.debug("Updating task progress (now " + level + ")", quest.getId(), task.getId(), player.getUniqueId());
+
+ int islandLevelNeeded = (int) task.getConfigValue("level");
+ if (level >= islandLevelNeeded) {
+ super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
+ taskProgress.setProgress(islandLevelNeeded);
+ taskProgress.setCompleted(true);
+ }
+
+ TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress, islandLevelNeeded);
+ }
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/FabledSkyblockLevelTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/FabledSkyblockLevelTaskType.java
deleted file mode 100644
index edacb2ee..00000000
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/FabledSkyblockLevelTaskType.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.leonardobishop.quests.bukkit.tasktype.type.dependent;
-
-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.TaskProgress;
-import com.leonardobishop.quests.common.quest.Quest;
-import com.leonardobishop.quests.common.quest.Task;
-import com.songoda.skyblock.api.event.island.IslandLevelChangeEvent;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-public final class FabledSkyblockLevelTaskType extends BukkitTaskType {
-
- private final BukkitQuestsPlugin plugin;
-
- public FabledSkyblockLevelTaskType(BukkitQuestsPlugin plugin) {
- super("fabledskyblock_level", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island level for FabledSkyblock.");
- this.plugin = plugin;
-
- super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "level"));
- super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "level"));
- }
-
- @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
- public void onIslandLevel(IslandLevelChangeEvent event) {
- List<UUID> members = new ArrayList<>();
- members.add(event.getIsland().getOwnerUUID());
- members.addAll(event.getIsland().getCoopPlayers().keySet());
-
- for (UUID member : members) {
- QPlayer qPlayer = plugin.getPlayerManager().getPlayer(member);
- if (qPlayer == null) {
- continue;
- }
-
- Player player = Bukkit.getPlayer(member);
-
- if (player == null) {
- continue;
- }
-
- for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(player, qPlayer, this)) {
- Quest quest = pendingTask.quest();
- Task task = pendingTask.task();
- TaskProgress taskProgress = pendingTask.taskProgress();
-
- int islandLevelNeeded = (int) task.getConfigValue("level");
-
- super.debug("Player island level updated to " + event.getLevel().getLevel(), quest.getId(), task.getId(), member);
-
- taskProgress.setProgress(event.getLevel().getLevel());
- super.debug("Updating task progress (now " + event.getLevel().getLevel() + ")", quest.getId(), task.getId(), member);
-
- if (event.getLevel().getLevel() >= islandLevelNeeded) {
- super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
- taskProgress.setProgress(islandLevelNeeded);
- taskProgress.setCompleted(true);
- }
-
- TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress, islandLevelNeeded);
- }
- }
- }
-}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/CompatUtils.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/CompatUtils.java
index e6609b44..0541fca7 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/CompatUtils.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/CompatUtils.java
@@ -36,4 +36,14 @@ public class CompatUtils {
Plugin plugin = Bukkit.getPluginManager().getPlugin(pluginName);
return plugin != null ? plugin.getDescription().getVersion() : null;
}
+
+ public static Class<?> getFirstClassAvailable(String... classNames) {
+ for (String className : classNames) {
+ try {
+ return Class.forName(className);
+ } catch (ClassNotFoundException ignored) {
+ }
+ }
+ return null;
+ }
}