mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-19 07:11:14 +00:00
reimplement loot tables
This commit is contained in:
@@ -32,7 +32,6 @@ import com.dfsek.terra.config.files.FolderLoader;
|
|||||||
import com.dfsek.terra.config.files.Loader;
|
import com.dfsek.terra.config.files.Loader;
|
||||||
import com.dfsek.terra.config.files.ZIPLoader;
|
import com.dfsek.terra.config.files.ZIPLoader;
|
||||||
import com.dfsek.terra.config.lang.LangUtil;
|
import com.dfsek.terra.config.lang.LangUtil;
|
||||||
import com.dfsek.terra.config.loaders.LootTableLoader;
|
|
||||||
import com.dfsek.terra.config.templates.AbstractableTemplate;
|
import com.dfsek.terra.config.templates.AbstractableTemplate;
|
||||||
import com.dfsek.terra.config.templates.BiomeGridTemplate;
|
import com.dfsek.terra.config.templates.BiomeGridTemplate;
|
||||||
import com.dfsek.terra.config.templates.BiomeTemplate;
|
import com.dfsek.terra.config.templates.BiomeTemplate;
|
||||||
@@ -48,12 +47,15 @@ import com.dfsek.terra.registry.BiomeGridRegistry;
|
|||||||
import com.dfsek.terra.registry.BiomeRegistry;
|
import com.dfsek.terra.registry.BiomeRegistry;
|
||||||
import com.dfsek.terra.registry.CarverRegistry;
|
import com.dfsek.terra.registry.CarverRegistry;
|
||||||
import com.dfsek.terra.registry.FloraRegistry;
|
import com.dfsek.terra.registry.FloraRegistry;
|
||||||
|
import com.dfsek.terra.registry.LootRegistry;
|
||||||
import com.dfsek.terra.registry.OreRegistry;
|
import com.dfsek.terra.registry.OreRegistry;
|
||||||
import com.dfsek.terra.registry.PaletteRegistry;
|
import com.dfsek.terra.registry.PaletteRegistry;
|
||||||
import com.dfsek.terra.registry.ScriptRegistry;
|
import com.dfsek.terra.registry.ScriptRegistry;
|
||||||
import com.dfsek.terra.registry.StructureRegistry;
|
import com.dfsek.terra.registry.StructureRegistry;
|
||||||
import com.dfsek.terra.registry.TerraRegistry;
|
import com.dfsek.terra.registry.TerraRegistry;
|
||||||
import com.dfsek.terra.registry.TreeRegistry;
|
import com.dfsek.terra.registry.TreeRegistry;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.json.simple.parser.ParseException;
|
||||||
import parsii.eval.Scope;
|
import parsii.eval.Scope;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -61,6 +63,7 @@ import java.io.FileInputStream;
|
|||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
@@ -86,6 +89,7 @@ public class ConfigPack implements LoaderRegistrar {
|
|||||||
private final OreRegistry oreRegistry = new OreRegistry();
|
private final OreRegistry oreRegistry = new OreRegistry();
|
||||||
private final TreeRegistry treeRegistry;
|
private final TreeRegistry treeRegistry;
|
||||||
private final ScriptRegistry scriptRegistry = new ScriptRegistry();
|
private final ScriptRegistry scriptRegistry = new ScriptRegistry();
|
||||||
|
private final LootRegistry lootRegistry = new LootRegistry();
|
||||||
|
|
||||||
private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader();
|
private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader();
|
||||||
private final ConfigLoader selfLoader = new ConfigLoader();
|
private final ConfigLoader selfLoader = new ConfigLoader();
|
||||||
@@ -149,13 +153,19 @@ public class ConfigPack implements LoaderRegistrar {
|
|||||||
for(Map.Entry<String, Double> var : template.getVariables().entrySet()) {
|
for(Map.Entry<String, Double> var : template.getVariables().entrySet()) {
|
||||||
varScope.create(var.getKey()).setValue(var.getValue());
|
varScope.create(var.getKey()).setValue(var.getValue());
|
||||||
}
|
}
|
||||||
abstractConfigLoader
|
|
||||||
.registerLoader(LootTable.class, new LootTableLoader(loader, main)); // These loaders need access to the Loader instance to get files.
|
|
||||||
|
|
||||||
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, scriptRegistry, checkCache);
|
StructureScript structureScript = new StructureScript(stream, main, scriptRegistry, checkCache);
|
||||||
scriptRegistry.add(structureScript.getId(), structureScript);
|
scriptRegistry.add(structureScript.getId(), structureScript);
|
||||||
})).close();
|
})).close().open("structures/loot", ".json").thenEntries(entries -> {
|
||||||
|
for(Map.Entry<String, InputStream> entry : entries) {
|
||||||
|
try {
|
||||||
|
lootRegistry.add(entry.getKey(), new LootTable(IOUtils.toString(entry.getValue(), StandardCharsets.UTF_8), main));
|
||||||
|
} catch(ParseException | IOException | NullPointerException e) {
|
||||||
|
throw new LoadException("Unable to load loot", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).close();
|
||||||
|
|
||||||
loader
|
loader
|
||||||
.open("palettes", ".yml").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close()
|
.open("palettes", ".yml").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close()
|
||||||
@@ -250,7 +260,8 @@ public class ConfigPack implements LoaderRegistrar {
|
|||||||
.registerLoader(Ore.class, oreRegistry)
|
.registerLoader(Ore.class, oreRegistry)
|
||||||
.registerLoader(Tree.class, treeRegistry)
|
.registerLoader(Tree.class, treeRegistry)
|
||||||
.registerLoader(StructureScript.class, scriptRegistry)
|
.registerLoader(StructureScript.class, scriptRegistry)
|
||||||
.registerLoader(TerraStructure.class, structureRegistry);
|
.registerLoader(TerraStructure.class, structureRegistry)
|
||||||
|
.registerLoader(LootTable.class, lootRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ScriptRegistry getScriptRegistry() {
|
public ScriptRegistry getScriptRegistry() {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import java.io.InputStream;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Consumer;
|
import java.util.Set;
|
||||||
|
|
||||||
public abstract class Loader {
|
public abstract class Loader {
|
||||||
protected final Map<String, InputStream> streams = new HashMap<>();
|
protected final Map<String, InputStream> streams = new HashMap<>();
|
||||||
@@ -23,11 +23,16 @@ public abstract class Loader {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Loader thenNames(Consumer<List<String>> consumer) {
|
public Loader thenNames(ExceptionalConsumer<List<String>> consumer) throws ConfigException {
|
||||||
consumer.accept(new GlueList<>(streams.keySet()));
|
consumer.accept(new GlueList<>(streams.keySet()));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Loader thenEntries(ExceptionalConsumer<Set<Map.Entry<String, InputStream>>> consumer) throws ConfigException {
|
||||||
|
consumer.accept(streams.entrySet());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a single file from this Loader.
|
* Get a single file from this Loader.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
package com.dfsek.terra.config.loaders;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.exception.LoadException;
|
|
||||||
import com.dfsek.tectonic.loading.ConfigLoader;
|
|
||||||
import com.dfsek.tectonic.loading.TypeLoader;
|
|
||||||
import com.dfsek.terra.api.loot.LootTable;
|
|
||||||
import com.dfsek.terra.api.platform.TerraPlugin;
|
|
||||||
import com.dfsek.terra.config.files.Loader;
|
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
import org.json.simple.parser.ParseException;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.lang.reflect.Type;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
|
|
||||||
public class LootTableLoader implements TypeLoader<LootTable> {
|
|
||||||
private final Loader loader;
|
|
||||||
private final TerraPlugin main;
|
|
||||||
|
|
||||||
public LootTableLoader(Loader loader, TerraPlugin main) {
|
|
||||||
this.loader = loader;
|
|
||||||
this.main = main;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LootTable load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
|
|
||||||
try(InputStream stream = loader.get("structures/loot/" + o + ".json")) {
|
|
||||||
return new LootTable(IOUtils.toString(stream, StandardCharsets.UTF_8), main);
|
|
||||||
} catch(IOException | ParseException | NullPointerException e) {
|
|
||||||
throw new LoadException("Unable to load loot", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -33,14 +33,14 @@ public class StructureTemplate extends AbstractableTemplate implements ConfigTem
|
|||||||
|
|
||||||
@Value("loot")
|
@Value("loot")
|
||||||
@Abstractable
|
@Abstractable
|
||||||
private Map<Integer, LootTable> loot;
|
private Map<String, LootTable> loot;
|
||||||
|
|
||||||
@Value("features")
|
@Value("features")
|
||||||
@Abstractable
|
@Abstractable
|
||||||
@Default
|
@Default
|
||||||
private List<Void> features = new GlueList<>();
|
private List<Void> features = new GlueList<>();
|
||||||
|
|
||||||
public Map<Integer, LootTable> getLoot() {
|
public Map<String, LootTable> getLoot() {
|
||||||
return loot;
|
return loot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,15 +9,14 @@ import com.dfsek.terra.procgen.GridSpawn;
|
|||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
// TODO: implementation
|
|
||||||
public class TerraStructure {
|
public class TerraStructure {
|
||||||
private final ProbabilityCollection<StructureScript> structure;
|
private final ProbabilityCollection<StructureScript> structure;
|
||||||
private final Range spawnStart;
|
private final Range spawnStart;
|
||||||
private final GridSpawn spawn;
|
private final GridSpawn spawn;
|
||||||
private final Map<Integer, LootTable> loot;
|
private final Map<String, LootTable> loot;
|
||||||
private final StructureTemplate template;
|
private final StructureTemplate template;
|
||||||
|
|
||||||
public TerraStructure(ProbabilityCollection<StructureScript> structures, Range spawnStart, GridSpawn spawn, Map<Integer, LootTable> loot, StructureTemplate template) {
|
public TerraStructure(ProbabilityCollection<StructureScript> structures, Range spawnStart, GridSpawn spawn, Map<String, LootTable> loot, StructureTemplate template) {
|
||||||
this.structure = structures;
|
this.structure = structures;
|
||||||
this.spawnStart = spawnStart;
|
this.spawnStart = spawnStart;
|
||||||
this.spawn = spawn;
|
this.spawn = spawn;
|
||||||
@@ -41,7 +40,7 @@ public class TerraStructure {
|
|||||||
return spawn;
|
return spawn;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<Integer, LootTable> getLoot() {
|
public Map<String, LootTable> getLoot() {
|
||||||
return loot;
|
return loot;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.dfsek.terra.registry;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.loot.LootTable;
|
||||||
|
|
||||||
|
public class LootRegistry extends TerraRegistry<LootTable> {
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user