From 251e4c9215141e01df87308c2faec3bf2e1e9460 Mon Sep 17 00:00:00 2001
From: md_5 <git@md-5.net>
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