diff --git a/bukkit/libs/bedwars-api-2.0.0-SNAPSHOT.jar b/bukkit/libs/bedwars-api-2.0.0-SNAPSHOT.jar new file mode 100644 index 00000000..78e1c253 Binary files /dev/null and b/bukkit/libs/bedwars-api-2.0.0-SNAPSHOT.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 00920e77..e81c5c3d 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java @@ -113,6 +113,14 @@ import com.leonardobishop.quests.bukkit.tasktype.type.dependent.BedWars1058FinalKillTask; import com.leonardobishop.quests.bukkit.tasktype.type.dependent.BedWars1058LoseTask; import com.leonardobishop.quests.bukkit.tasktype.type.dependent.BedWars1058WinTask; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.BedWars1058BuyTask; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.BedWars1058GeneratorCollectTask; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.BedWars2023BedBreakTask; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.BedWars2023FinalKillTask; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.BedWars2023LoseTask; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.BedWars2023WinTask; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.BedWars2023BuyTask; +import com.leonardobishop.quests.bukkit.tasktype.type.dependent.BedWars2023GeneratorCollectTask; 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; @@ -501,6 +509,14 @@ public void onEnable() { taskTypeManager.registerTaskType(() -> new BedWars1058FinalKillTask(this), () -> CompatUtils.isPluginEnabled("BedWars1058")); // not tested taskTypeManager.registerTaskType(() -> new BedWars1058LoseTask(this), () -> CompatUtils.isPluginEnabled("BedWars1058")); // not tested taskTypeManager.registerTaskType(() -> new BedWars1058WinTask(this), () -> CompatUtils.isPluginEnabled("BedWars1058")); // not tested + taskTypeManager.registerTaskType(() -> new BedWars1058BuyTask(this), () -> CompatUtils.isPluginEnabled("BedWars1058")); // not tested + taskTypeManager.registerTaskType(() -> new BedWars1058GeneratorCollectTask(this), () -> CompatUtils.isPluginEnabled("BedWars1058")); // not tested + taskTypeManager.registerTaskType(() -> new BedWars2023BedBreakTask(this), () -> CompatUtils.isPluginEnabled("BedWars2023")); // not tested + taskTypeManager.registerTaskType(() -> new BedWars2023FinalKillTask(this), () -> CompatUtils.isPluginEnabled("BedWars2023")); // not tested + taskTypeManager.registerTaskType(() -> new BedWars2023LoseTask(this), () -> CompatUtils.isPluginEnabled("BedWars2023")); // not tested + taskTypeManager.registerTaskType(() -> new BedWars2023WinTask(this), () -> CompatUtils.isPluginEnabled("BedWars2023")); // not tested + taskTypeManager.registerTaskType(() -> new BedWars2023BuyTask(this), () -> CompatUtils.isPluginEnabled("BedWars2023")); // not tested + taskTypeManager.registerTaskType(() -> new BedWars2023GeneratorCollectTask(this), () -> CompatUtils.isPluginEnabled("BedWars2023")); // not tested taskTypeManager.registerTaskType(() -> new BentoBoxLevelTaskType(this), () -> CompatUtils.isPluginEnabled("BentoBox") && CompatUtils.classExists("world.bentobox.level.events.IslandLevelCalculatedEvent")); taskTypeManager.registerTaskType(() -> new CitizensDeliverTaskType(this), () -> CompatUtils.isPluginEnabled("Citizens")); taskTypeManager.registerTaskType(() -> new CitizensInteractTaskType(this), () -> CompatUtils.isPluginEnabled("Citizens")); diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars1058BuyTask.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars1058BuyTask.java new file mode 100644 index 00000000..34006f7e --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars1058BuyTask.java @@ -0,0 +1,105 @@ +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; + +import com.andrei1058.bedwars.api.events.shop.ShopBuyEvent; +import com.andrei1058.bedwars.api.arena.shop.ICategoryContent; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.bukkit.util.constraint.TaskConstraintSet; +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.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.inventory.ItemStack; + +public final class BedWars1058BuyTask extends BukkitTaskType { + + private final BukkitQuestsPlugin plugin; + + public BedWars1058BuyTask(BukkitQuestsPlugin plugin) { + super("bedwars1058_buy", TaskUtils.TASK_ATTRIBUTION_STRING, "Buy specific items from the BedWars1058 shop."); + this.plugin = plugin; + + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "item")); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onShopBuy(ShopBuyEvent event) { + Player buyer = event.getBuyer(); + if (buyer == null) { + return; + } + + QPlayer qBuyer = plugin.getPlayerManager().getPlayer(buyer.getUniqueId()); + if (qBuyer == null) { + return; + } + + ICategoryContent boughtContent = event.getCategoryContent(); + if (boughtContent == null) { + return; + } + + String boughtIdentifier = boughtContent.getIdentifier(); + ItemStack boughtStack = boughtContent.getItemStack(buyer); + String boughtMaterial = boughtStack != null ? boughtStack.getType().name() : null; + + for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(buyer, qBuyer, this, TaskConstraintSet.ALL)) { + Quest quest = pendingTask.quest(); + Task task = pendingTask.task(); + TaskProgress taskProgress = pendingTask.taskProgress(); + + String requiredId = (String) task.getConfigValue("item"); + if (requiredId == null) { + continue; + } + + boolean matched = false; + + if (requiredId.equalsIgnoreCase(boughtIdentifier)) { + matched = true; + super.debug("Matched identifier " + boughtIdentifier, + quest.getId(), task.getId(), buyer.getUniqueId()); + } + + if (!matched && requiredId.equalsIgnoreCase(boughtMaterial)) { + matched = true; + super.debug("Matched material " + boughtMaterial, + quest.getId(), task.getId(), buyer.getUniqueId()); + } + + if (!matched) { + super.debug("Bought item (" + boughtIdentifier + "/" + boughtMaterial + ") does not match required " + requiredId, + quest.getId(), task.getId(), buyer.getUniqueId()); + continue; + } + + int boughtAmount = (boughtStack != null) ? boughtStack.getAmount() : 1; + + int progress = taskProgress.getProgress() instanceof Integer + ? (int) taskProgress.getProgress() + : 0; + progress += boughtAmount; + taskProgress.setProgress(progress); + + int amount = (int) task.getConfigValue("amount"); + + super.debug("Progress " + progress + "/" + amount, + quest.getId(), task.getId(), buyer.getUniqueId()); + + if (progress >= amount) { + taskProgress.setCompleted(true); + super.debug("Marking task as complete", + quest.getId(), task.getId(), buyer.getUniqueId()); + } + + TaskUtils.sendTrackAdvancement(buyer, quest, task, pendingTask, amount); + } + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars1058GeneratorCollectTask.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars1058GeneratorCollectTask.java new file mode 100644 index 00000000..026ab181 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars1058GeneratorCollectTask.java @@ -0,0 +1,84 @@ +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; + +import com.andrei1058.bedwars.api.events.player.PlayerGeneratorCollectEvent; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.bukkit.util.constraint.TaskConstraintSet; +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.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.inventory.ItemStack; + +public final class BedWars1058GeneratorCollectTask extends BukkitTaskType { + + private final BukkitQuestsPlugin plugin; + + public BedWars1058GeneratorCollectTask(BukkitQuestsPlugin plugin) { + super("bedwars1058_generator_collect", TaskUtils.TASK_ATTRIBUTION_STRING, "Collect specific items from BedWars1058 generators."); + this.plugin = plugin; + + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "item")); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onGeneratorCollect(PlayerGeneratorCollectEvent event) { + Player player = event.getPlayer(); + if (player == null) { + return; + } + + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + ItemStack collectedStack = event.getItemStack(); + if (collectedStack == null) { + return; + } + + String collectedMaterial = collectedStack.getType().name(); + int collectedAmount = collectedStack.getAmount(); + + for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(player, qPlayer, this, TaskConstraintSet.ALL)) { + Quest quest = pendingTask.quest(); + Task task = pendingTask.task(); + TaskProgress taskProgress = pendingTask.taskProgress(); + + String requiredId = (String) task.getConfigValue("item"); + if (requiredId == null) { + continue; + } + + if (!requiredId.equalsIgnoreCase(collectedMaterial)) { + super.debug("Collected " + collectedMaterial + " does not match required " + requiredId, + quest.getId(), task.getId(), player.getUniqueId()); + continue; + } + + super.debug("Player collected required item (" + collectedMaterial + ")", + quest.getId(), task.getId(), player.getUniqueId()); + + int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress, collectedAmount); + int amount = ((int) task.getConfigValue("amount")); + + super.debug("Progress " + progress + "/" + amount, + quest.getId(), task.getId(), player.getUniqueId()); + + if (progress >= amount) { + taskProgress.setCompleted(true); + super.debug("Marking task as complete", + quest.getId(), task.getId(), player.getUniqueId()); + } + + TaskUtils.sendTrackAdvancement(player, quest, task, pendingTask, amount); + } + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023BedBreakTask.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023BedBreakTask.java new file mode 100644 index 00000000..a6a117c3 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023BedBreakTask.java @@ -0,0 +1,60 @@ +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.bukkit.util.constraint.TaskConstraintSet; +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.tomkeuper.bedwars.api.events.player.PlayerBedBreakEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +public final class BedWars2023BedBreakTask extends BukkitTaskType { + + private final BukkitQuestsPlugin plugin; + + public BedWars2023BedBreakTask(BukkitQuestsPlugin plugin) { + super("bedwars2023_bedbreak", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of beds in BedWars2023."); + this.plugin = plugin; + + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerBedBreak(PlayerBedBreakEvent event) { + Player player = event.getPlayer(); + 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, TaskConstraintSet.ALL)) { + Quest quest = pendingTask.quest(); + Task task = pendingTask.task(); + TaskProgress taskProgress = pendingTask.taskProgress(); + + super.debug("Player broke a bed in BedWars", quest.getId(), task.getId(), player.getUniqueId()); + + 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/BedWars2023BuyTask.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023BuyTask.java new file mode 100644 index 00000000..d6fa66c8 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023BuyTask.java @@ -0,0 +1,106 @@ +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.bukkit.util.constraint.TaskConstraintSet; +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.tomkeuper.bedwars.api.arena.shop.ICategoryContent; +import com.tomkeuper.bedwars.api.events.shop.ShopBuyEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.inventory.ItemStack; + +public final class BedWars2023BuyTask extends BukkitTaskType { + + private final BukkitQuestsPlugin plugin; + + public BedWars2023BuyTask(BukkitQuestsPlugin plugin) { + super("bedwars2023_buy", TaskUtils.TASK_ATTRIBUTION_STRING, "Buy specific items from the BedWars2023 shop."); + this.plugin = plugin; + + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "item")); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onShopBuy(ShopBuyEvent event) { + Player buyer = event.getBuyer(); + if (buyer == null) { + return; + } + + QPlayer qBuyer = plugin.getPlayerManager().getPlayer(buyer.getUniqueId()); + if (qBuyer == null) { + return; + } + + ICategoryContent boughtContent = event.getCategoryContent(); + if (boughtContent == null) { + return; + } + + String boughtIdentifier = boughtContent.getIdentifier(); + ItemStack boughtStack = boughtContent.getItemStack(buyer); + String boughtMaterial = boughtStack != null ? boughtStack.getType().name() : null; + + for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(buyer, qBuyer, this, TaskConstraintSet.ALL)) { + Quest quest = pendingTask.quest(); + Task task = pendingTask.task(); + TaskProgress taskProgress = pendingTask.taskProgress(); + + String requiredId = (String) task.getConfigValue("item"); + if (requiredId == null) { + continue; + } + + boolean matched = false; + + if (requiredId.equalsIgnoreCase(boughtIdentifier)) { + matched = true; + super.debug("Matched identifier " + boughtIdentifier, + quest.getId(), task.getId(), buyer.getUniqueId()); + } + + if (!matched && requiredId.equalsIgnoreCase(boughtMaterial)) { + matched = true; + super.debug("Matched material " + boughtMaterial, + quest.getId(), task.getId(), buyer.getUniqueId()); + } + + if (!matched) { + super.debug("Bought item (" + boughtIdentifier + "/" + boughtMaterial + ") does not match required " + requiredId, + quest.getId(), task.getId(), buyer.getUniqueId()); + continue; + } + + int boughtAmount = (boughtStack != null) ? boughtStack.getAmount() : 1; + + int progress = taskProgress.getProgress() instanceof Integer + ? (int) taskProgress.getProgress() + : 0; + progress += boughtAmount; + taskProgress.setProgress(progress); + + int amount = (int) task.getConfigValue("amount"); + + super.debug("Progress " + progress + "/" + amount, + quest.getId(), task.getId(), buyer.getUniqueId()); + + if (progress >= amount) { + taskProgress.setCompleted(true); + super.debug("Marking task as complete", + quest.getId(), task.getId(), buyer.getUniqueId()); + } + + TaskUtils.sendTrackAdvancement(buyer, quest, task, pendingTask, amount); + } + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023FinalKillTask.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023FinalKillTask.java new file mode 100644 index 00000000..0aaccd7d --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023FinalKillTask.java @@ -0,0 +1,64 @@ +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.bukkit.util.constraint.TaskConstraintSet; +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.tomkeuper.bedwars.api.events.player.PlayerKillEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +public final class BedWars2023FinalKillTask extends BukkitTaskType { + + private final BukkitQuestsPlugin plugin; + + public BedWars2023FinalKillTask(BukkitQuestsPlugin plugin) { + super("bedwars2023_finalkill", TaskUtils.TASK_ATTRIBUTION_STRING, "Get a final kill in BedWars2023."); + this.plugin = plugin; + + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerKill(PlayerKillEvent event) { + PlayerKillEvent.PlayerKillCause cause = event.getCause(); + if (!cause.isFinalKill()) { + return; + } + + Player killer = event.getKiller(); + if (killer == null || killer.hasMetadata("NPC")) { + return; + } + + QPlayer qKiller = plugin.getPlayerManager().getPlayer(killer.getUniqueId()); + if (qKiller == null) { + return; + } + + for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(killer, qKiller, this, TaskConstraintSet.ALL)) { + Quest quest = pendingTask.quest(); + Task task = pendingTask.task(); + TaskProgress taskProgress = pendingTask.taskProgress(); + + super.debug("Player got a final kill", quest.getId(), task.getId(), killer.getUniqueId()); + + int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress); + super.debug("Incrementing task progress (now " + progress + ")", quest.getId(), task.getId(), killer.getUniqueId()); + + int amount = (int) task.getConfigValue("amount"); + if (progress >= amount) { + super.debug("Marking task as complete", quest.getId(), task.getId(), killer.getUniqueId()); + taskProgress.setCompleted(true); + } + + TaskUtils.sendTrackAdvancement(killer, quest, task, pendingTask, amount); + } + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023GeneratorCollectTask.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023GeneratorCollectTask.java new file mode 100644 index 00000000..1fc8d37a --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023GeneratorCollectTask.java @@ -0,0 +1,84 @@ +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; + +import com.tomkeuper.bedwars.api.events.player.PlayerGeneratorCollectEvent; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.bukkit.util.constraint.TaskConstraintSet; +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.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.inventory.ItemStack; + +public final class BedWars2023GeneratorCollectTask extends BukkitTaskType { + + private final BukkitQuestsPlugin plugin; + + public BedWars2023GeneratorCollectTask(BukkitQuestsPlugin plugin) { + super("bedwars2023_generator_collect", TaskUtils.TASK_ATTRIBUTION_STRING, "Collect specific items from BedWars2023 generators."); + this.plugin = plugin; + + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "item")); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onGeneratorCollect(PlayerGeneratorCollectEvent event) { + Player player = event.getPlayer(); + if (player == null) { + return; + } + + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + ItemStack collectedStack = event.getItemStack(); + if (collectedStack == null) { + return; + } + + String collectedMaterial = collectedStack.getType().name(); + int collectedAmount = collectedStack.getAmount(); + + for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(player, qPlayer, this, TaskConstraintSet.ALL)) { + Quest quest = pendingTask.quest(); + Task task = pendingTask.task(); + TaskProgress taskProgress = pendingTask.taskProgress(); + + String requiredId = (String) task.getConfigValue("item"); + if (requiredId == null) { + continue; + } + + if (!requiredId.equalsIgnoreCase(collectedMaterial)) { + super.debug("Collected " + collectedMaterial + " does not match required " + requiredId, + quest.getId(), task.getId(), player.getUniqueId()); + continue; + } + + super.debug("Player collected required item (" + collectedMaterial + ")", + quest.getId(), task.getId(), player.getUniqueId()); + + int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress, collectedAmount); + int amount = ((int) task.getConfigValue("amount")); + + super.debug("Progress " + progress + "/" + amount, + quest.getId(), task.getId(), player.getUniqueId()); + + if (progress >= amount) { + taskProgress.setCompleted(true); + super.debug("Marking task as complete", + quest.getId(), task.getId(), player.getUniqueId()); + } + + TaskUtils.sendTrackAdvancement(player, quest, task, pendingTask, amount); + } + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023LoseTask.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023LoseTask.java new file mode 100644 index 00000000..0bbda6f9 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023LoseTask.java @@ -0,0 +1,74 @@ +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; + +import com.tomkeuper.bedwars.api.events.gameplay.GameEndEvent; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.bukkit.util.constraint.TaskConstraintSet; +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.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import java.util.List; +import java.util.UUID; + +public final class BedWars2023LoseTask extends BukkitTaskType { + + private final BukkitQuestsPlugin plugin; + + public BedWars2023LoseTask(BukkitQuestsPlugin plugin) { + super("bedwars2023_lose", TaskUtils.TASK_ATTRIBUTION_STRING, "Lose a game of BedWars in BedWars2023."); + this.plugin = plugin; + + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onGameEnd(GameEndEvent event) { + List loserUniqueIds = event.getLosers(); + + for (UUID loserUniqueId : loserUniqueIds) { + Player loser = Bukkit.getPlayer(loserUniqueId); + + if (loser != null) { + this.handle(loser); + } + } + } + + private void handle(final Player loser) { + if (loser.hasMetadata("NPC")) { + return; + } + + QPlayer qLoser = plugin.getPlayerManager().getPlayer(loser.getUniqueId()); + if (qLoser == null) { + return; + } + + for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(loser, qLoser, this, TaskConstraintSet.ALL)) { + Quest quest = pendingTask.quest(); + Task task = pendingTask.task(); + TaskProgress taskProgress = pendingTask.taskProgress(); + + super.debug("Player lost a BedWars game", quest.getId(), task.getId(), loser.getUniqueId()); + + int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress); + super.debug("Incrementing task progress (now " + progress + ")", quest.getId(), task.getId(), loser.getUniqueId()); + + int amount = (int) task.getConfigValue("amount"); + if (progress >= amount) { + super.debug("Marking task as complete", quest.getId(), task.getId(), loser.getUniqueId()); + taskProgress.setCompleted(true); + } + + TaskUtils.sendTrackAdvancement(loser, quest, task, pendingTask, amount); + } + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023WinTask.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023WinTask.java new file mode 100644 index 00000000..33c4999c --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/BedWars2023WinTask.java @@ -0,0 +1,74 @@ +package com.leonardobishop.quests.bukkit.tasktype.type.dependent; + +import com.tomkeuper.bedwars.api.events.gameplay.GameEndEvent; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.bukkit.util.constraint.TaskConstraintSet; +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.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import java.util.List; +import java.util.UUID; + +public final class BedWars2023WinTask extends BukkitTaskType { + + private final BukkitQuestsPlugin plugin; + + public BedWars2023WinTask(BukkitQuestsPlugin plugin) { + super("bedwars2023_win", TaskUtils.TASK_ATTRIBUTION_STRING, "Win a game of BedWars in BedWars2023."); + this.plugin = plugin; + + super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onGameEnd(GameEndEvent event) { + List winnerUniqueIds = event.getLosers(); + + for (UUID winnerUniqueId : winnerUniqueIds) { + Player winner = Bukkit.getPlayer(winnerUniqueId); + + if (winner != null) { + this.handle(winner); + } + } + } + + private void handle(final Player winner) { + if (winner.hasMetadata("NPC")) { + return; + } + + QPlayer qWinner = plugin.getPlayerManager().getPlayer(winner.getUniqueId()); + if (qWinner == null) { + return; + } + + for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(winner, qWinner, this, TaskConstraintSet.ALL)) { + Quest quest = pendingTask.quest(); + Task task = pendingTask.task(); + TaskProgress taskProgress = pendingTask.taskProgress(); + + super.debug("Player won a BedWars game", quest.getId(), task.getId(), winner.getUniqueId()); + + int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress); + super.debug("Incrementing task progress (now " + progress + ")", quest.getId(), task.getId(), winner.getUniqueId()); + + int amount = (int) task.getConfigValue("amount"); + if (progress >= amount) { + super.debug("Marking task as complete", quest.getId(), task.getId(), winner.getUniqueId()); + taskProgress.setCompleted(true); + } + + TaskUtils.sendTrackAdvancement(winner, quest, task, pendingTask, amount); + } + } +} diff --git a/bukkit/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml index 56b2d21d..92b89ca5 100644 --- a/bukkit/src/main/resources/plugin.yml +++ b/bukkit/src/main/resources/plugin.yml @@ -9,6 +9,7 @@ author: "LMBishop & contributors" softdepend: - ASkyBlock - BedWars1058 +- BedWars2023 - BentoBox - BlockTracker - Citizens diff --git a/docs/task-types/bedwars1058_buy-(task-type).md b/docs/task-types/bedwars1058_buy-(task-type).md new file mode 100644 index 00000000..fd360553 --- /dev/null +++ b/docs/task-types/bedwars1058_buy-(task-type).md @@ -0,0 +1,33 @@ +--- +title: bedwars1058_buy +parent: External task types +grand_parent: Task types +--- + +# bedwars1058_buy (task type) + +Not released yet (dev builds) +{: .label .label-green } + +Plugin 'BedWars1058' required +{: .label } + +Buy a specific item from the BedWars1058 shop. + +## Options + +| Key | Description | Type | Required | Default | Notes | +|----------|-----------------------------------------------|---------|----------|---------|---------------------------| +| `item` | The shop item that the player must purchase. | String | Yes | \- | \- | +| `amount` | The number of times to buy this item. | Integer | Yes | \- | \- | + +## Examples + +Buy 3 Ender Pearls: + +``` yaml +bedwars1058: + type: "bedwars1058_buy" + item: "ENDER_PEARL" + amount: 3 +``` \ No newline at end of file diff --git a/docs/task-types/bedwars1058_generator_collect-(task-type).md b/docs/task-types/bedwars1058_generator_collect-(task-type).md new file mode 100644 index 00000000..ba9c607e --- /dev/null +++ b/docs/task-types/bedwars1058_generator_collect-(task-type).md @@ -0,0 +1,33 @@ +--- +title: bedwars1058_generator_collect +parent: External task types +grand_parent: Task types +--- + +# bedwars1058_generator_collect (task type) + +Not released yet (dev builds) +{: .label .label-green } + +Plugin 'BedWars1058' required +{: .label } + +Collect a specific item from generators in BedWars1058. + +## Options + +| Key | Description | Type | Required | Default | Notes | +|----------|------------------------------------------------|---------|----------|---------|-------| +| `item` | The generator item that the player must collect. | String | Yes | \- | \- | +| `amount` | The amount of items to collect. | Integer | Yes | \- | \- | + +## Examples + +Collect 10 diamonds: + +``` yaml +bedwars1058: + type: "bedwars1058_generator_collect" + item: "DIAMOND" + amount: 10 +``` diff --git a/docs/task-types/bedwars2023-buy-(task-type).md b/docs/task-types/bedwars2023-buy-(task-type).md new file mode 100644 index 00000000..d69fd1a9 --- /dev/null +++ b/docs/task-types/bedwars2023-buy-(task-type).md @@ -0,0 +1,33 @@ +--- +title: bedwars2023_buy +parent: External task types +grand_parent: Task types +--- + +# bedwars2023_buy (task type) + +Not released yet (dev builds) +{: .label .label-green } + +Plugin 'BedWars2023' required +{: .label } + +Buy a specific item from the BedWars2023 shop. + +## Options + +| Key | Description | Type | Required | Default | Notes | +|----------|-----------------------------------------------|---------|----------|---------|---------------------------| +| `item` | The shop item that the player must purchase. | String | Yes | \- | \- | +| `amount` | The number of times to buy this item. | Integer | Yes | \- | \- | + +## Examples + +Buy 3 Ender Pearls: + +``` yaml +bedwars2023: + type: "bedwars2023_buy" + item: "ENDER_PEARL" + amount: 3 +``` \ No newline at end of file diff --git a/docs/task-types/bedwars2023_bedbreak-(task-type).md b/docs/task-types/bedwars2023_bedbreak-(task-type).md new file mode 100644 index 00000000..cf33b45e --- /dev/null +++ b/docs/task-types/bedwars2023_bedbreak-(task-type).md @@ -0,0 +1,31 @@ +--- +title: bedwars2023_bedbreak +parent: External task types +grand_parent: Task types +--- + +# bedwars2023_bedbreak (task type) + +Not released yet (dev builds) +{: .label .label-green } + +Plugin 'BedWars2023' required +{: .label } + +Break a set amount of beds in BedWars2023. + +## Options + +| Key | Description | Type | Required | Default | Notes | +|----------|------------------------------|---------------------|----------|---------|-------| +| `amount` | The amount of beds to break. | Integer | Yes | \- | \- | + +## Examples + +Break 10 beds: + +``` yaml +bedwars2023: + type: "bedwars2023_bedbreak" + amount: 10 # amount of beds to break +``` diff --git a/docs/task-types/bedwars2023_finalkill-(task-type).md b/docs/task-types/bedwars2023_finalkill-(task-type).md new file mode 100644 index 00000000..4496a3f6 --- /dev/null +++ b/docs/task-types/bedwars2023_finalkill-(task-type).md @@ -0,0 +1,31 @@ +--- +title: bedwars2023_finalkill +parent: External task types +grand_parent: Task types +--- + +# bedwars2023_finalkill (task type) + +Not released yet (dev builds) +{: .label .label-green } + +Plugin 'BedWars2023' required +{: .label } + +Get a final kill in a BedWars2023 game. + +## Options + +| Key | Description | Type | Required | Default | Notes | +|----------|----------------------------|---------------------|----------|---------|-------| +| `amount` | The amount of final kills. | Integer | Yes | \- | \- | + +## Examples + +Final kill 5 players: + +``` yaml +bedwars2023: + type: "bedwars2023_finalkill" + amount: 5 # amount of final kills +``` diff --git a/docs/task-types/bedwars2023_generator_collect-(task-type).md b/docs/task-types/bedwars2023_generator_collect-(task-type).md new file mode 100644 index 00000000..ffba6abe --- /dev/null +++ b/docs/task-types/bedwars2023_generator_collect-(task-type).md @@ -0,0 +1,33 @@ +--- +title: bedwars2023_generator_collect +parent: External task types +grand_parent: Task types +--- + +# bedwars2023_generator_collect (task type) + +Not released yet (dev builds) +{: .label .label-green } + +Plugin 'BedWars2023' required +{: .label } + +Collect a specific item from generators in BedWars2023. + +## Options + +| Key | Description | Type | Required | Default | Notes | +|----------|------------------------------------------------|---------|----------|---------|-------| +| `item` | The generator item that the player must collect. | String | Yes | \- | \- | +| `amount` | The amount of items to collect. | Integer | Yes | \- | \- | + +## Examples + +Collect 10 diamonds: + +``` yaml +bedwars2023: + type: "bedwars2023_generator_collect" + item: "DIAMOND" + amount: 10 +``` diff --git a/docs/task-types/bedwars2023_lose-(task-type).md b/docs/task-types/bedwars2023_lose-(task-type).md new file mode 100644 index 00000000..d54b1f87 --- /dev/null +++ b/docs/task-types/bedwars2023_lose-(task-type).md @@ -0,0 +1,31 @@ +--- +title: bedwars2023_lose +parent: External task types +grand_parent: Task types +--- + +# bedwars2023_lose (task type) + +Not released yet (dev builds) +{: .label .label-green } + +Plugin 'BedWars2023' required +{: .label } + +Lose a game of BedWars in BedWars2023. + +## Options + +| Key | Description | Type | Required | Default | Notes | +|----------|------------------------------|---------------------|----------|---------|-------| +| `amount` | The amount of games to lose. | Integer | Yes | \- | \- | + +## Examples + +Lose 5 Game: + +``` yaml +bedwars2023: + type: "bedwars2023_lose" + amount: 5 # amount of games to lose +``` diff --git a/docs/task-types/bedwars2023_win-(task-type).md b/docs/task-types/bedwars2023_win-(task-type).md new file mode 100644 index 00000000..841cce83 --- /dev/null +++ b/docs/task-types/bedwars2023_win-(task-type).md @@ -0,0 +1,31 @@ +--- +title: bedwars2023_win +parent: External task types +grand_parent: Task types +--- + +# bedwars2023_win (task type) + +Not released yet (dev builds) +{: .label .label-green } + +Plugin 'BedWars2023' required +{: .label } + +Win a game of BedWars in BedWars2023. + +## Options + +| Key | Description | Type | Required | Default | Notes | +|----------|-----------------------------|---------------------|----------|---------|-------| +| `amount` | The amount of games to win. | Integer | Yes | \- | \- | + +## Examples + +Win 5 games: + +``` yaml +bedwars2023: + type: "bedwars2023_win" + amount: 5 # amount of games to win +```