feat: support waterlogged

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

View File

@@ -37,6 +37,10 @@ public class JeBlockState {
completeMissingProperties();
}
public String getPropertyValue(String key) {
return properties.get(key);
}
private void completeMissingProperties() {
var defaultProperties = Mapping.getJeBlockDefaultProperties(identifier);
if(properties.size() == defaultProperties.size()) {

View File

@@ -7,19 +7,32 @@ import org.allaymc.terra.allay.JeBlockState;
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"));
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
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 record AllayBlockState(BlockState allayBlockState, JeBlockState jeBlockSt
public BlockState getHandle() {
return allayBlockState;
}
public BlockState allayBlockState() { return allayBlockState; }
public boolean containsWater() { return containsWater; }
public JeBlockState jeBlockState() { return jeBlockState; }
}

View File

@@ -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 @@ import com.dfsek.terra.api.world.ServerWorld;
* @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

View File

@@ -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 @@ import com.dfsek.terra.api.world.chunk.generation.ProtoChunk;
* @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 record AllayProtoChunk(UnsafeChunk allayChunk) implements ProtoChunk {
@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

View File

@@ -2,8 +2,8 @@ package org.allaymc.terra.allay.delegate;
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 @@ import com.dfsek.terra.api.world.chunk.generation.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
public int centerChunkX() {
return context.getCurrentChunk().getX();
@@ -41,7 +43,14 @@ public record AllayProtoWorld(AllayServerWorld allayServerWorld, OtherChunkAcces
@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

View File

@@ -2,6 +2,8 @@ package org.allaymc.terra.allay.delegate;
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 @@ import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
* @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 record AllayServerWorld(AllayGeneratorWrapper allayGeneratorWrapper, Dime
@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

View File

@@ -4,6 +4,6 @@
"authors": [
"daoge_cmd"
],
"version": "1.0.0",
"version": "1.0.1",
"order": "START_UP"
}