--- a/net/minecraft/world/entity/projectile/SmallFireball.java
+++ b/net/minecraft/world/entity/projectile/SmallFireball.java
@@ -23,6 +_,11 @@
 
     public SmallFireball(Level level, LivingEntity owner, Vec3 movement) {
         super(EntityType.SMALL_FIREBALL, owner, movement, level);
+        // CraftBukkit start
+        if (this.getOwner() != null && this.getOwner() instanceof Mob) {
+            this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING);
+        }
+        // CraftBukkit end
     }
 
     public SmallFireball(Level level, double x, double y, double z, Vec3 movement) {
@@ -36,7 +_,14 @@
             Entity var7 = result.getEntity();
             Entity owner = this.getOwner();
             int remainingFireTicks = var7.getRemainingFireTicks();
-            var7.igniteForSeconds(5.0F);
+            // CraftBukkit start - Entity damage by entity event + combust event
+            org.bukkit.event.entity.EntityCombustByEntityEvent event = new org.bukkit.event.entity.EntityCombustByEntityEvent(this.getBukkitEntity(), var7.getBukkitEntity(), 5.0F);
+            var7.level().getCraftServer().getPluginManager().callEvent(event);
+
+            if (!event.isCancelled()) {
+                var7.igniteForSeconds(event.getDuration(), false);
+            }
+            // CraftBukkit end
             DamageSource damageSource = this.damageSources().fireball(this, owner);
             if (!var7.hurtServer(serverLevel, damageSource, 5.0F)) {
                 var7.setRemainingFireTicks(remainingFireTicks);
@@ -51,9 +_,9 @@
         super.onHitBlock(result);
         if (this.level() instanceof ServerLevel serverLevel) {
             Entity owner = this.getOwner();
-            if (!(owner instanceof Mob) || serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
+            if (this.isIncendiary) { // CraftBukkit
                 BlockPos blockPos = result.getBlockPos().relative(result.getDirection());
-                if (this.level().isEmptyBlock(blockPos)) {
+                if (this.level().isEmptyBlock(blockPos) && !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(this.level(), blockPos, this).isCancelled()) { // CraftBukkit
                     this.level().setBlockAndUpdate(blockPos, BaseFireBlock.getState(this.level(), blockPos));
                 }
             }
@@ -64,7 +_,7 @@
     protected void onHit(HitResult result) {
         super.onHit(result);
         if (!this.level().isClientSide()) {
-            this.discard();
+            this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.HIT); // CraftBukkit - add Bukkit remove cause
         }
     }
 }
