From a28f46eca36a82723d1de31df0dd0a437ea261b2 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Jul 2021 15:06:56 -0700 Subject: [PATCH] allow dynamic block data in TerraScript block function by default --- .../terrascript/script/StructureScript.java | 6 +- .../script/builders/BlockFunctionBuilder.java | 12 +--- .../functions/AbstractBlockFunction.java | 54 ------------------ .../script/functions/BlockFunction.java | 56 ++++++++++++++----- .../functions/DynamicBlockFunction.java | 31 ---------- 5 files changed, 49 insertions(+), 110 deletions(-) delete mode 100644 common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/AbstractBlockFunction.java delete mode 100644 common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/DynamicBlockFunction.java diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java index 56bb2c3a8..e4fdfe575 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java @@ -63,9 +63,9 @@ public class StructureScript implements Structure { functionRegistry.forEach(parser::registerFunction); // Register registry functions. - parser.registerFunction("block", new BlockFunctionBuilder(main, false)) - .registerFunction("dynamicBlock", new BlockFunctionBuilder(main, true)) - .registerFunction("debugBlock", new BlockFunctionBuilder(main, false)) + parser + .registerFunction("block", new BlockFunctionBuilder(main)) + .registerFunction("debugBlock", new BlockFunctionBuilder(main)) .registerFunction("check", new CheckFunctionBuilder(main)) .registerFunction("structure", new StructureFunctionBuilder(registry, main)) .registerFunction("randomInt", new RandomFunctionBuilder()) diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java index 80c30e236..0dd732615 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java @@ -4,31 +4,25 @@ import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.constants.BooleanConstant; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; -import com.dfsek.terra.addons.terrascript.script.functions.AbstractBlockFunction; import com.dfsek.terra.addons.terrascript.script.functions.BlockFunction; -import com.dfsek.terra.addons.terrascript.script.functions.DynamicBlockFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.TerraPlugin; import java.util.List; -public class BlockFunctionBuilder implements FunctionBuilder { +public class BlockFunctionBuilder implements FunctionBuilder { private final TerraPlugin main; - private final boolean dynamic; - public BlockFunctionBuilder(TerraPlugin main, boolean dynamic) { + public BlockFunctionBuilder(TerraPlugin main) { this.main = main; - this.dynamic = dynamic; } @SuppressWarnings("unchecked") @Override - public AbstractBlockFunction build(List> argumentList, Position position) throws ParseException { + public BlockFunction build(List> argumentList, Position position) throws ParseException { if(argumentList.size() < 4) throw new ParseException("Expected data", position); Returnable booleanReturnable = new BooleanConstant(true, position); if(argumentList.size() == 5) booleanReturnable = (Returnable) argumentList.get(4); - if(dynamic) - return new DynamicBlockFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), booleanReturnable, main, position); return new BlockFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), booleanReturnable, main, position); } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/AbstractBlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/AbstractBlockFunction.java deleted file mode 100644 index 72ff12807..000000000 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/AbstractBlockFunction.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.dfsek.terra.addons.terrascript.script.functions; - -import com.dfsek.terra.addons.terrascript.buffer.items.BufferedBlock; -import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; -import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; -import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; -import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; -import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; -import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.util.RotationUtil; -import com.dfsek.terra.api.vector.Vector2; -import com.dfsek.terra.api.vector.Vector3; -import net.jafama.FastMath; - -import java.util.Map; - -public abstract class AbstractBlockFunction implements Function { - protected final Returnable x, y, z; - protected final Returnable blockData; - protected final TerraPlugin main; - private final Returnable overwrite; - private final Position position; - - protected AbstractBlockFunction(Returnable x, Returnable y, Returnable z, Returnable blockData, Returnable overwrite, TerraPlugin main, Position position) { - this.x = x; - this.y = y; - this.z = z; - this.blockData = blockData; - this.overwrite = overwrite; - this.main = main; - this.position = position; - } - - void setBlock(ImplementationArguments implementationArguments, Map> variableMap, TerraImplementationArguments arguments, BlockState rot) { - Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); - - RotationUtil.rotateVector(xz, arguments.getRotation()); - - RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); - 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()))); - } - - @Override - public Position getPosition() { - return position; - } - - @Override - public ReturnType returnType() { - return ReturnType.VOID; - } -} diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java index e41d2b782..069cfce2b 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java @@ -1,36 +1,66 @@ package com.dfsek.terra.addons.terrascript.script.functions; -import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; +import com.dfsek.terra.addons.terrascript.buffer.items.BufferedBlock; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; -import com.dfsek.terra.addons.terrascript.parser.lang.constants.ConstantExpression; +import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.util.RotationUtil; +import com.dfsek.terra.api.vector.Vector2; +import com.dfsek.terra.api.vector.Vector3; +import net.jafama.FastMath; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; -public class BlockFunction extends AbstractBlockFunction { - private final BlockState data; +public class BlockFunction implements Function { + protected final Returnable x, y, z; - public BlockFunction(Returnable x, Returnable y, Returnable z, Returnable data, Returnable overwrite, TerraPlugin main, Position position) throws ParseException { - super(x, y, z, data, overwrite, main, position); + private final Map data = new HashMap<>(); + protected final Returnable blockData; + protected final TerraPlugin main; + private final Returnable overwrite; + private final Position position; - if(!(data instanceof ConstantExpression)) throw new ParseException("Block data must be constant", data.getPosition()); - try { - this.data = main.getWorldHandle().createBlockData(((ConstantExpression) data).getConstant()); - } catch(IllegalArgumentException e) { - throw new ParseException("Could not parse block data", data.getPosition(), e); - } + public BlockFunction(Returnable x, Returnable y, Returnable z, Returnable blockData, Returnable overwrite, TerraPlugin main, Position position) { + this.x = x; + this.y = y; + this.z = z; + this.blockData = blockData; + this.overwrite = overwrite; + this.main = main; + this.position = position; + } + + void setBlock(ImplementationArguments implementationArguments, Map> variableMap, TerraImplementationArguments arguments, BlockState rot) { + Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); + + RotationUtil.rotateVector(xz, arguments.getRotation()); + + RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); + 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()))); } @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - BlockState rot = data.clone(); + BlockState rot = data.computeIfAbsent(blockData.apply(implementationArguments, variableMap), main.getWorldHandle()::createBlockData).clone(); setBlock(implementationArguments, variableMap, arguments, rot); return null; } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/DynamicBlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/DynamicBlockFunction.java deleted file mode 100644 index 3a3ec57e3..000000000 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/DynamicBlockFunction.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.dfsek.terra.addons.terrascript.script.functions; - -import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; -import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; -import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; -import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; -import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.block.state.BlockState; - -import java.util.HashMap; -import java.util.Map; - -public class DynamicBlockFunction extends AbstractBlockFunction { - private final Map data = new HashMap<>(); - private final Position position; - - - public DynamicBlockFunction(Returnable x, Returnable y, Returnable z, Returnable data, Returnable overwrite, TerraPlugin main, Position position) { - super(x, y, z, data, overwrite, main, position); - this.position = position; - } - - @Override - public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { - TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - BlockState rot = data.computeIfAbsent(blockData.apply(implementationArguments, variableMap), main.getWorldHandle()::createBlockData).clone(); - setBlock(implementationArguments, variableMap, arguments, rot); - return null; - } -}