--- a/net/minecraft/world/item/FireChargeItem.java
+++ b/net/minecraft/world/item/FireChargeItem.java
@@ -5,6 +5,7 @@
 import net.minecraft.sounds.SoundSource;
 import net.minecraft.util.RandomSource;
 import net.minecraft.world.InteractionResult;
+import net.minecraft.world.entity.Entity;
 import net.minecraft.world.entity.player.Player;
 import net.minecraft.world.item.context.UseOnContext;
 import net.minecraft.world.level.Level;
@@ -17,41 +18,60 @@
 import net.minecraft.world.level.gameevent.GameEvent;
 
 public class FireChargeItem extends Item {
+
     public FireChargeItem(Item.Properties settings) {
         super(settings);
     }
 
     @Override
     public InteractionResult useOn(UseOnContext context) {
-        Level level = context.getLevel();
-        BlockPos blockPos = context.getClickedPos();
-        BlockState blockState = level.getBlockState(blockPos);
-        boolean bl = false;
-        if (!CampfireBlock.canLight(blockState) && !CandleBlock.canLight(blockState) && !CandleCakeBlock.canLight(blockState)) {
-            blockPos = blockPos.relative(context.getClickedFace());
-            if (BaseFireBlock.canBePlacedAt(level, blockPos, context.getHorizontalDirection())) {
-                this.playSound(level, blockPos);
-                level.setBlockAndUpdate(blockPos, BaseFireBlock.getState(level, blockPos));
-                level.gameEvent(context.getPlayer(), GameEvent.BLOCK_PLACE, blockPos);
-                bl = true;
+        Level world = context.getLevel();
+        BlockPos blockposition = context.getClickedPos();
+        BlockState iblockdata = world.getBlockState(blockposition);
+        boolean flag = false;
+
+        if (!CampfireBlock.canLight(iblockdata) && !CandleBlock.canLight(iblockdata) && !CandleCakeBlock.canLight(iblockdata)) {
+            blockposition = blockposition.relative(context.getClickedFace());
+            if (BaseFireBlock.canBePlacedAt(world, blockposition, context.getHorizontalDirection())) {
+                // CraftBukkit start - fire BlockIgniteEvent
+                if (org.bukkit.craftbukkit.v1_20_R2.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition, org.bukkit.event.block.BlockIgniteEvent.IgniteCause.FIREBALL, context.getPlayer()).isCancelled()) {
+                    if (!context.getPlayer().getAbilities().instabuild) {
+                        context.getItemInHand().shrink(1);
+                    }
+                    return InteractionResult.PASS;
+                }
+                // CraftBukkit end
+                this.playSound(world, blockposition);
+                world.setBlockAndUpdate(blockposition, BaseFireBlock.getState(world, blockposition));
+                world.gameEvent((Entity) context.getPlayer(), GameEvent.BLOCK_PLACE, blockposition);
+                flag = true;
             }
         } else {
-            this.playSound(level, blockPos);
-            level.setBlockAndUpdate(blockPos, blockState.setValue(BlockStateProperties.LIT, Boolean.valueOf(true)));
-            level.gameEvent(context.getPlayer(), GameEvent.BLOCK_CHANGE, blockPos);
-            bl = true;
+            // CraftBukkit start - fire BlockIgniteEvent
+            if (org.bukkit.craftbukkit.v1_20_R2.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition, org.bukkit.event.block.BlockIgniteEvent.IgniteCause.FIREBALL, context.getPlayer()).isCancelled()) {
+                if (!context.getPlayer().getAbilities().instabuild) {
+                    context.getItemInHand().shrink(1);
+                }
+                return InteractionResult.PASS;
+            }
+            // CraftBukkit end
+            this.playSound(world, blockposition);
+            world.setBlockAndUpdate(blockposition, (BlockState) iblockdata.setValue(BlockStateProperties.LIT, true));
+            world.gameEvent((Entity) context.getPlayer(), GameEvent.BLOCK_CHANGE, blockposition);
+            flag = true;
         }
 
-        if (bl) {
+        if (flag) {
             context.getItemInHand().shrink(1);
-            return InteractionResult.sidedSuccess(level.isClientSide);
+            return InteractionResult.sidedSuccess(world.isClientSide);
         } else {
             return InteractionResult.FAIL;
         }
     }
 
     private void playSound(Level world, BlockPos pos) {
-        RandomSource randomSource = world.getRandom();
-        world.playSound((Player)null, pos, SoundEvents.FIRECHARGE_USE, SoundSource.BLOCKS, 1.0F, (randomSource.nextFloat() - randomSource.nextFloat()) * 0.2F + 1.0F);
+        RandomSource randomsource = world.getRandom();
+
+        world.playSound((Player) null, pos, SoundEvents.FIRECHARGE_USE, SoundSource.BLOCKS, 1.0F, (randomsource.nextFloat() - randomsource.nextFloat()) * 0.2F + 1.0F);
     }
 }
