mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-17 22:31:52 +00:00
add smart waterlog
This commit is contained in:
@@ -6,4 +6,6 @@ public interface BlockType extends Handle {
|
|||||||
BlockData getDefaultData();
|
BlockData getDefaultData();
|
||||||
|
|
||||||
boolean isSolid();
|
boolean isSolid();
|
||||||
|
|
||||||
|
boolean isWater();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import com.dfsek.terra.api.structures.script.builders.RecursionsFunctionBuilder;
|
|||||||
import com.dfsek.terra.api.structures.script.builders.SetMarkFunctionBuilder;
|
import com.dfsek.terra.api.structures.script.builders.SetMarkFunctionBuilder;
|
||||||
import com.dfsek.terra.api.structures.script.builders.StateFunctionBuilder;
|
import com.dfsek.terra.api.structures.script.builders.StateFunctionBuilder;
|
||||||
import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder;
|
import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder;
|
||||||
|
import com.dfsek.terra.api.structures.script.builders.UnaryBooleanFunctionBuilder;
|
||||||
import com.dfsek.terra.api.structures.script.builders.UnaryNumberFunctionBuilder;
|
import com.dfsek.terra.api.structures.script.builders.UnaryNumberFunctionBuilder;
|
||||||
import com.dfsek.terra.api.structures.script.builders.UnaryStringFunctionBuilder;
|
import com.dfsek.terra.api.structures.script.builders.UnaryStringFunctionBuilder;
|
||||||
import com.dfsek.terra.api.structures.script.builders.ZeroArgFunctionBuilder;
|
import com.dfsek.terra.api.structures.script.builders.ZeroArgFunctionBuilder;
|
||||||
@@ -71,6 +72,7 @@ public class StructureScript {
|
|||||||
.registerFunction("getBiome", new BiomeFunctionBuilder(main))
|
.registerFunction("getBiome", new BiomeFunctionBuilder(main))
|
||||||
.registerFunction("getBlock", new CheckBlockFunctionBuilder())
|
.registerFunction("getBlock", new CheckBlockFunctionBuilder())
|
||||||
.registerFunction("state", new StateFunctionBuilder(main))
|
.registerFunction("state", new StateFunctionBuilder(main))
|
||||||
|
.registerFunction("setWaterlog", new UnaryBooleanFunctionBuilder((waterlog, args) -> args.setWaterlog(waterlog)))
|
||||||
.registerFunction("originX", new ZeroArgFunctionBuilder<Number>(arguments -> arguments.getBuffer().getOrigin().getX(), Returnable.ReturnType.NUMBER))
|
.registerFunction("originX", new ZeroArgFunctionBuilder<Number>(arguments -> arguments.getBuffer().getOrigin().getX(), Returnable.ReturnType.NUMBER))
|
||||||
.registerFunction("originY", new ZeroArgFunctionBuilder<Number>(arguments -> arguments.getBuffer().getOrigin().getY(), Returnable.ReturnType.NUMBER))
|
.registerFunction("originY", new ZeroArgFunctionBuilder<Number>(arguments -> arguments.getBuffer().getOrigin().getY(), Returnable.ReturnType.NUMBER))
|
||||||
.registerFunction("originZ", new ZeroArgFunctionBuilder<Number>(arguments -> arguments.getBuffer().getOrigin().getZ(), Returnable.ReturnType.NUMBER))
|
.registerFunction("originZ", new ZeroArgFunctionBuilder<Number>(arguments -> arguments.getBuffer().getOrigin().getZ(), Returnable.ReturnType.NUMBER))
|
||||||
|
|||||||
+9
@@ -11,6 +11,7 @@ public class TerraImplementationArguments implements ImplementationArguments {
|
|||||||
private final Rotation rotation;
|
private final Rotation rotation;
|
||||||
private final Random random;
|
private final Random random;
|
||||||
private final int recursions;
|
private final int recursions;
|
||||||
|
private boolean waterlog = false;
|
||||||
|
|
||||||
public TerraImplementationArguments(Buffer buffer, Rotation rotation, Random random, int recursions) {
|
public TerraImplementationArguments(Buffer buffer, Rotation rotation, Random random, int recursions) {
|
||||||
this.buffer = buffer;
|
this.buffer = buffer;
|
||||||
@@ -34,4 +35,12 @@ public class TerraImplementationArguments implements ImplementationArguments {
|
|||||||
public Rotation getRotation() {
|
public Rotation getRotation() {
|
||||||
return rotation;
|
return rotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isWaterlog() {
|
||||||
|
return waterlog;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWaterlog(boolean waterlog) {
|
||||||
|
this.waterlog = waterlog;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
package com.dfsek.terra.api.structures.script.builders;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments;
|
||||||
|
import com.dfsek.terra.api.structures.parser.lang.Returnable;
|
||||||
|
import com.dfsek.terra.api.structures.parser.lang.functions.Function;
|
||||||
|
import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder;
|
||||||
|
import com.dfsek.terra.api.structures.parser.lang.variables.Variable;
|
||||||
|
import com.dfsek.terra.api.structures.script.TerraImplementationArguments;
|
||||||
|
import com.dfsek.terra.api.structures.tokenizer.Position;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
|
||||||
|
public class UnaryBooleanFunctionBuilder implements FunctionBuilder<Function<Void>> {
|
||||||
|
|
||||||
|
private final BiConsumer<Boolean, TerraImplementationArguments> function;
|
||||||
|
|
||||||
|
public UnaryBooleanFunctionBuilder(BiConsumer<Boolean, TerraImplementationArguments> function) {
|
||||||
|
this.function = function;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Function<Void> build(List<Returnable<?>> argumentList, Position position) {
|
||||||
|
return new Function<Void>() {
|
||||||
|
@Override
|
||||||
|
public ReturnType returnType() {
|
||||||
|
return ReturnType.VOID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public Void apply(ImplementationArguments implementationArguments, Map<String, Variable<?>> variableMap) {
|
||||||
|
function.accept(((Returnable<Boolean>) argumentList.get(0)).apply(implementationArguments, variableMap), (TerraImplementationArguments) implementationArguments);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Position getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int argNumber() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Returnable.ReturnType getArgument(int position) {
|
||||||
|
if(position == 0) return Returnable.ReturnType.BOOLEAN;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -51,7 +51,7 @@ public class BlockFunction implements Function<Void> {
|
|||||||
RotationUtil.rotateVector(xz, arguments.getRotation());
|
RotationUtil.rotateVector(xz, arguments.getRotation());
|
||||||
|
|
||||||
RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse());
|
RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse());
|
||||||
arguments.getBuffer().addItem(new BufferedBlock(rot, overwrite.apply(implementationArguments, variableMap), main), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld()));
|
arguments.getBuffer().addItem(new BufferedBlock(rot, overwrite.apply(implementationArguments, variableMap), main, arguments.isWaterlog()), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld()));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+9
-2
@@ -4,23 +4,30 @@ import com.dfsek.terra.api.TerraPlugin;
|
|||||||
import com.dfsek.terra.api.math.vector.Location;
|
import com.dfsek.terra.api.math.vector.Location;
|
||||||
import com.dfsek.terra.api.platform.block.Block;
|
import com.dfsek.terra.api.platform.block.Block;
|
||||||
import com.dfsek.terra.api.platform.block.BlockData;
|
import com.dfsek.terra.api.platform.block.BlockData;
|
||||||
|
import com.dfsek.terra.api.platform.block.data.Waterlogged;
|
||||||
|
|
||||||
public class BufferedBlock implements BufferedItem {
|
public class BufferedBlock implements BufferedItem {
|
||||||
private final BlockData data;
|
private final BlockData data;
|
||||||
private final boolean overwrite;
|
private final boolean overwrite;
|
||||||
private final TerraPlugin main;
|
private final TerraPlugin main;
|
||||||
|
private final boolean waterlog;
|
||||||
|
|
||||||
public BufferedBlock(BlockData data, boolean overwrite, TerraPlugin main) {
|
public BufferedBlock(BlockData data, boolean overwrite, TerraPlugin main, boolean waterlog) {
|
||||||
this.data = data;
|
this.data = data;
|
||||||
this.overwrite = overwrite;
|
this.overwrite = overwrite;
|
||||||
this.main = main;
|
this.main = main;
|
||||||
|
this.waterlog = waterlog;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void paste(Location origin) {
|
public void paste(Location origin) {
|
||||||
Block block = origin.getBlock();
|
Block block = origin.getBlock();
|
||||||
try {
|
try {
|
||||||
if(overwrite || block.isEmpty()) block.setBlockData(data, false);
|
if(overwrite || block.isEmpty()) {
|
||||||
|
if(waterlog && data instanceof Waterlogged && block.getBlockData().getBlockType().isWater())
|
||||||
|
((Waterlogged) data).setWaterlogged(true);
|
||||||
|
block.setBlockData(data, false);
|
||||||
|
}
|
||||||
} catch(RuntimeException e) {
|
} catch(RuntimeException e) {
|
||||||
main.logger().severe("Failed to place block at location " + origin + ": " + e.getMessage());
|
main.logger().severe("Failed to place block at location " + origin + ": " + e.getMessage());
|
||||||
main.getDebugLogger().stack(e);
|
main.getDebugLogger().stack(e);
|
||||||
|
|||||||
+5
@@ -29,6 +29,11 @@ public class BukkitBlockTypeAndItem implements BlockType, Item {
|
|||||||
return delegate.isSolid();
|
return delegate.isSolid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isWater() {
|
||||||
|
return delegate == Material.WATER;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack newItemStack(int amount) {
|
public ItemStack newItemStack(int amount) {
|
||||||
return BukkitAdapter.adapt(new org.bukkit.inventory.ItemStack(delegate, amount));
|
return BukkitAdapter.adapt(new org.bukkit.inventory.ItemStack(delegate, amount));
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.dfsek.terra.api.platform.block.BlockData;
|
|||||||
import com.dfsek.terra.api.platform.block.BlockType;
|
import com.dfsek.terra.api.platform.block.BlockType;
|
||||||
import com.dfsek.terra.fabric.world.FabricAdapter;
|
import com.dfsek.terra.fabric.world.FabricAdapter;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.Blocks;
|
||||||
|
|
||||||
public class FabricBlockType implements BlockType {
|
public class FabricBlockType implements BlockType {
|
||||||
private final Block delegate;
|
private final Block delegate;
|
||||||
@@ -27,6 +28,11 @@ public class FabricBlockType implements BlockType {
|
|||||||
return delegate.getDefaultState().isOpaque();
|
return delegate.getDefaultState().isOpaque();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isWater() {
|
||||||
|
return delegate == Blocks.WATER;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return delegate.hashCode();
|
return delegate.hashCode();
|
||||||
|
|||||||
@@ -97,4 +97,9 @@ public class Data implements BlockData, BlockType {
|
|||||||
public boolean isSolid() {
|
public boolean isSolid() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isWater() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user