182 lines
11 KiB
Diff
182 lines
11 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Tom <cryptite@gmail.com>
|
|
Date: Fri, 12 Aug 2022 08:20:02 -0500
|
|
Subject: [PATCH] Set BlockData without light updates
|
|
|
|
Copyright (c) 2021 Tom Miller
|
|
|
|
Original license: MIT
|
|
Original project: https://github.com/Cryptite/Slice
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/WorldGenRegion.java b/src/main/java/net/minecraft/server/level/WorldGenRegion.java
|
|
index 8afacc53a673567cead4c6e49966f07f1d5da754..33f07595a99a94984f221fdf8e436dd3c3b094f5 100644
|
|
--- a/src/main/java/net/minecraft/server/level/WorldGenRegion.java
|
|
+++ b/src/main/java/net/minecraft/server/level/WorldGenRegion.java
|
|
@@ -278,7 +278,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
|
|
}
|
|
}
|
|
|
|
@@ -353,7 +353,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 f915415e2e24ee7ab3c279ae1fa98d2d9d19a683..d110c887878fa1555c0a258818471baf6a2c6a8c 100644
|
|
--- a/src/main/java/net/minecraft/world/level/Level.java
|
|
+++ b/src/main/java/net/minecraft/world/level/Level.java
|
|
@@ -613,12 +613,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
|
|
@@ -665,7 +665,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();
|
|
@@ -812,7 +812,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 1834470b549d8352317cf081173ff542c9faac1e..ebbbb5033f88a4cea866b0415001c2f747e1248f 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/Block.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/Block.java
|
|
@@ -200,7 +200,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;
|
|
}
|
|
|