summaryrefslogtreecommitdiffstats
path: root/bukkit/src/main
diff options
context:
space:
mode:
authorKrakenied <Krakenied1@gmail.com>2023-12-31 16:55:38 +0100
committerLeonardo Bishop <13875753+LMBishop@users.noreply.github.com>2024-01-09 15:58:15 +0000
commite6f0d05d1912005fd80f79aa7ed65de2ee959461 (patch)
tree4497d8d5a78ea5237803ff854f2db53ade3d5423 /bukkit/src/main
parenta55916db6ca6e6bf400505265dd832a2520a4ab0 (diff)
Add FabledSkyBlock 3 support
Diffstat (limited to 'bukkit/src/main')
-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
-rw-r--r--bukkit/src/main/resources/plugin.yml2
5 files changed, 144 insertions, 75 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;
+ }
}
diff --git a/bukkit/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml
index 243e6b73..80fb1149 100644
--- a/bukkit/src/main/resources/plugin.yml
+++ b/bukkit/src/main/resources/plugin.yml
@@ -6,7 +6,7 @@ version: "${version}"
main: com.leonardobishop.quests.bukkit.BukkitQuestsPlugin
website: https://github.com/LMBishop/Quests
author: "LMBishop & contributors"
-softdepend: [ASkyBlock, BentoBox, Citizens, CoreProtect, Essentials, FabledSkyblock, IridiumSkyblock, MythicMobs, PlaceholderAPI, PlayerBlockTracker, PlayerPoints, ShopGUIPlus, SuperiorSkyblock2, uSkyBlock, Votifier, VotingPlugin]
+softdepend: [ASkyBlock, BentoBox, Citizens, CoreProtect, Essentials, FabledSkyBlock, IridiumSkyblock, MythicMobs, PlaceholderAPI, PlayerBlockTracker, PlayerPoints, ShopGUIPlus, SuperiorSkyblock2, uSkyBlock, Votifier, VotingPlugin]
prefix: Quests
api-version: "1.13" # allows new API features but Quests will still work pre-1.13
folia-supported: true