From 0caf75f8392e4ad4c4c7189d1b1f4922b18133b6 Mon Sep 17 00:00:00 2001 From: Owen <23108066+Owen1212055@users.noreply.github.com> Date: Wed, 25 Jun 2025 14:16:03 -0400 Subject: [PATCH] Fix #12721 (#12725) * Fix #12721 Track when knots are created and only fire the event then * Use mutable boolean + check if actually spawned --- .../LeashFenceKnotEntity.java.patch | 22 +++++++++++++++++++ .../minecraft/world/item/LeadItem.java.patch | 20 ++++++++++------- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/paper-server/patches/sources/net/minecraft/world/entity/decoration/LeashFenceKnotEntity.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/decoration/LeashFenceKnotEntity.java.patch index 51f18a9293..65331b4049 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/decoration/LeashFenceKnotEntity.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/decoration/LeashFenceKnotEntity.java.patch @@ -27,3 +27,25 @@ } } +@@ -120,7 +_,12 @@ + return this.level().getBlockState(this.pos).is(BlockTags.FENCES); + } + ++ // Paper start - Track if a knot was created + public static LeashFenceKnotEntity getOrCreateKnot(Level level, BlockPos pos) { ++ return getOrCreateKnot(level, pos, null); ++ } ++ public static LeashFenceKnotEntity getOrCreateKnot(Level level, BlockPos pos, @Nullable org.apache.commons.lang3.mutable.MutableBoolean created) { ++ // Paper end - Track if a knot was created + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); +@@ -134,7 +_,7 @@ + } + + LeashFenceKnotEntity leashFenceKnotEntity1 = new LeashFenceKnotEntity(level, pos); +- level.addFreshEntity(leashFenceKnotEntity1); ++ if (level.addFreshEntity(leashFenceKnotEntity1) && created != null) { created.setTrue(); } // Paper - Track if a knot was created + return leashFenceKnotEntity1; + } + diff --git a/paper-server/patches/sources/net/minecraft/world/item/LeadItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/LeadItem.java.patch index c9fcda66a5..632e534029 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/LeadItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/LeadItem.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/LeadItem.java +++ b/net/minecraft/world/item/LeadItem.java -@@ -26,24 +_,43 @@ +@@ -26,24 +_,46 @@ if (blockState.is(BlockTags.FENCES)) { Player player = context.getPlayer(); if (!level.isClientSide && player != null) { @@ -22,15 +22,19 @@ + for (java.util.Iterator iterator = list.iterator(); iterator.hasNext();) { // Paper - use iterator to remove + Leashable leashable = iterator.next(); // Paper - use iterator to remove if (leashFenceKnotEntity == null) { - leashFenceKnotEntity = LeashFenceKnotEntity.getOrCreateKnot(level, pos); +- leashFenceKnotEntity = LeashFenceKnotEntity.getOrCreateKnot(level, pos); + // CraftBukkit start - fire HangingPlaceEvent -+ org.bukkit.inventory.EquipmentSlot hand = org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(interactionHand); -+ org.bukkit.event.hanging.HangingPlaceEvent event = new org.bukkit.event.hanging.HangingPlaceEvent((org.bukkit.entity.Hanging) leashFenceKnotEntity.getBukkitEntity(), player != null ? (org.bukkit.entity.Player) player.getBukkitEntity() : null, org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), org.bukkit.block.BlockFace.SELF, hand); -+ level.getCraftServer().getPluginManager().callEvent(event); ++ org.apache.commons.lang3.mutable.MutableBoolean created = new org.apache.commons.lang3.mutable.MutableBoolean(false); ++ leashFenceKnotEntity = LeashFenceKnotEntity.getOrCreateKnot(level, pos, created); ++ if (created.booleanValue()) { ++ org.bukkit.inventory.EquipmentSlot hand = org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(interactionHand); ++ org.bukkit.event.hanging.HangingPlaceEvent event = new org.bukkit.event.hanging.HangingPlaceEvent((org.bukkit.entity.Hanging) leashFenceKnotEntity.getBukkitEntity(), player != null ? (org.bukkit.entity.Player) player.getBukkitEntity() : null, org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), org.bukkit.block.BlockFace.SELF, hand); ++ level.getCraftServer().getPluginManager().callEvent(event); + -+ if (event.isCancelled()) { -+ leashFenceKnotEntity.discard(null); // CraftBukkit - add Bukkit remove cause -+ return InteractionResult.PASS; ++ if (event.isCancelled()) { ++ leashFenceKnotEntity.discard(null); // CraftBukkit - add Bukkit remove cause ++ return InteractionResult.PASS; ++ } + } + // CraftBukkit end leashFenceKnotEntity.playPlacementSound();