diff options
Diffstat (limited to 'bukkit/src/main/java/com/leonardobishop')
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; + } } |
