From fcea8e476619b8504c2a85906d6c63d915efc64f Mon Sep 17 00:00:00 2001 From: Krakenied Date: Thu, 26 Dec 2024 22:38:32 +0100 Subject: Clamp damage in deal damage task type Closes https://github.com/LMBishop/Quests/issues/753 --- .../bukkit/tasktype/type/DealDamageTaskType.java | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'bukkit/src/main/java') diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/DealDamageTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/DealDamageTaskType.java index fef815ec..06db1410 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/DealDamageTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/DealDamageTaskType.java @@ -9,6 +9,7 @@ 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.Creature; +import org.bukkit.entity.Damageable; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -25,11 +26,12 @@ public final class DealDamageTaskType extends BukkitTaskType { super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useEntityListConfigValidator(this, "mob", "mobs")); super.addConfigValidator(TaskUtils.useBooleanConfigValidator(this, "allow-only-creatures")); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onDamage(EntityDamageByEntityEvent event) { + public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { Entity damager = event.getDamager(); if (!(damager instanceof Player player)) { return; @@ -45,7 +47,15 @@ public final class DealDamageTaskType extends BukkitTaskType { } Entity entity = event.getEntity(); - double damage = event.getDamage(); + if (!(entity instanceof Damageable damageable)) { + return; + } + + // Clamp entity damage as getDamage() returns Float.MAX_VALUE for killing a parrot with a cookie + // https://github.com/LMBishop/Quests/issues/753 + double finalDamage = event.getFinalDamage(); + double health = damageable.getHealth(); + double damage = Math.clamp(finalDamage, 0.0d, health); for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(player, qPlayer, this, TaskConstraintSet.ALL)) { Quest quest = pendingTask.quest(); @@ -55,11 +65,17 @@ public final class DealDamageTaskType extends BukkitTaskType { super.debug("Player damaged " + entity.getType() + " for " + damage, quest.getId(), task.getId(), player.getUniqueId()); boolean allowOnlyCreatures = TaskUtils.getConfigBoolean(task, "allow-only-creatures", true); + if (allowOnlyCreatures && !(entity instanceof Creature)) { super.debug(entity.getType() + " is not a creature but allow-only-creatures is true, continuing...", quest.getId(), task.getId(), player.getUniqueId()); continue; } + if (!TaskUtils.matchEntity(this, pendingTask, entity, player.getUniqueId())) { + super.debug("Continuing...", quest.getId(), task.getId(), player.getUniqueId()); + continue; + } + int amount = (int) task.getConfigValue("amount"); double progress = Math.min(amount, TaskUtils.getDecimalTaskProgress(taskProgress) + damage); @@ -70,6 +86,7 @@ public final class DealDamageTaskType extends BukkitTaskType { super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId()); taskProgress.setCompleted(true); } + TaskUtils.sendTrackAdvancement(player, quest, task, pendingTask, amount); } } -- cgit v1.2.3-70-g09d2