diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java index 3c99b6524..57304011b 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java @@ -16,12 +16,12 @@ import com.dfsek.terra.api.util.vector.Vector2; public class BiomeHolderImpl implements BiomeHolder { - private final Vector2 origin; + private final Vector2.Mutable origin; private final int width; private final int offset; private BiomeDelegate[][] biomes; - public BiomeHolderImpl(int width, Vector2 origin) { + public BiomeHolderImpl(int width, Vector2.Mutable origin) { width += 4; this.width = width; biomes = new BiomeDelegate[width][width]; @@ -29,7 +29,7 @@ public class BiomeHolderImpl implements BiomeHolder { this.offset = 2; } - private BiomeHolderImpl(BiomeDelegate[][] biomes, Vector2 origin, int width, int offset) { + private BiomeHolderImpl(BiomeDelegate[][] biomes, Vector2.Mutable origin, int width, int offset) { this.biomes = biomes; this.origin = origin; this.width = width; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java index 2db320052..8a4be5d7d 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java @@ -39,7 +39,7 @@ public class BiomePipeline { * @return BiomeHolder containing biomes. */ public BiomeHolder getBiomes(int x, int z, long seed) { - BiomeHolder holder = new BiomeHolderImpl(init, Vector2.of(x * (init - 1), z * (init - 1))); + BiomeHolder holder = new BiomeHolderImpl(init, Vector2.of(x * (init - 1), z * (init - 1)).mutable()); holder.fill(source, seed); for(Stage stage : stages) holder = stage.apply(holder, seed); return holder; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java index 1f8215990..3b9f8b147 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java @@ -41,10 +41,9 @@ public class BiomeFunction implements Function { public String apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), - z.apply(implementationArguments, variableMap).doubleValue()); + Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()), arguments.getRotation()); - RotationUtil.rotateVector(xz, arguments.getRotation()); BiomeProvider grid = arguments.getWorld().getBiomeProvider(); 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 240b26055..e8074ccd6 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 @@ -71,11 +71,10 @@ public class BlockFunction implements Function { void setBlock(ImplementationArguments implementationArguments, Map> variableMap, TerraImplementationArguments arguments, BlockState rot) { - Vector2 xz = Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), - z.apply(implementationArguments, variableMap).doubleValue()); - - RotationUtil.rotateVector(xz, arguments.getRotation()); - + Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()), arguments.getRotation()); + + RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); try { Vector3 set = Vector3.of(FastMath.roundToInt(xz.getX()), diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java index fab126191..5f3df7121 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java @@ -37,12 +37,11 @@ public class CheckBlockFunction implements Function { @Override public String apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - - Vector2 xz = Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), - z.apply(implementationArguments, variableMap).doubleValue()); - - RotationUtil.rotateVector(xz, arguments.getRotation()); - + + Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()), arguments.getRotation()); + + String data = arguments.getWorld() .getBlockState(arguments.getOrigin() .toVector3() diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java index 2e9b2a07d..a65f875cb 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java @@ -47,10 +47,9 @@ public class EntityFunction implements Function { @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), - z.apply(implementationArguments, variableMap).doubleValue()); - - RotationUtil.rotateVector(xz, arguments.getRotation()); + Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()), arguments.getRotation()); + Entity entity = arguments.getWorld().spawnEntity(Vector3.of(xz.getX(), y.apply(implementationArguments, variableMap).doubleValue(), xz.getZ()).add(arguments.getOrigin()).add(0.5, 0, 0.5), data); platform.getEventManager().callEvent(new EntitySpawnEvent(entity.world().getPack(), entity)); return null; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java index de186b107..355e0f0ce 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java @@ -36,10 +36,9 @@ public class GetMarkFunction implements Function { @Override public String apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), - z.apply(implementationArguments, variableMap).doubleValue()); - - RotationUtil.rotateVector(xz, arguments.getRotation()); + Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()), arguments.getRotation()); + String mark = arguments.getMark(Vector3.of(FastMath.floorToInt(xz.getX()), FastMath.floorToInt( y.apply(implementationArguments, variableMap).doubleValue()), FastMath.floorToInt(xz.getZ())).add(arguments.getOrigin())); return mark == null ? "" : mark; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java index 07399d193..02257d5e2 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java @@ -58,11 +58,10 @@ public class LootFunction implements Function { @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), - z.apply(implementationArguments, variableMap).doubleValue()); - - RotationUtil.rotateVector(xz, arguments.getRotation()); - + Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()), arguments.getRotation()); + + String id = data.apply(implementationArguments, variableMap); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java index a48a25953..3238b51b1 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java @@ -45,10 +45,9 @@ public class PullFunction implements Function { @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), - z.apply(implementationArguments, variableMap).doubleValue()); - - RotationUtil.rotateVector(xz, arguments.getRotation()); + Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()), arguments.getRotation()); + BlockState rot = data.clone(); RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java index ec4b23853..a77ffe876 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java @@ -38,11 +38,10 @@ public class SetMarkFunction implements Function { @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), - z.apply(implementationArguments, variableMap).doubleValue()); - - RotationUtil.rotateVector(xz, arguments.getRotation()); - + Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()), arguments.getRotation()); + + arguments.setMark(Vector3.of(FastMath.floorToInt(xz.getX()), FastMath.floorToInt( y.apply(implementationArguments, variableMap).doubleValue()), diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java index 87ee4f31a..607101f60 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java @@ -45,10 +45,10 @@ public class StateFunction implements Function { @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), - z.apply(implementationArguments, variableMap).doubleValue()); - RotationUtil.rotateVector(xz, arguments.getRotation()); - + Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()), arguments.getRotation()); + + Vector3 origin = Vector3.of(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())).add(arguments.getOrigin()); try { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java index c5cc8ff64..e0deb9e68 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java @@ -62,12 +62,11 @@ public class StructureFunction implements Function { if(arguments.getRecursions() > platform.getTerraConfig().getMaxRecursion()) throw new RuntimeException("Structure recursion too deep: " + arguments.getRecursions()); - - Vector2 xz = Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), - z.apply(implementationArguments, variableMap).doubleValue()); - - RotationUtil.rotateVector(xz, arguments.getRotation()); - + + Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()), arguments.getRotation()); + + String app = id.apply(implementationArguments, variableMap); return registry.get(app).map(script -> { Rotation rotation1; diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/util/RotationUtil.java b/common/api/core/src/main/java/com/dfsek/terra/api/util/RotationUtil.java index 448d8bbc0..ddf5255a3 100644 --- a/common/api/core/src/main/java/com/dfsek/terra/api/util/RotationUtil.java +++ b/common/api/core/src/main/java/com/dfsek/terra/api/util/RotationUtil.java @@ -16,10 +16,10 @@ import com.dfsek.terra.api.block.state.properties.enums.RailShape; import com.dfsek.terra.api.block.state.properties.enums.RedstoneConnection; import com.dfsek.terra.api.block.state.properties.enums.WallHeight; import com.dfsek.terra.api.util.vector.Vector2; +import com.dfsek.terra.api.util.vector.Vector2.Mutable; public final class RotationUtil { - /** * Rotate and mirror a coordinate pair. * @@ -29,15 +29,13 @@ public final class RotationUtil { * @return Rotated vector */ public static Vector2 rotateVector(Vector2 orig, Rotation r) { - Vector2 copy = orig.clone(); + Mutable copy = orig.mutable(); switch(r) { case CW_90 -> copy.setX(orig.getZ()).setZ(-orig.getX()); case CCW_90 -> copy.setX(-orig.getZ()).setZ(orig.getX()); case CW_180 -> copy.multiply(-1); } - orig.setX(copy.getX()); - orig.setZ(copy.getZ()); - return orig; + return copy.immutable(); } diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/vector/Vector2.java b/common/api/util/src/main/java/com/dfsek/terra/api/util/vector/Vector2.java index 1df80e826..aa0336253 100644 --- a/common/api/util/src/main/java/com/dfsek/terra/api/util/vector/Vector2.java +++ b/common/api/util/src/main/java/com/dfsek/terra/api/util/vector/Vector2.java @@ -16,8 +16,8 @@ import com.dfsek.terra.api.util.MathUtil; * oh yeah */ public class Vector2 implements Cloneable { - private double x; - private double z; + private final double x; + private final double z; /** * Create a vector with a given X and Z component @@ -34,67 +34,7 @@ public class Vector2 implements Cloneable { return new Vector2(x, z); } - /** - * Multiply X and Z components by a value. - * - * @param m Value to multiply - * - * @return Mutated vector, for chaining. - */ - public Vector2 multiply(double m) { - x *= m; - z *= m; - return this; - } - /** - * Add this vector to another. - * - * @param other Vector to add - * - * @return Mutated vector, for chaining. - */ - public Vector2 add(Vector2 other) { - x += other.getX(); - z += other.getZ(); - return this; - } - - /** - * Subtract a vector from this vector, - * - * @param other Vector to subtract - * - * @return Mutated vector, for chaining. - */ - public Vector2 subtract(Vector2 other) { - x -= other.getX(); - z -= other.getZ(); - return this; - } - - /** - * Normalize this vector to length 1 - * - * @return Mutated vector, for chaining. - */ - public Vector2 normalize() { - divide(length()); - return this; - } - - /** - * Divide X and Z components by a value. - * - * @param d Divisor - * - * @return Mutated vector, for chaining. - */ - public Vector2 divide(double d) { - x /= d; - z /= d; - return this; - } /** * Get the length of this Vector @@ -142,12 +82,6 @@ public class Vector2 implements Cloneable { return Vector3.of(this.x, y, this.z); } - public Vector2 add(double x, double z) { - this.x += x; - this.z += z; - return this; - } - /** * Get X component * @@ -157,10 +91,6 @@ public class Vector2 implements Cloneable { return x; } - public Vector2 setX(double x) { - this.x = x; - return this; - } /** * Get Z component @@ -171,10 +101,6 @@ public class Vector2 implements Cloneable { return z; } - public Vector2 setZ(double z) { - this.z = z; - return this; - } public int getBlockX() { return FastMath.floorToInt(x); @@ -197,11 +123,124 @@ public class Vector2 implements Cloneable { return MathUtil.equals(this.x, other.x) && MathUtil.equals(this.z, other.z); } - public Vector2 clone() { - try { - return (Vector2) super.clone(); - } catch(CloneNotSupportedException e) { - throw new Error(e); + public Mutable mutable() { + return new Mutable(x, z); + } + + public static class Mutable { + private double x, z; + + private Mutable(double x, double z) { + this.x = x; + this.z = z; + } + + public double getX() { + return x; + } + + public double getZ() { + return z; + } + + public Vector2 immutable() { + return Vector2.of(x, z); + } + + public Mutable setX(double x) { + this.x = x; + return this; + } + + public Mutable setZ(double z) { + this.z = z; + return this; + } + + /** + * Get the length of this Vector + * + * @return length + */ + public double length() { + return FastMath.sqrt(lengthSquared()); + } + + /** + * Get the squared length of this Vector + * + * @return squared length + */ + public double lengthSquared() { + return x * x + z * z; + } + + public Mutable add(double x, double z) { + this.x += x; + this.z += z; + return this; + } + + /** + * Multiply X and Z components by a value. + * + * @param m Value to multiply + * + * @return Mutated vector, for chaining. + */ + public Mutable multiply(double m) { + x *= m; + z *= m; + return this; + } + + /** + * Add this vector to another. + * + * @param other Vector to add + * + * @return Mutated vector, for chaining. + */ + public Mutable add(Vector2 other) { + x += other.getX(); + z += other.getZ(); + return this; + } + + /** + * Subtract a vector from this vector, + * + * @param other Vector to subtract + * + * @return Mutated vector, for chaining. + */ + public Mutable subtract(Vector2 other) { + x -= other.getX(); + z -= other.getZ(); + return this; + } + + /** + * Normalize this vector to length 1 + * + * @return Mutated vector, for chaining. + */ + public Mutable normalize() { + divide(length()); + return this; + } + + /** + * Divide X and Z components by a value. + * + * @param d Divisor + * + * @return Mutated vector, for chaining. + */ + public Mutable divide(double d) { + x /= d; + z /= d; + return this; } }