mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-10-25 13:30:10 +00:00
feat: support waterlogged
This commit is contained in:
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()) {
|
||||||
|
|||||||
+23
-4
@@ -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
|
||||||
|
|||||||
+13
-1
@@ -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
|
||||||
|
|||||||
+12
-3
@@ -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
|
||||||
|
|||||||
+13
-2
@@ -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"
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user