--- a/net/minecraft/world/level/block/FireBlock.java
+++ b/net/minecraft/world/level/block/FireBlock.java
@@ -28,8 +28,16 @@
 import net.minecraft.world.phys.shapes.CollisionContext;
 import net.minecraft.world.phys.shapes.Shapes;
 import net.minecraft.world.phys.shapes.VoxelShape;
+// CraftBukkit start
+import org.bukkit.craftbukkit.block.CraftBlockState;
+import org.bukkit.craftbukkit.block.CraftBlockStates;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.block.BlockBurnEvent;
+import org.bukkit.event.block.BlockFadeEvent;
+// CraftBukkit end
 
 public class FireBlock extends BaseFireBlock {
+
     public static final MapCodec<FireBlock> CODEC = simpleCodec(FireBlock::new);
     public static final int MAX_AGE = 15;
     public static final IntegerProperty AGE = BlockStateProperties.AGE_15;
@@ -38,16 +46,14 @@
     public static final BooleanProperty SOUTH = PipeBlock.SOUTH;
     public static final BooleanProperty WEST = PipeBlock.WEST;
     public static final BooleanProperty UP = PipeBlock.UP;
-    private static final Map<Direction, BooleanProperty> PROPERTY_BY_DIRECTION = PipeBlock.PROPERTY_BY_DIRECTION
-        .entrySet()
-        .stream()
-        .filter(entry -> entry.getKey() != Direction.DOWN)
-        .collect(Util.toMap());
-    private static final VoxelShape UP_AABB = Block.box(0.0, 15.0, 0.0, 16.0, 16.0, 16.0);
-    private static final VoxelShape WEST_AABB = Block.box(0.0, 0.0, 0.0, 1.0, 16.0, 16.0);
-    private static final VoxelShape EAST_AABB = Block.box(15.0, 0.0, 0.0, 16.0, 16.0, 16.0);
-    private static final VoxelShape NORTH_AABB = Block.box(0.0, 0.0, 0.0, 16.0, 16.0, 1.0);
-    private static final VoxelShape SOUTH_AABB = Block.box(0.0, 0.0, 15.0, 16.0, 16.0, 16.0);
+    private static final Map<Direction, BooleanProperty> PROPERTY_BY_DIRECTION = (Map) PipeBlock.PROPERTY_BY_DIRECTION.entrySet().stream().filter((entry) -> {
+        return entry.getKey() != Direction.DOWN;
+    }).collect(Util.toMap());
+    private static final VoxelShape UP_AABB = Block.box(0.0D, 15.0D, 0.0D, 16.0D, 16.0D, 16.0D);
+    private static final VoxelShape WEST_AABB = Block.box(0.0D, 0.0D, 0.0D, 1.0D, 16.0D, 16.0D);
+    private static final VoxelShape EAST_AABB = Block.box(15.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D);
+    private static final VoxelShape NORTH_AABB = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 1.0D);
+    private static final VoxelShape SOUTH_AABB = Block.box(0.0D, 0.0D, 15.0D, 16.0D, 16.0D, 16.0D);
     private final Map<BlockState, VoxelShape> shapesCache;
     private static final int IGNITE_INSTANT = 60;
     private static final int IGNITE_EASY = 30;
@@ -57,68 +63,74 @@
     private static final int BURN_EASY = 60;
     private static final int BURN_MEDIUM = 20;
     private static final int BURN_HARD = 5;
-    public final Object2IntMap<Block> igniteOdds = new Object2IntOpenHashMap<>();
-    private final Object2IntMap<Block> burnOdds = new Object2IntOpenHashMap<>();
+    public final Object2IntMap<Block> igniteOdds = new Object2IntOpenHashMap();
+    private final Object2IntMap<Block> burnOdds = new Object2IntOpenHashMap();
 
     @Override
     public MapCodec<FireBlock> codec() {
-        return CODEC;
+        return FireBlock.CODEC;
     }
 
     public FireBlock(BlockBehaviour.Properties settings) {
         super(settings, 1.0F);
-        this.registerDefaultState(
-            this.stateDefinition
-                .any()
-                .setValue(AGE, Integer.valueOf(0))
-                .setValue(NORTH, Boolean.valueOf(false))
-                .setValue(EAST, Boolean.valueOf(false))
-                .setValue(SOUTH, Boolean.valueOf(false))
-                .setValue(WEST, Boolean.valueOf(false))
-                .setValue(UP, Boolean.valueOf(false))
-        );
-        this.shapesCache = ImmutableMap.copyOf(
-            this.stateDefinition
-                .getPossibleStates()
-                .stream()
-                .filter(state -> state.getValue(AGE) == 0)
-                .collect(Collectors.toMap(Function.identity(), FireBlock::calculateShape))
-        );
+        this.registerDefaultState((BlockState) ((BlockState) ((BlockState) ((BlockState) ((BlockState) ((BlockState) ((BlockState) this.stateDefinition.any()).setValue(FireBlock.AGE, 0)).setValue(FireBlock.NORTH, false)).setValue(FireBlock.EAST, false)).setValue(FireBlock.SOUTH, false)).setValue(FireBlock.WEST, false)).setValue(FireBlock.UP, false));
+        this.shapesCache = ImmutableMap.copyOf((Map) this.stateDefinition.getPossibleStates().stream().filter((iblockdata) -> {
+            return (Integer) iblockdata.getValue(FireBlock.AGE) == 0;
+        }).collect(Collectors.toMap(Function.identity(), FireBlock::calculateShape)));
     }
 
     private static VoxelShape calculateShape(BlockState state) {
-        VoxelShape voxelShape = Shapes.empty();
-        if (state.getValue(UP)) {
-            voxelShape = UP_AABB;
+        VoxelShape voxelshape = Shapes.empty();
+
+        if ((Boolean) state.getValue(FireBlock.UP)) {
+            voxelshape = FireBlock.UP_AABB;
         }
 
-        if (state.getValue(NORTH)) {
-            voxelShape = Shapes.or(voxelShape, NORTH_AABB);
+        if ((Boolean) state.getValue(FireBlock.NORTH)) {
+            voxelshape = Shapes.or(voxelshape, FireBlock.NORTH_AABB);
         }
 
-        if (state.getValue(SOUTH)) {
-            voxelShape = Shapes.or(voxelShape, SOUTH_AABB);
+        if ((Boolean) state.getValue(FireBlock.SOUTH)) {
+            voxelshape = Shapes.or(voxelshape, FireBlock.SOUTH_AABB);
         }
 
-        if (state.getValue(EAST)) {
-            voxelShape = Shapes.or(voxelShape, EAST_AABB);
+        if ((Boolean) state.getValue(FireBlock.EAST)) {
+            voxelshape = Shapes.or(voxelshape, FireBlock.EAST_AABB);
         }
 
-        if (state.getValue(WEST)) {
-            voxelShape = Shapes.or(voxelShape, WEST_AABB);
+        if ((Boolean) state.getValue(FireBlock.WEST)) {
+            voxelshape = Shapes.or(voxelshape, FireBlock.WEST_AABB);
         }
 
-        return voxelShape.isEmpty() ? DOWN_AABB : voxelShape;
+        return voxelshape.isEmpty() ? FireBlock.DOWN_AABB : voxelshape;
     }
 
     @Override
     protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) {
-        return this.canSurvive(state, world, pos) ? this.getStateWithAge(world, pos, state.getValue(AGE)) : Blocks.AIR.defaultBlockState();
+        // CraftBukkit start
+        if (!(world instanceof ServerLevel)) return this.canSurvive(state, world, pos) ? (BlockState) this.getStateWithAge(world, pos, (Integer) state.getValue(FireBlock.AGE)) : Blocks.AIR.defaultBlockState(); // Paper - don't fire events in world generation
+        if (!this.canSurvive(state, world, pos)) {
+            // Suppress during worldgen
+            if (!(world instanceof Level)) {
+                return Blocks.AIR.defaultBlockState();
+            }
+            CraftBlockState blockState = CraftBlockStates.getBlockState(world, pos);
+            blockState.setData(Blocks.AIR.defaultBlockState());
+
+            BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState);
+            ((Level) world).getCraftServer().getPluginManager().callEvent(event);
+
+            if (!event.isCancelled()) {
+                return blockState.getHandle();
+            }
+        }
+        return this.getStateWithAge(world, pos, (Integer) state.getValue(FireBlock.AGE)); // Paper - don't fire events in world generation; diff on change, see "don't fire events in world generation"
+        // CraftBukkit end
     }
 
     @Override
     protected VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) {
-        return this.shapesCache.get(state.setValue(AGE, Integer.valueOf(0)));
+        return (VoxelShape) this.shapesCache.get(state.setValue(FireBlock.AGE, 0));
     }
 
     @Override
@@ -127,19 +139,24 @@
     }
 
     protected BlockState getStateForPlacement(BlockGetter world, BlockPos pos) {
-        BlockPos blockPos = pos.below();
-        BlockState blockState = world.getBlockState(blockPos);
-        if (!this.canBurn(blockState) && !blockState.isFaceSturdy(world, blockPos, Direction.UP)) {
-            BlockState blockState2 = this.defaultBlockState();
+        BlockPos blockposition1 = pos.below();
+        BlockState iblockdata = world.getBlockState(blockposition1);
 
-            for (Direction direction : Direction.values()) {
-                BooleanProperty booleanProperty = PROPERTY_BY_DIRECTION.get(direction);
-                if (booleanProperty != null) {
-                    blockState2 = blockState2.setValue(booleanProperty, Boolean.valueOf(this.canBurn(world.getBlockState(pos.relative(direction)))));
+        if (!this.canBurn(iblockdata) && !iblockdata.isFaceSturdy(world, blockposition1, Direction.UP)) {
+            BlockState iblockdata1 = this.defaultBlockState();
+            Direction[] aenumdirection = Direction.values();
+            int i = aenumdirection.length;
+
+            for (int j = 0; j < i; ++j) {
+                Direction enumdirection = aenumdirection[j];
+                BooleanProperty blockstateboolean = (BooleanProperty) FireBlock.PROPERTY_BY_DIRECTION.get(enumdirection);
+
+                if (blockstateboolean != null) {
+                    iblockdata1 = (BlockState) iblockdata1.setValue(blockstateboolean, this.canBurn(world.getBlockState(pos.relative(enumdirection))));
                 }
             }
 
-            return blockState2;
+            return iblockdata1;
         } else {
             return this.defaultBlockState();
         }
@@ -147,132 +164,178 @@
 
     @Override
     protected boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) {
-        BlockPos blockPos = pos.below();
-        return world.getBlockState(blockPos).isFaceSturdy(world, blockPos, Direction.UP) || this.isValidFireLocation(world, pos);
+        BlockPos blockposition1 = pos.below();
+
+        return world.getBlockState(blockposition1).isFaceSturdy(world, blockposition1, Direction.UP) || this.isValidFireLocation(world, pos);
     }
 
     @Override
     protected void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) {
-        world.scheduleTick(pos, this, getFireTickDelay(world.random));
+        world.scheduleTick(pos, this, FireBlock.getFireTickDelay(world)); // Paper - Add fire-tick-delay option
         if (world.getGameRules().getBoolean(GameRules.RULE_DOFIRETICK)) {
             if (!state.canSurvive(world, pos)) {
-                world.removeBlock(pos, false);
+                this.fireExtinguished(world, pos); // CraftBukkit - invalid place location
             }
 
-            BlockState blockState = world.getBlockState(pos.below());
-            boolean bl = blockState.is(world.dimensionType().infiniburn());
-            int i = state.getValue(AGE);
-            if (!bl && world.isRaining() && this.isNearRain(world, pos) && random.nextFloat() < 0.2F + (float)i * 0.03F) {
-                world.removeBlock(pos, false);
+            BlockState iblockdata1 = world.getBlockState(pos.below());
+            boolean flag = iblockdata1.is(world.dimensionType().infiniburn());
+            int i = (Integer) state.getValue(FireBlock.AGE);
+
+            if (!flag && world.isRaining() && this.isNearRain(world, pos) && random.nextFloat() < 0.2F + (float) i * 0.03F) {
+                this.fireExtinguished(world, pos); // CraftBukkit - extinguished by rain
             } else {
                 int j = Math.min(15, i + random.nextInt(3) / 2);
+
                 if (i != j) {
-                    state = state.setValue(AGE, Integer.valueOf(j));
+                    state = (BlockState) state.setValue(FireBlock.AGE, j);
                     world.setBlock(pos, state, 4);
                 }
 
-                if (!bl) {
+                if (!flag) {
                     if (!this.isValidFireLocation(world, pos)) {
-                        BlockPos blockPos = pos.below();
-                        if (!world.getBlockState(blockPos).isFaceSturdy(world, blockPos, Direction.UP) || i > 3) {
-                            world.removeBlock(pos, false);
+                        BlockPos blockposition1 = pos.below();
+
+                        if (!world.getBlockState(blockposition1).isFaceSturdy(world, blockposition1, Direction.UP) || i > 3) {
+                            this.fireExtinguished(world, pos); // CraftBukkit
                         }
 
                         return;
                     }
 
                     if (i == 15 && random.nextInt(4) == 0 && !this.canBurn(world.getBlockState(pos.below()))) {
-                        world.removeBlock(pos, false);
+                        this.fireExtinguished(world, pos); // CraftBukkit
                         return;
                     }
                 }
 
-                boolean bl2 = world.getBiome(pos).is(BiomeTags.INCREASED_FIRE_BURNOUT);
-                int k = bl2 ? -50 : 0;
-                this.checkBurnOut(world, pos.east(), 300 + k, random, i);
-                this.checkBurnOut(world, pos.west(), 300 + k, random, i);
-                this.checkBurnOut(world, pos.below(), 250 + k, random, i);
-                this.checkBurnOut(world, pos.above(), 250 + k, random, i);
-                this.checkBurnOut(world, pos.north(), 300 + k, random, i);
-                this.checkBurnOut(world, pos.south(), 300 + k, random, i);
-                BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
+                boolean flag1 = world.getBiome(pos).is(BiomeTags.INCREASED_FIRE_BURNOUT);
+                int k = flag1 ? -50 : 0;
 
-                for (int l = -1; l <= 1; l++) {
-                    for (int m = -1; m <= 1; m++) {
-                        for (int n = -1; n <= 4; n++) {
-                            if (l != 0 || n != 0 || m != 0) {
-                                int o = 100;
-                                if (n > 1) {
-                                    o += (n - 1) * 100;
+                // CraftBukkit start - add source blockposition to burn calls
+                this.trySpread(world, pos.east(), 300 + k, random, i, pos);
+                this.trySpread(world, pos.west(), 300 + k, random, i, pos);
+                this.trySpread(world, pos.below(), 250 + k, random, i, pos);
+                this.trySpread(world, pos.above(), 250 + k, random, i, pos);
+                this.trySpread(world, pos.north(), 300 + k, random, i, pos);
+                this.trySpread(world, pos.south(), 300 + k, random, i, pos);
+                // CraftBukkit end
+                BlockPos.MutableBlockPos blockposition_mutableblockposition = new BlockPos.MutableBlockPos();
+
+                for (int l = -1; l <= 1; ++l) {
+                    for (int i1 = -1; i1 <= 1; ++i1) {
+                        for (int j1 = -1; j1 <= 4; ++j1) {
+                            if (l != 0 || j1 != 0 || i1 != 0) {
+                                int k1 = 100;
+
+                                if (j1 > 1) {
+                                    k1 += (j1 - 1) * 100;
                                 }
 
-                                mutableBlockPos.setWithOffset(pos, l, n, m);
-                                int p = this.getIgniteOdds(world, mutableBlockPos);
-                                if (p > 0) {
-                                    int q = (p + 40 + world.getDifficulty().getId() * 7) / (i + 30);
-                                    if (bl2) {
-                                        q /= 2;
+                                blockposition_mutableblockposition.setWithOffset(pos, l, j1, i1);
+                                int l1 = this.getIgniteOdds(world, blockposition_mutableblockposition);
+
+                                if (l1 > 0) {
+                                    int i2 = (l1 + 40 + world.getDifficulty().getId() * 7) / (i + 30);
+
+                                    if (flag1) {
+                                        i2 /= 2;
                                     }
 
-                                    if (q > 0 && random.nextInt(o) <= q && (!world.isRaining() || !this.isNearRain(world, mutableBlockPos))) {
-                                        int r = Math.min(15, i + random.nextInt(5) / 4);
-                                        world.setBlock(mutableBlockPos, this.getStateWithAge(world, mutableBlockPos, r), 3);
+                                    if (i2 > 0 && random.nextInt(k1) <= i2 && (!world.isRaining() || !this.isNearRain(world, blockposition_mutableblockposition))) {
+                                        int j2 = Math.min(15, i + random.nextInt(5) / 4);
+
+                                        // CraftBukkit start - Call to stop spread of fire
+                                        if (world.getBlockState(blockposition_mutableblockposition).getBlock() != Blocks.FIRE) {
+                                            if (CraftEventFactory.callBlockIgniteEvent(world, blockposition_mutableblockposition, pos).isCancelled()) {
+                                                continue;
+                                            }
+
+                                            CraftEventFactory.handleBlockSpreadEvent(world, pos, blockposition_mutableblockposition, this.getStateWithAge(world, blockposition_mutableblockposition, j2), 3); // CraftBukkit
+                                        }
+                                        // CraftBukkit end
                                     }
                                 }
                             }
                         }
                     }
                 }
+
             }
         }
     }
 
     protected boolean isNearRain(Level world, BlockPos pos) {
-        return world.isRainingAt(pos)
-            || world.isRainingAt(pos.west())
-            || world.isRainingAt(pos.east())
-            || world.isRainingAt(pos.north())
-            || world.isRainingAt(pos.south());
+        return world.isRainingAt(pos) || world.isRainingAt(pos.west()) || world.isRainingAt(pos.east()) || world.isRainingAt(pos.north()) || world.isRainingAt(pos.south());
     }
 
     private int getBurnOdds(BlockState state) {
-        return state.hasProperty(BlockStateProperties.WATERLOGGED) && state.getValue(BlockStateProperties.WATERLOGGED)
-            ? 0
-            : this.burnOdds.getInt(state.getBlock());
+        return state.hasProperty(BlockStateProperties.WATERLOGGED) && (Boolean) state.getValue(BlockStateProperties.WATERLOGGED) ? 0 : this.burnOdds.getInt(state.getBlock());
     }
 
     private int getIgniteOdds(BlockState state) {
-        return state.hasProperty(BlockStateProperties.WATERLOGGED) && state.getValue(BlockStateProperties.WATERLOGGED)
-            ? 0
-            : this.igniteOdds.getInt(state.getBlock());
+        return state.hasProperty(BlockStateProperties.WATERLOGGED) && (Boolean) state.getValue(BlockStateProperties.WATERLOGGED) ? 0 : this.igniteOdds.getInt(state.getBlock());
     }
 
-    private void checkBurnOut(Level world, BlockPos pos, int spreadFactor, RandomSource random, int currentAge) {
-        int i = this.getBurnOdds(world.getBlockState(pos));
-        if (random.nextInt(spreadFactor) < i) {
-            BlockState blockState = world.getBlockState(pos);
-            if (random.nextInt(currentAge + 10) < 5 && !world.isRainingAt(pos)) {
-                int j = Math.min(currentAge + random.nextInt(5) / 4, 15);
-                world.setBlock(pos, this.getStateWithAge(world, pos, j), 3);
+    private void trySpread(Level world, BlockPos blockposition, int i, RandomSource randomsource, int j, BlockPos sourceposition) { // CraftBukkit add sourceposition
+        int k = this.getBurnOdds(world.getBlockState(blockposition));
+
+        if (randomsource.nextInt(i) < k) {
+            BlockState iblockdata = world.getBlockState(blockposition);
+
+            // CraftBukkit start
+            org.bukkit.block.Block theBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
+            org.bukkit.block.Block sourceBlock = world.getWorld().getBlockAt(sourceposition.getX(), sourceposition.getY(), sourceposition.getZ());
+
+            BlockBurnEvent event = new BlockBurnEvent(theBlock, sourceBlock);
+            world.getCraftServer().getPluginManager().callEvent(event);
+
+            if (event.isCancelled()) {
+                return;
+            }
+
+            if (iblockdata.getBlock() instanceof TntBlock && !CraftEventFactory.callTNTPrimeEvent(world, blockposition, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.FIRE, null, sourceposition)) {
+                return;
+            }
+            // CraftBukkit end
+
+            if (randomsource.nextInt(j + 10) < 5 && !world.isRainingAt(blockposition)) {
+                int l = Math.min(j + randomsource.nextInt(5) / 4, 15);
+
+                world.setBlock(blockposition, this.getStateWithAge(world, blockposition, l), 3);
             } else {
-                world.removeBlock(pos, false);
+                if(iblockdata.getBlock() != Blocks.TNT) world.removeBlock(blockposition, false); // Paper - TNTPrimeEvent; We might be cancelling it below, move the setAir down
             }
 
-            Block block = blockState.getBlock();
+            Block block = iblockdata.getBlock();
+
             if (block instanceof TntBlock) {
-                TntBlock.explode(world, pos);
+                // Paper start - TNTPrimeEvent
+                org.bukkit.block.Block tntBlock = org.bukkit.craftbukkit.block.CraftBlock.at(world, blockposition);
+                if (!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.FIRE, null).callEvent()) {
+                    return;
+                }
+                world.removeBlock(blockposition, false);
+                // Paper end - TNTPrimeEvent
+                TntBlock.explode(world, blockposition);
             }
         }
+
     }
 
     private BlockState getStateWithAge(LevelAccessor world, BlockPos pos, int age) {
-        BlockState blockState = getState(world, pos);
-        return blockState.is(Blocks.FIRE) ? blockState.setValue(AGE, Integer.valueOf(age)) : blockState;
+        BlockState iblockdata = getState(world, pos);
+
+        return iblockdata.is(Blocks.FIRE) ? (BlockState) iblockdata.setValue(FireBlock.AGE, age) : iblockdata;
     }
 
     private boolean isValidFireLocation(BlockGetter world, BlockPos pos) {
-        for (Direction direction : Direction.values()) {
-            if (this.canBurn(world.getBlockState(pos.relative(direction)))) {
+        Direction[] aenumdirection = Direction.values();
+        int i = aenumdirection.length;
+
+        for (int j = 0; j < i; ++j) {
+            Direction enumdirection = aenumdirection[j];
+
+            if (this.canBurn(world.getBlockState(pos.relative(enumdirection)))) {
                 return true;
             }
         }
@@ -285,10 +348,14 @@
             return 0;
         } else {
             int i = 0;
+            Direction[] aenumdirection = Direction.values();
+            int j = aenumdirection.length;
 
-            for (Direction direction : Direction.values()) {
-                BlockState blockState = world.getBlockState(pos.relative(direction));
-                i = Math.max(this.getIgniteOdds(blockState), i);
+            for (int k = 0; k < j; ++k) {
+                Direction enumdirection = aenumdirection[k];
+                BlockState iblockdata = world.getBlockState(pos.relative(enumdirection));
+
+                i = Math.max(this.getIgniteOdds(iblockdata), i);
             }
 
             return i;
@@ -301,18 +368,20 @@
     }
 
     @Override
-    protected void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) {
-        super.onPlace(state, world, pos, oldState, notify);
-        world.scheduleTick(pos, this, getFireTickDelay(world.random));
+    // Paper start - UseOnContext param
+    protected void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify, net.minecraft.world.item.context.UseOnContext context) {
+        super.onPlace(state, world, pos, oldState, notify, context);
+    // Paper end - UseOnContext param
+        world.scheduleTick(pos, this, FireBlock.getFireTickDelay(world)); // Paper - Add fire-tick-delay option
     }
 
-    private static int getFireTickDelay(RandomSource random) {
-        return 30 + random.nextInt(10);
+    private static int getFireTickDelay(Level world) { // Paper - Add fire-tick-delay option
+        return world.paperConfig().environment.fireTickDelay + world.random.nextInt(10); // Paper - Add fire-tick-delay option
     }
 
     @Override
     protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
-        builder.add(AGE, NORTH, EAST, SOUTH, WEST, UP);
+        builder.add(FireBlock.AGE, FireBlock.NORTH, FireBlock.EAST, FireBlock.SOUTH, FireBlock.WEST, FireBlock.UP);
     }
 
     public void setFlammable(Block block, int burnChance, int spreadChance) {
@@ -321,180 +390,181 @@
     }
 
     public static void bootStrap() {
-        FireBlock fireBlock = (FireBlock)Blocks.FIRE;
-        fireBlock.setFlammable(Blocks.OAK_PLANKS, 5, 20);
-        fireBlock.setFlammable(Blocks.SPRUCE_PLANKS, 5, 20);
-        fireBlock.setFlammable(Blocks.BIRCH_PLANKS, 5, 20);
-        fireBlock.setFlammable(Blocks.JUNGLE_PLANKS, 5, 20);
-        fireBlock.setFlammable(Blocks.ACACIA_PLANKS, 5, 20);
-        fireBlock.setFlammable(Blocks.CHERRY_PLANKS, 5, 20);
-        fireBlock.setFlammable(Blocks.DARK_OAK_PLANKS, 5, 20);
-        fireBlock.setFlammable(Blocks.MANGROVE_PLANKS, 5, 20);
-        fireBlock.setFlammable(Blocks.BAMBOO_PLANKS, 5, 20);
-        fireBlock.setFlammable(Blocks.BAMBOO_MOSAIC, 5, 20);
-        fireBlock.setFlammable(Blocks.OAK_SLAB, 5, 20);
-        fireBlock.setFlammable(Blocks.SPRUCE_SLAB, 5, 20);
-        fireBlock.setFlammable(Blocks.BIRCH_SLAB, 5, 20);
-        fireBlock.setFlammable(Blocks.JUNGLE_SLAB, 5, 20);
-        fireBlock.setFlammable(Blocks.ACACIA_SLAB, 5, 20);
-        fireBlock.setFlammable(Blocks.CHERRY_SLAB, 5, 20);
-        fireBlock.setFlammable(Blocks.DARK_OAK_SLAB, 5, 20);
-        fireBlock.setFlammable(Blocks.MANGROVE_SLAB, 5, 20);
-        fireBlock.setFlammable(Blocks.BAMBOO_SLAB, 5, 20);
-        fireBlock.setFlammable(Blocks.BAMBOO_MOSAIC_SLAB, 5, 20);
-        fireBlock.setFlammable(Blocks.OAK_FENCE_GATE, 5, 20);
-        fireBlock.setFlammable(Blocks.SPRUCE_FENCE_GATE, 5, 20);
-        fireBlock.setFlammable(Blocks.BIRCH_FENCE_GATE, 5, 20);
-        fireBlock.setFlammable(Blocks.JUNGLE_FENCE_GATE, 5, 20);
-        fireBlock.setFlammable(Blocks.ACACIA_FENCE_GATE, 5, 20);
-        fireBlock.setFlammable(Blocks.CHERRY_FENCE_GATE, 5, 20);
-        fireBlock.setFlammable(Blocks.DARK_OAK_FENCE_GATE, 5, 20);
-        fireBlock.setFlammable(Blocks.MANGROVE_FENCE_GATE, 5, 20);
-        fireBlock.setFlammable(Blocks.BAMBOO_FENCE_GATE, 5, 20);
-        fireBlock.setFlammable(Blocks.OAK_FENCE, 5, 20);
-        fireBlock.setFlammable(Blocks.SPRUCE_FENCE, 5, 20);
-        fireBlock.setFlammable(Blocks.BIRCH_FENCE, 5, 20);
-        fireBlock.setFlammable(Blocks.JUNGLE_FENCE, 5, 20);
-        fireBlock.setFlammable(Blocks.ACACIA_FENCE, 5, 20);
-        fireBlock.setFlammable(Blocks.CHERRY_FENCE, 5, 20);
-        fireBlock.setFlammable(Blocks.DARK_OAK_FENCE, 5, 20);
-        fireBlock.setFlammable(Blocks.MANGROVE_FENCE, 5, 20);
-        fireBlock.setFlammable(Blocks.BAMBOO_FENCE, 5, 20);
-        fireBlock.setFlammable(Blocks.OAK_STAIRS, 5, 20);
-        fireBlock.setFlammable(Blocks.BIRCH_STAIRS, 5, 20);
-        fireBlock.setFlammable(Blocks.SPRUCE_STAIRS, 5, 20);
-        fireBlock.setFlammable(Blocks.JUNGLE_STAIRS, 5, 20);
-        fireBlock.setFlammable(Blocks.ACACIA_STAIRS, 5, 20);
-        fireBlock.setFlammable(Blocks.CHERRY_STAIRS, 5, 20);
-        fireBlock.setFlammable(Blocks.DARK_OAK_STAIRS, 5, 20);
-        fireBlock.setFlammable(Blocks.MANGROVE_STAIRS, 5, 20);
-        fireBlock.setFlammable(Blocks.BAMBOO_STAIRS, 5, 20);
-        fireBlock.setFlammable(Blocks.BAMBOO_MOSAIC_STAIRS, 5, 20);
-        fireBlock.setFlammable(Blocks.OAK_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.SPRUCE_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.BIRCH_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.JUNGLE_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.ACACIA_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.CHERRY_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.DARK_OAK_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.MANGROVE_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.BAMBOO_BLOCK, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_OAK_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_SPRUCE_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_BIRCH_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_JUNGLE_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_ACACIA_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_CHERRY_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_DARK_OAK_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_MANGROVE_LOG, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_BAMBOO_BLOCK, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_OAK_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_SPRUCE_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_BIRCH_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_JUNGLE_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_ACACIA_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_CHERRY_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_DARK_OAK_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.STRIPPED_MANGROVE_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.OAK_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.SPRUCE_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.BIRCH_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.JUNGLE_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.ACACIA_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.CHERRY_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.DARK_OAK_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.MANGROVE_WOOD, 5, 5);
-        fireBlock.setFlammable(Blocks.MANGROVE_ROOTS, 5, 20);
-        fireBlock.setFlammable(Blocks.OAK_LEAVES, 30, 60);
-        fireBlock.setFlammable(Blocks.SPRUCE_LEAVES, 30, 60);
-        fireBlock.setFlammable(Blocks.BIRCH_LEAVES, 30, 60);
-        fireBlock.setFlammable(Blocks.JUNGLE_LEAVES, 30, 60);
-        fireBlock.setFlammable(Blocks.ACACIA_LEAVES, 30, 60);
-        fireBlock.setFlammable(Blocks.CHERRY_LEAVES, 30, 60);
-        fireBlock.setFlammable(Blocks.DARK_OAK_LEAVES, 30, 60);
-        fireBlock.setFlammable(Blocks.MANGROVE_LEAVES, 30, 60);
-        fireBlock.setFlammable(Blocks.BOOKSHELF, 30, 20);
-        fireBlock.setFlammable(Blocks.TNT, 15, 100);
-        fireBlock.setFlammable(Blocks.SHORT_GRASS, 60, 100);
-        fireBlock.setFlammable(Blocks.FERN, 60, 100);
-        fireBlock.setFlammable(Blocks.DEAD_BUSH, 60, 100);
-        fireBlock.setFlammable(Blocks.SUNFLOWER, 60, 100);
-        fireBlock.setFlammable(Blocks.LILAC, 60, 100);
-        fireBlock.setFlammable(Blocks.ROSE_BUSH, 60, 100);
-        fireBlock.setFlammable(Blocks.PEONY, 60, 100);
-        fireBlock.setFlammable(Blocks.TALL_GRASS, 60, 100);
-        fireBlock.setFlammable(Blocks.LARGE_FERN, 60, 100);
-        fireBlock.setFlammable(Blocks.DANDELION, 60, 100);
-        fireBlock.setFlammable(Blocks.POPPY, 60, 100);
-        fireBlock.setFlammable(Blocks.BLUE_ORCHID, 60, 100);
-        fireBlock.setFlammable(Blocks.ALLIUM, 60, 100);
-        fireBlock.setFlammable(Blocks.AZURE_BLUET, 60, 100);
-        fireBlock.setFlammable(Blocks.RED_TULIP, 60, 100);
-        fireBlock.setFlammable(Blocks.ORANGE_TULIP, 60, 100);
-        fireBlock.setFlammable(Blocks.WHITE_TULIP, 60, 100);
-        fireBlock.setFlammable(Blocks.PINK_TULIP, 60, 100);
-        fireBlock.setFlammable(Blocks.OXEYE_DAISY, 60, 100);
-        fireBlock.setFlammable(Blocks.CORNFLOWER, 60, 100);
-        fireBlock.setFlammable(Blocks.LILY_OF_THE_VALLEY, 60, 100);
-        fireBlock.setFlammable(Blocks.TORCHFLOWER, 60, 100);
-        fireBlock.setFlammable(Blocks.PITCHER_PLANT, 60, 100);
-        fireBlock.setFlammable(Blocks.WITHER_ROSE, 60, 100);
-        fireBlock.setFlammable(Blocks.PINK_PETALS, 60, 100);
-        fireBlock.setFlammable(Blocks.WHITE_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.ORANGE_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.MAGENTA_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.LIGHT_BLUE_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.YELLOW_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.LIME_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.PINK_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.GRAY_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.LIGHT_GRAY_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.CYAN_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.PURPLE_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.BLUE_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.BROWN_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.GREEN_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.RED_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.BLACK_WOOL, 30, 60);
-        fireBlock.setFlammable(Blocks.VINE, 15, 100);
-        fireBlock.setFlammable(Blocks.COAL_BLOCK, 5, 5);
-        fireBlock.setFlammable(Blocks.HAY_BLOCK, 60, 20);
-        fireBlock.setFlammable(Blocks.TARGET, 15, 20);
-        fireBlock.setFlammable(Blocks.WHITE_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.ORANGE_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.MAGENTA_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.LIGHT_BLUE_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.YELLOW_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.LIME_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.PINK_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.GRAY_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.LIGHT_GRAY_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.CYAN_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.PURPLE_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.BLUE_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.BROWN_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.GREEN_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.RED_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.BLACK_CARPET, 60, 20);
-        fireBlock.setFlammable(Blocks.DRIED_KELP_BLOCK, 30, 60);
-        fireBlock.setFlammable(Blocks.BAMBOO, 60, 60);
-        fireBlock.setFlammable(Blocks.SCAFFOLDING, 60, 60);
-        fireBlock.setFlammable(Blocks.LECTERN, 30, 20);
-        fireBlock.setFlammable(Blocks.COMPOSTER, 5, 20);
-        fireBlock.setFlammable(Blocks.SWEET_BERRY_BUSH, 60, 100);
-        fireBlock.setFlammable(Blocks.BEEHIVE, 5, 20);
-        fireBlock.setFlammable(Blocks.BEE_NEST, 30, 20);
-        fireBlock.setFlammable(Blocks.AZALEA_LEAVES, 30, 60);
-        fireBlock.setFlammable(Blocks.FLOWERING_AZALEA_LEAVES, 30, 60);
-        fireBlock.setFlammable(Blocks.CAVE_VINES, 15, 60);
-        fireBlock.setFlammable(Blocks.CAVE_VINES_PLANT, 15, 60);
-        fireBlock.setFlammable(Blocks.SPORE_BLOSSOM, 60, 100);
-        fireBlock.setFlammable(Blocks.AZALEA, 30, 60);
-        fireBlock.setFlammable(Blocks.FLOWERING_AZALEA, 30, 60);
-        fireBlock.setFlammable(Blocks.BIG_DRIPLEAF, 60, 100);
-        fireBlock.setFlammable(Blocks.BIG_DRIPLEAF_STEM, 60, 100);
-        fireBlock.setFlammable(Blocks.SMALL_DRIPLEAF, 60, 100);
-        fireBlock.setFlammable(Blocks.HANGING_ROOTS, 30, 60);
-        fireBlock.setFlammable(Blocks.GLOW_LICHEN, 15, 100);
+        FireBlock blockfire = (FireBlock) Blocks.FIRE;
+
+        blockfire.setFlammable(Blocks.OAK_PLANKS, 5, 20);
+        blockfire.setFlammable(Blocks.SPRUCE_PLANKS, 5, 20);
+        blockfire.setFlammable(Blocks.BIRCH_PLANKS, 5, 20);
+        blockfire.setFlammable(Blocks.JUNGLE_PLANKS, 5, 20);
+        blockfire.setFlammable(Blocks.ACACIA_PLANKS, 5, 20);
+        blockfire.setFlammable(Blocks.CHERRY_PLANKS, 5, 20);
+        blockfire.setFlammable(Blocks.DARK_OAK_PLANKS, 5, 20);
+        blockfire.setFlammable(Blocks.MANGROVE_PLANKS, 5, 20);
+        blockfire.setFlammable(Blocks.BAMBOO_PLANKS, 5, 20);
+        blockfire.setFlammable(Blocks.BAMBOO_MOSAIC, 5, 20);
+        blockfire.setFlammable(Blocks.OAK_SLAB, 5, 20);
+        blockfire.setFlammable(Blocks.SPRUCE_SLAB, 5, 20);
+        blockfire.setFlammable(Blocks.BIRCH_SLAB, 5, 20);
+        blockfire.setFlammable(Blocks.JUNGLE_SLAB, 5, 20);
+        blockfire.setFlammable(Blocks.ACACIA_SLAB, 5, 20);
+        blockfire.setFlammable(Blocks.CHERRY_SLAB, 5, 20);
+        blockfire.setFlammable(Blocks.DARK_OAK_SLAB, 5, 20);
+        blockfire.setFlammable(Blocks.MANGROVE_SLAB, 5, 20);
+        blockfire.setFlammable(Blocks.BAMBOO_SLAB, 5, 20);
+        blockfire.setFlammable(Blocks.BAMBOO_MOSAIC_SLAB, 5, 20);
+        blockfire.setFlammable(Blocks.OAK_FENCE_GATE, 5, 20);
+        blockfire.setFlammable(Blocks.SPRUCE_FENCE_GATE, 5, 20);
+        blockfire.setFlammable(Blocks.BIRCH_FENCE_GATE, 5, 20);
+        blockfire.setFlammable(Blocks.JUNGLE_FENCE_GATE, 5, 20);
+        blockfire.setFlammable(Blocks.ACACIA_FENCE_GATE, 5, 20);
+        blockfire.setFlammable(Blocks.CHERRY_FENCE_GATE, 5, 20);
+        blockfire.setFlammable(Blocks.DARK_OAK_FENCE_GATE, 5, 20);
+        blockfire.setFlammable(Blocks.MANGROVE_FENCE_GATE, 5, 20);
+        blockfire.setFlammable(Blocks.BAMBOO_FENCE_GATE, 5, 20);
+        blockfire.setFlammable(Blocks.OAK_FENCE, 5, 20);
+        blockfire.setFlammable(Blocks.SPRUCE_FENCE, 5, 20);
+        blockfire.setFlammable(Blocks.BIRCH_FENCE, 5, 20);
+        blockfire.setFlammable(Blocks.JUNGLE_FENCE, 5, 20);
+        blockfire.setFlammable(Blocks.ACACIA_FENCE, 5, 20);
+        blockfire.setFlammable(Blocks.CHERRY_FENCE, 5, 20);
+        blockfire.setFlammable(Blocks.DARK_OAK_FENCE, 5, 20);
+        blockfire.setFlammable(Blocks.MANGROVE_FENCE, 5, 20);
+        blockfire.setFlammable(Blocks.BAMBOO_FENCE, 5, 20);
+        blockfire.setFlammable(Blocks.OAK_STAIRS, 5, 20);
+        blockfire.setFlammable(Blocks.BIRCH_STAIRS, 5, 20);
+        blockfire.setFlammable(Blocks.SPRUCE_STAIRS, 5, 20);
+        blockfire.setFlammable(Blocks.JUNGLE_STAIRS, 5, 20);
+        blockfire.setFlammable(Blocks.ACACIA_STAIRS, 5, 20);
+        blockfire.setFlammable(Blocks.CHERRY_STAIRS, 5, 20);
+        blockfire.setFlammable(Blocks.DARK_OAK_STAIRS, 5, 20);
+        blockfire.setFlammable(Blocks.MANGROVE_STAIRS, 5, 20);
+        blockfire.setFlammable(Blocks.BAMBOO_STAIRS, 5, 20);
+        blockfire.setFlammable(Blocks.BAMBOO_MOSAIC_STAIRS, 5, 20);
+        blockfire.setFlammable(Blocks.OAK_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.SPRUCE_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.BIRCH_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.JUNGLE_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.ACACIA_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.CHERRY_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.DARK_OAK_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.MANGROVE_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.BAMBOO_BLOCK, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_OAK_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_SPRUCE_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_BIRCH_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_JUNGLE_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_ACACIA_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_CHERRY_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_DARK_OAK_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_MANGROVE_LOG, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_BAMBOO_BLOCK, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_OAK_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_SPRUCE_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_BIRCH_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_JUNGLE_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_ACACIA_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_CHERRY_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_DARK_OAK_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.STRIPPED_MANGROVE_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.OAK_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.SPRUCE_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.BIRCH_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.JUNGLE_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.ACACIA_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.CHERRY_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.DARK_OAK_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.MANGROVE_WOOD, 5, 5);
+        blockfire.setFlammable(Blocks.MANGROVE_ROOTS, 5, 20);
+        blockfire.setFlammable(Blocks.OAK_LEAVES, 30, 60);
+        blockfire.setFlammable(Blocks.SPRUCE_LEAVES, 30, 60);
+        blockfire.setFlammable(Blocks.BIRCH_LEAVES, 30, 60);
+        blockfire.setFlammable(Blocks.JUNGLE_LEAVES, 30, 60);
+        blockfire.setFlammable(Blocks.ACACIA_LEAVES, 30, 60);
+        blockfire.setFlammable(Blocks.CHERRY_LEAVES, 30, 60);
+        blockfire.setFlammable(Blocks.DARK_OAK_LEAVES, 30, 60);
+        blockfire.setFlammable(Blocks.MANGROVE_LEAVES, 30, 60);
+        blockfire.setFlammable(Blocks.BOOKSHELF, 30, 20);
+        blockfire.setFlammable(Blocks.TNT, 15, 100);
+        blockfire.setFlammable(Blocks.SHORT_GRASS, 60, 100);
+        blockfire.setFlammable(Blocks.FERN, 60, 100);
+        blockfire.setFlammable(Blocks.DEAD_BUSH, 60, 100);
+        blockfire.setFlammable(Blocks.SUNFLOWER, 60, 100);
+        blockfire.setFlammable(Blocks.LILAC, 60, 100);
+        blockfire.setFlammable(Blocks.ROSE_BUSH, 60, 100);
+        blockfire.setFlammable(Blocks.PEONY, 60, 100);
+        blockfire.setFlammable(Blocks.TALL_GRASS, 60, 100);
+        blockfire.setFlammable(Blocks.LARGE_FERN, 60, 100);
+        blockfire.setFlammable(Blocks.DANDELION, 60, 100);
+        blockfire.setFlammable(Blocks.POPPY, 60, 100);
+        blockfire.setFlammable(Blocks.BLUE_ORCHID, 60, 100);
+        blockfire.setFlammable(Blocks.ALLIUM, 60, 100);
+        blockfire.setFlammable(Blocks.AZURE_BLUET, 60, 100);
+        blockfire.setFlammable(Blocks.RED_TULIP, 60, 100);
+        blockfire.setFlammable(Blocks.ORANGE_TULIP, 60, 100);
+        blockfire.setFlammable(Blocks.WHITE_TULIP, 60, 100);
+        blockfire.setFlammable(Blocks.PINK_TULIP, 60, 100);
+        blockfire.setFlammable(Blocks.OXEYE_DAISY, 60, 100);
+        blockfire.setFlammable(Blocks.CORNFLOWER, 60, 100);
+        blockfire.setFlammable(Blocks.LILY_OF_THE_VALLEY, 60, 100);
+        blockfire.setFlammable(Blocks.TORCHFLOWER, 60, 100);
+        blockfire.setFlammable(Blocks.PITCHER_PLANT, 60, 100);
+        blockfire.setFlammable(Blocks.WITHER_ROSE, 60, 100);
+        blockfire.setFlammable(Blocks.PINK_PETALS, 60, 100);
+        blockfire.setFlammable(Blocks.WHITE_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.ORANGE_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.MAGENTA_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.LIGHT_BLUE_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.YELLOW_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.LIME_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.PINK_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.GRAY_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.LIGHT_GRAY_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.CYAN_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.PURPLE_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.BLUE_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.BROWN_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.GREEN_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.RED_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.BLACK_WOOL, 30, 60);
+        blockfire.setFlammable(Blocks.VINE, 15, 100);
+        blockfire.setFlammable(Blocks.COAL_BLOCK, 5, 5);
+        blockfire.setFlammable(Blocks.HAY_BLOCK, 60, 20);
+        blockfire.setFlammable(Blocks.TARGET, 15, 20);
+        blockfire.setFlammable(Blocks.WHITE_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.ORANGE_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.MAGENTA_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.LIGHT_BLUE_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.YELLOW_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.LIME_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.PINK_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.GRAY_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.LIGHT_GRAY_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.CYAN_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.PURPLE_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.BLUE_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.BROWN_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.GREEN_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.RED_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.BLACK_CARPET, 60, 20);
+        blockfire.setFlammable(Blocks.DRIED_KELP_BLOCK, 30, 60);
+        blockfire.setFlammable(Blocks.BAMBOO, 60, 60);
+        blockfire.setFlammable(Blocks.SCAFFOLDING, 60, 60);
+        blockfire.setFlammable(Blocks.LECTERN, 30, 20);
+        blockfire.setFlammable(Blocks.COMPOSTER, 5, 20);
+        blockfire.setFlammable(Blocks.SWEET_BERRY_BUSH, 60, 100);
+        blockfire.setFlammable(Blocks.BEEHIVE, 5, 20);
+        blockfire.setFlammable(Blocks.BEE_NEST, 30, 20);
+        blockfire.setFlammable(Blocks.AZALEA_LEAVES, 30, 60);
+        blockfire.setFlammable(Blocks.FLOWERING_AZALEA_LEAVES, 30, 60);
+        blockfire.setFlammable(Blocks.CAVE_VINES, 15, 60);
+        blockfire.setFlammable(Blocks.CAVE_VINES_PLANT, 15, 60);
+        blockfire.setFlammable(Blocks.SPORE_BLOSSOM, 60, 100);
+        blockfire.setFlammable(Blocks.AZALEA, 30, 60);
+        blockfire.setFlammable(Blocks.FLOWERING_AZALEA, 30, 60);
+        blockfire.setFlammable(Blocks.BIG_DRIPLEAF, 60, 100);
+        blockfire.setFlammable(Blocks.BIG_DRIPLEAF_STEM, 60, 100);
+        blockfire.setFlammable(Blocks.SMALL_DRIPLEAF, 60, 100);
+        blockfire.setFlammable(Blocks.HANGING_ROOTS, 30, 60);
+        blockfire.setFlammable(Blocks.GLOW_LICHEN, 15, 100);
     }
 }
