diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java index e8d04a630..8f2046a69 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java @@ -34,10 +34,8 @@ public class BiomeConfigType implements ConfigType { public Supplier> registrySupplier(ConfigPack pack) { return () -> pack.getRegistryFactory().create(registry -> (TypeLoader) (t, c, loader) -> { if(c.equals("SELF")) return null; - TerraBiome obj = registry.get((String) c); - if(obj == null) - throw new LoadException("No such " + t.getType().getTypeName() + " matching \"" + c + "\" was found in this registry."); - return obj; + return registry.get((String) c).orElseThrow(() -> new LoadException( + "No such " + t.getType().getTypeName() + " matching \"" + c + "\" was found in this registry.")); }); } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/arg/BiomeArgumentParser.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/arg/BiomeArgumentParser.java index c00f60ee7..5d705a719 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/arg/BiomeArgumentParser.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/arg/BiomeArgumentParser.java @@ -22,6 +22,6 @@ public class BiomeArgumentParser implements ArgumentParser { @Override public TerraBiome parse(CommandSender sender, String arg) { Player player = (Player) sender; - return player.world().getConfig().getRegistry(TerraBiome.class).get(arg); + return player.world().getConfig().getRegistry(TerraBiome.class).get(arg).orElse(null); } } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java index bfdee2f22..ce7d61ab5 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java @@ -38,10 +38,8 @@ public class PaletteConfigType implements ConfigType { if(((String) c).startsWith("BLOCK:")) return new PaletteImpl.Singleton( platform.getWorldHandle().createBlockData(((String) c).substring(6))); // Return single palette for BLOCK: shortcut. - Palette obj = registry.get((String) c); - if(obj == null) - throw new LoadException("No such " + t.getType().getTypeName() + " matching \"" + c + "\" was found in this registry."); - return obj; + return registry.get((String) c).orElseThrow(() -> new LoadException( + "No such " + t.getType().getTypeName() + " matching \"" + c + "\" was found in this registry.")); }); } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/ScriptArgumentParser.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/ScriptArgumentParser.java index ca700ee60..e7756eb88 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/ScriptArgumentParser.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/ScriptArgumentParser.java @@ -21,6 +21,6 @@ public class ScriptArgumentParser implements ArgumentParser { @Override public Structure parse(CommandSender sender, String arg) { - return ((Player) sender).world().getConfig().getRegistry(Structure.class).get(arg); + return ((Player) sender).world().getConfig().getRegistry(Structure.class).get(arg).orElse(null); } } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/StructureArgumentParser.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/StructureArgumentParser.java index 33738a1d1..cce782a2f 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/StructureArgumentParser.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/StructureArgumentParser.java @@ -21,6 +21,6 @@ public class StructureArgumentParser implements ArgumentParser { private final Registry registry; @@ -61,16 +60,12 @@ public class LootFunction implements Function { RotationUtil.rotateVector(xz, arguments.getRotation()); String id = data.apply(implementationArguments, variableMap); - LootTable table = registry.get(id); - - if(table == null) { - LOGGER.error("No such loot table {}", id); - return null; - } - - arguments.getBuffer().addItem(new BufferedLootApplication(table, platform, script), - new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), - FastMath.roundToInt(xz.getZ()))); + registry.get(id).ifPresentOrElse(table -> arguments.getBuffer().addItem(new BufferedLootApplication(table, platform, script), + new Vector3(FastMath.roundToInt(xz.getX()), + y.apply(implementationArguments, variableMap) + .intValue(), + FastMath.roundToInt(xz.getZ()))), + () -> LOGGER.error("No such loot table {}", id)); return null; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java index b42267b2d..f816c541a 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java @@ -70,26 +70,25 @@ public class StructureFunction implements Function { RotationUtil.rotateVector(xz, arguments.getRotation()); String app = id.apply(implementationArguments, variableMap); - Structure script = registry.get(app); - if(script == null) { - LOGGER.warn("No such structure {}", app); - return null; - } - - Rotation rotation1; - String rotString = rotations.get(arguments.getRandom().nextInt(rotations.size())).apply(implementationArguments, variableMap); - try { - rotation1 = Rotation.valueOf(rotString); - } catch(IllegalArgumentException e) { - LOGGER.warn("Invalid rotation {}", rotString); - return null; - } - - Vector3 offset = new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), - FastMath.roundToInt(xz.getZ())); - - return script.generate(new IntermediateBuffer(arguments.getBuffer(), offset), arguments.getWorld(), arguments.getRandom(), - arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1); + return registry.get(app).map(script -> { + Rotation rotation1; + String rotString = rotations.get(arguments.getRandom().nextInt(rotations.size())).apply(implementationArguments, variableMap); + try { + rotation1 = Rotation.valueOf(rotString); + } catch(IllegalArgumentException e) { + LOGGER.warn("Invalid rotation {}", rotString); + return null; + } + + Vector3 offset = new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), + FastMath.roundToInt(xz.getZ())); + + return script.generate(new IntermediateBuffer(arguments.getBuffer(), offset), arguments.getWorld(), arguments.getRandom(), + arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1); + }).orElseGet(() -> { + LOGGER.error("No such structure {}", app); + return false; + }); } @Override diff --git a/common/api/registry/src/main/java/com/dfsek/terra/api/registry/Registry.java b/common/api/registry/src/main/java/com/dfsek/terra/api/registry/Registry.java index 8a34b9aab..9319fc58f 100644 --- a/common/api/registry/src/main/java/com/dfsek/terra/api/registry/Registry.java +++ b/common/api/registry/src/main/java/com/dfsek/terra/api/registry/Registry.java @@ -15,6 +15,7 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import java.util.Collection; +import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -28,9 +29,8 @@ public interface Registry extends TypeLoader { * * @return Value matching the identifier, {@code null} if no value is present. */ - @NotNull @Contract(pure = true) - T get(@NotNull String identifier) throws NoSuchEntryException; + Optional get(@NotNull String identifier); /** * Check if the registry contains a value. diff --git a/common/api/registry/src/main/java/com/dfsek/terra/api/registry/exception/NoSuchEntryException.java b/common/api/registry/src/main/java/com/dfsek/terra/api/registry/exception/NoSuchEntryException.java index ba0e627ff..ce39576c3 100644 --- a/common/api/registry/src/main/java/com/dfsek/terra/api/registry/exception/NoSuchEntryException.java +++ b/common/api/registry/src/main/java/com/dfsek/terra/api/registry/exception/NoSuchEntryException.java @@ -5,7 +5,4 @@ public class NoSuchEntryException extends RuntimeException { super(message); } - public NoSuchEntryException(String message, Throwable cause) { - super(message, cause); - } } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java index fca427665..47b4b337c 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java @@ -43,12 +43,11 @@ public class GenericTemplateSupplierLoader implements TypeLoader { public T load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException { Map map = (Map) c; try { - if(!registry.contains((String) map.get("type"))) { - throw new LoadException("No such entry: " + map.get("type")); - } - ObjectTemplate template = registry.get(((String) map.get("type"))).get(); - loader.load(template, new MapConfiguration(map)); - return template.get(); + return loader + .load(registry + .get(((String) map.get("type"))) + .orElseThrow(() -> new LoadException("No such entry: " + map.get("type"))) + .get(), new MapConfiguration(map)).get(); } catch(ConfigException e) { throw new LoadException("Unable to load object: ", e); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java index d172bfcac..250244154 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java @@ -22,6 +22,7 @@ import com.dfsek.tectonic.loading.ConfigLoader; import java.lang.reflect.AnnotatedType; import java.util.Collection; +import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -50,7 +51,7 @@ public class CheckedRegistryImpl implements CheckedRegistry { } @Override - public @NotNull T get(@NotNull String identifier) { + public Optional get(@NotNull String identifier) { return registry.get(identifier); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java index eb0751ecb..045e6a803 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java @@ -22,6 +22,7 @@ import com.dfsek.tectonic.loading.ConfigLoader; import java.lang.reflect.AnnotatedType; import java.util.Collection; +import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -44,7 +45,7 @@ public class LockedRegistryImpl implements Registry { } @Override - public @NotNull T get(@NotNull String identifier) { + public Optional get(@NotNull String identifier) { return registry.get(identifier); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java index 59a0be1d7..c15a95a7e 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java @@ -19,11 +19,13 @@ package com.dfsek.terra.registry; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; +import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; import java.util.Collection; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; @@ -34,10 +36,6 @@ import java.util.stream.Collectors; import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.registry.exception.DuplicateEntryException; -import com.dfsek.terra.api.registry.exception.NoSuchEntryException; - -import org.jetbrains.annotations.NotNull; - /** * Registry implementation with read/write access. For internal use only. @@ -59,17 +57,12 @@ public class OpenRegistryImpl implements OpenRegistry { @Override public T load(AnnotatedType type, Object o, ConfigLoader configLoader) throws LoadException { - T obj; - try { - obj = get((String) o); - } catch(NoSuchEntryException e) { + return get((String) o).orElseThrow(() -> { String list = objects.keySet().stream().sorted().reduce("", (a, b) -> a + "\n - " + b); if(objects.isEmpty()) list = "[ ]"; - throw new LoadException("No such " + type.getType().getTypeName() + " matching \"" + o + - "\" was found in this registry. Registry contains items: " + list); - } - - return obj; + return new LoadException("No such " + type.getType().getTypeName() + " matching \"" + o + + "\" was found in this registry. Registry contains items: " + list); + }); } @Override @@ -101,12 +94,8 @@ public class OpenRegistryImpl implements OpenRegistry { @SuppressWarnings("unchecked") @Override - public @NotNull T get(@NotNull String identifier) { - T value = objects.getOrDefault(identifier, (Entry) NULL).getValue(); - if(value == null) { - throw new NoSuchEntryException("Entry " + identifier + " is not present in registry."); - } - return value; + public Optional get(@NotNull String identifier) { + return Optional.ofNullable(objects.getOrDefault(identifier, (Entry) NULL).getValue()); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java index 4e70d65e1..8d2079a02 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java @@ -72,7 +72,7 @@ public class PlatformImpl extends AbstractPlatform { worlds.forEach(world -> { FabricChunkGeneratorWrapper chunkGeneratorWrapper = ((FabricChunkGeneratorWrapper) world.getChunkManager().getChunkGenerator()); - chunkGeneratorWrapper.setPack(getConfigRegistry().get(chunkGeneratorWrapper.getPack().getID())); + chunkGeneratorWrapper.setPack(getConfigRegistry().get(chunkGeneratorWrapper.getPack().getID()).orElseThrow()); }); return succeed; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index e00cd4aa5..a872fa48f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -72,7 +72,13 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C config -> config.group( Codec.STRING.fieldOf("pack") .forGetter(ConfigPack::getID) - ).apply(config, config.stable(FabricEntryPoint.getPlatform().getConfigRegistry()::get))); + ).apply(config, config.stable(id -> FabricEntryPoint.getPlatform() + .getConfigRegistry() + .get(id) + .orElseThrow( + () -> new IllegalArgumentException( + "No such config pack " + + id))))); public static final Codec CODEC = RecordCodecBuilder.create( instance -> instance.group( diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java index 7b7b76420..e989df91e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java @@ -24,6 +24,7 @@ import net.minecraft.util.dynamic.RegistryLookupCodec; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeSource; +import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; import java.util.Objects; import java.util.stream.Collectors; @@ -34,16 +35,19 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.fabric.FabricEntryPoint; import com.dfsek.terra.fabric.util.FabricUtil; -import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; - public class TerraBiomeSource extends BiomeSource { public static final Codec PACK_CODEC = (RecordCodecBuilder.create(config -> config.group( Codec.STRING.fieldOf("pack").forGetter(ConfigPack::getID) ) .apply(config, config.stable( - FabricEntryPoint.getPlatform() - .getConfigRegistry()::get)))); + id -> FabricEntryPoint.getPlatform() + .getConfigRegistry() + .get(id) + .orElseThrow( + () -> new IllegalArgumentException( + "No such config pack " + + id)))))); public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( RegistryLookupCodec.of(Registry.BIOME_KEY).forGetter(source -> source.biomeRegistry), Codec.LONG.fieldOf("seed").stable().forGetter(source -> source.seed), diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java index 90ef6156b..7d7033553 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java @@ -78,10 +78,10 @@ public abstract class GeneratorOptionsMixin { l, false); prop = prop.substring(prop.indexOf(":") + 1); - - ConfigPack config = main.getConfigRegistry().get(prop); - - if(config == null) throw new IllegalArgumentException("No such pack " + prop); + + String finalProp = prop; + ConfigPack config = main.getConfigRegistry().get(prop).orElseThrow(() -> new IllegalArgumentException( + "No such pack " + finalProp)); main.getEventManager().callEvent(new BiomeRegistrationEvent(registryManager)); // register biomes