mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
Upstream has released updates that appear to apply and compile correctly Paper Changes: PaperMC/Paper@f7e3976 Revert "Legacy data should look for legacy materials (Fixes #6618)" (Fixes #6664) PaperMC/Paper@ce1e7e8 Fix jline relocation (#6677) PaperMC/Paper@3e8fb21 Suggest PlayerPostRespawnEvent if changing player state (#6679) PaperMC/Paper@2b404b0 Fix nullability on Block#breakNaturally (#6651) PaperMC/Paper@8ee9bdd Fix stacktrace deobf where thrownProxy got initialized before rewriting (#6684) PaperMC/Paper@fce7905 Option to prevent NBT copy in smithing recipes (#6671) PaperMC/Paper@3b2b835 Fix click event when vanilla scoreboard name coloring is enabled (#6652) PaperMC/Paper@425edfa More CommandBlock API (#5746) PaperMC/Paper@6847f57 Improve ItemStack#editMeta (#6502) PaperMC/Paper@6703c13 Preserve overstacked loot (#5943) PaperMC/Paper@0032236 Make Levels Use Correct Spawn Settings (#6419) PaperMC/Paper@4a27a4a Update head rotation in missing places (#5481) PaperMC/Paper@ebfd70b Use null for null resource pack prompts (#6572) PaperMC/Paper@826acaf Fix plugin provides load order (#6687) PaperMC/Paper@f905057 Prevent unintended light block manipulation (#6601) PaperMC/Paper@45c4f90 Readd root/admin user detection (#6593) PaperMC/Paper@e8830b2 Revert "Readd root/admin user detection (#6593)" (#6699) PaperMC/Paper@cc38c16 Updated Upstream (Bukkit/CraftBukkit) (#6638) PaperMC/Paper@7dd7c0c [ci skip] update issue template to remove checkboxes and add datapacks (#6702) PaperMC/Paper@bde7b98 Make legacyRenderer a ViewerUnaware renderer (#6691) PaperMC/Paper@e391591 Update paperweight to 1.1.12 (#6653) PaperMC/Paper@e14aff9 Don't count named piglins and hoglins towards mob cap (#6452) PaperMC/Paper@a978f41 Start console thread after PaperConfig & MinecraftServer.console are initialized (#6716) PaperMC/Paper@b1f0cbd [ci skip] Remove redundant/broken readme badges (#6715) PaperMC/Paper@e3ef498 [ci skip] remove markdown from issue template (#6705) PaperMC/Paper@7ebf08a Handle missing Spawn Egg item meta for 1.17 mobs (#6700) PaperMC/Paper@90f717f Add missing team sidebar display slots (#6690)
198 lines
8.3 KiB
Diff
198 lines
8.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
|
Date: Fri, 28 May 2021 12:24:45 -0500
|
|
Subject: [PATCH] Fix advancement triggers on entity death
|
|
|
|
This fixes PaperMC/Paper#3729 and PaperMC/Paper#4252
|
|
|
|
Paper changes logical order revolving around making the EntityDeathEvent
|
|
cancellable. Reordering this logic has ended up with entity equipment being
|
|
cleared _before_ advancement criteria can run, causing things like killing
|
|
raid captains not giving the voluntary exile advancement.
|
|
|
|
This fixes the issue by storing a copy of the equipment in a new field just
|
|
before doing the death event logic where the equipment is cleared and then
|
|
restoring it back to the entity just before the criterion triggers run and
|
|
then finally clearing the equipment again right after the criterion is done.
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
index 214bc2bcbcb88a9a62d2151a62aaa57beadc7da0..6d7a2eece40e5c665d6ec6f21f8a342e350fbec4 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -1661,10 +1661,13 @@ public abstract class LivingEntity extends Entity {
|
|
}
|
|
|
|
// Paper start
|
|
+ List<List<ItemStack>> equipmentSnapshotBefore = this.cloneEquipment(); // Purpur
|
|
org.bukkit.event.entity.EntityDeathEvent deathEvent = this.dropAllDeathLoot(source);
|
|
if (deathEvent == null || !deathEvent.isCancelled()) {
|
|
if (this.deathScore >= 0 && entityliving != null) {
|
|
+ this.restoreEquipment(equipmentSnapshotBefore); // Purpur
|
|
entityliving.awardKillScore(this, this.deathScore, source);
|
|
+ this.clearEquipment(); // Purpur
|
|
}
|
|
|
|
if (this.isSleeping()) {
|
|
@@ -2548,6 +2551,12 @@ public abstract class LivingEntity extends Entity {
|
|
@Override
|
|
public abstract void setItemSlot(EquipmentSlot slot, ItemStack stack);
|
|
|
|
+ // Purpur start
|
|
+ public abstract List<List<ItemStack>> cloneEquipment();
|
|
+ public abstract void restoreEquipment(List<List<ItemStack>> list);
|
|
+ public abstract void clearEquipment();
|
|
+ // Purpur end
|
|
+
|
|
protected void verifyEquippedItem(ItemStack stack) {
|
|
CompoundTag nbttagcompound = stack.getTag();
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
|
|
index 5e62ecb980199f8dba97703403ef811167a24ec5..0f8e261912feac68bdc8119d7368d8719618e787 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/Mob.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
|
|
@@ -1026,6 +1026,41 @@ public abstract class Mob extends LivingEntity {
|
|
|
|
}
|
|
|
|
+ // Purpur start
|
|
+ public List<List<ItemStack>> cloneEquipment() {
|
|
+ List<List<ItemStack>> list = new java.util.ArrayList<>();
|
|
+ List<ItemStack> handItems = new java.util.ArrayList<>();
|
|
+ for (ItemStack item : this.handItems) {
|
|
+ handItems.add(item.copy());
|
|
+ }
|
|
+ list.add(handItems);
|
|
+ List<ItemStack> armorItems = new java.util.ArrayList<>();
|
|
+ for (ItemStack item : this.armorItems) {
|
|
+ armorItems.add(item.copy());
|
|
+ }
|
|
+ list.add(armorItems);
|
|
+ return list;
|
|
+ }
|
|
+
|
|
+ public void restoreEquipment(List<List<ItemStack>> list) {
|
|
+ this.handItems.clear();
|
|
+ List<ItemStack> handItems = list.get(0);
|
|
+ for (int i = 0; i < handItems.size(); i++) {
|
|
+ this.handItems.set(i, handItems.get(1));
|
|
+ }
|
|
+ this.armorItems.clear();
|
|
+ List<ItemStack> armorItems = list.get(1);
|
|
+ for (int i = 0; i < armorItems.size(); i++) {
|
|
+ this.armorItems.set(i, armorItems.get(i));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void clearEquipment() {
|
|
+ this.handItems.clear();
|
|
+ this.armorItems.clear();
|
|
+ }
|
|
+ // Purpur end
|
|
+
|
|
@Override
|
|
protected void dropCustomDeathLoot(DamageSource source, int lootingMultiplier, boolean allowDrops) {
|
|
super.dropCustomDeathLoot(source, lootingMultiplier, allowDrops);
|
|
diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
|
|
index 31454b15a20e0484e21c25ffb80d4d536e2ecc0b..4fd44e58e9b83f45a66562f53710ee647b7e2b1b 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
|
|
@@ -205,6 +205,41 @@ public class ArmorStand extends LivingEntity {
|
|
this.noTickEquipmentDirty = true; // Paper - Allow equipment to be updated even when tick disabled
|
|
}
|
|
|
|
+ // Purpur start
|
|
+ public List<List<ItemStack>> cloneEquipment() {
|
|
+ List<List<ItemStack>> list = new java.util.ArrayList<>();
|
|
+ List<ItemStack> handItems = new java.util.ArrayList<>();
|
|
+ for (ItemStack item : this.handItems) {
|
|
+ handItems.add(item.copy());
|
|
+ }
|
|
+ list.add(handItems);
|
|
+ List<ItemStack> armorItems = new java.util.ArrayList<>();
|
|
+ for (ItemStack item : this.armorItems) {
|
|
+ armorItems.add(item.copy());
|
|
+ }
|
|
+ list.add(armorItems);
|
|
+ return list;
|
|
+ }
|
|
+
|
|
+ public void restoreEquipment(List<List<ItemStack>> list) {
|
|
+ this.handItems.clear();
|
|
+ List<ItemStack> handItems = list.get(0);
|
|
+ for (int i = 0; i < handItems.size(); i++) {
|
|
+ this.handItems.set(i, handItems.get(1));
|
|
+ }
|
|
+ this.armorItems.clear();
|
|
+ List<ItemStack> armorItems = list.get(1);
|
|
+ for (int i = 0; i < armorItems.size(); i++) {
|
|
+ this.armorItems.set(i, armorItems.get(1));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void clearEquipment() {
|
|
+ this.handItems.clear();
|
|
+ this.armorItems.clear();
|
|
+ }
|
|
+ // Purpur end
|
|
+
|
|
@Override
|
|
public boolean canTakeItem(ItemStack stack) {
|
|
net.minecraft.world.entity.EquipmentSlot enumitemslot = Mob.getEquipmentSlotForItem(stack);
|
|
diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
index c6267fa6832596c1c0944cecbbe0e4ed0eb3e0b8..dc26629d7aa1fc82dbc9902c807312cd814e5465 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
@@ -1991,6 +1991,52 @@ public abstract class Player extends LivingEntity {
|
|
|
|
}
|
|
|
|
+ // Purpur start
|
|
+ public List<List<ItemStack>> cloneEquipment() {
|
|
+ List<List<ItemStack>> list = new java.util.ArrayList<>();
|
|
+ List<ItemStack> invItems = new java.util.ArrayList<>();
|
|
+ for (ItemStack item : this.inventory.items) {
|
|
+ invItems.add(item.copy());
|
|
+ }
|
|
+ list.add(invItems);
|
|
+ List<ItemStack> armorItems = new java.util.ArrayList<>();
|
|
+ for (ItemStack item : this.inventory.armor) {
|
|
+ armorItems.add(item.copy());
|
|
+ }
|
|
+ list.add(armorItems);
|
|
+ List<ItemStack> offhandItems = new java.util.ArrayList<>();
|
|
+ for (ItemStack item : this.inventory.offhand) {
|
|
+ offhandItems.add(item.copy());
|
|
+ }
|
|
+ list.add(offhandItems);
|
|
+ return list;
|
|
+ }
|
|
+
|
|
+ public void restoreEquipment(List<List<ItemStack>> list) {
|
|
+ this.inventory.items.clear();
|
|
+ List<ItemStack> invItems = list.get(0);
|
|
+ for (int i = 0; i < invItems.size(); i++) {
|
|
+ this.inventory.items.set(i, invItems.get(1));
|
|
+ }
|
|
+ this.inventory.armor.clear();
|
|
+ List<ItemStack> armorItems = list.get(1);
|
|
+ for (int i = 0; i < armorItems.size(); i++) {
|
|
+ this.inventory.armor.set(i, armorItems.get(1));
|
|
+ }
|
|
+ this.inventory.offhand.clear();
|
|
+ List<ItemStack> offhandItems = list.get(2);
|
|
+ for (int i = 0; i < offhandItems.size(); i++) {
|
|
+ this.inventory.offhand.set(i, offhandItems.get(1));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void clearEquipment() {
|
|
+ this.inventory.items.clear();
|
|
+ this.inventory.armor.clear();
|
|
+ this.inventory.offhand.clear();
|
|
+ }
|
|
+ // Purpur end
|
|
+
|
|
public boolean addItem(ItemStack stack) {
|
|
this.equipEventAndSound(stack);
|
|
return this.inventory.add(stack);
|