From 9f5f283ece92cc5747713fd973aa402a0a927497 Mon Sep 17 00:00:00 2001 From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Sun, 6 Apr 2025 11:08:27 +0800 Subject: [PATCH] Fix SculkCatalyst exp skip (#452) (#455) --- .../0008-Fix-SculkCatalyst-exp-skip.patch | 59 +++++++++++++++++++ .../0120-Fix-SculkCatalyst-exp-skip.patch | 49 +++++++++++++++ .../0016-Fix-SculkCatalyst-exp-skip.patch | 35 +++++++++++ 3 files changed, 143 insertions(+) create mode 100644 leaves-api/paper-patches/features/0008-Fix-SculkCatalyst-exp-skip.patch create mode 100644 leaves-server/minecraft-patches/features/0120-Fix-SculkCatalyst-exp-skip.patch create mode 100644 leaves-server/paper-patches/features/0016-Fix-SculkCatalyst-exp-skip.patch diff --git a/leaves-api/paper-patches/features/0008-Fix-SculkCatalyst-exp-skip.patch b/leaves-api/paper-patches/features/0008-Fix-SculkCatalyst-exp-skip.patch new file mode 100644 index 00000000..5db9e044 --- /dev/null +++ b/leaves-api/paper-patches/features/0008-Fix-SculkCatalyst-exp-skip.patch @@ -0,0 +1,59 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Sun, 6 Apr 2025 10:42:47 +0800 +Subject: [PATCH] Fix SculkCatalyst exp skip + + +diff --git a/src/main/java/org/bukkit/event/entity/EntityDeathEvent.java b/src/main/java/org/bukkit/event/entity/EntityDeathEvent.java +index 42ffb81708b327f765ba3235fdd1ab69cd7589fd..0a7e37420f8d024ffba1fd1c52edc50c10408e6e 100644 +--- a/src/main/java/org/bukkit/event/entity/EntityDeathEvent.java ++++ b/src/main/java/org/bukkit/event/entity/EntityDeathEvent.java +@@ -25,17 +25,25 @@ public class EntityDeathEvent extends EntityEvent implements org.bukkit.event.Ca + private float deathSoundVolume; + private float deathSoundPitch; + // Paper end ++ private int rewardExp; // Leaves - exp fix + + public EntityDeathEvent(@NotNull final LivingEntity entity, @NotNull DamageSource damageSource, @NotNull final List drops) { + this(entity, damageSource, drops, 0); + } + + public EntityDeathEvent(@NotNull final LivingEntity what, @NotNull DamageSource damageSource, @NotNull final List drops, final int droppedExp) { ++ // Leaves start - exp fix ++ this(what, damageSource, drops, droppedExp, droppedExp); ++ } ++ ++ public EntityDeathEvent(@NotNull final LivingEntity what, @NotNull DamageSource damageSource, @NotNull final List drops, final int droppedExp, final int rewardExp) { + super(what); + this.damageSource = damageSource; + this.drops = drops; + this.dropExp = droppedExp; ++ this.rewardExp = rewardExp; + } ++ // Leaves end - exp fix + + @NotNull + @Override +@@ -75,6 +83,7 @@ public class EntityDeathEvent extends EntityEvent implements org.bukkit.event.Ca + */ + public void setDroppedExp(int exp) { + this.dropExp = exp; ++ this.rewardExp = exp; // Leaves - exp fix + } + + /** +@@ -226,4 +235,14 @@ public class EntityDeathEvent extends EntityEvent implements org.bukkit.event.Ca + this.deathSoundPitch = pitch; + } + // Paper end ++ ++ // Leaves start - exp fix ++ public int getRewardExp() { ++ return rewardExp; ++ } ++ ++ public void setRewardExp(int rewardExp) { ++ this.rewardExp = rewardExp; ++ } ++ // Leaves end - exp fix + } diff --git a/leaves-server/minecraft-patches/features/0120-Fix-SculkCatalyst-exp-skip.patch b/leaves-server/minecraft-patches/features/0120-Fix-SculkCatalyst-exp-skip.patch new file mode 100644 index 00000000..49210e9e --- /dev/null +++ b/leaves-server/minecraft-patches/features/0120-Fix-SculkCatalyst-exp-skip.patch @@ -0,0 +1,49 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Sun, 6 Apr 2025 10:42:45 +0800 +Subject: [PATCH] Fix SculkCatalyst exp skip + + +diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java +index b1b738bcd20cbc927bdbac6ab10e28f79fd8a23b..e61e5c5b3777c8861f090ada2a4ddaaf88116329 100644 +--- a/net/minecraft/world/entity/LivingEntity.java ++++ b/net/minecraft/world/entity/LivingEntity.java +@@ -293,6 +293,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + protected float appliedScale = 1.0F; + // CraftBukkit start + public int expToDrop; ++ public int expToReward; // Leaves - exp fix + public ArrayList drops = new ArrayList<>(); // Paper - Restore vanilla drops behavior + public final org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes; + public boolean collides = true; +@@ -1743,6 +1744,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + entity.killedEntity((ServerLevel) this.level(), this); + } + this.gameEvent(GameEvent.ENTITY_DIE); ++ if (!this.wasExperienceConsumed()) this.dropExperience((ServerLevel) this.level(), damageSource.getEntity()); // Leaves - exp fix + } else { + this.dead = false; + this.setHealth((float) deathEvent.getReviveHealth()); +@@ -1817,7 +1819,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + this.drops = new ArrayList<>(); + // this.dropEquipment(level); // CraftBukkit - moved up + // CraftBukkit end +- this.dropExperience(level, damageSource.getEntity()); ++ // this.dropExperience(level, damageSource.getEntity()); // Leaves - exp fix + return deathEvent; // Paper + } + +diff --git a/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java b/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java +index 1638eccef431fb68775af624110f1968f0c6dabd..117748f385cecabef890d27af55d88abee6adf4b 100644 +--- a/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java +@@ -96,8 +96,7 @@ public class SculkCatalystBlockEntity extends BlockEntity implements GameEventLi + public boolean handleGameEvent(ServerLevel level, Holder gameEvent, GameEvent.Context context, Vec3 pos) { + if (gameEvent.is(GameEvent.ENTITY_DIE) && context.sourceEntity() instanceof LivingEntity livingEntity) { + if (!livingEntity.wasExperienceConsumed()) { +- DamageSource lastDamageSource = livingEntity.getLastDamageSource(); +- int experienceReward = livingEntity.getExperienceReward(level, Optionull.map(lastDamageSource, DamageSource::getEntity)); ++ int experienceReward = livingEntity.expToReward; // Leaves - exp fix + if (livingEntity.shouldDropExperience() && experienceReward > 0) { + this.sculkSpreader.addCursors(BlockPos.containing(pos.relative(Direction.UP, 0.5)), experienceReward); + this.tryAwardItSpreadsAdvancement(level, livingEntity); diff --git a/leaves-server/paper-patches/features/0016-Fix-SculkCatalyst-exp-skip.patch b/leaves-server/paper-patches/features/0016-Fix-SculkCatalyst-exp-skip.patch new file mode 100644 index 00000000..f0d02db7 --- /dev/null +++ b/leaves-server/paper-patches/features/0016-Fix-SculkCatalyst-exp-skip.patch @@ -0,0 +1,35 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Sun, 6 Apr 2025 10:42:46 +0800 +Subject: [PATCH] Fix SculkCatalyst exp skip + + +diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +index fa122a6a0c56cab95d366618845c3afd2654def7..2c61032304461cecd0843dec15ef06492ba23f7a 100644 +--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java ++++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +@@ -991,7 +991,7 @@ public class CraftEventFactory { + CraftLivingEntity entity = (CraftLivingEntity) victim.getBukkitEntity(); + CraftDamageSource bukkitDamageSource = new CraftDamageSource(damageSource); + CraftWorld world = (CraftWorld) entity.getWorld(); +- EntityDeathEvent event = new EntityDeathEvent(entity, bukkitDamageSource, new io.papermc.paper.util.TransformingRandomAccessList<>(drops, Entity.DefaultDrop::stack, FROM_FUNCTION), victim.getExpReward(world.getHandle(), damageSource.getEntity())); // Paper - Restore vanilla drops behavior ++ EntityDeathEvent event = new EntityDeathEvent(entity, bukkitDamageSource, new io.papermc.paper.util.TransformingRandomAccessList<>(drops, Entity.DefaultDrop::stack, FROM_FUNCTION), victim.getExpReward(world.getHandle(), damageSource.getEntity()), victim.getExperienceReward(world.getHandle(), damageSource.getEntity())); // Paper - Restore vanilla drops behavior // Leaves - exp fix + populateFields(victim, event); // Paper - make cancellable + Bukkit.getServer().getPluginManager().callEvent(event); + +@@ -1002,6 +1002,7 @@ public class CraftEventFactory { + playDeathSound(victim, event); + // Paper end + victim.expToDrop = event.getDroppedExp(); ++ victim.expToReward = event.getRewardExp(); // Leaves - exp fix + lootCheck.run(); // Paper - advancement triggers before destroying items + + // Paper start - Restore vanilla drops behavior +@@ -1041,6 +1042,7 @@ public class CraftEventFactory { + victim.newLevel = event.getNewLevel(); + victim.newTotalExp = event.getNewTotalExp(); + victim.expToDrop = event.getDroppedExp(); ++ victim.expToReward = event.getRewardExp(); // Leaves - exp fix + victim.newExp = event.getNewExp(); + + // Paper start - Restore vanilla drops behavior