implement PullFunction

This commit is contained in:
dfsek
2020-12-25 17:46:29 -07:00
parent 9685dbbb9d
commit c6d7d1a947
4 changed files with 130 additions and 1 deletions

View File

@@ -9,6 +9,7 @@ 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.PullFunctionBuilder;
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;
@@ -38,7 +39,8 @@ public class StructureScript {
.addFunction("randomInt", new RandomFunctionBuilder())
.addFunction("recursions", new RecursionsFunctionBuilder())
.addFunction("setMark", new MarkFunctionBuilder())
.addFunction("getMark", new GetMarkFunctionBuilder());
.addFunction("getMark", new GetMarkFunctionBuilder())
.addFunction("pull", new PullFunctionBuilder(main));
try {
block = parser.parse();

View File

@@ -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.PullFunction;
import com.dfsek.terra.api.structures.tokenizer.Position;
import java.util.List;
public class PullFunctionBuilder implements FunctionBuilder<PullFunction> {
private final TerraPlugin main;
public PullFunctionBuilder(TerraPlugin main) {
this.main = main;
}
@SuppressWarnings("unchecked")
@Override
public PullFunction build(List<Returnable<?>> argumentList, Position position) throws ParseException {
return new PullFunction((Returnable<Number>) argumentList.get(0), (Returnable<Number>) argumentList.get(1), (Returnable<Number>) argumentList.get(2), (Returnable<String>) 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;
}
}
}

View File

@@ -0,0 +1,58 @@
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.block.BlockData;
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.BufferedPulledBlock;
import com.dfsek.terra.api.structures.tokenizer.Position;
import net.jafama.FastMath;
public class PullFunction implements Function<Void> {
private final BlockData data;
private final Returnable<Number> x, y, z;
private final Position position;
public PullFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Returnable<String> data, TerraPlugin main, Position position) throws ParseException {
this.position = position;
if(!(data instanceof ConstantExpression)) throw new ParseException("Block data must be constant", data.getPosition());
this.data = main.getWorldHandle().createBlockData(((ConstantExpression<String>) data).getConstant());
this.x = x;
this.y = y;
this.z = z;
}
@Override
public String name() {
return "pull";
}
@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);
BlockData rot = data.clone();
RotationUtil.rotateBlockData(rot, rotation.inverse());
buffer.addItem(new BufferedPulledBlock(rot), 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;
}
}

View File

@@ -0,0 +1,26 @@
package com.dfsek.terra.api.structures.structure.buffer.items;
import com.dfsek.terra.api.math.vector.Location;
import com.dfsek.terra.api.platform.block.Block;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.platform.block.BlockFace;
public class BufferedPulledBlock implements BufferedItem {
private final BlockData data;
public BufferedPulledBlock(BlockData data) {
this.data = data;
}
@Override
public void paste(Location origin) {
Block pos = origin.getBlock();
while(pos.getY() > 0) {
if(!pos.isEmpty()) {
pos.setBlockData(data, false);
break;
}
pos = pos.getRelative(BlockFace.DOWN);
}
}
}