--- a/net/minecraft/world/entity/projectile/SmallFireball.java
+++ b/net/minecraft/world/entity/projectile/SmallFireball.java
@@ -15,14 +15,24 @@
 import net.minecraft.world.phys.EntityHitResult;
 import net.minecraft.world.phys.HitResult;
 import net.minecraft.world.phys.Vec3;
+// 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, Vec3 velocity) {
         super(EntityType.SMALL_FIREBALL, owner, velocity, 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, Vec3 velocity) {
@@ -32,17 +42,29 @@
     @Override
     protected void onHitEntity(EntityHitResult entityHitResult) {
         super.onHitEntity(entityHitResult);
-        if (this.level() instanceof ServerLevel serverLevel) {
-            Entity var7 = entityHitResult.getEntity();
-            Entity entity2 = this.getOwner();
-            int i = var7.getRemainingFireTicks();
-            var7.igniteForSeconds(5.0F);
-            DamageSource damageSource = this.damageSources().fireball(this, entity2);
-            if (!var7.hurt(damageSource, 5.0F)) {
-                var7.setRemainingFireTicks(i);
+        Level world = this.level();
+
+        if (world instanceof ServerLevel worldserver) {
+            Entity entity = entityHitResult.getEntity();
+            Entity entity1 = this.getOwner();
+            int i = entity.getRemainingFireTicks();
+
+            // CraftBukkit start - Entity damage by entity event + combust event
+            EntityCombustByEntityEvent event = new EntityCombustByEntityEvent((org.bukkit.entity.Projectile) this.getBukkitEntity(), entity.getBukkitEntity(), 5.0F);
+            entity.level().getCraftServer().getPluginManager().callEvent(event);
+
+            if (!event.isCancelled()) {
+                entity.igniteForSeconds(event.getDuration(), false);
+            }
+            // CraftBukkit end
+            DamageSource damagesource = this.damageSources().fireball(this, entity1);
+
+            if (!entity.hurt(damagesource, 5.0F)) {
+                entity.setRemainingFireTicks(i);
             } else {
-                EnchantmentHelper.doPostAttackEffects(serverLevel, var7, damageSource);
+                EnchantmentHelper.doPostAttackEffects(worldserver, entity, damagesource);
             }
+
         }
     }
 
@@ -51,12 +73,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));
                 }
             }
+
         }
     }
 
@@ -64,8 +89,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
