From e6f0d05d1912005fd80f79aa7ed65de2ee959461 Mon Sep 17 00:00:00 2001 From: Krakenied Date: Sun, 31 Dec 2023 16:55:38 +0100 Subject: Add FabledSkyBlock 3 support --- bukkit/build.gradle | 16 +-- bukkit/libs/uSkyBlock-API-2.7.4.jar | Bin 0 -> 21809 bytes .../quests/bukkit/BukkitQuestsPlugin.java | 4 +- .../dependent/FabledSkyBlockLevelTaskType.java | 131 +++++++++++++++++++++ .../dependent/FabledSkyblockLevelTaskType.java | 72 ----------- .../quests/bukkit/util/CompatUtils.java | 10 ++ bukkit/src/main/resources/plugin.yml | 2 +- 7 files changed, 152 insertions(+), 83 deletions(-) create mode 100644 bukkit/libs/uSkyBlock-API-2.7.4.jar create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/FabledSkyBlockLevelTaskType.java delete mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/FabledSkyblockLevelTaskType.java (limited to 'bukkit') 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 Binary files /dev/null and b/bukkit/libs/uSkyBlock-API-2.7.4.jar 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 eventClass = (Class) 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 members; + long level; + + try { + Object island = getIslandMethod.invoke(event); + UUID ownerUUID = (UUID) getOwnerUUIDMethod.invoke(island); + Set coopPlayers = (Set) 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 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 -- cgit v1.2.3-70-g09d2