From d490324bfc502501eefdfc548b906379ab5eb6cd Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Wed, 19 Jun 2024 18:09:31 +0800 Subject: [PATCH] feat: support waterlogged --- .../org/allaymc/terra/allay/JeBlockState.java | 4 +++ .../terra/allay/delegate/AllayBlockState.java | 27 ++++++++++++++++--- .../terra/allay/delegate/AllayChunk.java | 14 +++++++++- .../terra/allay/delegate/AllayProtoChunk.java | 14 +++++++++- .../terra/allay/delegate/AllayProtoWorld.java | 15 ++++++++--- .../allay/delegate/AllayServerWorld.java | 15 +++++++++-- .../allay/src/main/resources/plugin.json | 2 +- 7 files changed, 79 insertions(+), 12 deletions(-) diff --git a/platforms/allay/src/main/java/org/allaymc/terra/allay/JeBlockState.java b/platforms/allay/src/main/java/org/allaymc/terra/allay/JeBlockState.java index 3db3e051bc..f417e3d9c5 100644 --- a/platforms/allay/src/main/java/org/allaymc/terra/allay/JeBlockState.java +++ b/platforms/allay/src/main/java/org/allaymc/terra/allay/JeBlockState.java @@ -37,6 +37,10 @@ private JeBlockState(String data) { completeMissingProperties(); } + public String getPropertyValue(String key) { + return properties.get(key); + } + private void completeMissingProperties() { var defaultProperties = Mapping.getJeBlockDefaultProperties(identifier); if(properties.size() == defaultProperties.size()) { diff --git a/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayBlockState.java b/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayBlockState.java index 79791d5545..cf85f34458 100644 --- a/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayBlockState.java +++ b/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayBlockState.java @@ -7,19 +7,32 @@ import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.properties.Property; +import java.util.Objects; + /** * Terra Project 2024/6/16 * * @author daoge_cmd */ -public record AllayBlockState(BlockState allayBlockState, JeBlockState jeBlockState) implements com.dfsek.terra.api.block.state.BlockState { +public final class AllayBlockState implements com.dfsek.terra.api.block.state.BlockState { + + public static final AllayBlockState AIR = new AllayBlockState(BlockTypes.AIR_TYPE.getDefaultState(), + JeBlockState.fromString("minecraft:air")); + private final BlockState allayBlockState; + private final JeBlockState jeBlockState; + private final boolean containsWater; - public static final AllayBlockState AIR = new AllayBlockState(BlockTypes.AIR_TYPE.getDefaultState(), JeBlockState.fromString("minecraft:air")); + public AllayBlockState(BlockState allayBlockState, JeBlockState jeBlockState) { + this.allayBlockState = allayBlockState; + this.jeBlockState = jeBlockState; + this.containsWater = "true".equals(jeBlockState.getPropertyValue("waterlogged")); + } @Override - public boolean matches(com.dfsek.terra.api.block.state.BlockState other) { - return ((AllayBlockState) other).allayBlockState == this.allayBlockState; + public boolean matches(com.dfsek.terra.api.block.state.BlockState o) { + var other = ((AllayBlockState) o); + return other.allayBlockState == this.allayBlockState && other.containsWater == this.containsWater; } @Override @@ -59,4 +72,10 @@ public boolean isAir() { public BlockState getHandle() { return allayBlockState; } + + public BlockState allayBlockState() { return allayBlockState; } + + public boolean containsWater() { return containsWater; } + + public JeBlockState jeBlockState() { return jeBlockState; } } diff --git a/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayChunk.java b/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayChunk.java index 113b3a5aea..19531b3f9b 100644 --- a/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayChunk.java +++ b/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayChunk.java @@ -1,5 +1,7 @@ package org.allaymc.terra.allay.delegate; +import org.allaymc.api.block.type.BlockTypes; +import org.allaymc.api.data.VanillaBlockPropertyTypes; import org.allaymc.api.world.chunk.Chunk; import org.allaymc.terra.allay.Mapping; import org.jetbrains.annotations.NotNull; @@ -14,9 +16,19 @@ * @author daoge_cmd */ public record AllayChunk(ServerWorld world, Chunk allayChunk) implements com.dfsek.terra.api.world.chunk.Chunk { + + private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER_TYPE.ofState(VanillaBlockPropertyTypes.LIQUID_DEPTH.createValue(15)); + @Override public void setBlock(int x, int y, int z, BlockState data, boolean physics) { - allayChunk.setBlockState(x, y, z, ((AllayBlockState)data).allayBlockState()); + var allayBlockState = (AllayBlockState)data; + var containsWater = allayBlockState.containsWater(); + if (!containsWater) { + var oldBlock = allayChunk.getBlockState(x, y, z); + containsWater = oldBlock == BlockTypes.WATER_TYPE; + } + allayChunk.setBlockState(x, y, z, allayBlockState.allayBlockState()); + if (containsWater) allayChunk.setBlockState(x, y, z, WATER, 1); } @Override diff --git a/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayProtoChunk.java b/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayProtoChunk.java index 7cc24b9630..e1dea49363 100644 --- a/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayProtoChunk.java +++ b/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayProtoChunk.java @@ -1,5 +1,7 @@ package org.allaymc.terra.allay.delegate; +import org.allaymc.api.block.type.BlockTypes; +import org.allaymc.api.data.VanillaBlockPropertyTypes; import org.allaymc.api.world.chunk.UnsafeChunk; import org.allaymc.terra.allay.Mapping; import org.jetbrains.annotations.NotNull; @@ -14,6 +16,9 @@ * @author daoge_cmd */ public record AllayProtoChunk(UnsafeChunk allayChunk) implements ProtoChunk { + + private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER_TYPE.ofState(VanillaBlockPropertyTypes.LIQUID_DEPTH.createValue(15)); + @Override public int getMaxHeight() { return allayChunk.getDimensionInfo().maxHeight(); @@ -21,7 +26,14 @@ public int getMaxHeight() { @Override public void setBlock(int x, int y, int z, @NotNull BlockState blockState) { - allayChunk.setBlockState(x, y, z, ((AllayBlockState)blockState).allayBlockState()); + var allayBlockState = (AllayBlockState)blockState; + var containsWater = allayBlockState.containsWater(); + if (!containsWater) { + var oldBlock = allayChunk.getBlockState(x, y, z); + containsWater = oldBlock == BlockTypes.WATER_TYPE; + } + allayChunk.setBlockState(x, y, z, allayBlockState.allayBlockState()); + if (containsWater) allayChunk.setBlockState(x, y, z, WATER, 1); } @Override diff --git a/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayProtoWorld.java b/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayProtoWorld.java index ab503db3b6..cab6a59cc6 100644 --- a/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayProtoWorld.java +++ b/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayProtoWorld.java @@ -2,8 +2,8 @@ import com.dfsek.terra.api.util.vector.Vector3; -import org.allaymc.api.world.chunk.ChunkAccessible; -import org.allaymc.api.world.chunk.UnsafeChunk; +import org.allaymc.api.block.type.BlockTypes; +import org.allaymc.api.data.VanillaBlockPropertyTypes; import org.allaymc.api.world.generator.context.OtherChunkAccessibleContext; import org.allaymc.terra.allay.Mapping; @@ -24,6 +24,8 @@ */ public record AllayProtoWorld(AllayServerWorld allayServerWorld, OtherChunkAccessibleContext context) implements ProtoWorld { + private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER_TYPE.ofState(VanillaBlockPropertyTypes.LIQUID_DEPTH.createValue(15)); + @Override public int centerChunkX() { return context.getCurrentChunk().getX(); @@ -41,7 +43,14 @@ public ServerWorld getWorld() { @Override public void setBlockState(int x, int y, int z, BlockState data, boolean physics) { - context.setBlockState(x, y, z, ((AllayBlockState)data).allayBlockState()); + var allayBlockState = (AllayBlockState)data; + var containsWater = allayBlockState.containsWater(); + if (!containsWater) { + var oldBlock = context.getBlockState(x, y, z).getBlockType(); + containsWater = oldBlock == BlockTypes.WATER_TYPE; + } + context.setBlockState(x, y, z, allayBlockState.allayBlockState()); + if (containsWater) context.setBlockState(x, y, z, WATER, 1); } @Override diff --git a/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayServerWorld.java b/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayServerWorld.java index ca94254545..e2af552927 100644 --- a/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayServerWorld.java +++ b/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayServerWorld.java @@ -2,6 +2,8 @@ import com.dfsek.terra.api.util.vector.Vector3; +import org.allaymc.api.block.type.BlockTypes; +import org.allaymc.api.data.VanillaBlockPropertyTypes; import org.allaymc.api.world.Dimension; import org.allaymc.terra.allay.Mapping; import org.allaymc.terra.allay.generator.AllayGeneratorWrapper; @@ -23,6 +25,9 @@ * @author daoge_cmd */ public record AllayServerWorld(AllayGeneratorWrapper allayGeneratorWrapper, Dimension allayDimension) implements ServerWorld { + + private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER_TYPE.ofState(VanillaBlockPropertyTypes.LIQUID_DEPTH.createValue(15)); + @Override public Chunk getChunkAt(int x, int z) { return new AllayChunk(this, allayDimension.getChunkService().getChunk(x ,z)); @@ -30,8 +35,14 @@ public Chunk getChunkAt(int x, int z) { @Override public void setBlockState(int x, int y, int z, BlockState data, boolean physics) { - var allayBlockState = ((AllayBlockState)data).allayBlockState(); - allayDimension.setBlockState(x, y, z, allayBlockState); + var allayBlockState = (AllayBlockState)data; + var containsWater = allayBlockState.containsWater(); + if (!containsWater) { + var oldBlock = allayDimension.getBlockState(x, y, z).getBlockType(); + containsWater = oldBlock == BlockTypes.WATER_TYPE; + } + allayDimension.setBlockState(x, y, z, allayBlockState.allayBlockState()); + if (containsWater) allayDimension.setBlockState(x, y, z, WATER, 1); } @Override diff --git a/platforms/allay/src/main/resources/plugin.json b/platforms/allay/src/main/resources/plugin.json index 56cbf7dd8c..b82f10b9e1 100644 --- a/platforms/allay/src/main/resources/plugin.json +++ b/platforms/allay/src/main/resources/plugin.json @@ -4,6 +4,6 @@ "authors": [ "daoge_cmd" ], - "version": "1.0.0", + "version": "1.0.1", "order": "START_UP" } \ No newline at end of file