From 5c923167255bb23779a76e5e00d601546df2f7d7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Jul 2021 15:18:42 -0700 Subject: [PATCH] implement BlockFunction Constant override --- .../script/builders/BlockFunctionBuilder.java | 4 ++++ .../script/functions/BlockFunction.java | 21 +++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) 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 0dd732615..1667b4bf5 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 @@ -3,6 +3,7 @@ package com.dfsek.terra.addons.terrascript.script.builders; 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.constants.StringConstant; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.script.functions.BlockFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; @@ -23,6 +24,9 @@ public class BlockFunctionBuilder implements FunctionBuilder { 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(argumentList.get(3) instanceof StringConstant) { + return new BlockFunction.Constant((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (StringConstant) 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/BlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java index 069cfce2b..2bc479789 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 @@ -3,6 +3,7 @@ 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.constants.StringConstant; 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; @@ -14,7 +15,6 @@ 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; @@ -49,11 +49,15 @@ public class BlockFunction implements Function { @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - BlockState rot = data.computeIfAbsent(blockData.apply(implementationArguments, variableMap), main.getWorldHandle()::createBlockData).clone(); + BlockState rot = getBlockState(implementationArguments, variableMap).clone(); setBlock(implementationArguments, variableMap, arguments, rot); return null; } + protected BlockState getBlockState(ImplementationArguments arguments, Map> variableMap) { + return data.computeIfAbsent(blockData.apply(arguments, variableMap), main.getWorldHandle()::createBlockData); + } + @Override public Position getPosition() { return position; @@ -63,4 +67,17 @@ public class BlockFunction implements Function { public ReturnType returnType() { return ReturnType.VOID; } + + public static class Constant extends BlockFunction { + private final BlockState state; + public Constant(Returnable x, Returnable y, Returnable z, StringConstant blockData, Returnable overwrite, TerraPlugin main, Position position) { + super(x, y, z, blockData, overwrite, main, position); + this.state = main.getWorldHandle().createBlockData(blockData.getConstant()); + } + + @Override + protected BlockState getBlockState(ImplementationArguments arguments, Map> variableMap) { + return state; + } + } }