From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Tom Date: Fri, 12 Aug 2022 08:20:02 -0500 Subject: [PATCH] Set BlockData without light updates diff --git a/src/main/java/net/minecraft/server/level/WorldGenRegion.java b/src/main/java/net/minecraft/server/level/WorldGenRegion.java index 80c1e0e47818486a68e0114b063395290365346b..c7aa378d081c43838c6f8169125c46cbbfa72429 100644 --- a/src/main/java/net/minecraft/server/level/WorldGenRegion.java +++ b/src/main/java/net/minecraft/server/level/WorldGenRegion.java @@ -233,7 +233,7 @@ public class WorldGenRegion implements WorldGenLevel { Block.dropResources(iblockdata, this.level, pos, tileentity, breakingEntity, ItemStack.EMPTY); } - return this.setBlock(pos, Blocks.AIR.defaultBlockState(), 3, maxUpdateDepth); + return this.setBlock(pos, Blocks.AIR.defaultBlockState(), 3, maxUpdateDepth, true); // Slice } } @@ -308,7 +308,7 @@ public class WorldGenRegion implements WorldGenLevel { } @Override - public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth) { + public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth, boolean checkLight) { // Slice if (!this.ensureCanWrite(pos)) { return false; } else { diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java index 5a2a1d394852d39ea576624586f7fa736dec807c..f9117486a51a1456842b03b2d2f2ee72cf1bc297 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -510,12 +510,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } @Override - public final boolean setBlock(BlockPos pos, BlockState state, int flags) { // Paper - final for inline - return this.setBlock(pos, state, flags, 512); + public final boolean setBlock(BlockPos pos, BlockState state, int flags, boolean checkLight) { // Paper - final for inline + return this.setBlock(pos, state, flags, 512, checkLight); } @Override - public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth) { + public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth, boolean checkLight) { // CraftBukkit start - tree generation if (this.captureTreeGeneration) { // Paper start @@ -562,7 +562,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } else { BlockState iblockdata2 = this.getBlockState(pos); - if ((flags & 128) == 0 && iblockdata2 != iblockdata1 && (iblockdata2.getLightBlock(this, pos) != iblockdata1.getLightBlock(this, pos) || iblockdata2.getLightEmission() != iblockdata1.getLightEmission() || iblockdata2.useShapeForLightOcclusion() || iblockdata1.useShapeForLightOcclusion())) { + if (checkLight && (flags & 128) == 0 && iblockdata2 != iblockdata1 && (iblockdata2.getLightBlock(this, pos) != iblockdata1.getLightBlock(this, pos) || iblockdata2.getLightEmission() != iblockdata1.getLightEmission() || iblockdata2.useShapeForLightOcclusion() || iblockdata1.useShapeForLightOcclusion())) { this.getProfiler().push("queueCheckLight"); this.getChunkSource().getLightEngine().checkBlock(pos); this.getProfiler().pop(); @@ -709,7 +709,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { Block.dropResources(iblockdata, this, pos, tileentity, breakingEntity, ItemStack.EMPTY); } - boolean flag1 = this.setBlock(pos, fluid.createLegacyBlock(), 3, maxUpdateDepth); + boolean flag1 = this.setBlock(pos, fluid.createLegacyBlock(), 3, maxUpdateDepth, true); if (flag1) { this.gameEvent(GameEvent.BLOCK_DESTROY, pos, GameEvent.Context.of(breakingEntity, iblockdata)); diff --git a/src/main/java/net/minecraft/world/level/LevelWriter.java b/src/main/java/net/minecraft/world/level/LevelWriter.java index 134e5ec79bf2dddd4e31930f8a7cb2c02fa29518..fd72d278a2719911a46b6bc9e7da2dc24bbe681e 100644 --- a/src/main/java/net/minecraft/world/level/LevelWriter.java +++ b/src/main/java/net/minecraft/world/level/LevelWriter.java @@ -7,10 +7,14 @@ import net.minecraft.world.level.block.state.BlockState; public interface LevelWriter { - boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth); + boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth, boolean checkLight); default boolean setBlock(BlockPos pos, BlockState state, int flags) { - return this.setBlock(pos, state, flags, 512); + return this.setBlock(pos, state, flags, 512, true); + } + + default boolean setBlock(BlockPos pos, BlockState state, int flags, boolean checkLight) { + return this.setBlock(pos, state, flags, 512, checkLight); } boolean removeBlock(BlockPos pos, boolean move); diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java index 2e65b44f10aeb44fd524a58e7eb815a566c1ad61..f85777b5d4003a9fcc6f19976ea6ef23a8674c68 100644 --- a/src/main/java/net/minecraft/world/level/block/Block.java +++ b/src/main/java/net/minecraft/world/level/block/Block.java @@ -198,7 +198,7 @@ public class Block extends BlockBehaviour implements ItemLike { world.destroyBlock(pos, (flags & 32) == 0, (Entity) null, maxUpdateDepth); } } else { - world.setBlock(pos, newState, flags & -33, maxUpdateDepth); + world.setBlock(pos, newState, flags & -33, maxUpdateDepth, true); // Slice } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java index 62bca85da6c5d9877e21fecb702370506ddf671c..9e339db1a9257e64f5645ba7e4025debaa4110e9 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java @@ -277,7 +277,7 @@ public abstract class CraftRegionAccessor implements RegionAccessor { BlockPos pos = new BlockPos(x, y, z); net.minecraft.world.level.block.state.BlockState old = this.getHandle().getBlockState(pos); - CraftBlock.setTypeAndData(world, pos, old, ((CraftBlockData) blockData).getState(), true); + CraftBlock.setTypeAndData(world, pos, old, ((CraftBlockData) blockData).getState(), true, true); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java index 0d47460494135d4ec4c95260de033e054c2f0404..4d49cc4ceba781bc24ac9b4229483625a996839d 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java @@ -187,15 +187,20 @@ public class CraftBlock implements Block { @Override public void setBlockData(BlockData data, boolean applyPhysics) { + setBlockData(data, applyPhysics, true); + } + + @Override + public void setBlockData(BlockData data, boolean applyPhysics, boolean checkLight) { Preconditions.checkArgument(data != null, "BlockData cannot be null"); - this.setTypeAndData(((CraftBlockData) data).getState(), applyPhysics); + this.setTypeAndData(((CraftBlockData) data).getState(), applyPhysics, checkLight); } - boolean setTypeAndData(final net.minecraft.world.level.block.state.BlockState blockData, final boolean applyPhysics) { - return CraftBlock.setTypeAndData(this.world, this.position, this.getNMS(), blockData, applyPhysics); + boolean setTypeAndData(final net.minecraft.world.level.block.state.BlockState blockData, final boolean applyPhysics, boolean checkLight) { + return CraftBlock.setTypeAndData(this.world, this.position, this.getNMS(), blockData, applyPhysics, checkLight); } - public static boolean setTypeAndData(LevelAccessor world, BlockPos position, net.minecraft.world.level.block.state.BlockState old, net.minecraft.world.level.block.state.BlockState blockData, boolean applyPhysics) { + public static boolean setTypeAndData(LevelAccessor world, BlockPos position, net.minecraft.world.level.block.state.BlockState old, net.minecraft.world.level.block.state.BlockState blockData, boolean applyPhysics, boolean checkLight) { // SPIGOT-611: need to do this to prevent glitchiness. Easier to handle this here (like /setblock) than to fix weirdness in tile entity cleanup if (old.hasBlockEntity() && blockData.getBlock() != old.getBlock()) { // SPIGOT-3725 remove old tile entity if block changes // SPIGOT-4612: faster - just clear tile @@ -209,7 +214,7 @@ public class CraftBlock implements Block { if (applyPhysics) { return world.setBlock(position, blockData, 3); } else { - boolean success = world.setBlock(position, blockData, 2 | 16 | 1024); // NOTIFY | NO_OBSERVER | NO_PLACE (custom) + boolean success = world.setBlock(position, blockData, 2 | 16 | 1024, checkLight); // NOTIFY | NO_OBSERVER | NO_PLACE (custom) if (success && world instanceof net.minecraft.world.level.Level) { world.getMinecraftWorld().sendBlockUpdated( position, diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java index 966ac60daebb7bb211ab8096fc0c5f33db67320a..d68b046e30d0f3d186ed90b7c36086ccd889de1f 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java @@ -213,7 +213,7 @@ public class CraftBlockState implements BlockState { } net.minecraft.world.level.block.state.BlockState newBlock = this.data; - block.setTypeAndData(newBlock, applyPhysics); + block.setTypeAndData(newBlock, applyPhysics, true); if (access instanceof net.minecraft.world.level.Level) { this.world.getHandle().sendBlockUpdated( position, diff --git a/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java b/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java index cd0dc080fbd8c5b1509d67e2b60264393b2b7dbb..8195cace753c6d044a128f768459303bc2f97588 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java +++ b/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java @@ -241,7 +241,7 @@ public class DummyGeneratorAccess implements WorldGenLevel { } @Override - public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth) { + public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth, boolean checkLight) { return false; }