82 lines
5.2 KiB
Diff
82 lines
5.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Helvetica Volubi <suisuroru@blue-millennium.fun>
|
|
Date: Mon, 28 Apr 2025 22:51:32 +0800
|
|
Subject: [PATCH] Leaves: Fix SculkCatalyst exp skip
|
|
|
|
Co-authored by: violetc <58360096+s-yh-china@users.noreply.github.com>
|
|
As part of: Leaves (https://github.com/LeavesMC/Leaves/blob/f553c53e4230aa032e54a69b6479f1959ed24a60/leaves-server/paper-patches/features/0016-Fix-SculkCatalyst-exp-skip.patch)
|
|
Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html)
|
|
|
|
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
|
index ca67950e35c7f420846337e885d95b8eabca3f37..d9ea3db817878ff56a2772ce983ff95431e1326c 100644
|
|
--- a/net/minecraft/server/level/ServerPlayer.java
|
|
+++ b/net/minecraft/server/level/ServerPlayer.java
|
|
@@ -1358,7 +1358,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
|
}
|
|
|
|
// SPIGOT-5478 must be called manually now
|
|
- if (event.shouldDropExperience()) this.dropExperience(this.serverLevel(), cause.getEntity()); // Paper - tie to event
|
|
+ if (shouldDropExperience(event.shouldDropExperience(), event.forceUseEventDropStatus())) this.dropExperience(this.serverLevel(), cause.getEntity()); // Paper - tie to event // Leaves - exp fix
|
|
// we clean the player's inventory after the EntityDeathEvent is called so plugins can get the exact state of the inventory.
|
|
if (!event.getKeepInventory()) {
|
|
// Paper start - PlayerDeathEvent#getItemsToKeep
|
|
@@ -1392,6 +1392,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
|
this.setClientLoaded(false);
|
|
}
|
|
|
|
+ // Leaves start - exp fix
|
|
+ private boolean shouldDropExperience(boolean eventResult, boolean forceUseEvent) {
|
|
+ if (forceUseEvent) {
|
|
+ return eventResult;
|
|
+ }
|
|
+ return wasExperienceConsumed() ? false : eventResult;
|
|
+ }
|
|
+ // Leaves end - exp fix
|
|
+
|
|
private void tellNeutralMobsThatIDied() {
|
|
AABB aabb = new AABB(this.blockPosition()).inflate(32.0, 10.0, 32.0);
|
|
this.level()
|
|
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
|
|
index 2293c3db45e9ecce4e0d4b2f87b8e90228e44d94..658aa09aecf8d64145feedb82dc9be2a55201450 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<DefaultDrop> drops = new ArrayList<>(); // Paper - Restore vanilla drops behavior
|
|
public final org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes;
|
|
public boolean collides = true;
|
|
@@ -1761,6 +1762,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());
|
|
@@ -1835,7 +1837,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 bd6693af6412fb08a28ca9a71d5c70d54f72c6e6..8c2e35d087150fb0fc67c7457a4af9298f4b41e1 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, 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);
|