aboutsummaryrefslogtreecommitdiffhomepage
path: root/patch-remap/og/net/minecraft/world/level/block/BlockFire.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patch-remap/og/net/minecraft/world/level/block/BlockFire.patch')
-rw-r--r--patch-remap/og/net/minecraft/world/level/block/BlockFire.patch146
1 files changed, 146 insertions, 0 deletions
diff --git a/patch-remap/og/net/minecraft/world/level/block/BlockFire.patch b/patch-remap/og/net/minecraft/world/level/block/BlockFire.patch
new file mode 100644
index 0000000000..7a4a7bd484
--- /dev/null
+++ b/patch-remap/og/net/minecraft/world/level/block/BlockFire.patch
@@ -0,0 +1,146 @@
+--- a/net/minecraft/world/level/block/BlockFire.java
++++ b/net/minecraft/world/level/block/BlockFire.java
+@@ -29,6 +29,14 @@
+ import net.minecraft.world.phys.shapes.VoxelShapeCollision;
+ import net.minecraft.world.phys.shapes.VoxelShapes;
+
++// 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 BlockFire extends BlockFireAbstract {
+
+ public static final MapCodec<BlockFire> CODEC = simpleCodec(BlockFire::new);
+@@ -100,7 +108,24 @@
+
+ @Override
+ public IBlockData updateShape(IBlockData iblockdata, EnumDirection enumdirection, IBlockData iblockdata1, GeneratorAccess generatoraccess, BlockPosition blockposition, BlockPosition blockposition1) {
+- return this.canSurvive(iblockdata, generatoraccess, blockposition) ? this.getStateWithAge(generatoraccess, blockposition, (Integer) iblockdata.getValue(BlockFire.AGE)) : Blocks.AIR.defaultBlockState();
++ // CraftBukkit start
++ if (!this.canSurvive(iblockdata, generatoraccess, blockposition)) {
++ // Suppress during worldgen
++ if (!(generatoraccess instanceof World)) {
++ return Blocks.AIR.defaultBlockState();
++ }
++ CraftBlockState blockState = CraftBlockStates.getBlockState(generatoraccess, blockposition);
++ blockState.setData(Blocks.AIR.defaultBlockState());
++
++ BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState);
++ ((World) generatoraccess).getCraftServer().getPluginManager().callEvent(event);
++
++ if (!event.isCancelled()) {
++ return blockState.getHandle();
++ }
++ }
++ return this.getStateWithAge(generatoraccess, blockposition, (Integer) iblockdata.getValue(BlockFire.AGE));
++ // CraftBukkit end
+ }
+
+ @Override
+@@ -149,7 +174,7 @@
+ worldserver.scheduleTick(blockposition, (Block) this, getFireTickDelay(worldserver.random));
+ if (worldserver.getGameRules().getBoolean(GameRules.RULE_DOFIRETICK)) {
+ if (!iblockdata.canSurvive(worldserver, blockposition)) {
+- worldserver.removeBlock(blockposition, false);
++ fireExtinguished(worldserver, blockposition); // CraftBukkit - invalid place location
+ }
+
+ IBlockData iblockdata1 = worldserver.getBlockState(blockposition.below());
+@@ -157,7 +182,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);
+
+@@ -171,14 +196,14 @@
+ BlockPosition blockposition1 = blockposition.below();
+
+ if (!worldserver.getBlockState(blockposition1).isFaceSturdy(worldserver, blockposition1, EnumDirection.UP) || i > 3) {
+- worldserver.removeBlock(blockposition, false);
++ fireExtinguished(worldserver, blockposition); // CraftBukkit
+ }
+
+ return;
+ }
+
+ if (i == 15 && randomsource.nextInt(4) == 0 && !this.canBurn(worldserver.getBlockState(blockposition.below()))) {
+- worldserver.removeBlock(blockposition, false);
++ fireExtinguished(worldserver, blockposition); // CraftBukkit
+ return;
+ }
+ }
+@@ -186,12 +211,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.trySpread(worldserver, blockposition.east(), 300 + k, randomsource, i, blockposition);
++ this.trySpread(worldserver, blockposition.west(), 300 + k, randomsource, i, blockposition);
++ this.trySpread(worldserver, blockposition.below(), 250 + k, randomsource, i, blockposition);
++ this.trySpread(worldserver, blockposition.above(), 250 + k, randomsource, i, blockposition);
++ this.trySpread(worldserver, blockposition.north(), 300 + k, randomsource, i, blockposition);
++ this.trySpread(worldserver, blockposition.south(), 300 + k, randomsource, i, blockposition);
++ // CraftBukkit end
+ BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
+
+ for (int l = -1; l <= 1; ++l) {
+@@ -217,7 +244,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;
++ }
++
++ CraftEventFactory.handleBlockSpreadEvent(worldserver, blockposition, blockposition_mutableblockposition, this.getStateWithAge(worldserver, blockposition_mutableblockposition, j2), 3); // CraftBukkit
++ }
++ // CraftBukkit end
+ }
+ }
+ }
+@@ -241,12 +276,28 @@
+ return iblockdata.hasProperty(BlockProperties.WATERLOGGED) && (Boolean) iblockdata.getValue(BlockProperties.WATERLOGGED) ? 0 : this.igniteOdds.getInt(iblockdata.getBlock());
+ }
+
+- private void checkBurnOut(World world, BlockPosition blockposition, int i, RandomSource randomsource, int j) {
++ private void trySpread(World world, BlockPosition blockposition, int i, RandomSource randomsource, int j, BlockPosition sourceposition) { // CraftBukkit add sourceposition
+ int k = this.getBurnOdds(world.getBlockState(blockposition));
+
+ if (randomsource.nextInt(i) < k) {
+ IBlockData 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 BlockTNT && !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);
+