Pass rotation to Item#apply

This commit is contained in:
dfsek
2020-12-22 22:41:51 -07:00
parent 66e8647517
commit 062c9b5efb
16 changed files with 69 additions and 49 deletions

View File

@@ -3,6 +3,7 @@ package com.dfsek.terra.api.structures.parser.lang;
import com.dfsek.terra.api.math.vector.Location;
import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.structure.Rotation;
import java.util.List;
@@ -20,14 +21,14 @@ public class Block implements Item<Void> {
}
@Override
public Void apply(Location location) {
items.forEach(item -> item.apply(location));
public Void apply(Location location, Rotation rotation) {
items.forEach(item -> item.apply(location, rotation));
return null;
}
@Override
public Void apply(Location location, Chunk chunk) {
items.forEach(item -> item.apply(location, chunk));
public Void apply(Location location, Chunk chunk, Rotation rotation) {
items.forEach(item -> item.apply(location, chunk, rotation));
return null;
}

View File

@@ -3,11 +3,12 @@ package com.dfsek.terra.api.structures.parser.lang;
import com.dfsek.terra.api.math.vector.Location;
import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.structure.Rotation;
public interface Item<T> {
T apply(Location location);
T apply(Location location, Rotation rotation);
T apply(Location location, Chunk chunk);
T apply(Location location, Chunk chunk, Rotation rotation);
Position getPosition();
}

View File

@@ -4,6 +4,7 @@ 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.tokenizer.Position;
import com.dfsek.terra.structure.Rotation;
public abstract class ConstantExpression<T> implements Returnable<T> {
private final T constant;
@@ -15,13 +16,13 @@ public abstract class ConstantExpression<T> implements Returnable<T> {
}
@Override
public T apply(Location location) {
public T apply(Location location, Rotation rotation) {
return constant;
}
@Override
public T apply(Location location, Chunk chunk) {
public T apply(Location location, Chunk chunk, Rotation rotation) {
return constant;
}

View File

@@ -6,6 +6,7 @@ import com.dfsek.terra.api.structures.parser.lang.Block;
import com.dfsek.terra.api.structures.parser.lang.Keyword;
import com.dfsek.terra.api.structures.parser.lang.Returnable;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.structure.Rotation;
public class IfKeyword implements Keyword<Void> {
private final Block conditional;
@@ -19,14 +20,14 @@ public class IfKeyword implements Keyword<Void> {
}
@Override
public Void apply(Location location) {
if(statement.apply(location)) conditional.apply(location);
public Void apply(Location location, Rotation rotation) {
if(statement.apply(location, rotation)) conditional.apply(location, rotation);
return null;
}
@Override
public Void apply(Location location, Chunk chunk) {
if(statement.apply(location, chunk)) conditional.apply(location, chunk);
public Void apply(Location location, Chunk chunk, Rotation rotation) {
if(statement.apply(location, chunk, rotation)) conditional.apply(location, chunk, rotation);
return null;
}

View File

@@ -4,6 +4,7 @@ import com.dfsek.terra.api.math.vector.Location;
import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.structures.parser.lang.Keyword;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.structure.Rotation;
public class ReturnKeyword implements Keyword<Void> {
private final Position position;
@@ -13,12 +14,12 @@ public class ReturnKeyword implements Keyword<Void> {
}
@Override
public Void apply(Location location) {
public Void apply(Location location, Rotation rotation) {
return null;
}
@Override
public Void apply(Location location, Chunk chunk) {
public Void apply(Location location, Chunk chunk, Rotation rotation) {
return null;
}

View File

@@ -6,6 +6,7 @@ import com.dfsek.terra.api.structures.parser.lang.Block;
import com.dfsek.terra.api.structures.parser.lang.Keyword;
import com.dfsek.terra.api.structures.parser.lang.Returnable;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.structure.Rotation;
public class WhileKeyword implements Keyword<Void> {
private final Block conditional;
@@ -19,14 +20,14 @@ public class WhileKeyword implements Keyword<Void> {
}
@Override
public Void apply(Location location) {
while(statement.apply(location)) conditional.apply(location);
public Void apply(Location location, Rotation rotation) {
while(statement.apply(location, rotation)) conditional.apply(location, rotation);
return null;
}
@Override
public Void apply(Location location, Chunk chunk) {
while(statement.apply(location, chunk)) conditional.apply(location, chunk);
public Void apply(Location location, Chunk chunk, Rotation rotation) {
while(statement.apply(location, chunk, rotation)) conditional.apply(location, chunk, rotation);
return null;
}

View File

@@ -4,6 +4,7 @@ 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.tokenizer.Position;
import com.dfsek.terra.structure.Rotation;
public abstract class BinaryOperation<I, O> implements Returnable<O> {
private final Returnable<I> left;
@@ -24,12 +25,12 @@ public abstract class BinaryOperation<I, O> implements Returnable<O> {
}
@Override
public O apply(Location location) {
return apply(left.apply(location), right.apply(location));
public O apply(Location location, Rotation rotation) {
return apply(left.apply(location, rotation), right.apply(location, rotation));
}
@Override
public O apply(Location location, Chunk chunk) {
return apply(left.apply(location, chunk), right.apply(location, chunk));
public O apply(Location location, Chunk chunk, Rotation rotation) {
return apply(left.apply(location, chunk, rotation), right.apply(location, chunk, rotation));
}
}

View File

@@ -4,6 +4,7 @@ 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.tokenizer.Position;
import com.dfsek.terra.structure.Rotation;
public abstract class UnaryOperation<T> implements Returnable<T> {
private final Returnable<T> input;
@@ -17,13 +18,13 @@ public abstract class UnaryOperation<T> implements Returnable<T> {
public abstract T apply(T input);
@Override
public T apply(Location location) {
return apply(input.apply(location));
public T apply(Location location, Rotation rotation) {
return apply(input.apply(location, rotation));
}
@Override
public T apply(Location location, Chunk chunk) {
return apply(input.apply(location, chunk));
public T apply(Location location, Chunk chunk, Rotation rotation) {
return apply(input.apply(location, chunk, rotation));
}
@Override

View File

@@ -5,6 +5,7 @@ import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.structures.parser.lang.Item;
import com.dfsek.terra.api.structures.parser.lang.Returnable;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.structure.Rotation;
public class Assignment<T> implements Item<T> {
private final Variable<T> delegate;
@@ -18,15 +19,15 @@ public class Assignment<T> implements Item<T> {
}
@Override
public T apply(Location location) {
T val = value.apply(location);
public T apply(Location location, Rotation rotation) {
T val = value.apply(location, rotation);
delegate.setValue(val);
return val;
}
@Override
public T apply(Location location, Chunk chunk) {
T val = value.apply(location, chunk);
public T apply(Location location, Chunk chunk, Rotation rotation) {
T val = value.apply(location, chunk, rotation);
delegate.setValue(val);
return val;
}

View File

@@ -4,6 +4,7 @@ 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.tokenizer.Position;
import com.dfsek.terra.structure.Rotation;
public class Getter implements Returnable<Object> {
private final Variable<?> delegate;
@@ -18,12 +19,12 @@ public class Getter implements Returnable<Object> {
}
@Override
public Object apply(Location location) {
public Object apply(Location location, Rotation rotation) {
return delegate.getValue();
}
@Override
public Object apply(Location location, Chunk chunk) {
public Object apply(Location location, Chunk chunk, Rotation rotation) {
return delegate.getValue();
}

View File

@@ -9,6 +9,7 @@ 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.tokenizer.Position;
import com.dfsek.terra.structure.Rotation;
public class BlockFunction implements Function<Void> {
private final BlockData data;
@@ -31,13 +32,13 @@ public class BlockFunction implements Function<Void> {
}
@Override
public Void apply(Location location) {
location.clone().add(x.apply(location).intValue(), y.apply(location).intValue(), z.apply(location).intValue()).getBlock().setBlockData(data, false);
public Void apply(Location location, Rotation rotation) {
location.clone().add(x.apply(location, rotation).intValue(), y.apply(location, rotation).intValue(), z.apply(location, rotation).intValue()).getBlock().setBlockData(data, false);
return null;
}
@Override
public Void apply(Location location, Chunk chunk) {
public Void apply(Location location, Chunk chunk, Rotation rotation) {
//TODO: do
return null;
}

View File

@@ -10,6 +10,7 @@ import com.dfsek.terra.api.structures.parser.lang.functions.Function;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.structures.world.LandCheck;
import com.dfsek.terra.api.structures.world.OceanCheck;
import com.dfsek.terra.structure.Rotation;
public class CheckFunction implements Function<String> {
private final TerraPlugin main;
@@ -29,14 +30,14 @@ public class CheckFunction implements Function<String> {
return "check";
}
private Vector3 getVector(Location location, Chunk chunk) {
return location.clone().add(chunk == null ? new Vector3(x.apply(location).intValue(), y.apply(location).intValue(), z.apply(location).intValue())
: new Vector3(x.apply(location, chunk).intValue(), y.apply(location, chunk).intValue(), z.apply(location, chunk).intValue())).toVector();
private Vector3 getVector(Location location, Chunk chunk, Rotation rotation) {
return location.clone().add(chunk == null ? new Vector3(x.apply(location, rotation).intValue(), y.apply(location, rotation).intValue(), z.apply(location, rotation).intValue())
: new Vector3(x.apply(location, chunk, rotation).intValue(), y.apply(location, chunk, rotation).intValue(), z.apply(location, chunk, rotation).intValue())).toVector();
}
@Override
public String apply(Location location) {
return apply(getVector(location, null), location.getWorld());
public String apply(Location location, Rotation rotation) {
return apply(getVector(location, null, rotation), location.getWorld());
}
private String apply(Vector3 vector, World world) {
@@ -48,8 +49,8 @@ public class CheckFunction implements Function<String> {
}
@Override
public String apply(Location location, Chunk chunk) {
return apply(getVector(location, chunk), location.getWorld());
public String apply(Location location, Chunk chunk, Rotation rotation) {
return apply(getVector(location, chunk, rotation), location.getWorld());
}
@Override

View File

@@ -142,6 +142,7 @@ public class ConfigPack implements LoaderRegistrar {
.registerLoader(LootTable.class, new LootTableLoader(loader, main)); // These loaders need access to the Loader instance to get files.
loader
.open("palettes").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close()
.open("palettes").thenNames(names -> names.forEach(System.out::println)).close()
.open("ores").then(streams -> buildAll(new OreFactory(), oreRegistry, abstractConfigLoader.load(streams, OreTemplate::new), main)).close()
.open("flora").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close()
.open("carving").then(streams -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.load(streams, CarverTemplate::new), main)).close()

View File

@@ -23,8 +23,13 @@ public abstract class Loader {
return this;
}
public Loader thenNames(Consumer<List<String>> consumer) throws ConfigException {
public Loader thenNames(Consumer<List<String>> consumer) {
consumer.accept(new GlueList<>(streams.keySet()));
System.out.println("names ^ ");
streams.forEach((name, stream) -> {
System.out.println(name);
});
System.out.println("names ^ ");
return this;
}

View File

@@ -9,6 +9,7 @@ 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.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.structure.Rotation;
import org.apache.commons.io.IOUtils;
import org.junit.jupiter.api.Test;
@@ -50,9 +51,9 @@ public class ParserTest {
long t = System.nanoTime() - l;
System.out.println("Took " + (double) t / 1000000);
block.apply(null);
block.apply(null, Rotation.NONE);
block.apply(null);
block.apply(null, Rotation.NONE);
}
private static class Test1 implements Function<Void> {
@@ -67,13 +68,13 @@ public class ParserTest {
}
@Override
public Void apply(Location location) {
System.out.println("string: " + a.apply(location) + ", double: " + b.apply(location));
public Void apply(Location location, Rotation rotation) {
System.out.println("string: " + a.apply(location, rotation) + ", double: " + b.apply(location, rotation));
return null;
}
@Override
public Void apply(Location location, Chunk chunk) {
public Void apply(Location location, Chunk chunk, Rotation rotation) {
return null;
}

View File

@@ -8,6 +8,7 @@ import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder;
import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder;
import com.dfsek.terra.bukkit.BukkitWorld;
import com.dfsek.terra.bukkit.command.DebugCommand;
import com.dfsek.terra.structure.Rotation;
import org.apache.commons.io.IOUtils;
import org.bukkit.block.Sign;
import org.bukkit.command.Command;
@@ -48,7 +49,7 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand {
System.out.println("Done parsing");
main.apply(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()));
main.apply(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), Rotation.NONE);
} catch(IOException | ParseException e) {
e.printStackTrace();