From fff918e0eece48f3ab7d752c4f13d83ed865a817 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 3 Jan 2021 20:29:10 -0700 Subject: [PATCH] Add CheckBlockFunction, which mustn't be discussed without mentioning that it shall be covered with disclaimers. --- .../terra/api/platform/block/BlockData.java | 2 + .../structures/script/StructureScript.java | 4 +- .../builders/CheckBlockFunctionBuilder.java | 33 +++++++++++++ .../script/functions/CheckBlockFunction.java | 48 +++++++++++++++++++ .../world/block/data/BukkitBlockData.java | 5 ++ .../fabric/world/block/FabricBlockData.java | 5 ++ 6 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckBlockFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckBlockFunction.java diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/BlockData.java b/common/src/main/java/com/dfsek/terra/api/platform/block/BlockData.java index de2434e04..d58979fa6 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/block/BlockData.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/BlockData.java @@ -8,4 +8,6 @@ public interface BlockData extends Cloneable, Handle { boolean matches(MaterialData materialData); BlockData clone(); + + String getAsString(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index a0a4f5c4b..055e2a087 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.script.builders.BinaryNumberFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BiomeFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.CheckBlockFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.EntityFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.GetMarkFunctionBuilder; @@ -56,7 +57,8 @@ public class StructureScript { .registerFunction("pull", new PullFunctionBuilder(main)) .registerFunction("loot", new LootFunctionBuilder(main, lootRegistry)) .registerFunction("entity", new EntityFunctionBuilder(main)) - .registerFunction("biome", new BiomeFunctionBuilder(main)) + .registerFunction("getBiome", new BiomeFunctionBuilder(main)) + .registerFunction("getBlock", new CheckBlockFunctionBuilder()) .registerFunction("abs", new UnaryNumberFunctionBuilder(number -> FastMath.abs(number.doubleValue()))) .registerFunction("pow", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.pow(number.doubleValue(), number2.doubleValue()))) .registerFunction("sqrt", new UnaryNumberFunctionBuilder(number -> FastMath.sqrt(number.doubleValue()))) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckBlockFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckBlockFunctionBuilder.java new file mode 100644 index 000000000..98eeb2665 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckBlockFunctionBuilder.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.CheckBlockFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class CheckBlockFunctionBuilder implements FunctionBuilder { + @SuppressWarnings("unchecked") + @Override + public CheckBlockFunction build(List> argumentList, Position position) { + return new CheckBlockFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), position); + } + + @Override + public int argNumber() { + return 3; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + case 1: + case 2: + return Returnable.ReturnType.NUMBER; + default: + return null; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckBlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckBlockFunction.java new file mode 100644 index 000000000..2c238cc64 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckBlockFunction.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; +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.script.TerraImplementationArguments; +import com.dfsek.terra.api.structures.structure.RotationUtil; +import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; + +public class CheckBlockFunction implements Function { + private final Returnable x, y, z; + private final Position position; + + public CheckBlockFunction(Returnable x, Returnable y, Returnable z, Position position) { + this.x = x; + this.y = y; + this.z = z; + this.position = position; + } + + + @Override + public String apply(ImplementationArguments implementationArguments) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); + + RotationUtil.rotateVector(xz, arguments.getRotation()); + + String data = arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))).getBlock().getBlockData().getAsString(); + if(data.contains("[")) return data.substring(0, data.indexOf('[')); // Strip properties + else return data; + } + + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.STRING; + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java index 63b54316c..0b8b2aa13 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java @@ -68,4 +68,9 @@ public class BukkitBlockData implements BlockData { throw new Error(e); } } + + @Override + public String getAsString() { + return delegate.getAsString(false); + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java index 0f0d4f602..f7fac5fb4 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java @@ -30,6 +30,11 @@ public class FabricBlockData implements BlockData { } } + @Override + public String getAsString() { + return delegate.toString(); + } + @Override public BlockState getHandle() { return delegate;