From 32148da8e31b35c4876dacd7009c5f597a84ff15 Mon Sep 17 00:00:00 2001 From: Harry Bridgen Date: Thu, 12 Mar 2026 10:12:35 +0000 Subject: [PATCH] Fix leash event for boats and elytra --- .../org/bukkit/event/entity/EntityUnleashEvent.java | 4 ++++ .../net/minecraft/world/entity/Leashable.java.patch | 2 +- .../entity/vehicle/boat/AbstractBoat.java.patch | 13 +++++++++++-- .../world/item/FireworkRocketItem.java.patch | 2 +- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/paper-api/src/main/java/org/bukkit/event/entity/EntityUnleashEvent.java b/paper-api/src/main/java/org/bukkit/event/entity/EntityUnleashEvent.java index 1491c1ac4ae6..619c3f0409be 100644 --- a/paper-api/src/main/java/org/bukkit/event/entity/EntityUnleashEvent.java +++ b/paper-api/src/main/java/org/bukkit/event/entity/EntityUnleashEvent.java @@ -102,6 +102,10 @@ public enum UnleashReason { * When the entity's leashholder is more than 10 blocks away */ DISTANCE, + /** + * When the leashed entity is removed from the game + */ + LEASHED_GONE, UNKNOWN; } } diff --git a/paper-server/patches/sources/net/minecraft/world/entity/Leashable.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/Leashable.java.patch index 568f7284c189..ac3e59d13afe 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/Leashable.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/Leashable.java.patch @@ -40,7 +40,7 @@ + // Paper start - Expand EntityUnleashEvent + final org.bukkit.event.entity.EntityUnleashEvent event = new org.bukkit.event.entity.EntityUnleashEvent( + entity.getBukkitEntity(), -+ !entity.isAlive() ? org.bukkit.event.entity.EntityUnleashEvent.UnleashReason.PLAYER_UNLEASH : org.bukkit.event.entity.EntityUnleashEvent.UnleashReason.HOLDER_GONE, ++ !entity.isAlive() ? org.bukkit.event.entity.EntityUnleashEvent.UnleashReason.LEASHED_GONE : org.bukkit.event.entity.EntityUnleashEvent.UnleashReason.HOLDER_GONE, + level.getGameRules().get(GameRules.ENTITY_DROPS) && !entity.pluginRemoved + ); + event.callEvent(); diff --git a/paper-server/patches/sources/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java.patch index c26b465f5514..465fe5eaf6b3 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java.patch @@ -84,14 +84,23 @@ this.setDeltaMovement(this.getDeltaMovement().multiply(1.0, 0.0, 1.0)); this.lastYd = 0.0; } -@@ -708,12 +_,12 @@ +@@ -708,12 +_,20 @@ } @Override - public void remove(Entity.RemovalReason reason) { + public void remove(Entity.RemovalReason reason, org.bukkit.event.entity.EntityRemoveEvent.@Nullable Cause eventCause) { // CraftBukkit - add Bukkit remove cause if (!this.level().isClientSide() && reason.shouldDestroy() && this.isLeashed()) { - this.dropLeash(); +- this.dropLeash(); ++ // Paper start - Fire EntityUnleashEvent on boat destruction ++ final org.bukkit.event.entity.EntityUnleashEvent event = new org.bukkit.event.entity.EntityUnleashEvent(this.getBukkitEntity(), org.bukkit.event.entity.EntityUnleashEvent.UnleashReason.LEASHED_GONE, true); ++ event.callEvent(); ++ if (event.isDropLeash()) { ++ this.dropLeash(); ++ } else { ++ this.removeLeash(); ++ } ++ // Paper end - Fire EntityUnleashEvent on boat destruction } - super.remove(reason); diff --git a/paper-server/patches/sources/net/minecraft/world/item/FireworkRocketItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/FireworkRocketItem.java.patch index 803d94ec2889..8f6f8cc9ffd2 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/FireworkRocketItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/FireworkRocketItem.java.patch @@ -37,7 +37,7 @@ + com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Firework) delayed.projectile().getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand)); + if (event.callEvent() && delayed.attemptSpawn()) { + player.awardStat(Stats.ITEM_USED.get(this)); // Moved up from below -+ if (player.dropAllLeashConnections(null)) { ++ if (player.dropAllLeashConnections(player, hand)) { // Paper - PlayerUnleashEntityEvent + level.playSound(null, player, SoundEvents.LEAD_BREAK, SoundSource.NEUTRAL, 1.0F, 1.0F); + } + if (event.shouldConsume() && !player.hasInfiniteMaterials()) {