Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30172,7 +30172,7 @@ index 93110c815abe7baef61b1eaacfe28ebb1fc821f7..564c5064ec105a4f59476f2d21d3664b
ChunkAccess getChunk(int x, int z, ChunkStatus chunkStatus, boolean requireChunk);

diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java
index c132a3bfff7cf020e7fe4be616daa763b83e4b25..1c521f9f32340cf75310686c90777e521ac3ae5c 100644
index 7a819ee03a1fc674cd17433ac03cbc59d466913c..05f4521084d5c93e166ea58bda04b7292916f2e9 100644
--- a/net/minecraft/world/level/ServerExplosion.java
+++ b/net/minecraft/world/level/ServerExplosion.java
@@ -62,6 +62,249 @@ public class ServerExplosion implements Explosion {
Expand Down Expand Up @@ -30575,7 +30575,7 @@ index c132a3bfff7cf020e7fe4be616daa763b83e4b25..1c521f9f32340cf75310686c90777e52
}

private void hurtEntities() {
@@ -346,6 +628,14 @@ public class ServerExplosion implements Explosion {
@@ -344,6 +626,14 @@ public class ServerExplosion implements Explosion {
}

public int explode() {
Expand All @@ -30590,7 +30590,7 @@ index c132a3bfff7cf020e7fe4be616daa763b83e4b25..1c521f9f32340cf75310686c90777e52
this.level.gameEvent(this.source, GameEvent.EXPLODE, this.center);
List<BlockPos> list = this.calculateExplodedPositions();
this.hurtEntities();
@@ -360,6 +650,13 @@ public class ServerExplosion implements Explosion {
@@ -358,6 +648,13 @@ public class ServerExplosion implements Explosion {
this.createFire(list);
}

Expand All @@ -30604,7 +30604,7 @@ index c132a3bfff7cf020e7fe4be616daa763b83e4b25..1c521f9f32340cf75310686c90777e52
return list.size();
}

@@ -449,12 +746,12 @@ public class ServerExplosion implements Explosion {
@@ -447,12 +744,12 @@ public class ServerExplosion implements Explosion {
// Paper start - Optimize explosions
private float getBlockDensity(Vec3 vec3d, Entity entity) {
if (!this.level.paperConfig().environment.optimizeExplosions) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -985,7 +985,7 @@
deltaMovement.z / 2.0 - vec3.z
);
+ Vec3 diff = finalVelocity.subtract(deltaMovement);
+ io.papermc.paper.event.entity.EntityKnockbackEvent event = CraftEventFactory.callEntityKnockbackEvent((org.bukkit.craftbukkit.entity.CraftLivingEntity) this.getBukkitEntity(), attacker, attacker, eventCause, strength, diff);
+ io.papermc.paper.event.entity.EntityKnockbackEvent event = CraftEventFactory.callEntityKnockbackEvent(this.getBukkitEntity(), attacker, attacker, eventCause, strength, diff);
+ // Paper end - knockback events
+ if (event.isCancelled()) {
+ return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@
if (!entity.ignoreExplosion(this)) {
double d = Math.sqrt(entity.distanceToSqr(this.center)) / f;
if (!(d > 1.0)) {
@@ -185,18 +_,54 @@
@@ -185,18 +_,52 @@
Vec3 vec31 = vec3.subtract(this.center).normalize();
boolean shouldDamageEntity = this.damageCalculator.shouldDamageEntity(this, entity);
float knockbackMultiplier = this.damageCalculator.getKnockbackMultiplier(entity);
Expand Down Expand Up @@ -119,12 +119,10 @@
+ double d2 = entity instanceof Player && this.level.paperConfig().environment.disableExplosionKnockback ? 0 : (1.0 - d) * f1 * knockbackMultiplier * (1.0 - d1); // Paper
Vec3 vec32 = vec31.scale(d2);
+ // CraftBukkit start - Call EntityKnockbackEvent
+ if (entity instanceof LivingEntity) {
+ // Paper start - knockback events
+ io.papermc.paper.event.entity.EntityKnockbackEvent event = CraftEventFactory.callEntityKnockbackEvent((org.bukkit.craftbukkit.entity.CraftLivingEntity) entity.getBukkitEntity(), this.source, this.damageSource.getEntity() != null ? this.damageSource.getEntity() : this.source, io.papermc.paper.event.entity.EntityKnockbackEvent.Cause.EXPLOSION, d2, vec32);
+ vec32 = event.isCancelled() ? Vec3.ZERO : org.bukkit.craftbukkit.util.CraftVector.toVec3(event.getKnockback());
+ // Paper end - knockback events
+ }
+ // Paper start - knockback events
+ io.papermc.paper.event.entity.EntityKnockbackEvent event = CraftEventFactory.callEntityKnockbackEvent(entity.getBukkitEntity(), this.source, this.damageSource.getEntity() != null ? this.damageSource.getEntity() : this.source, io.papermc.paper.event.entity.EntityKnockbackEvent.Cause.EXPLOSION, d2, vec32);
+ vec32 = event.isCancelled() ? Vec3.ZERO : org.bukkit.craftbukkit.util.CraftVector.toVec3(event.getKnockback());
+ // Paper end - knockback events
+ // CraftBukkit end
entity.push(vec32);
if (entity.getType().is(EntityTypeTags.REDIRECTABLE_PROJECTILE) && entity instanceof Projectile projectile) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2043,24 +2043,31 @@ public static ExplosionPrimeEvent callExplosionPrimeEvent(Entity nmsEntity, floa
return event;
}

public static io.papermc.paper.event.entity.EntityKnockbackEvent callEntityKnockbackEvent(CraftLivingEntity entity, Entity pusher, Entity attacker, io.papermc.paper.event.entity.EntityKnockbackEvent.Cause cause, double force, Vec3 knockback) {
public static io.papermc.paper.event.entity.EntityKnockbackEvent callEntityKnockbackEvent(CraftEntity entity, Entity pusher, Entity attacker, io.papermc.paper.event.entity.EntityKnockbackEvent.Cause cause, double force, Vec3 knockback) {
Vector apiKnockback = CraftVector.toBukkit(knockback);

final Vector currentVelocity = entity.getVelocity();
final Vector legacyFinalKnockback = currentVelocity.clone().add(apiKnockback);
final org.bukkit.event.entity.EntityKnockbackEvent.KnockbackCause legacyCause = org.bukkit.event.entity.EntityKnockbackEvent.KnockbackCause.valueOf(cause.name());
EntityKnockbackEvent legacyEvent;
if (pusher != null) {
legacyEvent = new EntityKnockbackByEntityEvent(entity, pusher.getBukkitEntity(), legacyCause, force, apiKnockback, legacyFinalKnockback);
} else {
legacyEvent = new EntityKnockbackEvent(entity, legacyCause, force, apiKnockback, legacyFinalKnockback);

EntityKnockbackEvent legacyEvent = null;
if (entity instanceof CraftLivingEntity) {
CraftLivingEntity livingEntity = (CraftLivingEntity) entity;
final Vector legacyFinalKnockback = currentVelocity.clone().add(apiKnockback);
final org.bukkit.event.entity.EntityKnockbackEvent.KnockbackCause legacyCause = org.bukkit.event.entity.EntityKnockbackEvent.KnockbackCause.valueOf(cause.name());
if (pusher != null) {
legacyEvent = new EntityKnockbackByEntityEvent(livingEntity, pusher.getBukkitEntity(), legacyCause, force, apiKnockback, legacyFinalKnockback);
} else {
legacyEvent = new EntityKnockbackEvent(livingEntity, legacyCause, force, apiKnockback, legacyFinalKnockback);
}
legacyEvent.callEvent();
}
legacyEvent.callEvent();

final io.papermc.paper.event.entity.EntityKnockbackEvent event;
apiKnockback = legacyEvent.getFinalKnockback().subtract(currentVelocity);
apiKnockback = legacyEvent != null ? legacyEvent.getFinalKnockback().subtract(currentVelocity) : apiKnockback;
if (attacker != null) {
event = new com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent(entity, attacker.getBukkitEntity(), cause, (float) force, apiKnockback);
if (entity instanceof CraftLivingEntity) {
event = new com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent((CraftLivingEntity) entity, attacker.getBukkitEntity(), cause, (float) force, apiKnockback);
} else {
event = new io.papermc.paper.event.entity.EntityPushedByEntityAttackEvent(entity, cause, pusher.getBukkitEntity(), apiKnockback);
}
} else {
event = new io.papermc.paper.event.entity.EntityKnockbackEvent(entity, cause, apiKnockback);
}
Expand Down