Skip to content

Commit 34cf3ab

Browse files
authored
Fix loot tables being reset before death event (#13886)
1 parent fd45f4b commit 34cf3ab

3 files changed

Lines changed: 19 additions & 6 deletions

File tree

paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -930,7 +930,7 @@
930930
+ killer.awardKillScore(this, source);
931931
+ }
932932
+ }); // Paper end
933-
+ this.postDeathDropItems(deathEvent); // Paper
933+
+ if (!deathEvent.isCancelled()) this.postDeathEventCallback(); // Paper - post death event logic
934934
+ this.drops = new java.util.ArrayList<>();
935935
+ // this.dropEquipment(level); // CraftBukkit - moved up
936936
+ // CraftBukkit end
@@ -940,7 +940,7 @@
940940

941941
protected void dropEquipment(final ServerLevel level) {
942942
}
943-
+ protected void postDeathDropItems(org.bukkit.event.entity.EntityDeathEvent event) {} // Paper - method for post death logic that cannot be ran before the event is potentially cancelled
943+
+ protected void postDeathEventCallback() {} // Paper - method for post death logic that must be ran if the event isn't cancelled
944944

945945
- protected void dropExperience(final ServerLevel level, final @Nullable Entity killer) {
946946
+ public int getExpReward(final ServerLevel level, final @Nullable Entity killer) { // CraftBukkit

paper-server/patches/sources/net/minecraft/world/entity/Mob.java.patch

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
this.dropChances = input.read("drop_chances", DropChances.CODEC).orElse(DropChances.DEFAULT);
109109
this.readLeashData(input);
110110
this.homeRadius = input.getIntOr("home_radius", -1);
111-
@@ -401,6 +_,13 @@
111+
@@ -401,11 +_,24 @@
112112
this.lootTable = input.read("DeathLootTable", LootTable.KEY_CODEC);
113113
this.lootTableSeed = input.getLongOr("DeathLootTableSeed", 0L);
114114
this.setNoAi(input.getBooleanOr("NoAI", false));
@@ -122,6 +122,17 @@
122122
}
123123

124124
@Override
125+
protected void dropFromLootTable(final ServerLevel level, final DamageSource source, final boolean playerKilled) {
126+
super.dropFromLootTable(level, source, playerKilled);
127+
+ // Paper start - delay loot table removal to after death event
128+
+ }
129+
+ @Override
130+
+ protected void postDeathEventCallback() {
131+
+ if (!this.shouldDropLoot((ServerLevel) this.level())) return; // This callback can only be ran if the level is a ServerLevel
132+
+ // Paper end - delay loot table removal to after death event
133+
this.lootTable = Optional.empty();
134+
}
135+
125136
@@ -465,6 +_,11 @@
126137
for (ItemEntity entity : this.level()
127138
.getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate(pickupReach.getX(), pickupReach.getY(), pickupReach.getZ()))) {

paper-server/patches/sources/net/minecraft/world/entity/animal/equine/AbstractChestedHorse.java.patch

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
--- a/net/minecraft/world/entity/animal/equine/AbstractChestedHorse.java
22
+++ b/net/minecraft/world/entity/animal/equine/AbstractChestedHorse.java
3-
@@ -74,6 +_,12 @@
3+
@@ -75,6 +_,16 @@
44
super.dropEquipment(level);
55
if (this.hasChest()) {
66
this.spawnAtLocation(level, Blocks.CHEST);
77
+ // Paper start - moved to post death logic
88
+ }
99
+ }
10-
+ protected void postDeathDropItems(org.bukkit.event.entity.EntityDeathEvent event) {
11-
+ if (this.hasChest() && !event.isCancelled()) {
10+
+ @Override
11+
+ protected void postDeathEventCallback() {
12+
+ super.postDeathEventCallback();
13+
+ if (this.hasChest()) {
1214
+ // Paper end - moved to post death logic
1315
this.setChest(false);
1416
}

0 commit comments

Comments
 (0)