feat: support waterlogged

This commit is contained in:
daoge_cmd committed 2024-06-19 18:09:31 +08:00
1 parent 5fa7007d45
commit d490324bfc
7 files changed
+79 -12

No files matched your search

@@ -37,6 +37,10 @@ public class JeBlockState {
completeMissingProperties(); completeMissingProperties();
} }
public String getPropertyValue(String key) {
return properties.get(key);
}
private void completeMissingProperties() { private void completeMissingProperties() {
var defaultProperties = Mapping.getJeBlockDefaultProperties(identifier); var defaultProperties = Mapping.getJeBlockDefaultProperties(identifier);
if(properties.size() == defaultProperties.size()) { if(properties.size() == defaultProperties.size()) {
@@ -7,19 +7,32 @@ import org.allaymc.terra.allay.JeBlockState;
import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.BlockType;
import com.dfsek.terra.api.block.state.properties.Property; import com.dfsek.terra.api.block.state.properties.Property;
import java.util.Objects;
/** /**
* Terra Project 2024/6/16 * Terra Project 2024/6/16
* *
* @author daoge_cmd * @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")); 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 AllayBlockState(BlockState allayBlockState, JeBlockState jeBlockState) {
this.allayBlockState = allayBlockState;
this.jeBlockState = jeBlockState;
this.containsWater = "true".equals(jeBlockState.getPropertyValue("waterlogged"));
}
@Override @Override
public boolean matches(com.dfsek.terra.api.block.state.BlockState other) { public boolean matches(com.dfsek.terra.api.block.state.BlockState o) {
return ((AllayBlockState) other).allayBlockState == this.allayBlockState; var other = ((AllayBlockState) o);
return other.allayBlockState == this.allayBlockState && other.containsWater == this.containsWater;
} }
@Override @Override
@@ -59,4 +72,10 @@ public record AllayBlockState(BlockState allayBlockState, JeBlockState jeBlockSt
public BlockState getHandle() { public BlockState getHandle() {
return allayBlockState; return allayBlockState;
} }
public BlockState allayBlockState() { return allayBlockState; }
public boolean containsWater() { return containsWater; }
public JeBlockState jeBlockState() { return jeBlockState; }
} }
@@ -1,5 +1,7 @@
package org.allaymc.terra.allay.delegate; 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.api.world.chunk.Chunk;
import org.allaymc.terra.allay.Mapping; import org.allaymc.terra.allay.Mapping;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -14,9 +16,19 @@ import com.dfsek.terra.api.world.ServerWorld;
* @author daoge_cmd * @author daoge_cmd
*/ */
public record AllayChunk(ServerWorld world, Chunk allayChunk) implements com.dfsek.terra.api.world.chunk.Chunk { 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 @Override
public void setBlock(int x, int y, int z, BlockState data, boolean physics) { 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 @Override
@@ -1,5 +1,7 @@
package org.allaymc.terra.allay.delegate; 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.api.world.chunk.UnsafeChunk;
import org.allaymc.terra.allay.Mapping; import org.allaymc.terra.allay.Mapping;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -14,6 +16,9 @@ import com.dfsek.terra.api.world.chunk.generation.ProtoChunk;
* @author daoge_cmd * @author daoge_cmd
*/ */
public record AllayProtoChunk(UnsafeChunk allayChunk) implements ProtoChunk { 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 @Override
public int getMaxHeight() { public int getMaxHeight() {
return allayChunk.getDimensionInfo().maxHeight(); return allayChunk.getDimensionInfo().maxHeight();
@@ -21,7 +26,14 @@ public record AllayProtoChunk(UnsafeChunk allayChunk) implements ProtoChunk {
@Override @Override
public void setBlock(int x, int y, int z, @NotNull BlockState blockState) { 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 @Override
@@ -2,8 +2,8 @@ package org.allaymc.terra.allay.delegate;
import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.util.vector.Vector3;
import org.allaymc.api.world.chunk.ChunkAccessible; import org.allaymc.api.block.type.BlockTypes;
import org.allaymc.api.world.chunk.UnsafeChunk; import org.allaymc.api.data.VanillaBlockPropertyTypes;
import org.allaymc.api.world.generator.context.OtherChunkAccessibleContext; import org.allaymc.api.world.generator.context.OtherChunkAccessibleContext;
import org.allaymc.terra.allay.Mapping; import org.allaymc.terra.allay.Mapping;
@@ -24,6 +24,8 @@ import com.dfsek.terra.api.world.chunk.generation.ProtoWorld;
*/ */
public record AllayProtoWorld(AllayServerWorld allayServerWorld, OtherChunkAccessibleContext context) implements ProtoWorld { 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 @Override
public int centerChunkX() { public int centerChunkX() {
return context.getCurrentChunk().getX(); return context.getCurrentChunk().getX();
@@ -41,7 +43,14 @@ public record AllayProtoWorld(AllayServerWorld allayServerWorld, OtherChunkAcces
@Override @Override
public void setBlockState(int x, int y, int z, BlockState data, boolean physics) { 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 @Override
@@ -2,6 +2,8 @@ package org.allaymc.terra.allay.delegate;
import com.dfsek.terra.api.util.vector.Vector3; 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.api.world.Dimension;
import org.allaymc.terra.allay.Mapping; import org.allaymc.terra.allay.Mapping;
import org.allaymc.terra.allay.generator.AllayGeneratorWrapper; import org.allaymc.terra.allay.generator.AllayGeneratorWrapper;
@@ -23,6 +25,9 @@ import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
* @author daoge_cmd * @author daoge_cmd
*/ */
public record AllayServerWorld(AllayGeneratorWrapper allayGeneratorWrapper, Dimension allayDimension) implements ServerWorld { 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 @Override
public Chunk getChunkAt(int x, int z) { public Chunk getChunkAt(int x, int z) {
return new AllayChunk(this, allayDimension.getChunkService().getChunk(x ,z)); return new AllayChunk(this, allayDimension.getChunkService().getChunk(x ,z));
@@ -30,8 +35,14 @@ public record AllayServerWorld(AllayGeneratorWrapper allayGeneratorWrapper, Dime
@Override @Override
public void setBlockState(int x, int y, int z, BlockState data, boolean physics) { public void setBlockState(int x, int y, int z, BlockState data, boolean physics) {
var allayBlockState = ((AllayBlockState)data).allayBlockState(); var allayBlockState = (AllayBlockState)data;
allayDimension.setBlockState(x, y, z, allayBlockState); 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 @Override
@@ -4,6 +4,6 @@
"authors": [ "authors": [
"daoge_cmd" "daoge_cmd"
], ],
"version": "1.0.0", "version": "1.0.1",
"order": "START_UP" "order": "START_UP"
} }