From b26847f2505181f20a7f2a8a4e6a91c060a8d1fa Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 3 Jan 2021 19:49:15 -0700 Subject: [PATCH] implement BiomeFunction --- .../structures/script/StructureScript.java | 2 + .../script/builders/BiomeFunctionBuilder.java | 40 ++++++++++++++ .../script/functions/BiomeFunction.java | 54 +++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/BiomeFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java 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 b8eb03a89..a0a4f5c4b 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 @@ -7,6 +7,7 @@ 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.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.CheckFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.EntityFunctionBuilder; @@ -55,6 +56,7 @@ 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("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/BiomeFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BiomeFunctionBuilder.java new file mode 100644 index 000000000..cceb13fb7 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BiomeFunctionBuilder.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.platform.TerraPlugin; +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.BiomeFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class BiomeFunctionBuilder implements FunctionBuilder { + private final TerraPlugin main; + + public BiomeFunctionBuilder(TerraPlugin main) { + this.main = main; + } + + @SuppressWarnings("unchecked") + @Override + public BiomeFunction build(List> argumentList, Position position) { + return new BiomeFunction(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/BiomeFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java new file mode 100644 index 000000000..55b88e140 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.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.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 com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import net.jafama.FastMath; + +public class BiomeFunction implements Function { + private final TerraPlugin main; + private final Returnable x, y, z; + private final Position position; + + + public BiomeFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, Position position) { + this.main = main; + 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()); + + TerraBiomeGrid grid = main.getWorld(arguments.getBuffer().getOrigin().getWorld()).getGrid(); + + return ((UserDefinedBiome) grid.getBiome(arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))))).getID(); + } + + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.STRING; + } +}