From 5d609348936cd6c37afff02560b5d7e6b20a9369 Mon Sep 17 00:00:00 2001 From: XiaoMoMi <972454774@qq.com> Date: Fri, 22 Mar 2024 04:52:32 +0800 Subject: Add CustomFishing compatibility --- .../quests/bukkit/BukkitQuestsPlugin.java | 4 + .../type/dependent/CustomFishingGroupType.java | 91 ++++++++++++++++++++++ .../type/dependent/CustomFishingLootType.java | 79 +++++++++++++++++++ bukkit/src/main/resources/plugin.yml | 1 + 4 files changed, 175 insertions(+) create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CustomFishingGroupType.java create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CustomFishingLootType.java (limited to 'bukkit/src') 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 a1111120..7c349208 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java @@ -97,6 +97,8 @@ import com.leonardobishop.quests.bukkit.tasktype.type.dependent.ASkyBlockLevelTa import com.leonardobishop.quests.bukkit.tasktype.type.dependent.BentoBoxLevelTaskType; import com.leonardobishop.quests.bukkit.tasktype.type.dependent.CitizensDeliverTaskType; import com.leonardobishop.quests.bukkit.tasktype.type.dependent.CitizensInteractTaskType; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.CustomFishingGroupType; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.CustomFishingLootType; import com.leonardobishop.quests.bukkit.tasktype.type.dependent.EcoBossesKillingTaskType; import com.leonardobishop.quests.bukkit.tasktype.type.dependent.EcoMobsKillingTaskType; import com.leonardobishop.quests.bukkit.tasktype.type.dependent.EssentialsBalanceTaskType; @@ -449,6 +451,8 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests { taskTypeManager.registerTaskType(() -> new ASkyBlockLevelTaskType(this), () -> CompatUtils.isPluginEnabled("ASkyBlock")); taskTypeManager.registerTaskType(() -> new CitizensDeliverTaskType(this), () -> CompatUtils.isPluginEnabled("Citizens")); taskTypeManager.registerTaskType(() -> new CitizensInteractTaskType(this), () -> CompatUtils.isPluginEnabled("Citizens")); + taskTypeManager.registerTaskType(() -> new CustomFishingLootType(this), () -> CompatUtils.isPluginEnabled("CustomFishing")); + taskTypeManager.registerTaskType(() -> new CustomFishingGroupType(this), () -> CompatUtils.isPluginEnabled("CustomFishing")); taskTypeManager.registerTaskType(() -> new EcoBossesKillingTaskType(this), () -> CompatUtils.isPluginEnabled("EcoBosses")); taskTypeManager.registerTaskType(() -> new EcoMobsKillingTaskType(this), () -> CompatUtils.isPluginEnabled("EcoMobs")); taskTypeManager.registerTaskType(() -> new EssentialsBalanceTaskType(this), () -> CompatUtils.isPluginEnabled("Essentials")); diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CustomFishingGroupType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CustomFishingGroupType.java new file mode 100644 index 00000000..90d8e885 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CustomFishingGroupType.java @@ -0,0 +1,91 @@ +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 net.momirealms.customfishing.api.event.FishingResultEvent; +import net.momirealms.customfishing.api.mechanic.loot.Loot; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.Arrays; + +public final class CustomFishingGroupType extends BukkitTaskType { + + private final BukkitQuestsPlugin plugin; + + public CustomFishingGroupType(BukkitQuestsPlugin plugin) { + super("customfishing_group", TaskUtils.TASK_ATTRIBUTION_STRING, "Catch a set amount of loots in a certain group"); + this.plugin = plugin; + + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "group", "groups")); + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); + + plugin.getServer().getPluginManager().registerEvents(new CustomFishingListener(), plugin); + } + + private final class CustomFishingListener implements Listener { + + @EventHandler(ignoreCancelled = true) + public void onFishing(FishingResultEvent event) { + handle(event); + } + } + + private void handle(FishingResultEvent event) { + if (event.getResult() == FishingResultEvent.Result.FAILURE) + return; + + final Player player = event.getPlayer(); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + Loot loot = event.getLoot(); + if (loot == null) { + return; + } + + String[] groups = loot.getLootGroup(); + if (groups == null || groups.length == 0) { + 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 caught group " + Arrays.toString(groups), quest.getId(), task.getId(), player.getUniqueId()); + + loop: { + for (String group : groups) { + if (TaskUtils.matchString(this, pendingTask, group, player.getUniqueId(), "group", "groups", false, false)) { + break loop; + } + } + super.debug("Continuing...", quest.getId(), task.getId(), player.getUniqueId()); + continue; + } + + int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress); + super.debug("Incrementing task progress (now " + progress + ")", quest.getId(), task.getId(), player.getUniqueId()); + + int amount = (int) task.getConfigValue("amount"); + + if (progress >= amount) { + super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId()); + taskProgress.setCompleted(true); + } + + TaskUtils.sendTrackAdvancement(player, quest, task, pendingTask, amount); + } + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CustomFishingLootType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CustomFishingLootType.java new file mode 100644 index 00000000..c80d4971 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CustomFishingLootType.java @@ -0,0 +1,79 @@ +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 net.momirealms.customfishing.api.event.FishingResultEvent; +import net.momirealms.customfishing.api.mechanic.loot.Loot; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public final class CustomFishingLootType extends BukkitTaskType { + + private final BukkitQuestsPlugin plugin; + + public CustomFishingLootType(BukkitQuestsPlugin plugin) { + super("customfishing_loot", TaskUtils.TASK_ATTRIBUTION_STRING, "Catch a set amount of a loot"); + this.plugin = plugin; + + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "loot", "loots")); + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); + + plugin.getServer().getPluginManager().registerEvents(new CustomFishingListener(), plugin); + } + + private final class CustomFishingListener implements Listener { + + @EventHandler(ignoreCancelled = true) + public void onFishing(FishingResultEvent event) { + handle(event); + } + } + + private void handle(FishingResultEvent event) { + if (event.getResult() == FishingResultEvent.Result.FAILURE) + return; + + final Player player = event.getPlayer(); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + Loot loot = event.getLoot(); + if (loot == 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 caught loot " + loot.getID(), quest.getId(), task.getId(), player.getUniqueId()); + + if (!TaskUtils.matchString(this, pendingTask, loot.getID(), player.getUniqueId(), "loot", "loots", false, false)) { + super.debug("Continuing...", quest.getId(), task.getId(), player.getUniqueId()); + continue; + } + + int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress); + super.debug("Incrementing task progress (now " + progress + ")", quest.getId(), task.getId(), player.getUniqueId()); + + int amount = (int) task.getConfigValue("amount"); + + if (progress >= amount) { + super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId()); + taskProgress.setCompleted(true); + } + + TaskUtils.sendTrackAdvancement(player, quest, task, pendingTask, amount); + } + } +} diff --git a/bukkit/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml index 5c75b9aa..b1f854ff 100644 --- a/bukkit/src/main/resources/plugin.yml +++ b/bukkit/src/main/resources/plugin.yml @@ -12,6 +12,7 @@ softdepend: - Citizens - CMI - CoreProtect +- CustomFishing - EcoBosses - EcoMobs - Essentials -- cgit v1.2.3-70-g09d2