2021-03-16 09:00:00 +11:00
--- a/net/minecraft/world/level/block/BlockFire.java
+++ b/net/minecraft/world/level/block/BlockFire.java
2025-03-26 03:05:00 +11:00
@@ -28,6 +28,15 @@
2021-03-16 09:00:00 +11:00
import net.minecraft.world.phys.shapes.VoxelShapeCollision;
import net.minecraft.world.phys.shapes.VoxelShapes;
2014-11-26 08:32:16 +11:00
+// CraftBukkit start
2024-08-05 17:28:37 +10:00
+import net.minecraft.world.item.context.ItemActionContext;
2018-07-15 10:00:00 +10:00
+import org.bukkit.craftbukkit.block.CraftBlockState;
2021-09-29 18:56:16 +10:00
+import org.bukkit.craftbukkit.block.CraftBlockStates;
2014-11-26 08:32:16 +11:00
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.block.BlockBurnEvent;
2018-07-15 10:00:00 +10:00
+import org.bukkit.event.block.BlockFadeEvent;
2014-11-26 08:32:16 +11:00
+// CraftBukkit end
+
2020-06-25 10:00:00 +10:00
public class BlockFire extends BlockFireAbstract {
2014-11-26 08:32:16 +11:00
2023-12-06 03:40:00 +11:00
public static final MapCodec<BlockFire> CODEC = simpleCodec(BlockFire::new);
2025-03-26 03:05:00 +11:00
@@ -82,7 +91,24 @@
2018-07-15 10:00:00 +10:00
2019-04-23 12:00:00 +10:00
@Override
2024-10-23 02:15:00 +11:00
protected IBlockData updateShape(IBlockData iblockdata, IWorldReader iworldreader, ScheduledTickAccess scheduledtickaccess, BlockPosition blockposition, EnumDirection enumdirection, BlockPosition blockposition1, IBlockData iblockdata1, RandomSource randomsource) {
- return this.canSurvive(iblockdata, iworldreader, blockposition) ? this.getStateWithAge(iworldreader, blockposition, (Integer) iblockdata.getValue(BlockFire.AGE)) : Blocks.AIR.defaultBlockState();
2018-07-15 10:00:00 +10:00
+ // CraftBukkit start
2024-10-23 02:15:00 +11:00
+ if (!this.canSurvive(iblockdata, iworldreader, blockposition)) {
2020-06-27 08:41:54 +10:00
+ // Suppress during worldgen
2024-10-23 02:15:00 +11:00
+ if (!(iworldreader instanceof World world)) {
2021-11-22 09:00:00 +11:00
+ return Blocks.AIR.defaultBlockState();
2020-06-27 08:41:54 +10:00
+ }
2024-10-23 02:15:00 +11:00
+ CraftBlockState blockState = CraftBlockStates.getBlockState(world, blockposition);
2021-11-22 09:00:00 +11:00
+ blockState.setData(Blocks.AIR.defaultBlockState());
2018-07-15 10:00:00 +10:00
+
+ BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState);
2024-10-23 02:15:00 +11:00
+ world.getCraftServer().getPluginManager().callEvent(event);
2018-07-15 10:00:00 +10:00
+
+ if (!event.isCancelled()) {
+ return blockState.getHandle();
+ }
+ }
2024-10-23 02:15:00 +11:00
+ return this.getStateWithAge(iworldreader, blockposition, (Integer) iblockdata.getValue(BlockFire.AGE));
2018-07-15 10:00:00 +10:00
+ // CraftBukkit end
}
2020-06-25 10:00:00 +10:00
@Override
2025-03-26 03:05:00 +11:00
@@ -129,7 +155,7 @@
2021-06-11 15:00:00 +10:00
if (worldserver.getGameRules().getBoolean(GameRules.RULE_DOFIRETICK)) {
2025-03-26 03:05:00 +11:00
if (worldserver.getGameRules().getBoolean(GameRules.RULE_ALLOWFIRETICKAWAYFROMPLAYERS) || worldserver.anyPlayerCloseEnoughForSpawning(blockposition)) {
if (!iblockdata.canSurvive(worldserver, blockposition)) {
- worldserver.removeBlock(blockposition, false);
+ fireExtinguished(worldserver, blockposition); // CraftBukkit - invalid place location
}
IBlockData iblockdata1 = worldserver.getBlockState(blockposition.below());
@@ -137,7 +163,7 @@
int i = (Integer) iblockdata.getValue(BlockFire.AGE);
if (!flag && worldserver.isRaining() && this.isNearRain(worldserver, blockposition) && randomsource.nextFloat() < 0.2F + (float) i * 0.03F) {
- worldserver.removeBlock(blockposition, false);
+ fireExtinguished(worldserver, blockposition); // CraftBukkit - extinguished by rain
} else {
int j = Math.min(15, i + randomsource.nextInt(3) / 2);
2014-11-26 08:32:16 +11:00
2025-03-26 03:05:00 +11:00
@@ -151,14 +177,14 @@
BlockPosition blockposition1 = blockposition.below();
2014-11-26 08:32:16 +11:00
2025-03-26 03:05:00 +11:00
if (!worldserver.getBlockState(blockposition1).isFaceSturdy(worldserver, blockposition1, EnumDirection.UP) || i > 3) {
- worldserver.removeBlock(blockposition, false);
+ fireExtinguished(worldserver, blockposition); // CraftBukkit
}
2018-07-15 10:00:00 +10:00
2025-03-26 03:05:00 +11:00
return;
}
2019-04-23 12:00:00 +10:00
2025-03-26 03:05:00 +11:00
if (i == 15 && randomsource.nextInt(4) == 0 && !this.canBurn(worldserver.getBlockState(blockposition.below()))) {
2021-11-22 09:00:00 +11:00
- worldserver.removeBlock(blockposition, false);
2019-12-11 09:00:00 +11:00
+ fireExtinguished(worldserver, blockposition); // CraftBukkit
2025-03-26 03:05:00 +11:00
return;
2015-02-17 14:06:54 +00:00
}
}
2025-03-26 03:05:00 +11:00
@@ -166,12 +192,14 @@
boolean flag1 = worldserver.getBiome(blockposition).is(BiomeTags.INCREASED_FIRE_BURNOUT);
int k = flag1 ? -50 : 0;
- this.checkBurnOut(worldserver, blockposition.east(), 300 + k, randomsource, i);
- this.checkBurnOut(worldserver, blockposition.west(), 300 + k, randomsource, i);
- this.checkBurnOut(worldserver, blockposition.below(), 250 + k, randomsource, i);
- this.checkBurnOut(worldserver, blockposition.above(), 250 + k, randomsource, i);
- this.checkBurnOut(worldserver, blockposition.north(), 300 + k, randomsource, i);
- this.checkBurnOut(worldserver, blockposition.south(), 300 + k, randomsource, i);
+ // CraftBukkit start - add source blockposition to burn calls
+ this.checkBurnOut(worldserver, blockposition.east(), 300 + k, randomsource, i, blockposition);
+ this.checkBurnOut(worldserver, blockposition.west(), 300 + k, randomsource, i, blockposition);
+ this.checkBurnOut(worldserver, blockposition.below(), 250 + k, randomsource, i, blockposition);
+ this.checkBurnOut(worldserver, blockposition.above(), 250 + k, randomsource, i, blockposition);
+ this.checkBurnOut(worldserver, blockposition.north(), 300 + k, randomsource, i, blockposition);
+ this.checkBurnOut(worldserver, blockposition.south(), 300 + k, randomsource, i, blockposition);
+ // CraftBukkit end
BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
for (int l = -1; l <= 1; ++l) {
@@ -197,7 +225,15 @@
if (i2 > 0 && randomsource.nextInt(k1) <= i2 && (!worldserver.isRaining() || !this.isNearRain(worldserver, blockposition_mutableblockposition))) {
int j2 = Math.min(15, i + randomsource.nextInt(5) / 4);
- worldserver.setBlock(blockposition_mutableblockposition, this.getStateWithAge(worldserver, blockposition_mutableblockposition, j2), 3);
+ // CraftBukkit start - Call to stop spread of fire
+ if (worldserver.getBlockState(blockposition_mutableblockposition).getBlock() != Blocks.FIRE) {
+ if (CraftEventFactory.callBlockIgniteEvent(worldserver, blockposition_mutableblockposition, blockposition).isCancelled()) {
+ continue;
+ }
2014-11-26 08:32:16 +11:00
+
2025-03-26 03:05:00 +11:00
+ CraftEventFactory.handleBlockSpreadEvent(worldserver, blockposition, blockposition_mutableblockposition, this.getStateWithAge(worldserver, blockposition_mutableblockposition, j2), 3); // CraftBukkit
+ }
+ // CraftBukkit end
}
2014-11-26 08:32:16 +11:00
}
}
2025-03-26 03:05:00 +11:00
@@ -222,12 +258,28 @@
2022-06-08 02:00:00 +10:00
return iblockdata.hasProperty(BlockProperties.WATERLOGGED) && (Boolean) iblockdata.getValue(BlockProperties.WATERLOGGED) ? 0 : this.igniteOdds.getInt(iblockdata.getBlock());
2017-03-08 14:20:24 -08:00
}
2022-06-08 02:00:00 +10:00
- private void checkBurnOut(World world, BlockPosition blockposition, int i, RandomSource randomsource, int j) {
2025-03-26 03:05:00 +11:00
+ private void checkBurnOut(World world, BlockPosition blockposition, int i, RandomSource randomsource, int j, BlockPosition sourceposition) { // CraftBukkit add sourceposition
2022-06-08 02:00:00 +10:00
int k = this.getBurnOdds(world.getBlockState(blockposition));
2017-03-08 14:20:24 -08:00
2022-06-08 02:00:00 +10:00
if (randomsource.nextInt(i) < k) {
2021-11-22 09:00:00 +11:00
IBlockData iblockdata = world.getBlockState(blockposition);
2015-02-26 22:41:06 +00:00
2014-11-26 08:32:16 +11:00
+ // CraftBukkit start
+ org.bukkit.block.Block theBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
2017-03-08 14:20:24 -08:00
+ org.bukkit.block.Block sourceBlock = world.getWorld().getBlockAt(sourceposition.getX(), sourceposition.getY(), sourceposition.getZ());
2014-11-26 08:32:16 +11:00
+
2017-03-08 14:20:24 -08:00
+ BlockBurnEvent event = new BlockBurnEvent(theBlock, sourceBlock);
2021-06-11 21:33:49 +10:00
+ world.getCraftServer().getPluginManager().callEvent(event);
2014-11-26 08:32:16 +11:00
+
+ if (event.isCancelled()) {
+ return;
+ }
2023-05-03 20:46:43 +10:00
+
+ if (iblockdata.getBlock() instanceof BlockTNT && !CraftEventFactory.callTNTPrimeEvent(world, blockposition, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.FIRE, null, sourceposition)) {
+ return;
+ }
2014-11-26 08:32:16 +11:00
+ // CraftBukkit end
2015-02-26 22:41:06 +00:00
+
2022-06-08 02:00:00 +10:00
if (randomsource.nextInt(j + 10) < 5 && !world.isRainingAt(blockposition)) {
int l = Math.min(j + randomsource.nextInt(5) / 4, 15);
2014-11-26 08:32:16 +11:00
2025-03-26 03:05:00 +11:00
@@ -283,8 +335,10 @@
2024-08-05 17:28:37 +10:00
}
@Override
- protected void onPlace(IBlockData iblockdata, World world, BlockPosition blockposition, IBlockData iblockdata1, boolean flag) {
- super.onPlace(iblockdata, world, blockposition, iblockdata1, flag);
+ // CraftBukkit start - context
+ protected void onPlace(IBlockData iblockdata, World world, BlockPosition blockposition, IBlockData iblockdata1, boolean flag, ItemActionContext context) {
+ super.onPlace(iblockdata, world, blockposition, iblockdata1, flag, context);
+ // CraftBukkit end
world.scheduleTick(blockposition, (Block) this, getFireTickDelay(world.random));
}