From 19156cdd3be99963884ef56faaf41425813a24be Mon Sep 17 00:00:00 2001 From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Date: Sat, 6 Sep 2025 22:49:56 +0200 Subject: [PATCH] Give the right amount of experience after mending (#13047) --- .../java/org/bukkit/event/player/PlayerExpChangeEvent.java | 7 +++---- .../net/minecraft/world/entity/ExperienceOrb.java.patch | 4 ++-- .../org/bukkit/craftbukkit/event/CraftEventFactory.java | 5 +---- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/paper-api/src/main/java/org/bukkit/event/player/PlayerExpChangeEvent.java b/paper-api/src/main/java/org/bukkit/event/player/PlayerExpChangeEvent.java index a2b666d05..4ee832608 100644 --- a/paper-api/src/main/java/org/bukkit/event/player/PlayerExpChangeEvent.java +++ b/paper-api/src/main/java/org/bukkit/event/player/PlayerExpChangeEvent.java @@ -5,7 +5,6 @@ import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; - import org.jetbrains.annotations.Nullable; /** @@ -21,13 +20,13 @@ public class PlayerExpChangeEvent extends PlayerEvent { @ApiStatus.Internal public PlayerExpChangeEvent(@NotNull final Player player, final int expAmount) { - this(player, null, expAmount); + this(player, null, expAmount); } @ApiStatus.Internal public PlayerExpChangeEvent(@NotNull final Player player, @Nullable final Entity sourceEntity, final int expAmount) { - super(player); - this.source = sourceEntity; + super(player); + this.source = sourceEntity; this.exp = expAmount; } diff --git a/paper-server/patches/sources/net/minecraft/world/entity/ExperienceOrb.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/ExperienceOrb.java.patch index 3c45786a0..54bec7411 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/ExperienceOrb.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/ExperienceOrb.java.patch @@ -185,12 +185,12 @@ - if (entity.takeXpDelay == 0) { - entity.takeXpDelay = 2; + if (entity.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(serverPlayer.getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - PlayerPickupExperienceEvent -+ entity.takeXpDelay = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerXpCooldownEvent(entity, 2, org.bukkit.event.player.PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; ++ entity.takeXpDelay = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerXpCooldownEvent(entity, 2, org.bukkit.event.player.PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entity.takeXpDelay = 2; entity.take(this, 1); int i = this.repairPlayerItems(serverPlayer, this.getValue()); if (i > 0) { - entity.giveExperiencePoints(i); -+ entity.giveExperiencePoints(org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerExpChangeEvent(entity, this).getAmount()); // CraftBukkit - this.value -> event.getAmount() // Paper - supply experience orb object ++ entity.giveExperiencePoints(org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerExpChangeEvent(entity, this, i).getAmount()); // CraftBukkit - i -> event.getAmount() // Paper - supply experience orb } this.count--; diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 49ce3fdcb..9878d6842 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -1166,16 +1166,13 @@ public class CraftEventFactory { return event; } - // Paper start - Add orb - public static PlayerExpChangeEvent callPlayerExpChangeEvent(net.minecraft.world.entity.player.Player entity, net.minecraft.world.entity.ExperienceOrb entityOrb) { + public static PlayerExpChangeEvent callPlayerExpChangeEvent(net.minecraft.world.entity.player.Player entity, net.minecraft.world.entity.ExperienceOrb entityOrb, int expAmount) { Player player = (Player) entity.getBukkitEntity(); ExperienceOrb source = (ExperienceOrb) entityOrb.getBukkitEntity(); - int expAmount = source.getExperience(); PlayerExpChangeEvent event = new PlayerExpChangeEvent(player, source, expAmount); Bukkit.getPluginManager().callEvent(event); return event; } - // Paper end public static boolean handleBlockGrowEvent(Level world, BlockPos pos, net.minecraft.world.level.block.state.BlockState state, int flags) { CraftBlockState snapshot = CraftBlockStates.getBlockState(world, pos);