mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-25 12:05:53 +01:00
235 lines
15 KiB
Diff
235 lines
15 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Sat, 9 Mar 2024 14:13:04 -0800
|
|
Subject: [PATCH] Fix DamageSource API
|
|
|
|
Uses the correct entity in the EntityDamageByEntity event
|
|
Returns the correct entity for API's DamageSource#getCausingEntity
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
|
|
index aee26dd78953ff43306aaa64161f5b9edcdd4b83..bb1a60180e58c1333e7bb33e8acf1b0225eda8a8 100644
|
|
--- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java
|
|
+++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
|
|
@@ -29,8 +29,8 @@ public class DamageSource {
|
|
private boolean sweep = false;
|
|
private boolean melting = false;
|
|
private boolean poison = false;
|
|
- private Entity customEntityDamager = null; // This field is a helper for when direct entity damage is not set by vanilla
|
|
- private Entity customCausingEntityDamager = null; // This field is a helper for when causing entity damage is not set by vanilla
|
|
+ @Nullable
|
|
+ private Entity customEventDamager = null; // This field is a helper for when causing entity damage is not set by vanilla // Paper - fix DamageSource API
|
|
|
|
public DamageSource sweep() {
|
|
this.sweep = true;
|
|
@@ -59,33 +59,19 @@ public class DamageSource {
|
|
return this.poison;
|
|
}
|
|
|
|
- public Entity getDamager() {
|
|
- return (this.customEntityDamager != null) ? this.customEntityDamager : this.directEntity;
|
|
- }
|
|
-
|
|
- public Entity getCausingDamager() {
|
|
- return (this.customCausingEntityDamager != null) ? this.customCausingEntityDamager : this.causingEntity;
|
|
- }
|
|
-
|
|
- public DamageSource customEntityDamager(Entity entity) {
|
|
- // This method is not intended for change the causing entity if is already set
|
|
- // also is only necessary if the entity passed is not the direct entity or different from the current causingEntity
|
|
- if (this.customEntityDamager != null || this.directEntity == entity || this.causingEntity == entity) {
|
|
- return this;
|
|
- }
|
|
- DamageSource damageSource = this.cloneInstance();
|
|
- damageSource.customEntityDamager = entity;
|
|
- return damageSource;
|
|
+ // Paper start - fix DamageSource API
|
|
+ @Nullable
|
|
+ public Entity getCustomEventDamager() {
|
|
+ return (this.customEventDamager != null) ? this.customEventDamager : this.directEntity;
|
|
}
|
|
|
|
- public DamageSource customCausingEntityDamager(Entity entity) {
|
|
- // This method is not intended for change the causing entity if is already set
|
|
- // also is only necessary if the entity passed is not the direct entity or different from the current causingEntity
|
|
- if (this.customCausingEntityDamager != null || this.directEntity == entity || this.causingEntity == entity) {
|
|
- return this;
|
|
+ public DamageSource customEventDamager(Entity entity) {
|
|
+ if (this.directEntity != null) {
|
|
+ throw new IllegalStateException("Cannot set custom event damager when direct entity is already set (report a bug to Paper)");
|
|
}
|
|
DamageSource damageSource = this.cloneInstance();
|
|
- damageSource.customCausingEntityDamager = entity;
|
|
+ damageSource.customEventDamager = entity;
|
|
+ // Paper end - fix DamageSource API
|
|
return damageSource;
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSources.java b/src/main/java/net/minecraft/world/damagesource/DamageSources.java
|
|
index caf1d79e2bbdd257a5439e2973653747e678805f..e34584e4780f343d6c946af5377088d53818e88e 100644
|
|
--- a/src/main/java/net/minecraft/world/damagesource/DamageSources.java
|
|
+++ b/src/main/java/net/minecraft/world/damagesource/DamageSources.java
|
|
@@ -264,13 +264,7 @@ public class DamageSources {
|
|
}
|
|
|
|
public DamageSource explosion(@Nullable Entity source, @Nullable Entity attacker) {
|
|
- // CraftBukkit start
|
|
- return this.explosion(source, attacker, attacker != null && source != null ? DamageTypes.PLAYER_EXPLOSION : DamageTypes.EXPLOSION);
|
|
- }
|
|
-
|
|
- public DamageSource explosion(@Nullable Entity entity, @Nullable Entity entity1, ResourceKey<DamageType> resourceKey) {
|
|
- return this.source(resourceKey, entity, entity1);
|
|
- // CraftBukkit end
|
|
+ return this.source(attacker != null && source != null ? DamageTypes.PLAYER_EXPLOSION : DamageTypes.EXPLOSION, source, attacker); // Paper - revert to vanilla
|
|
}
|
|
|
|
public DamageSource sonicBoom(Entity attacker) {
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
index 1052133e22d90c90e5345ba423f6872cb5d2ad2d..8b6a905f398f5aadd0801ea50d49506a002d4ff5 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
@@ -3264,7 +3264,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
return;
|
|
}
|
|
|
|
- if (!this.hurt(this.damageSources().lightningBolt().customEntityDamager(lightning), 5.0F)) {
|
|
+ if (!this.hurt(this.damageSources().lightningBolt().customEventDamager(lightning), 5.0F)) { // Paper - fix DamageSource API
|
|
return;
|
|
}
|
|
// CraftBukkit end
|
|
diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java
|
|
index 2e5ef2a680e294b49f29e8d7ba8bd0ed023c393c..4bfa947531c4a67989e18032754dabf4c69e989c 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java
|
|
@@ -334,7 +334,7 @@ public class Turtle extends Animal {
|
|
|
|
@Override
|
|
public void thunderHit(ServerLevel world, LightningBolt lightning) {
|
|
- this.hurt(this.damageSources().lightningBolt().customEntityDamager(lightning), Float.MAX_VALUE); // CraftBukkit
|
|
+ this.hurt(this.damageSources().lightningBolt().customEventDamager(lightning), Float.MAX_VALUE); // CraftBukkit // Paper - fix DamageSource API
|
|
}
|
|
|
|
@Override
|
|
diff --git a/src/main/java/net/minecraft/world/entity/decoration/BlockAttachedEntity.java b/src/main/java/net/minecraft/world/entity/decoration/BlockAttachedEntity.java
|
|
index 7bc612890f941177da11da0ce047d5a74d8ebb33..270acce7411e5ada71eaa04c05efc888b295d9e3 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/decoration/BlockAttachedEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/decoration/BlockAttachedEntity.java
|
|
@@ -96,7 +96,7 @@ public abstract class BlockAttachedEntity extends Entity {
|
|
} else {
|
|
if (!this.isRemoved() && !this.level().isClientSide) {
|
|
// CraftBukkit start - fire break events
|
|
- Entity damager = (source.isDirect()) ? source.getDirectEntity() : source.getEntity();
|
|
+ Entity damager = (!source.isDirect() && source.getEntity() != null) ? source.getEntity() : source.getDirectEntity(); // Paper - fix DamageSource API
|
|
HangingBreakEvent event;
|
|
if (damager != null) {
|
|
event = new HangingBreakByEntityEvent((Hanging) this.getBukkitEntity(), damager.getBukkitEntity(), source.is(DamageTypeTags.IS_EXPLOSION) ? HangingBreakEvent.RemoveCause.EXPLOSION : HangingBreakEvent.RemoveCause.ENTITY);
|
|
diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java
|
|
index 2c01fbea62812f795111060d260f871cdf85e8bf..cb1b19e2e0d8f0744b2355b8f4da0206b196b19c 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java
|
|
@@ -271,7 +271,7 @@ public class Creeper extends Monster implements PowerableMob {
|
|
if (!event.isCancelled()) {
|
|
// CraftBukkit end
|
|
this.dead = true;
|
|
- this.level().explode(this, net.minecraft.world.level.Explosion.getDefaultDamageSource(this.level(), this).customCausingEntityDamager(this.entityIgniter), null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.MOB); // CraftBukkit
|
|
+ this.level().explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.MOB); // CraftBukkit // Paper - fix DamageSource API (revert to vanilla, no, just no, don't change this)
|
|
this.spawnLingeringCloud();
|
|
this.triggerOnDeathMobEffects(Entity.RemovalReason.KILLED);
|
|
this.discard(EntityRemoveEvent.Cause.EXPLODE); // CraftBukkit - add Bukkit remove cause
|
|
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EvokerFangs.java b/src/main/java/net/minecraft/world/entity/projectile/EvokerFangs.java
|
|
index c75433bb0fcd4264148950467bf6b700296aca7b..820965950c8b6c868ee261cf9613665e583f092e 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/EvokerFangs.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/EvokerFangs.java
|
|
@@ -135,7 +135,7 @@ public class EvokerFangs extends Entity implements TraceableEntity {
|
|
|
|
if (target.isAlive() && !target.isInvulnerable() && target != entityliving1) {
|
|
if (entityliving1 == null) {
|
|
- target.hurt(this.damageSources().magic().customEntityDamager(this), 6.0F); // CraftBukkit
|
|
+ target.hurt(this.damageSources().magic().customEventDamager(this), 6.0F); // CraftBukkit // Paper - fix DamageSource API
|
|
} else {
|
|
if (entityliving1.isAlliedTo((Entity) target)) {
|
|
return;
|
|
diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
|
|
index f43dd56182ced23cf1cf65c149c532a611cc933a..1aa5e57a4e6a4be60514d8808a2e6c973d93e798 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
|
|
@@ -89,7 +89,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile {
|
|
// entity.changeDimension(new DimensionTransition(worldserver, this.position(), entity.getDeltaMovement(), entity.getYRot(), entity.getXRot(), DimensionTransition.DO_NOTHING)); // CraftBukkit - moved up
|
|
entity.resetFallDistance();
|
|
entityplayer.resetCurrentImpulseContext();
|
|
- entity.hurt(this.damageSources().fall().customEntityDamager(this), 5.0F); // CraftBukkit
|
|
+ entity.hurt(this.damageSources().fall().customEventDamager(this), 5.0F); // CraftBukkit // Paper - fix DamageSource API
|
|
this.playSound(worldserver, this.position());
|
|
}
|
|
} else {
|
|
diff --git a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java
|
|
index 60eac9df10a9a395a1568925515d010eb51a64e5..55fd997a4e894eeab24de269d59e486196ffbe8d 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java
|
|
@@ -77,7 +77,7 @@ public class WitherSkull extends AbstractHurtingProjectile {
|
|
}
|
|
}
|
|
} else {
|
|
- flag = entity.hurt(this.damageSources().magic().customCausingEntity(this), 5.0F); // Paper - Fire EntityDamageByEntityEvent for unowned wither skulls
|
|
+ flag = entity.hurt(this.damageSources().magic().customEventDamager(this), 5.0F); // Paper - Fire EntityDamageByEntityEvent for unowned wither skulls // Paper - fix DamageSource API
|
|
}
|
|
|
|
if (flag && entity instanceof LivingEntity entityliving) {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSource.java b/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSource.java
|
|
index 8532324060eed772a10e2a3429890438cf32f9ba..7df86e7124a9ed359f05324b8fc4c8862f7e4b79 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSource.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSource.java
|
|
@@ -41,13 +41,13 @@ public class CraftDamageSource implements DamageSource {
|
|
|
|
@Override
|
|
public org.bukkit.entity.Entity getCausingEntity() {
|
|
- net.minecraft.world.entity.Entity entity = this.getHandle().getCausingDamager();
|
|
+ net.minecraft.world.entity.Entity entity = this.getHandle().getEntity(); // Paper - fix DamageSource API - revert to vanilla
|
|
return (entity != null) ? entity.getBukkitEntity() : null;
|
|
}
|
|
|
|
@Override
|
|
public org.bukkit.entity.Entity getDirectEntity() {
|
|
- net.minecraft.world.entity.Entity entity = this.getHandle().getDamager();
|
|
+ net.minecraft.world.entity.Entity entity = this.getHandle().getDirectEntity(); // Paper - fix DamageSource API
|
|
return (entity != null) ? entity.getBukkitEntity() : null;
|
|
}
|
|
|
|
@@ -65,7 +65,7 @@ public class CraftDamageSource implements DamageSource {
|
|
|
|
@Override
|
|
public boolean isIndirect() {
|
|
- return this.getHandle().getCausingDamager() != this.getHandle().getDamager();
|
|
+ return !this.getHandle().isDirect(); // Paper - fix DamageSource API
|
|
}
|
|
|
|
@Override
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSourceBuilder.java b/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSourceBuilder.java
|
|
index 4c6e15535fa40aad8cf1920f392589404f9ba79c..35eb95ef6fb6a0f7ea63351e90741c489fdd15f9 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSourceBuilder.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSourceBuilder.java
|
|
@@ -41,6 +41,11 @@ public class CraftDamageSourceBuilder implements DamageSource.Builder {
|
|
|
|
@Override
|
|
public DamageSource build() {
|
|
+ // Paper start - fix DamageCause API
|
|
+ if (this.causingEntity != null && this.directEntity == null) {
|
|
+ throw new IllegalArgumentException("Direct entity must be set if causing entity is set");
|
|
+ }
|
|
+ // Paper end - fix DamageCause API
|
|
return CraftDamageSource.buildFromBukkit(this.damageType, this.causingEntity, this.directEntity, this.damageLocation);
|
|
}
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
index 1af662ca881d656b17697fce837f659349241234..37bd0b7a1bfb9d59efa803e453f39d4e3fc916a4 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
@@ -1085,7 +1085,7 @@ public class CraftEventFactory {
|
|
|
|
private static EntityDamageEvent handleEntityDamageEvent(Entity entity, DamageSource source, Map<DamageModifier, Double> modifiers, Map<DamageModifier, Function<? super Double, Double>> modifierFunctions, boolean cancelled) {
|
|
CraftDamageSource bukkitDamageSource = new CraftDamageSource(source);
|
|
- Entity damager = (source.getDamager() != null) ? source.getDamager() : source.getEntity();
|
|
+ final Entity damager = source.getCustomEventDamager(); // Paper - fix DamageSource API
|
|
if (source.is(DamageTypeTags.IS_EXPLOSION)) {
|
|
if (damager == null) {
|
|
return CraftEventFactory.callEntityDamageEvent(source.getDirectBlock(), source.getDirectBlockState(), entity, DamageCause.BLOCK_EXPLOSION, bukkitDamageSource, modifiers, modifierFunctions, cancelled);
|