aboutsummaryrefslogtreecommitdiffstats
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
parenta55916db6ca6e6bf400505265dd832a2520a4ab0 (diff)
Add FabledSkyBlock 3 support
-rw-r--r--bukkit/build.gradle16
-rw-r--r--bukkit/libs/uSkyBlock-API-2.7.4.jarbin0 -> 21809 bytes
-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
-rw-r--r--docs/_old_mediawiki/fabledskyblock_level-(task-type).mediawiki4
-rw-r--r--docs/task-types/fabledskyblock_level-(task-type).md4
9 files changed, 156 insertions, 87 deletions
diff --git a/bukkit/build.gradle b/bukkit/build.gradle
index 42ff68c8..70db84cf 100644
--- a/bukkit/build.gradle
+++ b/bukkit/build.gradle
@@ -26,7 +26,7 @@ repositories {
maven { url = 'https://repo.essentialsx.net/releases/' }
// MMOItems, MythicLib
maven { url = 'https://nexus.phoenixdevt.fr/repository/maven-public/' }
- // MythicMobs 4, FabledSkyblock
+ // MythicMobs 4, FabledSkyBlock
maven { url = 'https://repo.songoda.com/repository/public/' }
// MythicMobs 5
maven { url = 'https://mvn.lumine.io/repository/maven-public/' }
@@ -40,8 +40,8 @@ repositories {
maven { url = 'https://repo.rosewooddev.io/repository/public/' }
// SuperiorSkyblock2
maven { url = 'https://repo.bg-software.com/repository/api/' }
- // uSkyBlock
- maven { url = 'https://www.uskyblock.ovh/maven/uskyblock/' }
+ // uSkyBlock TODO fix whenever repo is up
+ //maven { url = 'https://raw.githubusercontent.com/uskyblock/uskyblock-repo/master/' }
// VotingPlugin
maven { url = 'https://nexus.bencodez.com/repository/maven-public/' }
@@ -75,7 +75,7 @@ dependencies {
compileOnly 'com.willfp:libreforge:4.21.1'
// EssentialsX
compileOnly('net.essentialsx:EssentialsX:2.19.7') { transitive = false }
- // FabledSkyblock
+ // FabledSkyBlock
compileOnly 'com.songoda:skyblock:2.3.30'
// IridiumSkyblock TODO fix whenever repo is up
//compileOnly 'com.github.Iridium-Development:IridiumSkyblock:master-SNAPSHOT'
@@ -107,12 +107,12 @@ dependencies {
compileOnly 'com.github.Slimefun:Slimefun4:RC-32'
// SuperiorSkyblock2
compileOnly 'com.bgsoftware:SuperiorSkyblockAPI:2022.9'
- // uSkyBlock
- compileOnly('com.github.rlf:uSkyBlock-API:2.8.3') { transitive = false }
+ // uSkyBlock TODO fix whenever repo is up
+ //compileOnly('ovh.uskyblock:uSkyBlock-API:2.8.9') { transitive = false }
// VotingPlugin
- compileOnly('com.bencodez:votingplugin:6.9.5') { transitive = false }
+ compileOnly('com.bencodez:votingplugin:6.15') { transitive = false }
- // IridiumSkyblock
+ // IridiumSkyblock, uSkyBlock
compileOnly fileTree(dir: 'libs', includes: ['*.jar'])
// bStats
diff --git a/bukkit/libs/uSkyBlock-API-2.7.4.jar b/bukkit/libs/uSkyBlock-API-2.7.4.jar
new file mode 100644
index 00000000..327f3c72
--- /dev/null
+++ b/bukkit/libs/uSkyBlock-API-2.7.4.jar
Binary files differ
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
diff --git a/docs/_old_mediawiki/fabledskyblock_level-(task-type).mediawiki b/docs/_old_mediawiki/fabledskyblock_level-(task-type).mediawiki
index 7b1f6ed0..fb42ebdb 100644
--- a/docs/_old_mediawiki/fabledskyblock_level-(task-type).mediawiki
+++ b/docs/_old_mediawiki/fabledskyblock_level-(task-type).mediawiki
@@ -1,6 +1,6 @@
-: ''Requires the FabledSkyblock plugin to activate.''
+: ''Requires the FabledSkyBlock plugin to activate.''
-Reach a certain FabledSkyblock level.
+Reach a certain FabledSkyBlock level.
== Options ==
{|
diff --git a/docs/task-types/fabledskyblock_level-(task-type).md b/docs/task-types/fabledskyblock_level-(task-type).md
index a23c7f1d..958ef04d 100644
--- a/docs/task-types/fabledskyblock_level-(task-type).md
+++ b/docs/task-types/fabledskyblock_level-(task-type).md
@@ -9,10 +9,10 @@ grand_parent: Task types
Since v3.5
{: .label .label-green }
-Plugin 'FabledSkyblock' required
+Plugin 'FabledSkyBlock' required
{: .label }
-Reach a certain FabledSkyblock level.
+Reach a certain FabledSkyBlock level.
## Options