Skip to content

Commit 4b3d802

Browse files
committed
fix broken liquid physics during structure placement
In a world without any block transformer registered the physics of the water/lava wouldn't tick further and would stay static. This can be seen easily with the fountain in the stronghold.
1 parent 9c01f0c commit 4b3d802

File tree

5 files changed

+21
-22
lines changed

5 files changed

+21
-22
lines changed

paper-server/patches/sources/net/minecraft/world/level/levelgen/structure/StructurePiece.java.patch

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
level.setBlock(worldPos, blockstate, 2);
77
+ // CraftBukkit start - fluid handling is already done if we have a transformer generator access
8-
+ if (level instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess) {
8+
+ if (level instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess && transformerAccess.canTransformBlocks()) {
99
+ return;
1010
+ }
1111
+ // CraftBukkit end
@@ -18,10 +18,10 @@
1818

1919
+ // CraftBukkit start
2020
+ protected boolean placeCraftBlockEntity(ServerLevelAccessor levelAccessor, BlockPos pos, org.bukkit.craftbukkit.block.CraftBlockEntityState<?> craftBlockEntityState, int flags) {
21-
+ // todo use place for regular flow and fix liquid physics on placement
22-
+ if (levelAccessor instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess) {
21+
+ if (levelAccessor instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess && transformerAccess.canTransformBlocks()) {
2322
+ return transformerAccess.setCraftBlock(pos, craftBlockEntityState, flags);
2423
+ }
24+
+
2525
+ boolean result = levelAccessor.setBlock(pos, craftBlockEntityState.getHandle(), flags);
2626
+ BlockEntity blockEntity = levelAccessor.getBlockEntity(pos);
2727
+ if (blockEntity != null) {
@@ -42,7 +42,7 @@
4242
+ net.minecraft.world.level.block.entity.BlockEntity blockEntity = levelAccessor.getBlockEntity(pos);
4343
+ if (blockEntity instanceof net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity lootContainerBlockEntity) {
4444
+ lootContainerBlockEntity.setLootTable(lootTable, randomSource.nextLong());
45-
+ if (levelAccessor instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess) {
45+
+ if (levelAccessor instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess && transformerAccess.canTransformBlocks()) {
4646
+ transformerAccess.setCraftBlock(pos, (org.bukkit.craftbukkit.block.CraftBlockState) org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(levelAccessor, pos, blockEntity.getBlockState(), lootContainerBlockEntity.saveWithFullMetadata(levelAccessor.registryAccess())), 3);
4747
+ }
4848
+ }

paper-server/patches/sources/net/minecraft/world/level/levelgen/structure/structures/DesertPyramidStructure.java.patch

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
--- a/net/minecraft/world/level/levelgen/structure/structures/DesertPyramidStructure.java
22
+++ b/net/minecraft/world/level/levelgen/structure/structures/DesertPyramidStructure.java
3-
@@ -65,6 +_,15 @@
3+
@@ -65,6 +_,16 @@
44

55
private static void placeSuspiciousSand(BoundingBox boundingBox, WorldGenLevel worldGenLevel, BlockPos pos) {
66
if (boundingBox.isInside(pos)) {
77
+ // CraftBukkit start
8-
+ if (worldGenLevel instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess) {
8+
+ if (worldGenLevel instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess && transformerAccess.canTransformBlocks()) {
9+
+ // todo never called cause it's called in afterPlace after the whole capture logic
910
+ org.bukkit.craftbukkit.block.CraftBrushableBlock brushableState = (org.bukkit.craftbukkit.block.CraftBrushableBlock) org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(worldGenLevel, pos, Blocks.SUSPICIOUS_SAND.defaultBlockState(), null);
1011
+ brushableState.setLootTable(org.bukkit.craftbukkit.CraftLootTable.minecraftToBukkit(BuiltInLootTables.DESERT_PYRAMID_ARCHAEOLOGY));
1112
+ brushableState.setSeed(pos.asLong());

paper-server/src/main/java/org/bukkit/craftbukkit/util/CraftStructureTransformer.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,6 @@ public boolean canTransformBlocks() {
103103
}
104104

105105
public CraftBlockState transformCraftState(CraftBlockState originalState) {
106-
BlockTransformer[] transformers = this.blockTransformers;
107-
if (transformers == null || transformers.length == 0) {
108-
return originalState;
109-
}
110106
CraftLimitedRegion region = this.limitedRegion;
111107
if (region == null) {
112108
return originalState;
@@ -115,7 +111,7 @@ public CraftBlockState transformCraftState(CraftBlockState originalState) {
115111
BlockPos position = originalState.getPosition();
116112
BlockState blockState = originalState.copy();
117113
CraftTransformationState transformationState = new CraftTransformationState(originalState, region.getBlockState(position.getX(), position.getY(), position.getZ()));
118-
for (BlockTransformer transformer : transformers) {
114+
for (BlockTransformer transformer : this.blockTransformers) {
119115
blockState = Objects.requireNonNull(transformer.transform(region, position.getX(), position.getY(), position.getZ(), blockState, transformationState), "BlockState can't be null");
120116
transformationState.destroyCopies();
121117
}

paper-server/src/main/java/org/bukkit/craftbukkit/util/DelegatedGeneratorAccess.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -688,8 +688,8 @@ public Player getPlayerByUUID(UUID uuid) {
688688
}
689689

690690
@Override
691-
public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth) {
692-
return this.handle.setBlock(pos, state, flags, maxUpdateDepth);
691+
public boolean setBlock(BlockPos pos, BlockState state, int flags, int recursionLeft) {
692+
return this.handle.setBlock(pos, state, flags, recursionLeft);
693693
}
694694

695695
@Override

paper-server/src/main/java/org/bukkit/craftbukkit/util/TransformerGeneratorAccess.java

+11-9
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ public CraftStructureTransformer getStructureTransformer() {
2424
return this.structureTransformer;
2525
}
2626

27+
public boolean canTransformBlocks() {
28+
return this.structureTransformer != null && this.structureTransformer.canTransformBlocks();
29+
}
30+
2731
@Override
2832
public boolean addFreshEntity(Entity entity) {
2933
if (this.structureTransformer != null && !this.structureTransformer.transformEntity(entity)) {
@@ -40,14 +44,12 @@ public boolean addFreshEntity(Entity arg0, SpawnReason arg1) {
4044
return super.addFreshEntity(arg0, arg1);
4145
}
4246

43-
public boolean setCraftBlock(BlockPos position, CraftBlockState craftBlockState, int i, int j) {
44-
if (this.structureTransformer != null) {
45-
craftBlockState = this.structureTransformer.transformCraftState(craftBlockState);
46-
}
47+
public boolean setCraftBlock(BlockPos position, CraftBlockState craftBlockState, int flags, int recursionLeft) {
48+
craftBlockState = this.structureTransformer.transformCraftState(craftBlockState);
4749
// This code is based on the method 'net.minecraft.world.level.levelgen.structure.StructurePiece#placeBlock'
4850
// It ensures that any kind of block is updated correctly upon placing it
4951
BlockState snapshot = craftBlockState.getHandle();
50-
boolean result = super.setBlock(position, snapshot, i, j);
52+
boolean result = super.setBlock(position, snapshot, flags, recursionLeft);
5153
FluidState fluidState = this.getFluidState(position);
5254
if (!fluidState.isEmpty()) {
5355
this.scheduleTick(position, fluidState.getType(), 0);
@@ -67,11 +69,11 @@ public boolean setCraftBlock(BlockPos pos, CraftBlockState craftBlockState, int
6769
}
6870

6971
@Override
70-
public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth) {
71-
if (this.structureTransformer == null || !this.structureTransformer.canTransformBlocks()) {
72-
return super.setBlock(pos, state, flags, maxUpdateDepth);
72+
public boolean setBlock(BlockPos pos, BlockState state, int flags, int recursionLeft) {
73+
if (this.canTransformBlocks()) {
74+
return this.setCraftBlock(pos, (CraftBlockState) CraftBlockStates.getBlockState(this, pos, state, null), flags, recursionLeft);
7375
}
74-
return this.setCraftBlock(pos, (CraftBlockState) CraftBlockStates.getBlockState(this, pos, state, null), flags, maxUpdateDepth);
76+
return super.setBlock(pos, state, flags, recursionLeft);
7577
}
7678

7779
@Override

0 commit comments

Comments
 (0)