diff options
| author | Krakenied <krakenied1@gmail.com> | 2025-07-22 13:31:18 +0200 |
|---|---|---|
| committer | Krakenied <46192742+Krakenied@users.noreply.github.com> | 2025-07-29 00:06:46 +0200 |
| commit | 598d83935841b16f6fed8b8113730104b1fffe78 (patch) | |
| tree | 3faeaeee49b09007d78e8817a3f837fc687bd682 /bukkit/src/main/java | |
| parent | 9270f2487afede851140702fdadee0de699c53fc (diff) | |
Use DamageSource API
Diffstat (limited to 'bukkit/src/main/java')
6 files changed, 85 insertions, 46 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java index f6f5b628..c84bc315 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java @@ -15,6 +15,7 @@ import org.bukkit.entity.Player; import org.bukkit.entity.SkeletonHorse; import org.bukkit.entity.Strider; import org.bukkit.entity.ZombieHorse; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.SmithItemEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; @@ -27,6 +28,7 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.SmithingInventory; import org.bukkit.inventory.SmithingTransformRecipe; import org.bukkit.inventory.SmithingTrimRecipe; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -233,5 +235,10 @@ public interface VersionSpecificHandler { /** * {@link Entity#getPassengers()} method was introduced in {@code 1.11.2}. */ - List<Entity> getPassengers(final Entity entity); + List<Entity> getPassengers(Entity entity); + + /** + * DamageSources were introduced in {@code 1.20.4}. + */ + @Nullable Player getDamager(@Nullable EntityDamageEvent lastDamageCause); } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java index d9553694..5e7065dd 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java @@ -1,16 +1,23 @@ package com.leonardobishop.quests.bukkit.hook.versionspecific; +import com.leonardobishop.quests.bukkit.util.CompatUtils; +import org.bukkit.damage.DamageSource; import org.bukkit.entity.Camel; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.inventory.SmithItemEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; import org.bukkit.inventory.SmithingTransformRecipe; import org.bukkit.inventory.SmithingTrimRecipe; +import org.jspecify.annotations.Nullable; public class VersionSpecificHandler20 extends VersionSpecificHandler17 implements VersionSpecificHandler { + private static final boolean DAMAGE_SOURCE_API = CompatUtils.classExists("org.bukkit.damage.DamageSource"); + @Override public int getMinecraftVersion() { return 20; @@ -46,4 +53,25 @@ public class VersionSpecificHandler20 extends VersionSpecificHandler17 implement return null; } } + + @SuppressWarnings("UnstableApiUsage") + @Override + public @Nullable Player getDamager(@Nullable EntityDamageEvent event) { + if (!DAMAGE_SOURCE_API) { + return super.getDamager(event); + } + + if (event == null) { + return null; + } + + DamageSource source = event.getDamageSource(); + Entity causingEntity = source.getCausingEntity(); + + if (causingEntity instanceof Player) { + return (Player) causingEntity; + } + + return null; + } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java index 74e7deb9..70e02257 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java @@ -4,6 +4,9 @@ import org.bukkit.block.data.BlockData; import org.bukkit.entity.Entity; import org.bukkit.entity.Horse; import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.SmithItemEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; @@ -13,6 +16,8 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.projectiles.ProjectileSource; +import org.jspecify.annotations.Nullable; import java.util.HashMap; import java.util.List; @@ -192,7 +197,30 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler { @SuppressWarnings("deprecation") @Override public List<Entity> getPassengers(Entity entity) { - final Entity passenger = entity.getPassenger(); + Entity passenger = entity.getPassenger(); return passenger != null ? List.of(passenger) : List.of(); } + + @Override + public @Nullable Player getDamager(@Nullable EntityDamageEvent event) { + if (!(event instanceof EntityDamageByEntityEvent byEntityEvent)) { + return null; + } + + Entity damager = byEntityEvent.getDamager(); + + if (damager instanceof Player) { + return (Player) damager; + } + + if (damager instanceof Projectile projectile) { + ProjectileSource shooter = projectile.getShooter(); + + if (shooter instanceof Player) { + return (Player) shooter; + } + } + + return null; + } } 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 1be17aa0..1a9c384b 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 @@ -15,12 +15,10 @@ import org.bukkit.entity.Creature; import org.bukkit.entity.Damageable; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import org.bukkit.entity.Projectile; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.projectiles.ProjectileSource; public final class DealDamageTaskType extends BukkitTaskType { @@ -41,29 +39,11 @@ public final class DealDamageTaskType extends BukkitTaskType { } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { - Entity damager = event.getDamager(); - ItemStack weapon = null; - Player player; - - if (damager instanceof Player) { - player = (Player) damager; - - // It can be set there, but unfortunately we are unable to handle bows properly - weapon = player.getInventory().getItemInMainHand(); - } else if (damager instanceof Projectile projectile) { - ProjectileSource source = projectile.getShooter(); - - if (source instanceof Player) { - player = (Player) source; - } else { - return; - } - } else { - return; - } + public void onEntityDamage(EntityDamageEvent event) { + Entity entity = event.getEntity(); + Player player = plugin.getVersionSpecificHandler().getDamager(event); - if (player.hasMetadata("NPC")) { + if (player == null || player.hasMetadata("NPC")) { return; } @@ -72,7 +52,6 @@ public final class DealDamageTaskType extends BukkitTaskType { return; } - Entity entity = event.getEntity(); if (!(entity instanceof Damageable damageable)) { return; } @@ -103,12 +82,13 @@ public final class DealDamageTaskType extends BukkitTaskType { } if (task.hasConfigKey("item")) { - if (weapon == null) { + ItemStack item = plugin.getVersionSpecificHandler().getItemInMainHand(player); + if (item == null) { super.debug("Specific item is required, player has no item in hand; continuing...", quest.getId(), task.getId(), player.getUniqueId()); continue; } - super.debug("Specific item is required; player held item is of type '" + weapon.getType() + "'", quest.getId(), task.getId(), player.getUniqueId()); + super.debug("Specific item is required; player held item is of type '" + item.getType() + "'", quest.getId(), task.getId(), player.getUniqueId()); QuestItem qi; if ((qi = fixedQuestItemCache.get(quest.getId(), task.getId())) == null) { @@ -118,7 +98,7 @@ public final class DealDamageTaskType extends BukkitTaskType { } boolean exactMatch = TaskUtils.getConfigBoolean(task, "exact-match", true); - if (!qi.compareItemStack(weapon, exactMatch)) { + if (!qi.compareItemStack(item, exactMatch)) { super.debug("Item does not match required item, continuing...", quest.getId(), task.getId(), player.getUniqueId()); continue; } else { diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MobkillingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MobkillingTaskType.java index 28f78554..ab53e5a2 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MobkillingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MobkillingTaskType.java @@ -19,6 +19,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.inventory.ItemStack; @@ -62,7 +63,8 @@ public final class MobkillingTaskType extends BukkitTaskType { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onEntityDeath(EntityDeathEvent event) { LivingEntity entity = event.getEntity(); - Player player = entity.getKiller(); + EntityDamageEvent damageEvent = entity.getLastDamageCause(); + Player player = plugin.getVersionSpecificHandler().getDamager(damageEvent); handle(player, entity, 1); } @@ -84,11 +86,7 @@ public final class MobkillingTaskType extends BukkitTaskType { } private void handle(Player player, LivingEntity entity, int eventAmount) { - if (player == null) { - return; - } - - if (player.hasMetadata("NPC")) { + if (player == null || player.hasMetadata("NPC")) { return; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PlayerkillingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PlayerkillingTaskType.java index c6d4eb9d..6df513a5 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PlayerkillingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PlayerkillingTaskType.java @@ -8,11 +8,11 @@ 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.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; public final class PlayerkillingTaskType extends BukkitTaskType { @@ -27,14 +27,12 @@ public final class PlayerkillingTaskType extends BukkitTaskType { } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMobKill(EntityDeathEvent event) { - Player killer = event.getEntity().getKiller(); - Entity mob = event.getEntity(); + public void onPlayerDeath(PlayerDeathEvent event) { + Player killed = event.getPlayer(); + EntityDamageEvent damageEvent = killed.getLastDamageCause(); + Player killer = plugin.getVersionSpecificHandler().getDamager(damageEvent); - if (!(mob instanceof Player) - || killer == null - || killer.hasMetadata("NPC") - || mob == killer) { + if (killer == null || killer.hasMetadata("NPC") || killer == killed) { return; } |
