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 12a89c004..5eeae4c5c 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,8 @@ 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.GetMarkFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.MarkFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RandomFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RecursionsFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder; @@ -34,7 +36,9 @@ public class StructureScript { .addFunction("check", new CheckFunctionBuilder(main)) .addFunction("structure", new StructureFunctionBuilder(registry, main)) .addFunction("randomInt", new RandomFunctionBuilder()) - .addFunction("recursions", new RecursionsFunctionBuilder()); + .addFunction("recursions", new RecursionsFunctionBuilder()) + .addFunction("setMark", new MarkFunctionBuilder()) + .addFunction("getMark", new GetMarkFunctionBuilder()); try { block = parser.parse(); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/GetMarkFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/GetMarkFunctionBuilder.java new file mode 100644 index 000000000..5da2fa0e5 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/GetMarkFunctionBuilder.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.api.structures.script.builders; + +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.GetMarkFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class GetMarkFunctionBuilder implements FunctionBuilder { + + public GetMarkFunctionBuilder() { + } + + @SuppressWarnings("unchecked") + @Override + public GetMarkFunction build(List> argumentList, Position position) throws ParseException { + return new GetMarkFunction((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/builders/MarkFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/MarkFunctionBuilder.java new file mode 100644 index 000000000..cf73e0948 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/MarkFunctionBuilder.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.api.structures.script.builders; + +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.MarkFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class MarkFunctionBuilder implements FunctionBuilder { + + public MarkFunctionBuilder() { + } + + @SuppressWarnings("unchecked") + @Override + public MarkFunction build(List> argumentList, Position position) throws ParseException { + return new MarkFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), 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 8f4b1541e..01dc7946c 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 @@ -11,7 +11,7 @@ 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.BufferedBlock; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedBlock; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; @@ -40,8 +40,9 @@ public class BlockFunction implements Function { Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - - buffer.addItem(new BufferedBlock(data), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + BlockData rot = data.clone(); + RotationUtil.rotateBlockData(rot, rotation.inverse()); + buffer.addItem(new BufferedBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); return null; } 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 new file mode 100644 index 000000000..13ab0bf56 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java @@ -0,0 +1,49 @@ +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.exceptions.ParseException; +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.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.Mark; +import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; + +public class GetMarkFunction implements Function { + private final Returnable x, y, z; + private final Position position; + + public GetMarkFunction(Returnable x, Returnable y, Returnable z, Position position) throws ParseException { + this.position = position; + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public String name() { + return "block"; + } + + @Override + public String apply(Buffer buffer, Rotation rotation, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); + + RotationUtil.rotateVector(xz, rotation); + Mark mark = buffer.getMark(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + return mark == null ? "" : mark.getContent(); + } + + @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/MarkFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java new file mode 100644 index 000000000..562d47bfa --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java @@ -0,0 +1,52 @@ +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.exceptions.ParseException; +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.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.Mark; +import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; + +public class MarkFunction implements Function { + private final Returnable x, y, z; + private final Position position; + private final Returnable mark; + + public MarkFunction(Returnable x, Returnable y, Returnable z, Returnable mark, Position position) throws ParseException { + this.position = position; + this.mark = mark; + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public String name() { + return "block"; + } + + @Override + public Void apply(Buffer buffer, Rotation rotation, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); + + RotationUtil.rotateVector(xz, rotation); + + buffer.setMark(new Mark(mark.apply(buffer, rotation, recursions)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, 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/structure/buffer/Buffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java index d08fcccb4..80a74afe5 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java @@ -2,9 +2,15 @@ package com.dfsek.terra.api.structures.structure.buffer; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; +import com.dfsek.terra.api.structures.structure.buffer.items.Mark; public interface Buffer { Buffer addItem(BufferedItem item, Vector3 location); Location getOrigin(); + + Mark getMark(Vector3 location); + + Buffer setMark(Mark mark, Vector3 location); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Cell.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Cell.java new file mode 100644 index 000000000..ab0b6742e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Cell.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.api.structures.structure.buffer; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; +import com.dfsek.terra.api.structures.structure.buffer.items.Mark; +import com.dfsek.terra.api.util.GlueList; + +import java.util.List; + +public class Cell implements BufferedItem { + private final List items = new GlueList<>(); + private Mark mark = null; + + + @Override + public void paste(Location origin) { + items.forEach(item -> item.paste(origin)); + } + + public void add(BufferedItem item) { + items.add(item); + } + + public Mark getMark() { + return mark; + } + + public void setMark(Mark mark) { + this.mark = mark; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java index 73aee8af8..bc3614657 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java @@ -2,6 +2,8 @@ package com.dfsek.terra.api.structures.structure.buffer; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; +import com.dfsek.terra.api.structures.structure.buffer.items.Mark; public class IntermediateBuffer implements Buffer { private final Buffer original; @@ -21,4 +23,15 @@ public class IntermediateBuffer implements Buffer { public Location getOrigin() { return original.getOrigin().add(offset); } + + @Override + public Mark getMark(Vector3 location) { + return original.getMark(location.add(offset)); + } + + @Override + public Buffer setMark(Mark mark, Vector3 location) { + original.setMark(mark, location.add(offset)); + return this; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java index 2eef26a21..85d7c132d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java @@ -2,12 +2,14 @@ package com.dfsek.terra.api.structures.structure.buffer; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; +import com.dfsek.terra.api.structures.structure.buffer.items.Mark; import java.util.HashMap; import java.util.Map; public class StructureBuffer implements Buffer { - private final Map bufferedItemMap = new HashMap<>(); + private final Map bufferedItemMap = new HashMap<>(); private final Location origin; public StructureBuffer(Location origin) { @@ -22,10 +24,28 @@ public class StructureBuffer implements Buffer { @Override public Buffer addItem(BufferedItem item, Vector3 location) { - bufferedItemMap.put(location, item); + bufferedItemMap.putIfAbsent(location, new Cell()); + bufferedItemMap.get(location).add(item); return this; } + @Override + public Mark getMark(Vector3 location) { + Cell cell = bufferedItemMap.get(location); + if(cell != null) { + return cell.getMark(); + } + return null; + } + + @Override + public Buffer setMark(Mark mark, Vector3 location) { + bufferedItemMap.putIfAbsent(location, new Cell()); + bufferedItemMap.get(location).setMark(mark); + return this; + } + + @Override public Location getOrigin() { return origin; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedBlock.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedBlock.java similarity index 85% rename from common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedBlock.java rename to common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedBlock.java index 95ea66058..1ed1b414d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedBlock.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedBlock.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.structures.structure.buffer; +package com.dfsek.terra.api.structures.structure.buffer.items; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.block.BlockData; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedItem.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedItem.java similarity index 65% rename from common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedItem.java rename to common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedItem.java index d9d1f959c..a4cfa2e17 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedItem.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedItem.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.structures.structure.buffer; +package com.dfsek.terra.api.structures.structure.buffer.items; import com.dfsek.terra.api.math.vector.Location; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/Mark.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/Mark.java new file mode 100644 index 000000000..532030b87 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/Mark.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.api.structures.structure.buffer.items; + +public class Mark { + private final String content; + + public Mark(String content) { + this.content = content; + } + + public String getContent() { + return content; + } +}