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 @@ -17,18 +17,21 @@ public class ExplosionPrimeEvent extends EntityEvent implements Cancellable {
private float radius;
private boolean fire;

private final float velocity;

private boolean cancelled;

@ApiStatus.Internal
public ExplosionPrimeEvent(@NotNull final Entity entity, final float radius, final boolean fire) {
public ExplosionPrimeEvent(@NotNull final Entity entity, final float radius, final boolean fire, final float velocity) {
super(entity);
this.radius = radius;
this.fire = fire;
this.velocity = velocity;
}

@ApiStatus.Internal
public ExplosionPrimeEvent(@NotNull final Explosive explosive) {
this(explosive, explosive.getYield(), explosive.isIncendiary());
this(explosive, explosive.getYield(), explosive.isIncendiary(), 0);
}

/**
Expand Down Expand Up @@ -67,6 +70,17 @@ public void setFire(boolean fire) {
this.fire = fire;
}

/**
* Gets the velocity used in the explosion. This is zero for all entities except a TNT minecart, in which case it
* represents the velocity of the minecart when it explodes, the fall distance divided by ten,
* or the velocity of the arrow that caused the minecart to explode.
*
* @return returns the velocity of the explosion
*/
public float getVelocity() {
return this.velocity;
}

@Override
public boolean isCancelled() {
return this.cancelled;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
DamageSource damageSource1 = damageSource.getEntity() != null ? this.damageSources().explosion(this, damageSource.getEntity()) : null;
- level.explode(this, damageSource1, null, this.getX(), this.getY(), this.getZ(), 6.0F, false, Level.ExplosionInteraction.BLOCK);
+ // CraftBukkit start
+ org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExplosionPrimeEvent(this, 6.0F, false);
+ org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExplosionPrimeEvent(this, 6.0F, false, 0);
+ if (event.isCancelled()) {
+ return false;
+ }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
if (i <= 0) {
- level.explode(this, this.getX(), this.getEyeY(), this.getZ(), 7.0F, false, Level.ExplosionInteraction.MOB);
+ // CraftBukkit start
+ org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent(this.getBukkitEntity(), 7.0F, false);
+ org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent(this.getBukkitEntity(), 7.0F, false, 0);
+ level.getCraftServer().getPluginManager().callEvent(event);
+
+ if (!event.isCancelled()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@
if (this.level() instanceof ServerLevel serverLevel) {
float f = this.isPowered() ? 2.0F : 1.0F;
+ // CraftBukkit start
+ org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExplosionPrimeEvent(this, this.explosionRadius * f, false);
+ org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExplosionPrimeEvent(this, this.explosionRadius * f, false, 0);
+ if (!event.isCancelled()) {
+ // CraftBukkit end
this.dead = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
- this.level().explode(this, this.getX(), this.getY(), this.getZ(), 1.0F, false, Level.ExplosionInteraction.MOB);
- this.discard();
+ // CraftBukkit start
+ org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent(this.getBukkitEntity(), 1.0F, false);
+ org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent(this.getBukkitEntity(), 1.0F, false, 0);
+ if (event.callEvent()) {
+ this.level().explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.MOB);
+ }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
@Override
public void explode(Vec3 pos) {
+ // Paper start - Fire event for WindCharge explosions
+ org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExplosionPrimeEvent(this, RADIUS, false);
+ org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExplosionPrimeEvent(this, RADIUS, false, 0);
+ if (event.isCancelled()) {
+ return;
+ }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
@Override
public void explode(Vec3 pos) {
+ // Paper start - Fire event for WindCharge explosions
+ org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExplosionPrimeEvent(this, RADIUS, false);
+ org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExplosionPrimeEvent(this, RADIUS, false, 0);
+ if (event.isCancelled()) {
+ return;
+ }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,16 @@
this.fuse--;
this.level().addParticle(ParticleTypes.SMOKE, this.getX(), this.getY() + 0.5, this.getZ(), 0.0, 0.0, 0.0);
} else if (this.fuse == 0) {
@@ -104,6 +_,17 @@
@@ -104,6 +_,18 @@
if (this.level() instanceof ServerLevel serverLevel) {
if (serverLevel.getGameRules().get(GameRules.TNT_EXPLODES)) {
double min = Math.min(Math.sqrt(radiusModifier), 5.0);
+ // CraftBukkit start
+ org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent(
+ this.getBukkitEntity(),
+ (float) (this.explosionPowerBase + this.explosionSpeedFactor * this.random.nextDouble() * 1.5 * min),
+ this.isIncendiary
+ this.isIncendiary,
+ (float) min
+ );
+ if (!event.callEvent()) {
+ this.fuse = -1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2160,8 +2160,8 @@ public static ExplosionPrimeEvent callExplosionPrimeEvent(Explosive explosive) {
return event;
}

public static ExplosionPrimeEvent callExplosionPrimeEvent(Entity nmsEntity, float size, boolean fire) {
ExplosionPrimeEvent event = new ExplosionPrimeEvent(nmsEntity.getBukkitEntity(), size, fire);
public static ExplosionPrimeEvent callExplosionPrimeEvent(Entity nmsEntity, float size, boolean fire, float velocity) {
ExplosionPrimeEvent event = new ExplosionPrimeEvent(nmsEntity.getBukkitEntity(), size, fire, velocity);
Bukkit.getPluginManager().callEvent(event);
return event;
}
Expand Down
Loading