mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-10-26 05:50:08 +00:00
Implement StructureFunction and temp RandomFunction
This commit is contained in:
1 parent
405a96034c
commit
63e59692e2
6 files changed
+201
-3
No files matched your search
@@ -8,7 +8,10 @@ import com.dfsek.terra.api.structures.parser.exceptions.ParseException;
|
|||||||
import com.dfsek.terra.api.structures.parser.lang.Block;
|
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.BlockFunctionBuilder;
|
||||||
import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder;
|
import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder;
|
||||||
|
import com.dfsek.terra.api.structures.script.builders.RandomFunctionBuilder;
|
||||||
|
import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder;
|
||||||
import com.dfsek.terra.api.structures.structure.Rotation;
|
import com.dfsek.terra.api.structures.structure.Rotation;
|
||||||
|
import com.dfsek.terra.registry.ScriptRegistry;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -18,7 +21,7 @@ public class StructureScript {
|
|||||||
private final Block block;
|
private final Block block;
|
||||||
private final String id;
|
private final String id;
|
||||||
|
|
||||||
public StructureScript(InputStream inputStream, TerraPlugin main) {
|
public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry) {
|
||||||
Parser parser;
|
Parser parser;
|
||||||
try {
|
try {
|
||||||
parser = new Parser(IOUtils.toString(inputStream));
|
parser = new Parser(IOUtils.toString(inputStream));
|
||||||
@@ -26,7 +29,9 @@ public class StructureScript {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
parser.addFunction("block", new BlockFunctionBuilder(main))
|
parser.addFunction("block", new BlockFunctionBuilder(main))
|
||||||
.addFunction("check", new CheckFunctionBuilder(main));
|
.addFunction("check", new CheckFunctionBuilder(main))
|
||||||
|
.addFunction("structure", new StructureFunctionBuilder(registry, main))
|
||||||
|
.addFunction("randomInt", new RandomFunctionBuilder());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
block = parser.parse();
|
block = parser.parse();
|
||||||
|
|||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
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.RandomFunction;
|
||||||
|
import com.dfsek.terra.api.structures.tokenizer.Position;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RandomFunctionBuilder implements FunctionBuilder<RandomFunction> {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public RandomFunction build(List<Returnable<?>> argumentList, Position position) throws ParseException {
|
||||||
|
return new RandomFunction((Returnable<Number>) argumentList.get(0), position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int argNumber() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Returnable.ReturnType getArgument(int position) {
|
||||||
|
if(position == 0) return Returnable.ReturnType.NUMBER;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
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.StructureFunction;
|
||||||
|
import com.dfsek.terra.api.structures.tokenizer.Position;
|
||||||
|
import com.dfsek.terra.registry.ScriptRegistry;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class StructureFunctionBuilder implements FunctionBuilder<StructureFunction> {
|
||||||
|
private final ScriptRegistry registry;
|
||||||
|
private final TerraPlugin main;
|
||||||
|
|
||||||
|
public StructureFunctionBuilder(ScriptRegistry registry, TerraPlugin main) {
|
||||||
|
this.registry = registry;
|
||||||
|
this.main = main;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public StructureFunction build(List<Returnable<?>> argumentList, Position position) throws ParseException {
|
||||||
|
return new StructureFunction((Returnable<Number>) argumentList.get(0), (Returnable<Number>) argumentList.get(1), (Returnable<Number>) argumentList.get(2), (Returnable<String>) argumentList.get(3), registry, position, main);
|
||||||
|
}
|
||||||
|
|
||||||
|
@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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
package com.dfsek.terra.api.structures.script.functions;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.math.vector.Location;
|
||||||
|
import com.dfsek.terra.api.platform.world.Chunk;
|
||||||
|
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.tokenizer.Position;
|
||||||
|
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
|
public class RandomFunction implements Function<Integer> {
|
||||||
|
private final Returnable<Number> numberReturnable;
|
||||||
|
private final Position position;
|
||||||
|
|
||||||
|
public RandomFunction(Returnable<Number> numberReturnable, Position position) {
|
||||||
|
this.numberReturnable = numberReturnable;
|
||||||
|
this.position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String name() {
|
||||||
|
return "randomInt";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ReturnType returnType() {
|
||||||
|
return ReturnType.NUMBER;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer apply(Location location, Rotation rotation) {
|
||||||
|
return ThreadLocalRandom.current().nextInt(numberReturnable.apply(location, rotation).intValue()); // TODO: deterministic random
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer apply(Location location, Chunk chunk, Rotation rotation) {
|
||||||
|
return ThreadLocalRandom.current().nextInt(numberReturnable.apply(location, chunk, rotation).intValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Position getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
}
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
package com.dfsek.terra.api.structures.script.functions;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.math.vector.Location;
|
||||||
|
import com.dfsek.terra.api.math.vector.Vector2;
|
||||||
|
import com.dfsek.terra.api.platform.TerraPlugin;
|
||||||
|
import com.dfsek.terra.api.platform.world.Chunk;
|
||||||
|
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.StructureScript;
|
||||||
|
import com.dfsek.terra.api.structures.structure.Rotation;
|
||||||
|
import com.dfsek.terra.api.structures.structure.RotationUtil;
|
||||||
|
import com.dfsek.terra.api.structures.tokenizer.Position;
|
||||||
|
import com.dfsek.terra.registry.ScriptRegistry;
|
||||||
|
import net.jafama.FastMath;
|
||||||
|
|
||||||
|
public class StructureFunction implements Function<Void> {
|
||||||
|
private final ScriptRegistry registry;
|
||||||
|
private final Returnable<String> id;
|
||||||
|
private final Returnable<Number> x, y, z;
|
||||||
|
private final Position position;
|
||||||
|
private final TerraPlugin main;
|
||||||
|
|
||||||
|
public StructureFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Returnable<String> id, ScriptRegistry registry, Position position, TerraPlugin main) {
|
||||||
|
this.registry = registry;
|
||||||
|
this.id = id;
|
||||||
|
this.position = position;
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
this.main = main;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String name() {
|
||||||
|
return "structure";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ReturnType returnType() {
|
||||||
|
return ReturnType.VOID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void apply(Location location, Rotation rotation) {
|
||||||
|
System.out.println("executing structure function");
|
||||||
|
|
||||||
|
Vector2 xz = new Vector2(x.apply(location, rotation).doubleValue(), z.apply(location, rotation).doubleValue());
|
||||||
|
|
||||||
|
RotationUtil.rotateVector(xz, rotation);
|
||||||
|
|
||||||
|
StructureScript script = registry.get(id.apply(location, rotation));
|
||||||
|
if(script == null) {
|
||||||
|
main.getLogger().severe("No such structure " + id.apply(location, rotation));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Location location1 = location.clone().add(FastMath.roundToInt(xz.getX()), y.apply(location, rotation).intValue(), FastMath.roundToInt(xz.getZ()));
|
||||||
|
|
||||||
|
script.execute(location1, rotation);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void apply(Location location, Chunk chunk, Rotation rotation) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Position getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -153,7 +153,7 @@ public class ConfigPack implements LoaderRegistrar {
|
|||||||
|
|
||||||
|
|
||||||
loader.open("structures/data", ".tesf").then(streams -> streams.forEach(stream -> {
|
loader.open("structures/data", ".tesf").then(streams -> streams.forEach(stream -> {
|
||||||
StructureScript structureScript = new StructureScript(stream, main);
|
StructureScript structureScript = new StructureScript(stream, main, scriptRegistry);
|
||||||
scriptRegistry.add(structureScript.getId(), structureScript);
|
scriptRegistry.add(structureScript.getId(), structureScript);
|
||||||
})).close();
|
})).close();
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user