mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-02-16 10:30:42 +00:00
feat: support waterlogged
This commit is contained in:
@@ -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()) {
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -4,6 +4,6 @@
|
||||
"authors": [
|
||||
"daoge_cmd"
|
||||
],
|
||||
"version": "1.0.0",
|
||||
"version": "1.0.1",
|
||||
"order": "START_UP"
|
||||
}
|
||||
Reference in New Issue
Block a user