From a9df684b800452d0bc731851fd29770b50292173 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 31 Dec 2020 23:20:16 -0700 Subject: [PATCH] reimplement loot tables --- .../dfsek/terra/config/base/ConfigPack.java | 21 +++++++++--- .../com/dfsek/terra/config/files/Loader.java | 9 +++-- .../terra/config/loaders/LootTableLoader.java | 34 ------------------- .../config/templates/StructureTemplate.java | 4 +-- .../generation/items/TerraStructure.java | 7 ++-- .../dfsek/terra/registry/LootRegistry.java | 6 ++++ 6 files changed, 34 insertions(+), 47 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java create mode 100644 common/src/main/java/com/dfsek/terra/registry/LootRegistry.java diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 2a2f4247e..6de2e6ed2 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -32,7 +32,6 @@ import com.dfsek.terra.config.files.FolderLoader; import com.dfsek.terra.config.files.Loader; import com.dfsek.terra.config.files.ZIPLoader; 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.BiomeGridTemplate; 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.CarverRegistry; import com.dfsek.terra.registry.FloraRegistry; +import com.dfsek.terra.registry.LootRegistry; import com.dfsek.terra.registry.OreRegistry; import com.dfsek.terra.registry.PaletteRegistry; import com.dfsek.terra.registry.ScriptRegistry; import com.dfsek.terra.registry.StructureRegistry; import com.dfsek.terra.registry.TerraRegistry; import com.dfsek.terra.registry.TreeRegistry; +import org.apache.commons.io.IOUtils; +import org.json.simple.parser.ParseException; import parsii.eval.Scope; import java.io.File; @@ -61,6 +63,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; @@ -86,6 +89,7 @@ public class ConfigPack implements LoaderRegistrar { private final OreRegistry oreRegistry = new OreRegistry(); private final TreeRegistry treeRegistry; private final ScriptRegistry scriptRegistry = new ScriptRegistry(); + private final LootRegistry lootRegistry = new LootRegistry(); private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); private final ConfigLoader selfLoader = new ConfigLoader(); @@ -149,13 +153,19 @@ public class ConfigPack implements LoaderRegistrar { for(Map.Entry var : template.getVariables().entrySet()) { 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 -> { StructureScript structureScript = new StructureScript(stream, main, scriptRegistry, checkCache); scriptRegistry.add(structureScript.getId(), structureScript); - })).close(); + })).close().open("structures/loot", ".json").thenEntries(entries -> { + for(Map.Entry 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 .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(Tree.class, treeRegistry) .registerLoader(StructureScript.class, scriptRegistry) - .registerLoader(TerraStructure.class, structureRegistry); + .registerLoader(TerraStructure.class, structureRegistry) + .registerLoader(LootTable.class, lootRegistry); } public ScriptRegistry getScriptRegistry() { diff --git a/common/src/main/java/com/dfsek/terra/config/files/Loader.java b/common/src/main/java/com/dfsek/terra/config/files/Loader.java index b05840db6..5c06ec7ac 100644 --- a/common/src/main/java/com/dfsek/terra/config/files/Loader.java +++ b/common/src/main/java/com/dfsek/terra/config/files/Loader.java @@ -8,7 +8,7 @@ import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.function.Consumer; +import java.util.Set; public abstract class Loader { protected final Map streams = new HashMap<>(); @@ -23,11 +23,16 @@ public abstract class Loader { return this; } - public Loader thenNames(Consumer> consumer) { + public Loader thenNames(ExceptionalConsumer> consumer) throws ConfigException { consumer.accept(new GlueList<>(streams.keySet())); return this; } + public Loader thenEntries(ExceptionalConsumer>> consumer) throws ConfigException { + consumer.accept(streams.entrySet()); + return this; + } + /** * Get a single file from this Loader. * diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java deleted file mode 100644 index bca5044e8..000000000 --- a/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java +++ /dev/null @@ -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 { - 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); - } - } -} diff --git a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java index 231c91bac..c4041fa62 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java @@ -33,14 +33,14 @@ public class StructureTemplate extends AbstractableTemplate implements ConfigTem @Value("loot") @Abstractable - private Map loot; + private Map loot; @Value("features") @Abstractable @Default private List features = new GlueList<>(); - public Map getLoot() { + public Map getLoot() { return loot; } diff --git a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java index 3fda0fbd6..a2e39dd97 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java @@ -9,15 +9,14 @@ import com.dfsek.terra.procgen.GridSpawn; import java.util.Map; -// TODO: implementation public class TerraStructure { private final ProbabilityCollection structure; private final Range spawnStart; private final GridSpawn spawn; - private final Map loot; + private final Map loot; private final StructureTemplate template; - public TerraStructure(ProbabilityCollection structures, Range spawnStart, GridSpawn spawn, Map loot, StructureTemplate template) { + public TerraStructure(ProbabilityCollection structures, Range spawnStart, GridSpawn spawn, Map loot, StructureTemplate template) { this.structure = structures; this.spawnStart = spawnStart; this.spawn = spawn; @@ -41,7 +40,7 @@ public class TerraStructure { return spawn; } - public Map getLoot() { + public Map getLoot() { return loot; } } diff --git a/common/src/main/java/com/dfsek/terra/registry/LootRegistry.java b/common/src/main/java/com/dfsek/terra/registry/LootRegistry.java new file mode 100644 index 000000000..a824c9d31 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/registry/LootRegistry.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.registry; + +import com.dfsek.terra.api.loot.LootTable; + +public class LootRegistry extends TerraRegistry { +}