From 61c93b47ca8e1583c10592b1b096dab29246a12b Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 1 Jan 2021 03:28:06 -0700 Subject: [PATCH] implement EntityFunction --- .../parser/lang/functions/Function.java | 1 - .../lang/functions/builtin/AbsFunction.java | 5 -- .../lang/functions/builtin/PowFunction.java | 5 -- .../lang/functions/builtin/SqrtFunction.java | 5 -- .../lang/functions/def/DefinedFunction.java | 5 -- .../structures/script/StructureScript.java | 4 +- .../builders/EntityFunctionBuilder.java | 43 +++++++++++++++ .../script/functions/BlockFunction.java | 5 -- .../script/functions/CheckFunction.java | 5 -- .../script/functions/EntityFunction.java | 54 +++++++++++++++++++ .../script/functions/GetMarkFunction.java | 5 -- .../script/functions/LootFunction.java | 5 -- .../script/functions/MarkFunction.java | 5 -- .../script/functions/PullFunction.java | 5 -- .../script/functions/RandomFunction.java | 5 -- .../script/functions/RecursionsFunction.java | 5 -- .../script/functions/StructureFunction.java | 5 -- .../buffer/items/BufferedEntity.java | 18 +++++++ .../src/test/java/structure/ParserTest.java | 5 -- 19 files changed, 118 insertions(+), 72 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/EntityFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedEntity.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java index 1ebd54b85..aaa826d12 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java @@ -3,5 +3,4 @@ package com.dfsek.terra.api.structures.parser.lang.functions; import com.dfsek.terra.api.structures.parser.lang.Returnable; public interface Function extends Returnable { - String name(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java index cb83489c8..0e71693e0 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java @@ -16,11 +16,6 @@ public class AbsFunction extends MathFunction { this.returnable = returnable; } - @Override - public String name() { - return "abs"; - } - @Override public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return FastMath.abs(returnable.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java index 431f14075..03f21a69f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java @@ -18,11 +18,6 @@ public class PowFunction extends MathFunction { this.power = power; } - @Override - public String name() { - return "pow"; - } - @Override public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return FastMath.pow(base.apply(buffer, rotation, random, recursions).doubleValue(), power.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java index 35e746f47..3dbc1ce85 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java @@ -16,11 +16,6 @@ public class SqrtFunction extends MathFunction { this.returnable = returnable; } - @Override - public String name() { - return "sqrt"; - } - @Override public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return FastMath.sqrt(returnable.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java index 923a399ad..f06654de3 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java @@ -18,11 +18,6 @@ public abstract class DefinedFunction implements Function { this.position = position; } - @Override - public String name() { - return name; - } - @Override public T apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return block.apply(buffer, rotation, random, recursions); 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 99b73a377..cca20d6c3 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 @@ -8,6 +8,7 @@ import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; 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; import com.dfsek.terra.api.structures.script.builders.LootFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.MarkFunctionBuilder; @@ -49,7 +50,8 @@ public class StructureScript { .addFunction("setMark", new MarkFunctionBuilder()) .addFunction("getMark", new GetMarkFunctionBuilder()) .addFunction("pull", new PullFunctionBuilder(main)) - .addFunction("loot", new LootFunctionBuilder(main, lootRegistry)); + .addFunction("loot", new LootFunctionBuilder(main, lootRegistry)) + .addFunction("entity", new EntityFunctionBuilder(main)); try { block = parser.parse(); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/EntityFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/EntityFunctionBuilder.java new file mode 100644 index 000000000..fff23ce78 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/EntityFunctionBuilder.java @@ -0,0 +1,43 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +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.EntityFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class EntityFunctionBuilder implements FunctionBuilder { + private final TerraPlugin main; + + public EntityFunctionBuilder(TerraPlugin main) { + this.main = main; + } + + @SuppressWarnings("unchecked") + @Override + public EntityFunction build(List> argumentList, Position position) throws ParseException { + return new EntityFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position); + } + + @Override + public int argNumber() { + return 4; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + case 1: + case 2: + return Returnable.ReturnType.NUMBER; + case 3: + return Returnable.ReturnType.STRING; + default: + return null; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index d216222c6..44f671c61 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -32,11 +32,6 @@ public class BlockFunction implements Function { this.z = z; } - @Override - public String name() { - return "block"; - } - @Override public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index bef383108..67e4c6a73 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -36,11 +36,6 @@ public class CheckFunction implements Function { this.cache = cache; } - @Override - public String name() { - return "check"; - } - @Override public String apply(Buffer buffer, Rotation rotation, Random random, int recursions) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java new file mode 100644 index 000000000..3a81a8351 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java @@ -0,0 +1,54 @@ +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.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.entity.EntityType; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.RotationUtil; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedEntity; +import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; + +import java.util.Random; + +public class EntityFunction implements Function { + private final EntityType data; + private final Returnable x, y, z; + private final Position position; + + public EntityFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) throws ParseException { + this.position = position; + if(!(data instanceof ConstantExpression)) throw new ParseException("Entity data must be constant", data.getPosition()); + + this.data = main.getWorldHandle().getEntity(((ConstantExpression) data).getConstant()); + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); + + RotationUtil.rotateVector(xz, rotation); + + buffer.addItem(new BufferedEntity(data), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + return null; + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java index 34991865f..86540f2f0 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java @@ -25,11 +25,6 @@ public class GetMarkFunction implements Function { this.z = z; } - @Override - public String name() { - return "block"; - } - @Override public String apply(Buffer buffer, Rotation rotation, Random random, int recursions) { Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java index fd4467d65..1fddda10f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java @@ -33,11 +33,6 @@ public class LootFunction implements Function { this.main = main; } - @Override - public String name() { - return "block"; - } - @Override public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java index a30a36c50..979aeffca 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java @@ -27,11 +27,6 @@ public class MarkFunction implements Function { this.z = z; } - @Override - public String name() { - return "block"; - } - @Override public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java index 7f7734792..ad323307f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java @@ -32,11 +32,6 @@ public class PullFunction implements Function { this.z = z; } - @Override - public String name() { - return "pull"; - } - @Override public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java index b0fb3666c..f1175b35b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java @@ -18,11 +18,6 @@ public class RandomFunction implements Function { } - @Override - public String name() { - return "randomInt"; - } - @Override public ReturnType returnType() { return ReturnType.NUMBER; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java index 57050332c..ee37a4a49 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java @@ -14,11 +14,6 @@ public class RecursionsFunction implements Function { this.position = position; } - @Override - public String name() { - return "recursions"; - } - @Override public ReturnType returnType() { return ReturnType.NUMBER; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index 44a0dc3a8..58bbfaee9 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -36,11 +36,6 @@ public class StructureFunction implements Function { this.rotations = rotations; } - @Override - public String name() { - return "structure"; - } - @Override public ReturnType returnType() { return ReturnType.BOOLEAN; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedEntity.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedEntity.java new file mode 100644 index 000000000..f75b4383b --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedEntity.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.api.structures.structure.buffer.items; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.entity.EntityType; + +public class BufferedEntity implements BufferedItem { + + private final EntityType type; + + public BufferedEntity(EntityType type) { + this.type = type; + } + + @Override + public void paste(Location origin) { + origin.getWorld().spawnEntity(origin, type); + } +} diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 707501fea..b670cedbd 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -78,11 +78,6 @@ public class ParserTest { return position; } - @Override - public String name() { - return null; - } - @Override public ReturnType returnType() { return ReturnType.VOID;