--- a/net/minecraft/world/entity/projectile/SmallFireball.java
+++ b/net/minecraft/world/entity/projectile/SmallFireball.java
@@ -12,14 +12,21 @@
 import net.minecraft.world.phys.BlockHitResult;
 import net.minecraft.world.phys.EntityHitResult;
 import net.minecraft.world.phys.HitResult;
+import org.bukkit.event.entity.EntityCombustByEntityEvent; // CraftBukkit
 
 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) {
+            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,13 +38,21 @@
         super.onHitEntity(entityHitResult);
         if (!this.level.isClientSide) {
             Entity entity = entityHitResult.getEntity();
-            Entity entity2 = this.getOwner();
+            Entity entity1 = this.getOwner();
             int i = entity.getRemainingFireTicks();
-            entity.setSecondsOnFire(5);
-            if (!entity.hurt(DamageSource.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.setSecondsOnFire(event.getDuration(), false);
+            }
+            // CraftBukkit end
+            if (!entity.hurt(DamageSource.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);
             }
 
         }
@@ -48,10 +63,12 @@
         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 (isIncendiary) { // CraftBukkit
+                BlockPos blockposition = blockHitResult.getBlockPos().relative(blockHitResult.getDirection());
+
+                if (this.level.isEmptyBlock(blockposition) && !org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory.callBlockIgniteEvent(level, blockposition, this).isCancelled()) { // CraftBukkit
+                    this.level.setBlockAndUpdate(blockposition, BaseFireBlock.getState(this.level, blockposition));
                 }
             }
 
