implement LootFunction

This commit is contained in:
dfsek
2021-01-01 00:08:03 -07:00
parent a9df684b80
commit ce033b0956
13 changed files with 105 additions and 33 deletions
@@ -9,6 +9,7 @@ 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.LootFunctionBuilder;
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;
@@ -18,6 +19,7 @@ import com.dfsek.terra.api.structures.structure.Rotation;
import com.dfsek.terra.api.structures.structure.buffer.Buffer;
import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer;
import com.dfsek.terra.api.structures.world.CheckCache;
import com.dfsek.terra.registry.LootRegistry;
import com.dfsek.terra.registry.ScriptRegistry;
import org.apache.commons.io.IOUtils;
@@ -32,7 +34,7 @@ public class StructureScript {
private final String id;
private final LinkedHashMap<Location, StructureBuffer> cache;
public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, CheckCache cache) {
public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, LootRegistry lootRegistry, CheckCache cache) {
Parser parser;
try {
parser = new Parser(IOUtils.toString(inputStream));
@@ -46,7 +48,8 @@ public class StructureScript {
.addFunction("recursions", new RecursionsFunctionBuilder())
.addFunction("setMark", new MarkFunctionBuilder())
.addFunction("getMark", new GetMarkFunctionBuilder())
.addFunction("pull", new PullFunctionBuilder(main));
.addFunction("pull", new PullFunctionBuilder(main))
.addFunction("loot", new LootFunctionBuilder(main, lootRegistry));
try {
block = parser.parse();
@@ -0,0 +1,45 @@
package com.dfsek.terra.api.structures.script.builders;
import com.dfsek.terra.api.platform.TerraPlugin;
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.LootFunction;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.registry.LootRegistry;
import java.util.List;
public class LootFunctionBuilder implements FunctionBuilder<LootFunction> {
private final TerraPlugin main;
private final LootRegistry registry;
public LootFunctionBuilder(TerraPlugin main, LootRegistry registry) {
this.main = main;
this.registry = registry;
}
@SuppressWarnings("unchecked")
@Override
public LootFunction build(List<Returnable<?>> argumentList, Position position) {
return new LootFunction(registry, (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;
}
}
}
@@ -1,26 +1,36 @@
package com.dfsek.terra.api.structures.script.functions;
import com.dfsek.terra.api.loot.LootTable;
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.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.BufferedLootApplication;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.registry.LootRegistry;
import net.jafama.FastMath;
import java.util.Random;
public class LootFunction implements Function<Void> {
private final LootRegistry registry;
private final Returnable<String> data;
private final Returnable<Number> x, y, z;
private final Position position;
private final TerraPlugin main;
public LootFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Returnable<String> data, TerraPlugin main, Position position) {
public LootFunction(LootRegistry registry, Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Returnable<String> data, TerraPlugin main, Position position) {
this.registry = registry;
this.position = position;
this.data = data;
this.x = x;
this.y = y;
this.z = z;
this.main = main;
}
@Override
@@ -32,7 +42,17 @@ public class LootFunction implements Function<Void> {
public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) {
Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue());
RotationUtil.rotateVector(xz, rotation);
String id = data.apply(buffer, rotation, random, recursions);
LootTable table = registry.get(id);
if(table == null) {
main.getLogger().severe("No such loot table " + id);
return null;
}
buffer.addItem(new BufferedLootApplication(table, main), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ())));
return null;
}
@@ -53,9 +53,10 @@ public class StructureFunction implements Function<Boolean> {
RotationUtil.rotateVector(xz, rotation);
StructureScript script = registry.get(id.apply(buffer, rotation, random, recursions));
String app = id.apply(buffer, rotation, random, recursions);
StructureScript script = registry.get(app);
if(script == null) {
main.getLogger().severe("No such structure " + id.apply(buffer, rotation, random, recursions));
main.getLogger().severe("No such structure " + app);
return null;
}
@@ -7,11 +7,11 @@ import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem;
import com.dfsek.terra.api.structures.structure.buffer.items.Mark;
import net.jafama.FastMath;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class StructureBuffer implements Buffer {
private final Map<Vector3, Cell> bufferedItemMap = new HashMap<>();
private final Map<Vector3, Cell> bufferedItemMap = new LinkedHashMap<>();
private final Location origin;
private boolean succeeded;
@@ -1,11 +1,29 @@
package com.dfsek.terra.api.structures.structure.buffer.items;
import com.dfsek.terra.api.loot.LootTable;
import com.dfsek.terra.api.math.vector.Location;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.platform.TerraPlugin;
import com.dfsek.terra.api.platform.block.state.BlockState;
import com.dfsek.terra.api.platform.block.state.Container;
import com.dfsek.terra.api.util.FastRandom;
public class BufferedLootApplication implements BufferedItem {
private final LootTable table;
private final TerraPlugin main;
public BufferedLootApplication(LootTable table, TerraPlugin main) {
this.table = table;
this.main = main;
}
@Override
public void paste(Location origin) {
BlockData data = origin.getBlock().getBlockData();
BlockState data = origin.getBlock().getState();
if(!(data instanceof Container)) {
main.getLogger().severe("Failed to place loot at " + origin + "; block " + data.toString() + " is not container.");
return;
}
Container container = (Container) data;
table.fillInventory(container.getInventory(), new FastRandom(origin.hashCode()));
}
}