--- a/net/minecraft/world/entity/projectile/SmallFireball.java
+++ b/net/minecraft/world/entity/projectile/SmallFireball.java
@@ -12,14 +12,24 @@
 import net.minecraft.world.phys.BlockHitResult;
 import net.minecraft.world.phys.EntityHitResult;
 import net.minecraft.world.phys.HitResult;
+// CraftBukkit start
+import org.bukkit.event.entity.EntityCombustByEntityEvent;
+import org.bukkit.event.entity.EntityRemoveEvent;
+// CraftBukkit end
 
 public class SmallFireball extends Fireball {
+
     public SmallFireball(EntityType<? extends SmallFireball> type, Level world) {
         super(type, world);
     }
 
     public SmallFireball(Level world, LivingEntity owner, double velocityX, double velocityY, double velocityZ) {
         super(EntityType.SMALL_FIREBALL, owner, velocityX, velocityY, velocityZ, world);
+        // CraftBukkit start
+        if (this.getOwner() != null && this.getOwner() instanceof Mob) {
+            this.isIncendiary = this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING);
+        }
+        // CraftBukkit end
     }
 
     public SmallFireball(Level world, double x, double y, double z, double velocityX, double velocityY, double velocityZ) {
@@ -31,14 +41,23 @@
         super.onHitEntity(entityHitResult);
         if (!this.level().isClientSide) {
             Entity entity = entityHitResult.getEntity();
-            Entity entity2 = this.getOwner();
+            Entity entity1 = this.getOwner();
             int i = entity.getRemainingFireTicks();
-            entity.igniteForSeconds(5);
-            if (!entity.hurt(this.damageSources().fireball(this, entity2), 5.0F)) {
+
+            // CraftBukkit start - Entity damage by entity event + combust event
+            EntityCombustByEntityEvent event = new EntityCombustByEntityEvent((org.bukkit.entity.Projectile) this.getBukkitEntity(), entity.getBukkitEntity(), 5);
+            entity.level().getCraftServer().getPluginManager().callEvent(event);
+
+            if (!event.isCancelled()) {
+                entity.igniteForSeconds(event.getDuration(), false);
+            }
+            // CraftBukkit end
+            if (!entity.hurt(this.damageSources().fireball(this, entity1), 5.0F)) {
                 entity.setRemainingFireTicks(i);
-            } else if (entity2 instanceof LivingEntity) {
-                this.doEnchantDamageEffects((LivingEntity)entity2, entity);
+            } else if (entity1 instanceof LivingEntity) {
+                this.doEnchantDamageEffects((LivingEntity) entity1, entity);
             }
+
         }
     }
 
@@ -47,12 +66,15 @@
         super.onHitBlock(blockHitResult);
         if (!this.level().isClientSide) {
             Entity entity = this.getOwner();
-            if (!(entity instanceof Mob) || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
-                BlockPos blockPos = blockHitResult.getBlockPos().relative(blockHitResult.getDirection());
-                if (this.level().isEmptyBlock(blockPos)) {
-                    this.level().setBlockAndUpdate(blockPos, BaseFireBlock.getState(this.level(), blockPos));
+
+            if (this.isIncendiary) { // CraftBukkit
+                BlockPos blockposition = blockHitResult.getBlockPos().relative(blockHitResult.getDirection());
+
+                if (this.level().isEmptyBlock(blockposition) && !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(this.level(), blockposition, this).isCancelled()) { // CraftBukkit
+                    this.level().setBlockAndUpdate(blockposition, BaseFireBlock.getState(this.level(), blockposition));
                 }
             }
+
         }
     }
 
@@ -60,8 +82,9 @@
     protected void onHit(HitResult hitResult) {
         super.onHit(hitResult);
         if (!this.level().isClientSide) {
-            this.discard();
+            this.discard(EntityRemoveEvent.Cause.HIT); // CraftBukkit - add Bukkit remove cause
         }
+
     }
 
     @Override
