SPIGOT-7650: Add DamageSource for EntityDeathEvent and PlayerDeathEvent

This commit is contained in:
Doc 2024-05-04 08:16:00 +10:00 committed by md_5
parent 741b844806
commit c024a50393
No known key found for this signature in database
GPG Key ID: E8E901AC7C617C11
4 changed files with 44 additions and 13 deletions

View File

@ -349,7 +349,7 @@
+ +
+ String deathmessage = defaultMessage.getString(); + String deathmessage = defaultMessage.getString();
+ keepLevel = keepInventory; // SPIGOT-2222: pre-set keepLevel + keepLevel = keepInventory; // SPIGOT-2222: pre-set keepLevel
+ org.bukkit.event.entity.PlayerDeathEvent event = CraftEventFactory.callPlayerDeathEvent(this, loot, deathmessage, keepInventory); + org.bukkit.event.entity.PlayerDeathEvent event = CraftEventFactory.callPlayerDeathEvent(this, damagesource, loot, deathmessage, keepInventory);
+ +
+ // SPIGOT-943 - only call if they have an inventory open + // SPIGOT-943 - only call if they have an inventory open
+ if (this.containerMenu != this.inventoryMenu) { + if (this.containerMenu != this.inventoryMenu) {

View File

@ -596,7 +596,7 @@
this.dropCustomDeathLoot(damagesource, i, flag); this.dropCustomDeathLoot(damagesource, i, flag);
} }
+ // CraftBukkit start - Call death event + // CraftBukkit start - Call death event
+ CraftEventFactory.callEntityDeathEvent(this, this.drops); + CraftEventFactory.callEntityDeathEvent(this, damagesource, this.drops);
+ this.drops = new ArrayList<>(); + this.drops = new ArrayList<>();
+ // CraftBukkit end + // CraftBukkit end

View File

@ -81,7 +81,7 @@
this.setItemSlot(enumitemslot, itemstack.copyWithCount(1)); this.setItemSlot(enumitemslot, itemstack.copyWithCount(1));
return true; return true;
} else if (!itemstack.isEmpty() && itemstack.getCount() > 1) { } else if (!itemstack.isEmpty() && itemstack.getCount() > 1) {
@@ -423,15 +465,26 @@ @@ -423,18 +465,29 @@
entityhuman.setItemInHand(enumhand, itemstack1); entityhuman.setItemInHand(enumhand, itemstack1);
return true; return true;
} }
@ -92,12 +92,13 @@
public boolean hurt(DamageSource damagesource, float f) { public boolean hurt(DamageSource damagesource, float f) {
if (!this.level().isClientSide && !this.isRemoved()) { if (!this.level().isClientSide && !this.isRemoved()) {
if (damagesource.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { if (damagesource.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) {
- this.kill();
+ // CraftBukkit start + // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) { + if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) {
+ return false; + return false;
+ } + }
+ this.kill(damagesource); // CraftBukkit
+ // CraftBukkit end + // CraftBukkit end
this.kill();
return false; return false;
- } else if (!this.isInvulnerableTo(damagesource) && !this.invisible && !this.isMarker()) { - } else if (!this.isInvulnerableTo(damagesource) && !this.invisible && !this.isMarker()) {
+ } else if (!this.isInvulnerableTo(damagesource) && (true || !this.invisible) && !this.isMarker()) { // CraftBukkit + } else if (!this.isInvulnerableTo(damagesource) && (true || !this.invisible) && !this.isMarker()) { // CraftBukkit
@ -108,7 +109,20 @@
+ // CraftBukkit end + // CraftBukkit end
if (damagesource.is(DamageTypeTags.IS_EXPLOSION)) { if (damagesource.is(DamageTypeTags.IS_EXPLOSION)) {
this.brokenByAnything(damagesource); this.brokenByAnything(damagesource);
this.kill(); - this.kill();
+ this.kill(damagesource); // CraftBukkit
return false;
} else if (damagesource.is(DamageTypeTags.IGNITES_ARMOR_STANDS)) {
if (this.isOnFire()) {
@@ -467,7 +520,7 @@
if (damagesource.isCreativePlayer()) {
this.playBrokenSound();
this.showBreakingParticles();
- this.kill();
+ this.kill(damagesource); // CraftBukkit
return true;
} else {
long i = this.level().getGameTime();
@@ -479,7 +532,7 @@ @@ -479,7 +532,7 @@
} else { } else {
this.brokenByPlayer(damagesource); this.brokenByPlayer(damagesource);
@ -118,6 +132,15 @@
} }
return true; return true;
@@ -532,7 +585,7 @@
f1 -= f;
if (f1 <= 0.5F) {
this.brokenByAnything(damagesource);
- this.kill();
+ this.kill(damagesource); // CraftBukkit
} else {
this.setHealth(f1);
this.gameEvent(GameEvent.ENTITY_DAMAGE, damagesource.getEntity());
@@ -544,13 +597,13 @@ @@ -544,13 +597,13 @@
ItemStack itemstack = new ItemStack(Items.ARMOR_STAND); ItemStack itemstack = new ItemStack(Items.ARMOR_STAND);
@ -156,7 +179,7 @@
} }
@@ -660,9 +714,17 @@ @@ -660,9 +714,23 @@
return this.isSmall(); return this.isSmall();
} }
@ -170,8 +193,14 @@
@Override @Override
public void kill() { public void kill() {
- this.remove(Entity.RemovalReason.KILLED); - this.remove(Entity.RemovalReason.KILLED);
+ org.bukkit.craftbukkit.event.CraftEventFactory.callEntityDeathEvent(this, drops); // CraftBukkit - call event + // CraftBukkit start - pass DamageSource for kill
+ this.kill(null);
+ }
+
+ public void kill(DamageSource damageSource) {
+ org.bukkit.craftbukkit.event.CraftEventFactory.callEntityDeathEvent(this, (damageSource == null ? this.damageSources().genericKill() : damageSource), drops); // CraftBukkit - call event
+ this.remove(Entity.RemovalReason.KILLED, EntityRemoveEvent.Cause.DEATH); // CraftBukkit - add Bukkit remove cause + this.remove(Entity.RemovalReason.KILLED, EntityRemoveEvent.Cause.DEATH); // CraftBukkit - add Bukkit remove cause
+ // CraftBukkit end
this.gameEvent(GameEvent.ENTITY_DIE); this.gameEvent(GameEvent.ENTITY_DIE);
} }

View File

@ -880,13 +880,14 @@ public class CraftEventFactory {
return !event.isCancelled(); return !event.isCancelled();
} }
public static EntityDeathEvent callEntityDeathEvent(EntityLiving victim) { public static EntityDeathEvent callEntityDeathEvent(EntityLiving victim, DamageSource damageSource) {
return callEntityDeathEvent(victim, new ArrayList<org.bukkit.inventory.ItemStack>(0)); return callEntityDeathEvent(victim, damageSource, new ArrayList<org.bukkit.inventory.ItemStack>(0));
} }
public static EntityDeathEvent callEntityDeathEvent(EntityLiving victim, List<org.bukkit.inventory.ItemStack> drops) { public static EntityDeathEvent callEntityDeathEvent(EntityLiving victim, DamageSource damageSource, List<org.bukkit.inventory.ItemStack> drops) {
CraftLivingEntity entity = (CraftLivingEntity) victim.getBukkitEntity(); CraftLivingEntity entity = (CraftLivingEntity) victim.getBukkitEntity();
EntityDeathEvent event = new EntityDeathEvent(entity, drops, victim.getExpReward()); CraftDamageSource bukkitDamageSource = new CraftDamageSource(damageSource);
EntityDeathEvent event = new EntityDeathEvent(entity, bukkitDamageSource, drops, victim.getExpReward());
CraftWorld world = (CraftWorld) entity.getWorld(); CraftWorld world = (CraftWorld) entity.getWorld();
Bukkit.getServer().getPluginManager().callEvent(event); Bukkit.getServer().getPluginManager().callEvent(event);
@ -901,9 +902,10 @@ public class CraftEventFactory {
return event; return event;
} }
public static PlayerDeathEvent callPlayerDeathEvent(EntityPlayer victim, List<org.bukkit.inventory.ItemStack> drops, String deathMessage, boolean keepInventory) { public static PlayerDeathEvent callPlayerDeathEvent(EntityPlayer victim, DamageSource damageSource, List<org.bukkit.inventory.ItemStack> drops, String deathMessage, boolean keepInventory) {
CraftPlayer entity = victim.getBukkitEntity(); CraftPlayer entity = victim.getBukkitEntity();
PlayerDeathEvent event = new PlayerDeathEvent(entity, drops, victim.getExpReward(), 0, deathMessage); CraftDamageSource bukkitDamageSource = new CraftDamageSource(damageSource);
PlayerDeathEvent event = new PlayerDeathEvent(entity, bukkitDamageSource, drops, victim.getExpReward(), 0, deathMessage);
event.setKeepInventory(keepInventory); event.setKeepInventory(keepInventory);
event.setKeepLevel(victim.keepLevel); // SPIGOT-2222: pre-set keepLevel event.setKeepLevel(victim.keepLevel); // SPIGOT-2222: pre-set keepLevel
org.bukkit.World world = entity.getWorld(); org.bukkit.World world = entity.getWorld();