diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java new file mode 100644 index 000000000..8997bd937 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.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.BlockFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class BlockFunctionBuilder implements FunctionBuilder { + private final TerraPlugin main; + + public BlockFunctionBuilder(TerraPlugin main) { + this.main = main; + } + + @SuppressWarnings("unchecked") + @Override + public BlockFunction build(List> argumentList, Position position) throws ParseException { + return new BlockFunction((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/builders/CheckFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java new file mode 100644 index 000000000..d5e1ce757 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java @@ -0,0 +1,41 @@ +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.CheckFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class CheckFunctionBuilder implements FunctionBuilder { + private final TerraPlugin main; + + public CheckFunctionBuilder(TerraPlugin main) { + this.main = main; + } + + @SuppressWarnings("unchecked") + @Override + public CheckFunction build(List> argumentList, Position position) throws ParseException { + return new CheckFunction(main, (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/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index f207eff2e..64747263d 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 @@ -4,6 +4,7 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; +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; @@ -11,12 +12,12 @@ import com.dfsek.terra.api.structures.tokenizer.Position; public class BlockFunction implements Function { private final BlockData data; - private final Returnable x, y, z; + private final Returnable x, y, z; private final Position position; - public BlockFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) { + public BlockFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) throws ParseException { this.position = position; - if(!(data instanceof ConstantExpression)) throw new IllegalArgumentException("Block data must be constant."); + if(!(data instanceof ConstantExpression)) throw new ParseException("Block data must be constant."); this.data = main.getWorldHandle().createBlockData(((ConstantExpression) data).getConstant()); this.x = x; @@ -31,7 +32,7 @@ public class BlockFunction implements Function { @Override public Void apply(Location location) { - location.clone().add(x.apply(location), y.apply(location), z.apply(location)).getBlock().setBlockData(data, false); + location.clone().add(x.apply(location).intValue(), y.apply(location).intValue(), z.apply(location).intValue()).getBlock().setBlockData(data, false); return null; } 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 b05ac4f98..01b46f437 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 @@ -13,10 +13,10 @@ import com.dfsek.terra.api.structures.world.OceanCheck; public class CheckFunction implements Function { private final TerraPlugin main; - private final Returnable x, y, z; + private final Returnable x, y, z; private final Position position; - public CheckFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, Position position) { + public CheckFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, Position position) { this.main = main; this.x = x; this.y = y; @@ -30,8 +30,8 @@ public class CheckFunction implements Function { } private Vector3 getVector(Location location, Chunk chunk) { - return chunk == null ? new Vector3(x.apply(location) + location.getBlockX(), y.apply(location) + location.getBlockY(), z.apply(location) + location.getBlockZ()) - : new Vector3(x.apply(location, chunk) + location.getBlockX(), y.apply(location, chunk) + location.getBlockY(), z.apply(location, chunk) + location.getBlockZ()); + return location.clone().add(chunk == null ? new Vector3(x.apply(location).intValue(), y.apply(location).intValue(), z.apply(location).intValue()) + : new Vector3(x.apply(location, chunk).intValue(), y.apply(location, chunk).intValue(), z.apply(location, chunk).intValue())).toVector(); } @Override diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index a7ebcab75..1e8bed1c2 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,4 +1,4 @@ -test("hello" + 3 + "gdfg", (2 * (3+1) * (2 * (1+1)))); +test("minecraft:green_w" + "ool", (2 * (3+1) * (2 * (1+1)))); // num testVar = 3.4; @@ -18,6 +18,7 @@ while(iterator < 5) { if(true && !(boolean && false) && true) { +test(0,-1,0, "minecraft:green_w" + "ool"); num scopedVar = 2; test("if statement" + 2 + stringVar, 1 + testVar + scopedVar); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index 5add94894..299078dd3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -4,6 +4,8 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.Parser; 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.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; import org.apache.commons.io.IOUtils; @@ -37,7 +39,15 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { try { Parser parser = new Parser(IOUtils.toString(new FileInputStream(new File(getMain().getDataFolder(), "test.tesf")))); + parser.addFunction("block", new BlockFunctionBuilder(getMain())) + .addFunction("check", new CheckFunctionBuilder(getMain())); + + System.out.println("Parsing..."); + Block main = parser.parse(); + + System.out.println("Done parsing"); + main.apply(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ())); } catch(IOException | ParseException e) {