From 251e4c9215141e01df87308c2faec3bf2e1e9460 Mon Sep 17 00:00:00 2001 From: md_5 Date: Wed, 15 Mar 2017 15:26:36 +1100 Subject: [PATCH] SPIGOT-3126: Make fireballs do a better job of respecting mobGriefing --- nms-patches/EntityLargeFireball.patch | 20 ++++++++++++--- nms-patches/EntitySmallFireball.patch | 36 +++++++++++++++++++++------ 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/nms-patches/EntityLargeFireball.patch b/nms-patches/EntityLargeFireball.patch index 0fed3d4c2b..3e4e73c7f0 100644 --- a/nms-patches/EntityLargeFireball.patch +++ b/nms-patches/EntityLargeFireball.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/EntityLargeFireball.java +++ b/net/minecraft/server/EntityLargeFireball.java -@@ -1,5 +1,7 @@ +@@ -1,15 +1,19 @@ package net.minecraft.server; +import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit @@ -8,7 +8,19 @@ public class EntityLargeFireball extends EntityFireball { public int yield = 1; -@@ -21,7 +23,15 @@ + + public EntityLargeFireball(World world) { + super(world); ++ isIncendiary = this.world.getGameRules().getBoolean("mobGriefing"); // CraftBukkit + } + + public EntityLargeFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) { + super(world, entityliving, d0, d1, d2); ++ isIncendiary = this.world.getGameRules().getBoolean("mobGriefing"); // CraftBukkit + } + + protected void a(MovingObjectPosition movingobjectposition) { +@@ -21,7 +25,15 @@ boolean flag = this.world.getGameRules().getBoolean("mobGriefing"); @@ -19,13 +31,13 @@ + + if (!event.isCancelled()) { + // give 'this' instead of (Entity) null so we know what causes the damage -+ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), flag); ++ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), isIncendiary); + } + // CraftBukkit end this.die(); } -@@ -39,7 +49,8 @@ +@@ -39,7 +51,8 @@ public void a(NBTTagCompound nbttagcompound) { super.a(nbttagcompound); if (nbttagcompound.hasKeyOfType("ExplosionPower", 99)) { diff --git a/nms-patches/EntitySmallFireball.patch b/nms-patches/EntitySmallFireball.patch index 5fed4bcdc7..0833ca94f2 100644 --- a/nms-patches/EntitySmallFireball.patch +++ b/nms-patches/EntitySmallFireball.patch @@ -8,12 +8,29 @@ public class EntitySmallFireball extends EntityFireball { public EntitySmallFireball(World world) { -@@ -30,7 +32,14 @@ - flag = movingobjectposition.entity.damageEntity(DamageSource.fireball(this, this.shooter), 5.0F); - if (flag) { +@@ -10,6 +12,11 @@ + public EntitySmallFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) { + super(world, entityliving, d0, d1, d2); + this.setSize(0.3125F, 0.3125F); ++ // CraftBukkit start ++ if (this.shooter != null && this.shooter instanceof EntityInsentient) { ++ isIncendiary = this.world.getGameRules().getBoolean("mobGriefing"); ++ } ++ // CraftBukkit end + } + + public EntitySmallFireball(World world, double d0, double d1, double d2, double d3, double d4, double d5) { +@@ -27,10 +34,17 @@ + + if (movingobjectposition.entity != null) { + if (!movingobjectposition.entity.isFireProof()) { +- flag = movingobjectposition.entity.damageEntity(DamageSource.fireball(this, this.shooter), 5.0F); +- if (flag) { ++ // CraftBukkit start - Entity damage by entity event + combust event ++ isIncendiary = movingobjectposition.entity.damageEntity(DamageSource.fireball(this, this.shooter), 5.0F); ++ if (isIncendiary) { this.a(this.shooter, movingobjectposition.entity); - movingobjectposition.entity.setOnFire(5); -+ // CraftBukkit start - Entity damage by entity event + combust event + EntityCombustByEntityEvent event = new EntityCombustByEntityEvent((org.bukkit.entity.Projectile) this.getBukkitEntity(), movingobjectposition.entity.getBukkitEntity(), 5); + movingobjectposition.entity.world.getServer().getPluginManager().callEvent(event); + @@ -24,13 +41,18 @@ } } } else { -@@ -43,7 +52,11 @@ +@@ -39,11 +53,15 @@ + flag = this.world.getGameRules().getBoolean("mobGriefing"); + } + +- if (flag) { ++ // CraftBukkit start ++ if (isIncendiary) { BlockPosition blockposition = movingobjectposition.a().shift(movingobjectposition.direction); if (this.world.isEmpty(blockposition)) { - this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); -+ // CraftBukkit start -+ if (isIncendiary && !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) { ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) { + this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); + } + // CraftBukkit end