diff --git a/build.gradle.kts b/build.gradle.kts index 1e189b37b..b544506a5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ import com.dfsek.terra.getGitHash -val versionObj = Version("5", "1", "2", true) +val versionObj = Version("6", "0", "0", true) allprojects { version = versionObj diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt index bdcada325..4bab053e4 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt @@ -18,9 +18,7 @@ fun Project.configureDependencies() { dependencies { "testImplementation"("org.junit.jupiter:junit-jupiter-api:5.7.0") - "testImplementation"("org.yaml:snakeyaml:1.27") - "testImplementation"("com.googlecode.json-simple:json-simple:1.1.1") - "testRuntimeOnly"("org.junit.jupiter:junit-jupiter-engine:5.7.0") + "testImplementation"("org.junit.jupiter:junit-jupiter-engine:5.7.0") "compileOnly"("org.jetbrains:annotations:20.1.0") } } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt index aeb306888..c874d8820 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt @@ -62,8 +62,14 @@ fun Project.configureDistribution() { archiveClassifier.set("shaded") setVersion(project.version) relocate("org.apache.commons", "com.dfsek.terra.lib.commons") - relocate("parsii", "com.dfsek.terra.lib.parsii") relocate("net.jafama", "com.dfsek.terra.lib.jafama") + relocate("org.objectweb.asm", "com.dfsek.terra.lib.asm") + relocate("com.google.errorprone", "com.dfsek.terra.lib.google.errorprone") + relocate("com.google.j2objc", "com.dfsek.terra.lib.google.j2objc") + relocate("org.checkerframework", "com.dfsek.terra.lib.checkerframework") + relocate("org.javax.annotation", "com.dfsek.terra.lib.javax.annotation") + relocate("org.json", "com.dfsek.terra.lib.json") + relocate("org.yaml", "com.dfsek.terra.lib.yaml") minimize() } convention.getPlugin().archivesBaseName = project.name diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 5938324de..ef4e40978 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -14,13 +14,14 @@ dependencies { "shadedApi"("commons-io:commons-io:2.4") "shadedApi"("com.dfsek:Paralithic:0.3.2") - "shadedApi"("com.dfsek:Tectonic:1.2.3") + "shadedApi"("com.dfsek:Tectonic:1.3.1") "shadedApi"("net.jafama:jafama:2.3.2") "shadedApi"("org.yaml:snakeyaml:1.27") "shadedApi"("org.ow2.asm:asm:9.0") "shadedApi"("commons-io:commons-io:2.6") - "compileOnly"("com.googlecode.json-simple:json-simple:1.1") + "shadedApi"("com.googlecode.json-simple:json-simple:1.1.1") + "shadedApi"("org.yaml:snakeyaml:1.27") "compileOnly"("com.google.guava:guava:30.0-jre") diff --git a/common/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java b/common/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java index 9934c767b..85323611b 100644 --- a/common/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java +++ b/common/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java @@ -6,6 +6,7 @@ import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.registry.exception.DuplicateEntryException; import java.lang.reflect.Type; +import java.util.Collection; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -68,7 +69,7 @@ public class CheckedRegistry implements Registry { } @Override - public Set entries() { + public Collection entries() { return registry.entries(); } diff --git a/common/src/main/java/com/dfsek/terra/api/registry/LockedRegistry.java b/common/src/main/java/com/dfsek/terra/api/registry/LockedRegistry.java index 227656c4d..8889998b6 100644 --- a/common/src/main/java/com/dfsek/terra/api/registry/LockedRegistry.java +++ b/common/src/main/java/com/dfsek/terra/api/registry/LockedRegistry.java @@ -4,6 +4,7 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import java.lang.reflect.Type; +import java.util.Collection; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -41,7 +42,7 @@ public class LockedRegistry implements Registry { } @Override - public Set entries() { + public Collection entries() { return registry.entries(); } diff --git a/common/src/main/java/com/dfsek/terra/api/registry/Registry.java b/common/src/main/java/com/dfsek/terra/api/registry/Registry.java index 773d784ca..0976697e3 100644 --- a/common/src/main/java/com/dfsek/terra/api/registry/Registry.java +++ b/common/src/main/java/com/dfsek/terra/api/registry/Registry.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api.registry; import com.dfsek.tectonic.loading.TypeLoader; +import java.util.Collection; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -42,7 +43,7 @@ public interface Registry extends TypeLoader { * * @return Set containing all entries. */ - Set entries(); + Collection entries(); /** * Get all the keys in this registry. diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 108b3b101..b4f9439a6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -3,10 +3,13 @@ package com.dfsek.terra.api.structures.script; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; 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.builders.BinaryNumberFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BiomeFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; @@ -29,9 +32,6 @@ 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.DirectBuffer; import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; -import com.dfsek.terra.registry.config.FunctionRegistry; -import com.dfsek.terra.registry.config.LootRegistry; -import com.dfsek.terra.registry.config.ScriptRegistry; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import net.jafama.FastMath; @@ -49,7 +49,7 @@ public class StructureScript { private final TerraPlugin main; private String tempID; - public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, LootRegistry lootRegistry, FunctionRegistry functionRegistry) throws ParseException { + public StructureScript(InputStream inputStream, TerraPlugin main, Registry registry, Registry lootRegistry, Registry> functionRegistry) throws ParseException { Parser parser; try { parser = new Parser(IOUtils.toString(inputStream)); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java index d5e46d9d3..b894743a7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java @@ -1,21 +1,22 @@ package com.dfsek.terra.api.structures.script.builders; import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.structures.loot.LootTable; 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.StructureScript; import com.dfsek.terra.api.structures.script.functions.LootFunction; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.registry.config.LootRegistry; import java.util.List; public class LootFunctionBuilder implements FunctionBuilder { private final TerraPlugin main; - private final LootRegistry registry; + private final Registry registry; private final StructureScript script; - public LootFunctionBuilder(TerraPlugin main, LootRegistry registry, StructureScript script) { + public LootFunctionBuilder(TerraPlugin main, Registry registry, StructureScript script) { this.main = main; this.registry = registry; this.script = script; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java index 2b0be8468..918fec245 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java @@ -1,21 +1,22 @@ package com.dfsek.terra.api.structures.script.builders; import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; 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.StructureScript; import com.dfsek.terra.api.structures.script.functions.StructureFunction; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.registry.config.ScriptRegistry; import java.util.List; import java.util.stream.Collectors; public class StructureFunctionBuilder implements FunctionBuilder { - private final ScriptRegistry registry; + private final Registry registry; private final TerraPlugin main; - public StructureFunctionBuilder(ScriptRegistry registry, TerraPlugin main) { + public StructureFunctionBuilder(Registry registry, TerraPlugin main) { this.registry = registry; this.main = main; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java index 42add8070..ddbc064cd 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java @@ -3,6 +3,7 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; @@ -13,20 +14,19 @@ import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.structure.buffer.items.BufferedLootApplication; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.registry.config.LootRegistry; import net.jafama.FastMath; import java.util.Map; public class LootFunction implements Function { - private final LootRegistry registry; + private final Registry registry; private final Returnable data; private final Returnable x, y, z; private final Position position; private final TerraPlugin main; private final StructureScript script; - public LootFunction(LootRegistry registry, Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position, StructureScript script) { + public LootFunction(Registry registry, Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position, StructureScript script) { this.registry = registry; this.position = position; this.data = data; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index 7b9b38830..c0378d60e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -3,6 +3,7 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; @@ -13,21 +14,20 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.structure.buffer.IntermediateBuffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.registry.config.ScriptRegistry; import net.jafama.FastMath; import java.util.List; import java.util.Map; public class StructureFunction implements Function { - private final ScriptRegistry registry; + private final Registry registry; private final Returnable id; private final Returnable x, y, z; private final Position position; private final TerraPlugin main; private final List> rotations; - public StructureFunction(Returnable x, Returnable y, Returnable z, Returnable id, List> rotations, ScriptRegistry registry, Position position, TerraPlugin main) { + public StructureFunction(Returnable x, Returnable y, Returnable z, Returnable id, List> rotations, Registry registry, Position position, TerraPlugin main) { this.registry = registry; this.id = id; this.position = position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index 2fb3e4e1f..4f21273ee 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -15,6 +15,7 @@ public class Tokenizer { private final Lookahead reader; private final Stack brackets = new Stack<>(); private Token current; + private Token last; public Tokenizer(String data) throws ParseException { reader = new Lookahead(new StringReader(data + '\0')); @@ -28,7 +29,7 @@ public class Tokenizer { * @throws ParseException If token does not exist */ public Token get() throws ParseException { - if(!hasNext()) throw new ParseException("Unexpected end of input", current.getPosition()); + if(!hasNext()) throw new ParseException("Unexpected end of input", last.getPosition()); return current; } @@ -39,7 +40,7 @@ public class Tokenizer { * @throws ParseException If token does not exist */ public Token consume() throws ParseException { - if(!hasNext()) throw new ParseException("Unexpected end of input", current.getPosition()); + if(!hasNext()) throw new ParseException("Unexpected end of input", last.getPosition()); Token temp = current; current = fetchCheck(); return temp; @@ -57,8 +58,9 @@ public class Tokenizer { private Token fetchCheck() throws ParseException { Token fetch = fetch(); if(fetch != null) { - if(fetch.getType().equals(Token.Type.BLOCK_BEGIN)) brackets.push(fetch); // Opening bracket - else if(fetch.getType().equals(Token.Type.BLOCK_END)) { + last = fetch; + if(fetch.getType() == Token.Type.BLOCK_BEGIN) brackets.push(fetch); // Opening bracket + else if(fetch.getType() == Token.Type.BLOCK_END) { if(!brackets.isEmpty()) brackets.pop(); else throw new ParseException("Dangling opening brace", new Position(0, 0)); } diff --git a/common/src/main/java/com/dfsek/terra/api/util/generic/pair/ImmutablePair.java b/common/src/main/java/com/dfsek/terra/api/util/generic/pair/ImmutablePair.java index f58cbb52b..0ca0c0ad3 100644 --- a/common/src/main/java/com/dfsek/terra/api/util/generic/pair/ImmutablePair.java +++ b/common/src/main/java/com/dfsek/terra/api/util/generic/pair/ImmutablePair.java @@ -1,10 +1,12 @@ package com.dfsek.terra.api.util.generic.pair; -public class ImmutablePair { +public final class ImmutablePair { private final L left; private final R right; - public ImmutablePair(L left, R right) { + private static final ImmutablePair NULL = new ImmutablePair<>(null, null); + + private ImmutablePair(L left, R right) { this.left = left; this.right = right; } @@ -21,7 +23,12 @@ public class ImmutablePair { return left; } + @SuppressWarnings("unchecked") + public static ImmutablePair ofNull() { + return (ImmutablePair) NULL; + } + public Pair mutable() { - return new Pair<>(left, right); + return Pair.of(left, right); } } diff --git a/common/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java b/common/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java index dcb0be070..5ec1ede8f 100644 --- a/common/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java +++ b/common/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java @@ -4,7 +4,7 @@ public class Pair { private L left; private R right; - public Pair(L left, R right) { + private Pair(L left, R right) { this.left = left; this.right = right; } @@ -30,6 +30,6 @@ public class Pair { } public ImmutablePair immutable() { - return new ImmutablePair<>(left, right); + return ImmutablePair.of(left, right); } } diff --git a/common/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java b/common/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java new file mode 100644 index 000000000..90b04c3f1 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.api.util.seeded; + +import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.function.Supplier; + +@FunctionalInterface +public interface NoiseProvider extends Supplier> { +} diff --git a/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java b/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java index 69edf202e..491341ad9 100644 --- a/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java @@ -1,14 +1,13 @@ package com.dfsek.terra.api.util.world; import com.dfsek.terra.api.math.MathUtil; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.world.generation.math.samplers.Sampler; public final class PaletteUtil { - public static Palette getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) { + public static Palette getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) { PaletteHolder slant = c.getSlantPalette(); if(slant != null && MathUtil.derivative(sampler, x, y, z) > c.getSlantThreshold()) { return slant.getPalette(y); diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java index 539437a71..a72243739 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.world.biome; import com.dfsek.terra.api.math.noise.NoiseSampler; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; public interface Generator { @@ -35,7 +34,7 @@ public interface Generator { * * @return BlocPalette - The biome's palette. */ - Palette getPalette(int y); + Palette getPalette(int y); NoiseSampler getBiomeNoise(); diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/NoisePalette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/NoisePalette.java index 3af3d383b..f8d3b20a6 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/NoisePalette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/NoisePalette.java @@ -1,10 +1,11 @@ package com.dfsek.terra.api.world.palette; import com.dfsek.terra.api.math.noise.NoiseSampler; +import com.dfsek.terra.api.platform.block.BlockData; import java.util.List; -public class NoisePalette extends Palette { +public class NoisePalette extends Palette { private final NoiseSampler sampler; private final boolean is2D; @@ -14,11 +15,11 @@ public class NoisePalette extends Palette { } @Override - public E get(int layer, double x, double y, double z) { - PaletteLayer paletteLayer; + public BlockData get(int layer, double x, double y, double z) { + PaletteLayer paletteLayer; if(layer > this.getSize()) paletteLayer = this.getLayers().get(this.getLayers().size() - 1); else { - List> pl = getLayers(); + List pl = getLayers(); if(layer >= pl.size()) paletteLayer = pl.get(pl.size() - 1); else paletteLayer = pl.get(layer); } diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java index 881cd406c..fb367c191 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.world.palette; import com.dfsek.terra.api.math.noise.NoiseSampler; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.util.collections.ProbabilityCollection; @@ -11,8 +12,8 @@ import java.util.Random; * A class representation of a "slice" of the world. * Used to get a section of blocks, based on the depth at which they are found. */ -public abstract class Palette { - private final List> pallet = new GlueList<>(); +public abstract class Palette { + private final List pallet = new GlueList<>(); /** * Constructs a blank palette. @@ -21,16 +22,16 @@ public abstract class Palette { } - public com.dfsek.terra.api.world.palette.Palette add(E m, int layers, NoiseSampler sampler) { + public com.dfsek.terra.api.world.palette.Palette add(BlockData m, int layers, NoiseSampler sampler) { for(int i = 0; i < layers; i++) { - pallet.add(new PaletteLayer<>(m, sampler)); + pallet.add(new PaletteLayer(m, sampler)); } return this; } - public com.dfsek.terra.api.world.palette.Palette add(ProbabilityCollection m, int layers, NoiseSampler sampler) { + public com.dfsek.terra.api.world.palette.Palette add(ProbabilityCollection m, int layers, NoiseSampler sampler) { for(int i = 0; i < layers; i++) { - pallet.add(new PaletteLayer<>(m, sampler)); + pallet.add(new PaletteLayer(m, sampler)); } return this; } @@ -41,25 +42,25 @@ public abstract class Palette { * @param layer - The layer at which to fetch the material. * @return BlockData - The material fetched. */ - public abstract E get(int layer, double x, double y, double z); + public abstract BlockData get(int layer, double x, double y, double z); public int getSize() { return pallet.size(); } - public List> getLayers() { + public List getLayers() { return pallet; } /** * Class representation of a layer of a BlockPalette. */ - public static class PaletteLayer { + public static class PaletteLayer { private final boolean col; // Is layer using a collection? - private ProbabilityCollection collection; + private ProbabilityCollection collection; private final NoiseSampler sampler; - private E m; + private BlockData m; /** * Constructs a PaletteLayerHolder with a ProbabilityCollection of materials and a number of layers. @@ -67,7 +68,7 @@ public abstract class Palette { * @param type The collection of materials to choose from. * @param sampler Noise sampler to use */ - public PaletteLayer(ProbabilityCollection type, NoiseSampler sampler) { + public PaletteLayer(ProbabilityCollection type, NoiseSampler sampler) { this.sampler = sampler; this.col = true; this.collection = type; @@ -79,7 +80,7 @@ public abstract class Palette { * @param type The material to use. * @param sampler Noise sampler to use */ - public PaletteLayer(E type, NoiseSampler sampler) { + public PaletteLayer(BlockData type, NoiseSampler sampler) { this.sampler = sampler; this.col = false; this.m = type; @@ -94,18 +95,18 @@ public abstract class Palette { * * @return Material - the material.. */ - public E get(Random random) { + public BlockData get(Random random) { if(col) return this.collection.get(random); return m; } - public E get(NoiseSampler random, double x, double y, double z, boolean is2D) { + public BlockData get(NoiseSampler random, double x, double y, double z, boolean is2D) { if(col && is2D) return this.collection.get(random, x, z); else if(col) return this.collection.get(random, x, y, z); return m; } - public ProbabilityCollection getCollection() { + public ProbabilityCollection getCollection() { return collection; } } diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/SinglePalette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/SinglePalette.java index 06b075a2b..7b2db1fe2 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/SinglePalette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/SinglePalette.java @@ -1,14 +1,16 @@ package com.dfsek.terra.api.world.palette; -public class SinglePalette extends Palette { - private final E item; +import com.dfsek.terra.api.platform.block.BlockData; - public SinglePalette(E item) { +public class SinglePalette extends Palette { + private final BlockData item; + + public SinglePalette(BlockData item) { this.item = item; } @Override - public E get(int layer, double x, double y, double z) { + public BlockData get(int layer, double x, double y, double z) { return item; } } diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolder.java b/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolder.java index 2b4704cac..743bbba14 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolder.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolder.java @@ -1,16 +1,15 @@ package com.dfsek.terra.api.world.palette.holder; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; public class PaletteHolder { - private final Palette[] palettes; + private final Palette[] palettes; - protected PaletteHolder(Palette[] palettes) { + protected PaletteHolder(Palette[] palettes) { this.palettes = palettes; } - public Palette getPalette(int y) { + public Palette getPalette(int y) { return palettes[y]; } } diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolderBuilder.java b/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolderBuilder.java index 2cc72764b..451567113 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolderBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolderBuilder.java @@ -1,6 +1,5 @@ package com.dfsek.terra.api.world.palette.holder; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import net.jafama.FastMath; @@ -8,19 +7,19 @@ import java.util.Map; import java.util.TreeMap; public class PaletteHolderBuilder { - private final TreeMap> paletteMap = new TreeMap<>(); + private final TreeMap paletteMap = new TreeMap<>(); - public PaletteHolderBuilder add(int y, Palette palette) { + public PaletteHolderBuilder add(int y, Palette palette) { paletteMap.put(y, palette); return this; } @SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"}) public PaletteHolder build() { - Palette[] palettes = new Palette[paletteMap.lastKey() + 1]; + Palette[] palettes = new Palette[paletteMap.lastKey() + 1]; for(int y = 0; y <= FastMath.max(paletteMap.lastKey(), 255); y++) { - Palette d = null; - for(Map.Entry> e : paletteMap.entrySet()) { + Palette d = null; + for(Map.Entry e : paletteMap.entrySet()) { if(e.getKey() >= y) { d = e.getValue(); break; diff --git a/common/src/main/java/com/dfsek/terra/commands/biome/arg/BiomeArgumentParser.java b/common/src/main/java/com/dfsek/terra/commands/biome/arg/BiomeArgumentParser.java index 251036d39..7931b30be 100644 --- a/common/src/main/java/com/dfsek/terra/commands/biome/arg/BiomeArgumentParser.java +++ b/common/src/main/java/com/dfsek/terra/commands/biome/arg/BiomeArgumentParser.java @@ -14,6 +14,6 @@ public class BiomeArgumentParser implements ArgumentParser { @Override public TerraBiome parse(CommandSender sender, String arg) { Player player = (Player) sender; - return main.getWorld(player.getWorld()).getConfig().getBiomeRegistry().get(arg); + return main.getWorld(player.getWorld()).getConfig().getRegistry(TerraBiome.class).get(arg); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/biome/tab/BiomeTabCompleter.java b/common/src/main/java/com/dfsek/terra/commands/biome/tab/BiomeTabCompleter.java index f2461c532..4476e3613 100644 --- a/common/src/main/java/com/dfsek/terra/commands/biome/tab/BiomeTabCompleter.java +++ b/common/src/main/java/com/dfsek/terra/commands/biome/tab/BiomeTabCompleter.java @@ -17,6 +17,6 @@ public class BiomeTabCompleter implements TabCompleter { @Override public List complete(CommandSender sender) { Player player = (Player) sender; - return main.getWorld(player.getWorld()).getConfig().getBiomeRegistry().entries().stream().map(TerraBiome::getID).collect(Collectors.toList()); + return main.getWorld(player.getWorld()).getConfig().getRegistry(TerraBiome.class).entries().stream().map(TerraBiome::getID).collect(Collectors.toList()); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/structure/argument/ScriptArgumentParser.java b/common/src/main/java/com/dfsek/terra/commands/structure/argument/ScriptArgumentParser.java index 3797c08cd..f7d23dee8 100644 --- a/common/src/main/java/com/dfsek/terra/commands/structure/argument/ScriptArgumentParser.java +++ b/common/src/main/java/com/dfsek/terra/commands/structure/argument/ScriptArgumentParser.java @@ -13,6 +13,6 @@ public class ScriptArgumentParser implements ArgumentParser { @Override public StructureScript parse(CommandSender sender, String arg) { - return main.getWorld(((Player) sender).getWorld()).getConfig().getScriptRegistry().get(arg); + return main.getWorld(((Player) sender).getWorld()).getConfig().getRegistry(StructureScript.class).get(arg); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/structure/argument/StructureArgumentParser.java b/common/src/main/java/com/dfsek/terra/commands/structure/argument/StructureArgumentParser.java index dce50ac65..cf8b3378f 100644 --- a/common/src/main/java/com/dfsek/terra/commands/structure/argument/StructureArgumentParser.java +++ b/common/src/main/java/com/dfsek/terra/commands/structure/argument/StructureArgumentParser.java @@ -13,6 +13,6 @@ public class StructureArgumentParser implements ArgumentParser { @Override public TerraStructure parse(CommandSender sender, String arg) { - return main.getWorld(((Player) sender).getWorld()).getConfig().getStructureRegistry().get(arg); + return main.getWorld(((Player) sender).getWorld()).getConfig().getRegistry(TerraStructure.class).get(arg); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/structure/completer/ScriptCompleter.java b/common/src/main/java/com/dfsek/terra/commands/structure/completer/ScriptCompleter.java index 24f927baa..81e6eba02 100644 --- a/common/src/main/java/com/dfsek/terra/commands/structure/completer/ScriptCompleter.java +++ b/common/src/main/java/com/dfsek/terra/commands/structure/completer/ScriptCompleter.java @@ -16,6 +16,6 @@ public class ScriptCompleter implements TabCompleter { @Override public List complete(CommandSender sender) { - return main.getWorld(((Player) sender).getWorld()).getConfig().getScriptRegistry().entries().stream().map(StructureScript::getId).collect(Collectors.toList()); + return main.getWorld(((Player) sender).getWorld()).getConfig().getRegistry(StructureScript.class).entries().stream().map(StructureScript::getId).collect(Collectors.toList()); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/structure/completer/StructureCompleter.java b/common/src/main/java/com/dfsek/terra/commands/structure/completer/StructureCompleter.java index a2b5b1dad..cebfa20ab 100644 --- a/common/src/main/java/com/dfsek/terra/commands/structure/completer/StructureCompleter.java +++ b/common/src/main/java/com/dfsek/terra/commands/structure/completer/StructureCompleter.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.command.tab.TabCompleter; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.platform.CommandSender; import com.dfsek.terra.api.platform.entity.Player; +import com.dfsek.terra.world.population.items.TerraStructure; import java.util.ArrayList; import java.util.List; @@ -16,6 +17,6 @@ public class StructureCompleter implements TabCompleter { @Override public List complete(CommandSender sender) { Player player = (Player) sender; - return new ArrayList<>(main.getWorld(player.getWorld()).getConfig().getStructureRegistry().keys()); + return new ArrayList<>(main.getWorld(player.getWorld()).getConfig().getRegistry(TerraStructure.class).keys()); } } diff --git a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java index 279dbf3e4..78c2c288a 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java @@ -2,7 +2,6 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.NoisePalette; import com.dfsek.terra.api.world.palette.Palette; @@ -13,7 +12,7 @@ import com.dfsek.terra.world.population.items.flora.TerraFlora; public class FloraFactory implements ConfigFactory { @Override public TerraFlora build(FloraTemplate config, TerraPlugin main) { - Palette palette = new NoisePalette<>(new WhiteNoiseSampler(2403), false); + Palette palette = new NoisePalette(new WhiteNoiseSampler(2403), false); for(PaletteLayerHolder layer : config.getFloraPalette()) { palette.add(layer.getLayer(), layer.getSize(), layer.getSampler()); } diff --git a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java index d4983c076..e4d9fbeda 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java @@ -1,16 +1,15 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.NoisePalette; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder; import com.dfsek.terra.config.templates.PaletteTemplate; -public class PaletteFactory implements ConfigFactory> { +public class PaletteFactory implements ConfigFactory { @Override - public Palette build(PaletteTemplate config, TerraPlugin main) { - NoisePalette palette = new NoisePalette<>(config.getNoise().apply(2403L), config.getNoise().getDimensions() == 2); + public Palette build(PaletteTemplate config, TerraPlugin main) { + NoisePalette palette = new NoisePalette(config.getNoise().apply(2403L), config.getNoise().getDimensions() == 2); for(PaletteLayerHolder layer : config.getPalette()) { palette.add(layer.getLayer(), layer.getSize(), layer.getSampler()); } diff --git a/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java b/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java index d10449a37..8c94af81a 100644 --- a/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java @@ -30,7 +30,7 @@ public class ZIPLoader extends Loader { ZipEntry entry = entries.nextElement(); if(!entry.isDirectory() && entry.getName().startsWith(directory) && entry.getName().endsWith(extension)) { try { - String rel = entry.getName().substring(directory.length() + 1); + String rel = entry.getName().substring(directory.length()); streams.put(rel, file.getInputStream(entry)); } catch(IOException e) { e.printStackTrace(); diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/Types.java b/common/src/main/java/com/dfsek/terra/config/loaders/Types.java index 46c4f0978..595728d60 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/Types.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/Types.java @@ -5,7 +5,6 @@ import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.util.collections.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.flora.Flora; -import com.dfsek.terra.api.world.palette.Palette; import java.lang.reflect.Type; import java.util.Map; @@ -15,7 +14,6 @@ import java.util.Map; */ @SuppressWarnings("unused") public final class Types { - public static final Type BLOCK_DATA_PALETTE_TYPE; public static final Type BLOCK_DATA_PROBABILITY_COLLECTION_TYPE; public static final Type FLORA_PROBABILITY_COLLECTION_TYPE; public static final Type TREE_PROBABILITY_COLLECTION_TYPE; @@ -23,7 +21,6 @@ public final class Types { public static final Type TERRA_BIOME_TERRA_BIOME_PROBABILITY_COLLECTION_MAP; static { - BLOCK_DATA_PALETTE_TYPE = getType("blockDataPalette"); BLOCK_DATA_PROBABILITY_COLLECTION_TYPE = getType("blockDataProbabilityCollection"); FLORA_PROBABILITY_COLLECTION_TYPE = getType("floraProbabilityCollection"); TREE_PROBABILITY_COLLECTION_TYPE = getType("treeProbabilityCollection"); @@ -31,7 +28,6 @@ public final class Types { TERRA_BIOME_TERRA_BIOME_PROBABILITY_COLLECTION_MAP = getType("terraBiomeProbabilityCollectionMap"); } - private Palette blockDataPalette; private ProbabilityCollection blockDataProbabilityCollection; private ProbabilityCollection floraProbabilityCollection; private ProbabilityCollection treeProbabilityCollection; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java index 65ebf9d38..919ace8f7 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java @@ -6,8 +6,9 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.util.seeded.NoiseProvider; import com.dfsek.terra.api.util.seeded.NoiseSeeded; -import com.dfsek.terra.registry.config.NoiseRegistry; import java.lang.reflect.Type; import java.util.Locale; @@ -15,9 +16,9 @@ import java.util.Map; @SuppressWarnings("unchecked") public class NoiseSamplerBuilderLoader implements TypeLoader { - private final NoiseRegistry noiseRegistry; + private final Registry noiseRegistry; - public NoiseSamplerBuilderLoader(NoiseRegistry noiseRegistry) { + public NoiseSamplerBuilderLoader(Registry noiseRegistry) { this.noiseRegistry = noiseRegistry; } diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java index a0e7929e0..7dc94a21b 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java @@ -3,11 +3,9 @@ package com.dfsek.terra.config.loaders.palette; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.api.world.palette.holder.PaletteHolderBuilder; -import com.dfsek.terra.config.loaders.Types; import java.lang.reflect.Type; import java.util.List; @@ -21,7 +19,7 @@ public class PaletteHolderLoader implements TypeLoader { PaletteHolderBuilder builder = new PaletteHolderBuilder(); for(Map layer : palette) { for(Map.Entry entry : layer.entrySet()) { - builder.add(entry.getValue(), (Palette) configLoader.loadType(Types.BLOCK_DATA_PALETTE_TYPE, entry.getKey())); + builder.add(entry.getValue(), (Palette) configLoader.loadType(Palette.class, entry.getKey())); } } return builder.build(); diff --git a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java index a0f2c8bfe..07ea5b52a 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java @@ -2,36 +2,27 @@ package com.dfsek.terra.config.pack; import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.tectonic.abstraction.AbstractConfigLoader; +import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.tectonic.config.Configuration; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeRegistry; -import com.dfsek.tectonic.loading.object.ObjectTemplate; import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.event.events.config.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; -import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.script.StructureScript; +import com.dfsek.terra.api.util.generic.pair.ImmutablePair; +import com.dfsek.terra.api.util.seeded.NoiseProvider; import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; -import com.dfsek.terra.api.world.flora.Flora; -import com.dfsek.terra.api.world.palette.Palette; -import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.builder.BiomeBuilder; import com.dfsek.terra.config.dummy.DummyWorld; -import com.dfsek.terra.config.factories.BiomeFactory; -import com.dfsek.terra.config.factories.CarverFactory; -import com.dfsek.terra.config.factories.ConfigFactory; -import com.dfsek.terra.config.factories.FloraFactory; -import com.dfsek.terra.config.factories.OreFactory; -import com.dfsek.terra.config.factories.PaletteFactory; -import com.dfsek.terra.config.factories.StructureFactory; -import com.dfsek.terra.config.factories.TreeFactory; import com.dfsek.terra.config.fileloaders.FolderLoader; import com.dfsek.terra.config.fileloaders.Loader; import com.dfsek.terra.config.fileloaders.ZIPLoader; @@ -41,29 +32,16 @@ import com.dfsek.terra.config.loaders.config.biome.templates.provider.ImageProvi import com.dfsek.terra.config.loaders.config.biome.templates.provider.SingleBiomeProviderTemplate; import com.dfsek.terra.config.loaders.config.sampler.NoiseSamplerBuilderLoader; import com.dfsek.terra.config.loaders.config.sampler.templates.ImageSamplerTemplate; -import com.dfsek.terra.config.templates.AbstractableTemplate; -import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.config.templates.CarverTemplate; -import com.dfsek.terra.config.templates.FloraTemplate; -import com.dfsek.terra.config.templates.OreTemplate; -import com.dfsek.terra.config.templates.PaletteTemplate; -import com.dfsek.terra.config.templates.StructureTemplate; -import com.dfsek.terra.config.templates.TreeTemplate; +import com.dfsek.terra.config.prototype.ConfigType; +import com.dfsek.terra.config.prototype.ProtoConfig; import com.dfsek.terra.registry.OpenRegistry; -import com.dfsek.terra.registry.config.BiomeRegistry; -import com.dfsek.terra.registry.config.CarverRegistry; -import com.dfsek.terra.registry.config.FloraRegistry; +import com.dfsek.terra.registry.config.ConfigTypeRegistry; import com.dfsek.terra.registry.config.FunctionRegistry; import com.dfsek.terra.registry.config.LootRegistry; import com.dfsek.terra.registry.config.NoiseRegistry; -import com.dfsek.terra.registry.config.OreRegistry; -import com.dfsek.terra.registry.config.PaletteRegistry; import com.dfsek.terra.registry.config.ScriptRegistry; -import com.dfsek.terra.registry.config.StructureRegistry; -import com.dfsek.terra.registry.config.TreeRegistry; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.population.items.TerraStructure; -import com.dfsek.terra.world.population.items.ores.Ore; import org.apache.commons.io.IOUtils; import org.json.simple.parser.ParseException; @@ -74,12 +52,14 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.function.Supplier; -import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -89,38 +69,27 @@ import java.util.zip.ZipFile; public class ConfigPack implements LoaderRegistrar { private final ConfigPackTemplate template = new ConfigPackTemplate(); - private final BiomeRegistry biomeRegistry = new BiomeRegistry(); - private final StructureRegistry structureRegistry = new StructureRegistry(); - private final PaletteRegistry paletteRegistry; - private final FloraRegistry floraRegistry; - private final OreRegistry oreRegistry = new OreRegistry(); - private final TreeRegistry treeRegistry; - private final ScriptRegistry scriptRegistry = new ScriptRegistry(); - private final LootRegistry lootRegistry = new LootRegistry(); - - private final CarverRegistry carverRegistry = new CarverRegistry(); - - private final NoiseRegistry noiseRegistry = new NoiseRegistry(); - private final FunctionRegistry functionRegistry = new FunctionRegistry(); - private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); private final ConfigLoader selfLoader = new ConfigLoader(); private final Scope varScope = new Scope(); - private final TerraPlugin main; private final Loader loader; - private final BiomeProvider.BiomeProviderBuilder biomeProviderBuilder; + private final ConfigTypeRegistry configTypeRegistry; + private final Map, ImmutablePair, CheckedRegistry>> registryMap = newRegistryMap(); + public ConfigPack(File folder, TerraPlugin main) throws ConfigException { try { + this.configTypeRegistry = new ConfigTypeRegistry(this, main, (id, configType) -> { + OpenRegistry openRegistry = configType.registrySupplier().get(); + registryMap.put(configType.getTypeClass(), ImmutablePair.of(openRegistry, new CheckedRegistry<>(openRegistry))); + }); this.loader = new FolderLoader(folder.toPath()); this.main = main; long l = System.nanoTime(); - floraRegistry = new FloraRegistry(main); - paletteRegistry = new PaletteRegistry(main); - treeRegistry = new TreeRegistry(); + register(abstractConfigLoader); register(selfLoader); @@ -139,6 +108,7 @@ public class ConfigPack implements LoaderRegistrar { selfLoader.load(packPostTemplate, new FileInputStream(pack)); biomeProviderBuilder = packPostTemplate.getProviderBuilder(); biomeProviderBuilder.build(0); // Build dummy provider to catch errors at load time. + checkDeadEntries(main); } catch(FileNotFoundException e) { throw new LoadException("No pack.yml file found in " + folder.getAbsolutePath(), e); } @@ -151,17 +121,16 @@ public class ConfigPack implements LoaderRegistrar { public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { try { + this.configTypeRegistry = new ConfigTypeRegistry(this, main, (id, configType) -> { + OpenRegistry openRegistry = configType.registrySupplier().get(); + registryMap.put(configType.getTypeClass(), ImmutablePair.of(openRegistry, new CheckedRegistry<>(openRegistry))); + }); this.loader = new ZIPLoader(file); this.main = main; long l = System.nanoTime(); - floraRegistry = new FloraRegistry(main); - paletteRegistry = new PaletteRegistry(main); - treeRegistry = new TreeRegistry(); - register(abstractConfigLoader); - register(selfLoader); + register(selfLoader); main.register(selfLoader); - main.register(abstractConfigLoader); try { ZipEntry pack = null; @@ -183,6 +152,7 @@ public class ConfigPack implements LoaderRegistrar { selfLoader.load(packPostTemplate, file.getInputStream(pack)); biomeProviderBuilder = packPostTemplate.getProviderBuilder(); biomeProviderBuilder.build(0); // Build dummy provider to catch errors at load time. + checkDeadEntries(main); } catch(IOException e) { throw new LoadException("Unable to load pack.yml from ZIP file", e); } @@ -194,10 +164,36 @@ public class ConfigPack implements LoaderRegistrar { toWorldConfig(new TerraWorld(new DummyWorld(), this, main)); // Build now to catch any errors immediately. } - public static void buildAll(ConfigFactory factory, OpenRegistry registry, List configTemplates, TerraPlugin main) throws LoadException { - for(C template : configTemplates) registry.add(template.getID(), factory.build(template, main)); + @SuppressWarnings({"unchecked", "rawtypes"}) + private Map, ImmutablePair, CheckedRegistry>> newRegistryMap() { + Map, ImmutablePair, CheckedRegistry>> map = new HashMap, ImmutablePair, CheckedRegistry>>() { + private static final long serialVersionUID = 4015855819914064466L; + + @Override + public ImmutablePair, CheckedRegistry> put(Class key, ImmutablePair, CheckedRegistry> value) { + selfLoader.registerLoader(key, value.getLeft()); + abstractConfigLoader.registerLoader(key, value.getLeft()); + return super.put(key, value); + } + }; + + putPair(map, NoiseProvider.class, new NoiseRegistry()); + putPair(map, FunctionBuilder.class, (OpenRegistry) (Object) new FunctionRegistry()); + putPair(map, LootTable.class, new LootRegistry()); + putPair(map, StructureScript.class, new ScriptRegistry()); + + return map; } + private void putPair(Map, ImmutablePair, CheckedRegistry>> map, Class key, OpenRegistry l) { + map.put(key, ImmutablePair.of(l, new CheckedRegistry<>(l))); + } + + private void checkDeadEntries(TerraPlugin main) { + registryMap.forEach((clazz, pair) -> pair.getLeft().getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in '" + clazz + "' registry: '" + id + "'"))); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) private void load(long start, TerraPlugin main) throws ConfigException { main.getEventManager().callEvent(new ConfigPackPreLoadEvent(this)); @@ -208,8 +204,8 @@ public class ConfigPack implements LoaderRegistrar { loader.open("structures/data", ".tesf").thenEntries(entries -> { for(Map.Entry entry : entries) { try(InputStream stream = entry.getValue()) { - StructureScript structureScript = new StructureScript(stream, main, scriptRegistry, lootRegistry, functionRegistry); - scriptRegistry.add(structureScript.getId(), structureScript); + StructureScript structureScript = new StructureScript(stream, main, getRegistry(StructureScript.class), getRegistry(LootTable.class), (Registry>) (Object) getRegistry(FunctionBuilder.class)); + getOpenRegistry(StructureScript.class).add(structureScript.getId(), structureScript); } catch(com.dfsek.terra.api.structures.parser.exceptions.ParseException | IOException e) { throw new LoadException("Unable to load script \"" + entry.getKey() + "\"", e); } @@ -217,36 +213,38 @@ public class ConfigPack implements LoaderRegistrar { }).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)); + getOpenRegistry(LootTable.class).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 table \"" + entry.getKey() + "\"", e); } } }).close(); - loader - .open("carving", ".yml").then(streams -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.load(streams, CarverTemplate::new), main)).close() - .open("palettes", ".yml").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close() - .open("ores", ".yml").then(streams -> buildAll(new OreFactory(), oreRegistry, abstractConfigLoader.load(streams, OreTemplate::new), main)).close() - .open("structures/trees", ".yml").then(streams -> buildAll(new TreeFactory(), treeRegistry, abstractConfigLoader.load(streams, TreeTemplate::new), main)).close() - .open("structures/structures", ".yml").then(streams -> buildAll(new StructureFactory(), structureRegistry, abstractConfigLoader.load(streams, StructureTemplate::new), main)).close() - .open("flora", ".yml").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close() - .open("biomes", ".yml").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this, main)), main)).close(); + List configurations = new ArrayList<>(); + + loader.open("", ".yml").thenEntries(entries -> entries.forEach(stream -> configurations.add(new Configuration(stream.getValue(), stream.getKey())))); + + Map, List> configs = new HashMap<>(); + + for(Configuration configuration : configurations) { + ProtoConfig config = new ProtoConfig(); + selfLoader.load(config, configuration); + configs.computeIfAbsent(config.getType(), configType -> new ArrayList<>()).add(configuration); + } + + for(ConfigType configType : configTypeRegistry.entries()) { + for(ConfigTemplate config : abstractConfigLoader.loadConfigs(configs.getOrDefault(configType, Collections.emptyList()), () -> configType.getTemplate(this, main))) { + ((ConfigType) configType).callback(this, main, config); + } + } main.getEventManager().callEvent(new ConfigPackPostLoadEvent(this)); main.logger().info("Loaded config pack \"" + template.getID() + "\" v" + template.getVersion() + " by " + template.getAuthor() + " in " + (System.nanoTime() - start) / 1000000D + "ms."); } - public TerraStructure getStructure(String id) { - return structureRegistry.get(id); - } public Set getStructures() { - return structureRegistry.entries(); - } - - public List getStructureIDs() { - return structureRegistry.entries().stream().map(terraStructure -> terraStructure.getTemplate().getID()).collect(Collectors.toList()); + return new HashSet<>(getRegistry(TerraStructure.class).entries()); } public ConfigPackTemplate getTemplate() { @@ -257,80 +255,45 @@ public class ConfigPack implements LoaderRegistrar { return varScope; } + @SuppressWarnings("unchecked") + public CheckedRegistry getRegistry(Class clazz) { + return (CheckedRegistry) registryMap.getOrDefault(clazz, ImmutablePair.ofNull()).getRight(); + } + + @SuppressWarnings("unchecked") + protected OpenRegistry getOpenRegistry(Class clazz) { + return (OpenRegistry) registryMap.getOrDefault(clazz, ImmutablePair.ofNull()).getLeft(); + } + @Override public void register(TypeRegistry registry) { registry - .registerLoader(Palette.class, paletteRegistry) - .registerLoader(BiomeBuilder.class, biomeRegistry) - .registerLoader(Flora.class, floraRegistry) - .registerLoader(Ore.class, oreRegistry) - .registerLoader(Tree.class, treeRegistry) - .registerLoader(StructureScript.class, scriptRegistry) - .registerLoader(TerraStructure.class, structureRegistry) - .registerLoader(LootTable.class, lootRegistry) - .registerLoader(UserDefinedCarver.class, carverRegistry) + .registerLoader(ConfigType.class, configTypeRegistry) .registerLoader(BufferedImage.class, new BufferedImageLoader(loader)) - .registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(noiseRegistry)) .registerLoader(SingleBiomeProviderTemplate.class, SingleBiomeProviderTemplate::new) .registerLoader(BiomePipelineTemplate.class, () -> new BiomePipelineTemplate(main)) - .registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(biomeRegistry)) - .registerLoader(ImageSamplerTemplate.class, () -> new ImageProviderTemplate(biomeRegistry)); - } - - public Set getCarvers() { - return carverRegistry.entries(); + .registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class))) + .registerLoader(ImageSamplerTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class))) + .registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(getOpenRegistry(NoiseProvider.class))); } public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() { return biomeProviderBuilder; } - public CheckedRegistry getScriptRegistry() { - return new CheckedRegistry<>(scriptRegistry); - } - public CheckedRegistry getBiomeRegistry() { - return new CheckedRegistry<>(biomeRegistry); - } - - public CheckedRegistry getTreeRegistry() { - return new CheckedRegistry<>(treeRegistry); - } - - public CheckedRegistry> getFunctionRegistry() { - return new CheckedRegistry<>(functionRegistry); - } - - public CheckedRegistry>> getNormalizerRegistry() { - return new CheckedRegistry<>(noiseRegistry); - } - - public CheckedRegistry getCarverRegistry() { - return new CheckedRegistry<>(carverRegistry); - } - - public CheckedRegistry getFloraRegistry() { - return new CheckedRegistry<>(floraRegistry); - } - - public CheckedRegistry getLootRegistry() { - return new CheckedRegistry<>(lootRegistry); - } - - public CheckedRegistry getOreRegistry() { - return new CheckedRegistry<>(oreRegistry); - } - - public CheckedRegistry> getPaletteRegistry() { - return new CheckedRegistry<>(paletteRegistry); - } - - public CheckedRegistry getStructureRegistry() { - return new CheckedRegistry<>(structureRegistry); - } - - public WorldConfig toWorldConfig(TerraWorld world){ + public WorldConfig toWorldConfig(TerraWorld world) { return new WorldConfig(world, this, main); } + + public CheckedRegistry> getConfigTypeRegistry() { + return new CheckedRegistry>(configTypeRegistry) { + @Override + @SuppressWarnings("deprecation") + public void addUnchecked(String identifier, ConfigType value) { + if(contains(identifier)) throw new UnsupportedOperationException("Cannot override values in ConfigTypeRegistry!"); + } + }; + } } diff --git a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java index 6ddc798ef..11f473efd 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java @@ -1,62 +1,51 @@ package com.dfsek.terra.config.pack; import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.registry.LockedRegistry; -import com.dfsek.terra.api.structures.loot.LootTable; -import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; -import com.dfsek.terra.api.world.flora.Flora; -import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.carving.UserDefinedCarver; +import com.dfsek.terra.config.builder.BiomeBuilder; import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.math.SamplerCache; import com.dfsek.terra.world.population.items.TerraStructure; -import com.dfsek.terra.world.population.items.ores.Ore; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; import java.util.Set; public class WorldConfig { - private final LockedRegistry scriptRegistry; - private final LockedRegistry biomeRegistry; private final SamplerCache samplerCache; - private final LockedRegistry carverRegistry; - private final LockedRegistry treeRegistry; - private final LockedRegistry floraRegistry; - private final LockedRegistry lootRegistry; - private final LockedRegistry oreRegistry; - private final LockedRegistry> paletteRegistry; - private final LockedRegistry structureRegistry; private final BiomeProvider provider; private final TerraWorld world; private final ConfigPack pack; + private final Map, LockedRegistry> registryMap = new HashMap<>(); + public WorldConfig(TerraWorld world, ConfigPack pack, TerraPlugin main) { this.world = world; this.pack = pack; this.samplerCache = new SamplerCache(main, world); - this.scriptRegistry = new LockedRegistry<>(pack.getScriptRegistry()); + + pack.getConfigTypeRegistry().forEach(configType -> registryMap.put(configType.getTypeClass(), new LockedRegistry<>(pack.getRegistry(configType.getTypeClass())))); + OpenRegistry biomeOpenRegistry = new OpenRegistry<>(); - pack.getBiomeRegistry().forEach((id, biome) -> biomeOpenRegistry.add(id, biome.apply(world.getWorld().getSeed()))); - - this.biomeRegistry = new LockedRegistry<>(biomeOpenRegistry); - this.carverRegistry = new LockedRegistry<>(pack.getCarverRegistry()); - this.treeRegistry = new LockedRegistry<>(pack.getTreeRegistry()); - this.floraRegistry = new LockedRegistry<>(pack.getFloraRegistry()); - this.lootRegistry = new LockedRegistry<>(pack.getLootRegistry()); - this.oreRegistry = new LockedRegistry<>(pack.getOreRegistry()); - this.paletteRegistry = new LockedRegistry<>(pack.getPaletteRegistry()); - this.structureRegistry = new LockedRegistry<>(pack.getStructureRegistry()); + pack.getRegistry(BiomeBuilder.class).forEach((id, biome) -> biomeOpenRegistry.add(id, biome.apply(world.getWorld().getSeed()))); + registryMap.put(TerraBiome.class, new LockedRegistry<>(biomeOpenRegistry)); this.provider = pack.getBiomeProviderBuilder().build(world.getWorld().getSeed()); } + @SuppressWarnings("unchecked") + public LockedRegistry getRegistry(Class clazz) { + return (LockedRegistry) registryMap.get(clazz); + } + public TerraWorld getWorld() { return world; } @@ -66,43 +55,7 @@ public class WorldConfig { } public Set getCarvers() { - return carverRegistry.entries(); - } - - public LockedRegistry getScriptRegistry() { - return scriptRegistry; - } - - public LockedRegistry getBiomeRegistry() { - return biomeRegistry; - } - - public LockedRegistry getTreeRegistry() { - return treeRegistry; - } - - public LockedRegistry getCarverRegistry() { - return carverRegistry; - } - - public LockedRegistry getFloraRegistry() { - return floraRegistry; - } - - public LockedRegistry getLootRegistry() { - return lootRegistry; - } - - public LockedRegistry getOreRegistry() { - return oreRegistry; - } - - public LockedRegistry> getPaletteRegistry() { - return paletteRegistry; - } - - public LockedRegistry getStructureRegistry() { - return structureRegistry; + return new HashSet<>(getRegistry(UserDefinedCarver.class).entries()); } public BiomeProvider getProvider() { @@ -110,7 +63,7 @@ public class WorldConfig { } public Set getStructures() { - return structureRegistry.entries(); + return new HashSet<>(getRegistry(TerraStructure.class).entries()); } public ConfigPackTemplate getTemplate() { diff --git a/common/src/main/java/com/dfsek/terra/config/prototype/ConfigType.java b/common/src/main/java/com/dfsek/terra/config/prototype/ConfigType.java new file mode 100644 index 000000000..4c6f66ec7 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/config/prototype/ConfigType.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.config.prototype; + +import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.tectonic.exception.LoadException; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.registry.OpenRegistry; + +import java.util.function.Supplier; + +public interface ConfigType { + T getTemplate(ConfigPack pack, TerraPlugin main); + + void callback(ConfigPack pack, TerraPlugin main, T loadedConfig) throws LoadException; + + Class getTypeClass(); + + Supplier> registrySupplier(); +} diff --git a/common/src/main/java/com/dfsek/terra/config/prototype/ProtoConfig.java b/common/src/main/java/com/dfsek/terra/config/prototype/ProtoConfig.java new file mode 100644 index 000000000..329a88113 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/config/prototype/ProtoConfig.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.config.prototype; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.config.ConfigTemplate; + +public class ProtoConfig implements ConfigTemplate { + @Value("id") + private String id; + + @Value("type") + private ConfigType type; + + + public String getId() { + return id; + } + + public ConfigType getType() { + return type; + } +} diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index 69ee69122..a34a2c8b4 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -13,7 +13,6 @@ import com.dfsek.terra.api.math.noise.NoiseSampler; import com.dfsek.terra.api.math.noise.samplers.noise.ConstantSampler; import com.dfsek.terra.api.math.paralithic.BlankFunction; import com.dfsek.terra.api.math.paralithic.defined.UserDefinedFunction; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.api.platform.world.Biome; import com.dfsek.terra.api.util.GlueList; @@ -124,7 +123,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf @Value("ocean.palette") @Abstractable @Default - private Palette oceanPalette; + private Palette oceanPalette; @Value("elevation.equation") @Default @@ -159,12 +158,12 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf @Value("slabs.palettes") @Abstractable @Default - private Map> slabPalettes; + private Map slabPalettes; @Value("slabs.stair-palettes") @Abstractable @Default - private Map> stairPalettes; + private Map stairPalettes; @Value("slant.threshold") @Abstractable @@ -247,14 +246,6 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf return doSlabs; } - public Map> getSlabPalettes() { - return slabPalettes; - } - - public Map> getStairPalettes() { - return stairPalettes; - } - public BiomeTemplate(ConfigPack pack, TerraPlugin main) { this.pack = pack; biomeNoise = new NoiseSeeded() { @@ -268,7 +259,15 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf return 2; } }; - oceanPalette = new SinglePalette<>(main.getWorldHandle().createBlockData("minecraft:water")); + oceanPalette = new SinglePalette(main.getWorldHandle().createBlockData("minecraft:water")); + } + + public Map getSlabPalettes() { + return slabPalettes; + } + + public Map getStairPalettes() { + return stairPalettes; } public NoiseSeeded getBiomeNoise() { @@ -291,7 +290,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf return seaLevel; } - public Palette getOceanPalette() { + public Palette getOceanPalette() { return oceanPalette; } diff --git a/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java index 7362a4c6a..b3ecdb61f 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java @@ -17,7 +17,7 @@ public class OreTemplate extends AbstractableTemplate { @Abstractable private BlockData material; - @Value("type") + @Value("algorithm") @Abstractable @Default private Ore.Type oreType = Ore.Type.VANILLA; diff --git a/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java index 1cd0b81f2..3cbe07b0a 100644 --- a/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java @@ -6,19 +6,30 @@ import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.registry.exception.DuplicateEntryException; import java.lang.reflect.Type; +import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; import java.util.function.Consumer; +import java.util.stream.Collectors; /** * Registry implementation with read/write access. For internal use only. * @param */ public class OpenRegistry implements Registry { - private final Map objects = new HashMap<>(); + private final Map> objects; + private static final Entry NULL = new Entry<>(null); + + public OpenRegistry() { + objects = new HashMap<>(); + } + + protected OpenRegistry(Map> init) { + this.objects = init; + } @Override public T load(Type type, Object o, ConfigLoader configLoader) throws LoadException { @@ -35,6 +46,10 @@ public class OpenRegistry implements Registry { * @param value Value to add. */ public boolean add(String identifier, T value) { + return add(identifier, new Entry<>(value)); + } + + protected boolean add(String identifier, Entry value) { boolean exists = objects.containsKey(identifier); objects.put(identifier, value); return exists; @@ -58,24 +73,25 @@ public class OpenRegistry implements Registry { return objects.containsKey(identifier); } + @SuppressWarnings("unchecked") @Override public T get(String identifier) { - return objects.get(identifier); + return objects.getOrDefault(identifier, (Entry) NULL).getValue(); } @Override public void forEach(Consumer consumer) { - objects.forEach((id, obj) -> consumer.accept(obj)); + objects.forEach((id, obj) -> consumer.accept(obj.getRaw())); } @Override public void forEach(BiConsumer consumer) { - objects.forEach(consumer); + objects.forEach((id, entry) -> consumer.accept(id, entry.getRaw())); } @Override - public Set entries() { - return new HashSet<>(objects.values()); + public Collection entries() { + return objects.values().stream().map(Entry::getRaw).collect(Collectors.toList()); } @Override @@ -83,10 +99,41 @@ public class OpenRegistry implements Registry { return objects.keySet(); } + public Map getDeadEntries() { + Map dead = new HashMap<>(); + objects.forEach((id, entry) -> { + if(entry.dead()) dead.put(id, entry.value); // dont increment value here. + }); + return dead; + } + /** * Clears all entries from the registry. */ public void clear() { objects.clear(); } + + + protected static final class Entry { + private final T value; + private final AtomicInteger access = new AtomicInteger(0); + + public Entry(T value) { + this.value = value; + } + + public T getValue() { + access.incrementAndGet(); + return value; + } + + private T getRaw() { + return value; + } + + public boolean dead() { + return access.get() == 0; + } + } } diff --git a/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java new file mode 100644 index 000000000..90dd2a4b4 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java @@ -0,0 +1,117 @@ +package com.dfsek.terra.registry.config; + +import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.tectonic.exception.LoadException; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.platform.world.Tree; +import com.dfsek.terra.api.world.flora.Flora; +import com.dfsek.terra.api.world.palette.Palette; +import com.dfsek.terra.carving.UserDefinedCarver; +import com.dfsek.terra.config.builder.BiomeBuilder; +import com.dfsek.terra.config.factories.BiomeFactory; +import com.dfsek.terra.config.factories.CarverFactory; +import com.dfsek.terra.config.factories.ConfigFactory; +import com.dfsek.terra.config.factories.FloraFactory; +import com.dfsek.terra.config.factories.OreFactory; +import com.dfsek.terra.config.factories.PaletteFactory; +import com.dfsek.terra.config.factories.StructureFactory; +import com.dfsek.terra.config.factories.TreeFactory; +import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.config.prototype.ConfigType; +import com.dfsek.terra.config.templates.AbstractableTemplate; +import com.dfsek.terra.config.templates.BiomeTemplate; +import com.dfsek.terra.config.templates.CarverTemplate; +import com.dfsek.terra.config.templates.FloraTemplate; +import com.dfsek.terra.config.templates.OreTemplate; +import com.dfsek.terra.config.templates.PaletteTemplate; +import com.dfsek.terra.config.templates.StructureTemplate; +import com.dfsek.terra.config.templates.TreeTemplate; +import com.dfsek.terra.registry.OpenRegistry; +import com.dfsek.terra.world.population.items.TerraStructure; +import com.dfsek.terra.world.population.items.ores.Ore; + +import java.util.LinkedHashMap; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +public class ConfigTypeRegistry extends OpenRegistry> { + private final BiConsumer> callback; + + public ConfigTypeRegistry(ConfigPack pack, TerraPlugin main, BiConsumer> callback) { + super(new LinkedHashMap<>()); // Ordered + this.callback = callback; + add("PALETTE", new ConfigBuilder<>(new PaletteFactory(), PaletteTemplate::new, Palette.class, () -> new PaletteRegistry(main))); + add("ORE", new ConfigBuilder<>(new OreFactory(), OreTemplate::new, Ore.class, OreRegistry::new)); + add("FLORA", new ConfigBuilder<>(new FloraFactory(), FloraTemplate::new, Flora.class, () -> new FloraRegistry(main))); + add("CARVER", new ConfigBuilder<>(new CarverFactory(pack), CarverTemplate::new, UserDefinedCarver.class, CarverRegistry::new)); + add("STRUCTURE", new ConfigBuilder<>(new StructureFactory(), StructureTemplate::new, TerraStructure.class, StructureRegistry::new)); + add("TREE", new ConfigBuilder<>(new TreeFactory(), TreeTemplate::new, Tree.class, TreeRegistry::new)); + add("BIOME", new ConfigBuilder<>(new BiomeFactory(pack), () -> new BiomeTemplate(pack, main), BiomeBuilder.class, BiomeRegistry::new)); + add("PACK", new PackBuilder()); + } + + @Override + protected boolean add(String identifier, Entry> value) { + callback.accept(identifier, value.getValue()); + return super.add(identifier, value); + } + + private static final class PackBuilder implements ConfigType { + + @Override + public ConfigTemplate getTemplate(ConfigPack pack, TerraPlugin main) { + return new ConfigTemplate() { + }; + } + + @Override + public void callback(ConfigPack pack, TerraPlugin main, ConfigTemplate loadedConfig) { + + } + + @Override + public Class getTypeClass() { + return ConfigPack.class; + } + + @Override + public Supplier> registrySupplier() { + return OpenRegistry::new; + } + } + + private static final class ConfigBuilder implements ConfigType { + private final ConfigFactory factory; + private final Supplier provider; + private final Class clazz; + private final Supplier> registrySupplier; + + private ConfigBuilder(ConfigFactory factory, Supplier provider, Class clazz, Supplier> registrySupplier) { + this.factory = factory; + this.provider = provider; + this.clazz = clazz; + this.registrySupplier = registrySupplier; + } + + @Override + public T getTemplate(ConfigPack pack, TerraPlugin main) { + return provider.get(); + } + + @SuppressWarnings("deprecation") + @Override + public void callback(ConfigPack pack, TerraPlugin main, T loadedConfig) throws LoadException { + pack.getRegistry(clazz).addUnchecked(loadedConfig.getID(), factory.build(loadedConfig, main)); + } + + @Override + public Class getTypeClass() { + return clazz; + } + + @Override + public Supplier> registrySupplier() { + return registrySupplier; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/registry/config/FloraRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/FloraRegistry.java index 71fd680cd..878890bff 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/FloraRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/FloraRegistry.java @@ -57,7 +57,9 @@ public class FloraRegistry extends OpenRegistry { private void addItem(String id, Callable flora) { try { - add(id, flora.call()); + Entry entry = new Entry<>(flora.call()); + entry.getValue(); // Mark as not dead. + add(id, entry); } catch(Exception e) { main.logger().warning("Failed to load Flora item: " + id + ": " + e.getMessage()); } diff --git a/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java index ccbfee9ca..ac0bc4b48 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java @@ -1,6 +1,5 @@ package com.dfsek.terra.registry.config; -import com.dfsek.tectonic.loading.object.ObjectTemplate; import com.dfsek.terra.api.math.noise.samplers.noise.random.GaussianNoiseSampler; import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.api.math.noise.samplers.noise.simplex.OpenSimplex2SSampler; @@ -9,7 +8,7 @@ import com.dfsek.terra.api.math.noise.samplers.noise.simplex.PerlinSampler; import com.dfsek.terra.api.math.noise.samplers.noise.simplex.SimplexSampler; import com.dfsek.terra.api.math.noise.samplers.noise.value.ValueCubicSampler; import com.dfsek.terra.api.math.noise.samplers.noise.value.ValueSampler; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; +import com.dfsek.terra.api.util.seeded.NoiseProvider; import com.dfsek.terra.config.loaders.config.sampler.templates.DomainWarpTemplate; import com.dfsek.terra.config.loaders.config.sampler.templates.ImageSamplerTemplate; import com.dfsek.terra.config.loaders.config.sampler.templates.KernelTemplate; @@ -26,9 +25,7 @@ import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.Linear import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.NormalNormalizerTemplate; import com.dfsek.terra.registry.OpenRegistry; -import java.util.function.Supplier; - -public class NoiseRegistry extends OpenRegistry>> { +public class NoiseRegistry extends OpenRegistry { public NoiseRegistry() { add("LINEAR", LinearNormalizerTemplate::new); add("NORMAL", NormalNormalizerTemplate::new); diff --git a/common/src/main/java/com/dfsek/terra/registry/config/PaletteRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/PaletteRegistry.java index e54c8ec81..bcdfea683 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/PaletteRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/PaletteRegistry.java @@ -1,22 +1,21 @@ package com.dfsek.terra.registry.config; import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.SinglePalette; import com.dfsek.terra.registry.OpenRegistry; -public class PaletteRegistry extends OpenRegistry> { +public class PaletteRegistry extends OpenRegistry { private final TerraPlugin main; + public PaletteRegistry(TerraPlugin main) { this.main = main; } - @Override - public Palette get(String identifier) { + public Palette get(String identifier) { if(identifier.startsWith("BLOCK:")) - return new SinglePalette<>(main.getWorldHandle().createBlockData(identifier.substring(6))); // Return single palette for BLOCK: shortcut. + return new SinglePalette(main.getWorldHandle().createBlockData(identifier.substring(6))); // Return single palette for BLOCK: shortcut. return super.get(identifier); } } diff --git a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java index bbf0ac9f3..02b0c848a 100644 --- a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java @@ -75,7 +75,7 @@ public class TerraWorld { */ public BlockData getUngeneratedBlock(int x, int y, int z) { UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome(x, z); - Palette palette = biome.getGenerator(world).getPalette(y); + Palette palette = biome.getGenerator(world).getPalette(y); Sampler sampler = config.getSamplerCache().get(x, z); int fdX = FastMath.floorMod(x, 16); int fdZ = FastMath.floorMod(z, 16); diff --git a/common/src/main/java/com/dfsek/terra/world/generation/WorldGenerator.java b/common/src/main/java/com/dfsek/terra/world/generation/WorldGenerator.java index 971241ca5..2a46d1c2a 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/WorldGenerator.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/WorldGenerator.java @@ -1,7 +1,6 @@ package com.dfsek.terra.world.generation; import com.dfsek.terra.api.math.noise.NoiseSampler; -import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.holder.PaletteHolder; @@ -67,7 +66,7 @@ public class WorldGenerator implements Generator { * @return BlockPalette - The biome's palette. */ @Override - public Palette getPalette(int y) { + public Palette getPalette(int y) { return palettes.getPalette(y); } @@ -86,7 +85,7 @@ public class WorldGenerator implements Generator { return blendStep; } - public Palette getSlantPalette(int y) { + public Palette getSlantPalette(int y) { return slantPalettes.getPalette(y); } } diff --git a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java index c4f384b07..e0124a4a0 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java @@ -112,7 +112,7 @@ public class DefaultChunkGenerator2D implements TerraChunkGenerator { TerraBiome b = grid.getBiome(xOrig + x, zOrig + z); BiomeTemplate c = ((UserDefinedBiome) b).getConfig(); - Palette seaPalette = c.getOceanPalette(); + Palette seaPalette = c.getOceanPalette(); int height = FastMath.min((int) sampler.sample(x, 0, z), world.getMaxHeight() - 1); diff --git a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java index f63676161..69e6c8675 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java @@ -45,7 +45,7 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { private final ConfigPack configPack; private final TerraPlugin main; private final BlockType water; - private final SinglePalette blank; + private final SinglePalette blank; private final List blockPopulators = new ArrayList<>(); private final Carver carver; @@ -63,7 +63,7 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { carver = new NoiseCarver(new Range(0, 255), main.getWorldHandle().createBlockData("minecraft:air"), main); water = main.getWorldHandle().createBlockData("minecraft:water").getBlockType(); - blank = new SinglePalette<>(main.getWorldHandle().createBlockData("minecraft:air")); + blank = new SinglePalette(main.getWorldHandle().createBlockData("minecraft:air")); } @Override @@ -124,7 +124,7 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { BiomeTemplate c = ((UserDefinedBiome) b).getConfig(); int sea = c.getSeaLevel(); - Palette seaPalette = c.getOceanPalette(); + Palette seaPalette = c.getOceanPalette(); boolean justSet = false; BlockData data = null; @@ -162,11 +162,11 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { } } - private void prepareBlockPartFloor(BlockData down, BlockData orig, ChunkData chunk, Vector3 block, Map> slabs, - Map> stairs, double thresh, Sampler sampler) { + private void prepareBlockPartFloor(BlockData down, BlockData orig, ChunkData chunk, Vector3 block, Map slabs, + Map stairs, double thresh, Sampler sampler) { if(sampler.sample(block.getX(), block.getY() - 0.4, block.getZ()) > thresh) { if(stairs != null) { - Palette stairPalette = stairs.get(down.getBlockType()); + Palette stairPalette = stairs.get(down.getBlockType()); if(stairPalette != null) { BlockData stair = stairPalette.get(0, block.getX(), block.getY(), block.getZ()).clone(); if(stair instanceof Stairs) { @@ -183,11 +183,11 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { } } - private void prepareBlockPartCeiling(BlockData up, BlockData orig, ChunkData chunk, Vector3 block, Map> slabs, - Map> stairs, double thresh, Sampler sampler) { + private void prepareBlockPartCeiling(BlockData up, BlockData orig, ChunkData chunk, Vector3 block, Map slabs, + Map stairs, double thresh, Sampler sampler) { if(sampler.sample(block.getX(), block.getY() + 0.4, block.getZ()) > thresh) { if(stairs != null) { - Palette stairPalette = stairs.get(up.getBlockType()); + Palette stairPalette = stairs.get(up.getBlockType()); if(stairPalette != null) { BlockData stair = stairPalette.get(0, block.getX(), block.getY(), block.getZ()).clone(); if(stair instanceof Stairs) { diff --git a/common/src/main/java/com/dfsek/terra/world/population/items/flora/TerraFlora.java b/common/src/main/java/com/dfsek/terra/world/population/items/flora/TerraFlora.java index 0893d1c92..b154c2e91 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/items/flora/TerraFlora.java +++ b/common/src/main/java/com/dfsek/terra/world/population/items/flora/TerraFlora.java @@ -22,7 +22,7 @@ import java.util.ArrayList; import java.util.List; public class TerraFlora implements Flora { - private final Palette floraPalette; + private final Palette floraPalette; private final boolean physics; private final boolean ceiling; @@ -43,7 +43,7 @@ public class TerraFlora implements Flora { private final TerraPlugin main; - public TerraFlora(Palette floraPalette, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraPlugin main) { + public TerraFlora(Palette floraPalette, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraPlugin main) { this.floraPalette = floraPalette; this.physics = physics; this.testRotation = testRotation; diff --git a/common/src/test/java/biome/DistributionTest.java b/common/src/test/java/biome/DistributionTest.java deleted file mode 100644 index 711aba9c7..000000000 --- a/common/src/test/java/biome/DistributionTest.java +++ /dev/null @@ -1,352 +0,0 @@ -package biome; - -import com.dfsek.tectonic.abstraction.AbstractConfigLoader; -import com.dfsek.tectonic.annotations.Abstractable; -import com.dfsek.tectonic.annotations.Default; -import com.dfsek.tectonic.annotations.Value; -import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.tectonic.config.ValidatedConfigTemplate; -import com.dfsek.tectonic.exception.ConfigException; -import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.tectonic.loading.TypeRegistry; -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.addons.TerraAddon; -import com.dfsek.terra.api.event.EventManager; -import com.dfsek.terra.api.platform.handle.ItemHandle; -import com.dfsek.terra.api.platform.handle.WorldHandle; -import com.dfsek.terra.api.platform.world.Biome; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.registry.CheckedRegistry; -import com.dfsek.terra.api.registry.LockedRegistry; -import com.dfsek.terra.api.util.collections.ProbabilityCollection; -import com.dfsek.terra.api.util.logging.DebugLogger; -import com.dfsek.terra.api.util.logging.JavaLogger; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; -import com.dfsek.terra.api.world.biome.Generator; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.biome.provider.BiomeProvider; -import com.dfsek.terra.config.GenericLoaders; -import com.dfsek.terra.config.PluginConfig; -import com.dfsek.terra.config.builder.BiomeBuilder; -import com.dfsek.terra.config.fileloaders.FolderLoader; -import com.dfsek.terra.config.lang.Language; -import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; -import com.dfsek.terra.config.loaders.config.BufferedImageLoader; -import com.dfsek.terra.config.loaders.config.biome.BiomeProviderBuilderLoader; -import com.dfsek.terra.config.loaders.config.biome.templates.provider.BiomePipelineTemplate; -import com.dfsek.terra.config.loaders.config.biome.templates.provider.ImageProviderTemplate; -import com.dfsek.terra.config.loaders.config.biome.templates.provider.SingleBiomeProviderTemplate; -import com.dfsek.terra.config.loaders.config.sampler.NoiseSamplerBuilderLoader; -import com.dfsek.terra.config.pack.ConfigPack; -import com.dfsek.terra.config.templates.AbstractableTemplate; -import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.registry.config.BiomeRegistry; -import com.dfsek.terra.registry.config.NoiseRegistry; -import com.dfsek.terra.world.TerraWorld; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.WritableRaster; -import java.io.File; -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; -import java.util.logging.Logger; - -public class DistributionTest { - private static final TerraPlugin MAIN = new TerraPlugin() { - @Override - public WorldHandle getWorldHandle() { - return null; - } - - @Override - public TerraWorld getWorld(World world) { - return null; - } - - @Override - public com.dfsek.terra.api.util.logging.Logger logger() { - return new JavaLogger(Logger.getLogger("Terra")); - } - - @Override - public PluginConfig getTerraConfig() { - return new PluginConfig(); - } - - @Override - public File getDataFolder() { - return null; - } - - @Override - public boolean isDebug() { - return false; - } - - @Override - public Language getLanguage() { - return null; - } - - @Override - public CheckedRegistry getConfigRegistry() { - return null; - } - - @Override - public LockedRegistry getAddons() { - return null; - } - - @Override - public boolean reload() { - return true; - } - - @Override - public ItemHandle getItemHandle() { - return null; - } - - @Override - public void saveDefaultConfig() { - - } - - @Override - public String platformName() { - return null; - } - - @Override - public DebugLogger getDebugLogger() { - return new DebugLogger(new JavaLogger(Logger.getLogger("Terra"))); - } - - @Override - public EventManager getEventManager() { - return null; - } - - @Override - public void register(TypeRegistry registry) { - - } - }; - - - private static BiomeProvider getProvider(long seed) throws ConfigException, IOException { - System.out.println(seed); - File pack = new File("/home/dfsek/Documents/Terra/platforms/bukkit/target/server/plugins/Terra/packs/default/"); - FolderLoader folderLoader = new FolderLoader(pack.toPath()); - - AbstractConfigLoader loader = new AbstractConfigLoader(); - new GenericLoaders(MAIN).register(loader); - - BiomeRegistry biomeRegistry = new BiomeRegistry(); - folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), MAIN)); - - BiomeProviderTemplate template = new BiomeProviderTemplate(); - ConfigLoader pipeLoader = new ConfigLoader() - .registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader()) - .registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) - .registerLoader(BiomeBuilder.class, biomeRegistry) - .registerLoader(BufferedImage.class, new BufferedImageLoader(folderLoader)) - .registerLoader(SingleBiomeProviderTemplate.class, SingleBiomeProviderTemplate::new) - .registerLoader(BiomePipelineTemplate.class, () -> new BiomePipelineTemplate(MAIN)) - .registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(biomeRegistry)); - new GenericLoaders(MAIN).register(pipeLoader); - - pipeLoader.registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(new NoiseRegistry())); - - pipeLoader.load(template, folderLoader.get("pack.yml")); - return template.getBiomeProviderBuilder().build(seed); - } - - public static void main(String... args) throws ConfigException, IOException { - JFrame testFrame = new JFrame("Biome Viewer"); - - - final BiomeProvider[] provider = {getProvider(2403)}; - - - int size = 1024; - final BufferedImage[] image = {new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB)}; - for(int x = 0; x < size; x++) { - for(int z = 0; z < size; z++) { - image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); - } - } - - JLabel img = new JLabel(new ImageIcon(image[0])); - - testFrame.add(img); - testFrame.pack(); - img.addMouseListener(new MouseListener() { - @Override - public void mouseClicked(MouseEvent e) { - BufferedImage newImage = deepCopy(image[0]); - Graphics graphics = newImage.getGraphics(); - graphics.setColor(Color.WHITE); - graphics.fillRect(0, 0, 512, 24); - graphics.setColor(Color.BLACK); - graphics.setFont(new Font("Monospace", Font.BOLD, 20)); - graphics.drawString(provider[0].getBiome(e.getX(), e.getY()).toString(), 0, 20); - - graphics.setColor(Color.WHITE); - graphics.fillOval(e.getX() - 2, e.getY() - 2, 12, 12); - graphics.setColor(Color.BLACK); - graphics.fillOval(e.getX(), e.getY(), 8, 8); - - img.setIcon(new ImageIcon(newImage)); - } - - @Override - public void mousePressed(MouseEvent e) { - - } - - @Override - public void mouseReleased(MouseEvent e) { - - } - - @Override - public void mouseEntered(MouseEvent e) { - - } - - @Override - public void mouseExited(MouseEvent e) { - - } - }); - - testFrame.addKeyListener(new KeyListener() { - @Override - public void keyTyped(KeyEvent e) { - if(e.getKeyChar() == 's') { - long l = System.nanoTime(); - try { - provider[0] = getProvider(ThreadLocalRandom.current().nextLong()); - } catch(ConfigException | IOException configException) { - configException.printStackTrace(); - } - image[0] = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); - for(int x = 0; x < size; x++) { - for(int z = 0; z < size; z++) { - image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); - } - } - long n = System.nanoTime(); - double t = n - l; - System.out.println("Time: " + t / 1000000 + "ms"); - img.setIcon(new ImageIcon(image[0])); - } - } - - @Override - public void keyPressed(KeyEvent e) { - - } - - @Override - public void keyReleased(KeyEvent e) { - - } - }); - - testFrame.setResizable(false); - testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - testFrame.setVisible(true); - - } - - private static BufferedImage deepCopy(BufferedImage bi) { - ColorModel cm = bi.getColorModel(); - boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); - WritableRaster raster = bi.copyData(null); - return new BufferedImage(cm, raster, isAlphaPremultiplied, null); - } - - private static final class BiomeProviderTemplate implements ConfigTemplate { - @Value("biomes") - BiomeProvider.BiomeProviderBuilder biomeProviderBuilder; - - public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() { - return biomeProviderBuilder; - } - } - - private static final class TestBiome extends AbstractableTemplate implements TerraBiome, ValidatedConfigTemplate, BiomeBuilder { - - @Value("color") - @Default - @Abstractable - private int color; - - @Value("tags") - @Abstractable - @Default - private Set tags = new HashSet<>(); - - @Value("id") - private String id; - - @Override - public ProbabilityCollection getVanillaBiomes() { - return null; - } - - @Override - public BiomeTemplate getTemplate() { - return null; - } - - @Override - public Generator getGenerator(World w) { - return null; - } - - @Override - public int getColor() { - return color; - } - - @Override - public Set getTags() { - return tags; - } - - @Override - public boolean validate() { - color += (255 << 24); // Alpha adjustment - tags.add("BIOME:" + id); - return true; - } - - @Override - public String getID() { - return id; - } - - @Override - public String toString() { - return id; - } - - @Override - public TestBiome apply(Long aLong) { - return this; - } - } -} diff --git a/common/src/test/java/biome/ImageTest.java b/common/src/test/java/biome/ImageTest.java deleted file mode 100644 index ddc96dafc..000000000 --- a/common/src/test/java/biome/ImageTest.java +++ /dev/null @@ -1,218 +0,0 @@ -package biome; - -import com.dfsek.tectonic.abstraction.AbstractConfigLoader; -import com.dfsek.tectonic.annotations.Abstractable; -import com.dfsek.tectonic.annotations.Default; -import com.dfsek.tectonic.annotations.Value; -import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.tectonic.config.ValidatedConfigTemplate; -import com.dfsek.tectonic.exception.ConfigException; -import com.dfsek.terra.api.platform.world.Biome; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.util.collections.ProbabilityCollection; -import com.dfsek.terra.api.world.biome.Generator; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.biome.provider.BiomeProvider; -import com.dfsek.terra.api.world.biome.provider.ImageBiomeProvider; -import com.dfsek.terra.config.fileloaders.FolderLoader; -import com.dfsek.terra.config.pack.ConfigPack; -import com.dfsek.terra.config.templates.AbstractableTemplate; -import com.dfsek.terra.registry.OpenRegistry; -import org.junit.jupiter.api.Test; - -import javax.imageio.ImageIO; -import javax.swing.*; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.WritableRaster; -import java.io.File; -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; - -public class ImageTest { - private static ImageBiomeProvider getProvider(long seed) throws ConfigException, IOException { - System.out.println(seed); - File pack = new File("/home/dfsek/Documents/Terra/platforms/bukkit/target/server/plugins/Terra/packs/default/"); - FolderLoader folderLoader = new FolderLoader(pack.toPath()); - - AbstractConfigLoader loader = new AbstractConfigLoader(); - - OpenRegistry biomeRegistry = new OpenRegistry() { - }; - folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), null)); - - return new ImageBiomeProvider(biomeRegistry.entries(), ImageIO.read(ImageTest.class.getResourceAsStream("/map.jpg")), 1, ImageBiomeProvider.Align.CENTER); - } - - @Test - public static void main(String... args) throws ConfigException, IOException { - JFrame testFrame = new JFrame("Biome Viewer"); - - - final BiomeProvider[] provider = {getProvider(2403)}; - - - int size = 1024; - final BufferedImage[] image = {new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB)}; - for(int x = 0; x < size; x++) { - for(int z = 0; z < size; z++) { - image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); - } - } - - JLabel img = new JLabel(new ImageIcon(image[0])); - - testFrame.add(img); - testFrame.pack(); - img.addMouseListener(new MouseListener() { - @Override - public void mouseClicked(MouseEvent e) { - BufferedImage newImage = deepCopy(image[0]); - Graphics graphics = newImage.getGraphics(); - graphics.setColor(Color.WHITE); - graphics.fillRect(0, 0, 512, 24); - graphics.setColor(Color.BLACK); - graphics.setFont(new Font("Monospace", Font.BOLD, 20)); - graphics.drawString(provider[0].getBiome(e.getX(), e.getY()).toString(), 0, 20); - - graphics.setColor(Color.WHITE); - graphics.fillOval(e.getX() - 2, e.getY() - 2, 12, 12); - graphics.setColor(Color.BLACK); - graphics.fillOval(e.getX(), e.getY(), 8, 8); - - img.setIcon(new ImageIcon(newImage)); - } - - @Override - public void mousePressed(MouseEvent e) { - - } - - @Override - public void mouseReleased(MouseEvent e) { - - } - - @Override - public void mouseEntered(MouseEvent e) { - - } - - @Override - public void mouseExited(MouseEvent e) { - - } - }); - - testFrame.addKeyListener(new KeyListener() { - @Override - public void keyTyped(KeyEvent e) { - if(e.getKeyChar() == 's') { - try { - provider[0] = getProvider(ThreadLocalRandom.current().nextLong()); - } catch(ConfigException | IOException configException) { - configException.printStackTrace(); - } - image[0] = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); - for(int x = 0; x < size; x++) { - for(int z = 0; z < size; z++) { - image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); - } - } - img.setIcon(new ImageIcon(image[0])); - } - } - - @Override - public void keyPressed(KeyEvent e) { - - } - - @Override - public void keyReleased(KeyEvent e) { - - } - }); - - testFrame.setResizable(false); - testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - testFrame.setVisible(true); - - } - - private static BufferedImage deepCopy(BufferedImage bi) { - ColorModel cm = bi.getColorModel(); - boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); - WritableRaster raster = bi.copyData(null); - return new BufferedImage(cm, raster, isAlphaPremultiplied, null); - } - - private static final class BiomeProviderTemplate implements ConfigTemplate { - @Value("biome-pipeline") - BiomeProvider.BiomeProviderBuilder biomeProviderBuilder; - - public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() { - return biomeProviderBuilder; - } - } - - private static final class TestBiome extends AbstractableTemplate implements TerraBiome, ValidatedConfigTemplate { - - @Value("color") - @Default - @Abstractable - private int color; - - @Value("tags") - @Abstractable - @Default - private Set tags = new HashSet<>(); - - @Value("id") - private String id; - - @Override - public ProbabilityCollection getVanillaBiomes() { - return null; - } - - @Override - public Generator getGenerator(World w) { - return null; - } - - @Override - public int getColor() { - return color; - } - - @Override - public Set getTags() { - return tags; - } - - @Override - public boolean validate() { - color += (255 << 24); // Alpha adjustment - tags.add("BIOME:" + id); - return true; - } - - @Override - public String getID() { - return id; - } - - @Override - public String toString() { - return id; - } - } -} diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index e9dac10e5..6e8f30a0e 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -16,19 +16,12 @@ configureCommon() group = "com.dfsek.terra.bukkit" val mcVersion = "1.16.5" -val testDir = "target/server/" +val testDir = "target/server" val testMem = "3G" val paperURL = "https://papermc.io/api/v1/paper/%version%/latest/download/" val purpurURL = "https://ci.pl3x.net/job/Purpur/lastSuccessfulBuild/artifact/final/purpurclip.jar" -repositories { - mavenCentral() - maven { url = uri("http://maven.enginehub.org/repo/") } - maven { url = uri("https://repo.codemc.org/repository/maven-public") } - maven { url = uri("https://papermc.io/repo/repository/maven-public/") } -} - dependencies { "shadedApi"(project(":common")) @@ -39,17 +32,17 @@ dependencies { "compileOnly"("com.sk89q.worldedit:worldedit-bukkit:7.2.0-SNAPSHOT") - "shadedImplementation"("com.google.guava:guava:30.0-jre") + "shadedApi"("com.google.guava:guava:30.0-jre") } -val aikarsFlags = listOf("-XX:+UseG1GC", "-XX:+ParallelRefProcEnabled", "-XX:MaxGCPauseMillis=200", +val jvmFlags = listOf("-XX:+UseG1GC", "-XX:+ParallelRefProcEnabled", "-XX:MaxGCPauseMillis=200", "-XX:+UnlockExperimentalVMOptions", "-XX:+DisableExplicitGC", "-XX:+AlwaysPreTouch", "-XX:G1NewSizePercent=30", "-XX:G1MaxNewSizePercent=40", "-XX:G1HeapRegionSize=8M", "-XX:G1ReservePercent=20", "-XX:G1HeapWastePercent=5", "-XX:G1MixedGCCountTarget=4", "-XX:InitiatingHeapOccupancyPercent=15", "-XX:G1MixedGCLiveThresholdPercent=90", "-XX:G1RSetUpdatingPauseTimePercent=5", "-XX:SurvivorRatio=32", "-XX:+PerfDisableSharedMem", "-XX:MaxTenuringThreshold=1", "-Dusing.aikars.flags=https://mcflags.emc.gs", - "-Daikars.new.flags=true", "-DIReallyKnowWhatIAmDoingISwear") + "-Daikars.new.flags=true", "-DIReallyKnowWhatIAmDoingISwear", "-javaagent:paperclip.jar") fun downloadPaperclip(url: String, dir: String) { val clip = URL(url.replace("%version%", mcVersion)) @@ -160,7 +153,7 @@ task(name = "runPaper") { } main = "io.papermc.paperclip.Paperclip" - jvmArgs = aikarsFlags + jvmArgs = jvmFlags maxHeapSize = testMem minHeapSize = testMem //args = listOf("nogui") @@ -178,7 +171,7 @@ task(name = "runPurpur") { } main = "io.papermc.paperclip.Paperclip" - jvmArgs = aikarsFlags + jvmArgs = jvmFlags maxHeapSize = testMem minHeapSize = testMem //args = listOf("nogui") @@ -189,6 +182,7 @@ task(name = "runPurpur") { tasks.named("shadowJar") { relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") + relocate("com.google.common", "com.dfsek.terra.lib.google.common") } publishing { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java index 8f3736103..62747e2e2 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java @@ -28,6 +28,6 @@ public class BukkitWorldHandle implements WorldHandle { @Override public Pair getSelectedLocation(Player player) { org.bukkit.Location[] locations = WorldEditUtil.getSelectionLocations(BukkitAdapter.adapt(player)); - return new Pair<>(BukkitAdapter.adapt(locations[0]), BukkitAdapter.adapt(locations[1])); + return Pair.of(BukkitAdapter.adapt(locations[0]), BukkitAdapter.adapt(locations[1])); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java index 5c6d31183..9e2a65407 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java @@ -52,7 +52,7 @@ public class CommonListener implements Listener { Block block = e.getLocation().getBlock(); BlockData data = block.getBlockData(); block.setType(Material.AIR); - Tree tree = c.getTreeRegistry().get(TREE_TYPE_STRING_TRANSFORMER.translate(e.getSpecies())); + Tree tree = c.getRegistry(Tree.class).get(TREE_TYPE_STRING_TRANSFORMER.translate(e.getSpecies())); org.bukkit.Location location = e.getLocation(); if(!tree.plant(new Location(bukkit, location.getX(), location.getY(), location.getZ()), new FastRandom())) block.setBlockData(data); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java index 3945451f4..aebdd017d 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java @@ -23,7 +23,7 @@ public class PaperListener implements Listener { String name = "minecraft:" + e.getType().getName(); main.getDebugLogger().info("Overriding structure location for \"" + name + "\""); TerraWorld tw = main.getWorld(BukkitAdapter.adapt(e.getWorld())); - TerraStructure config = tw.getConfig().getStructureRegistry().get(tw.getConfig().getTemplate().getLocatable().get(name)); + TerraStructure config = tw.getConfig().getRegistry(TerraStructure.class).get(tw.getConfig().getTemplate().getLocatable().get(name)); if(config != null) { AsyncStructureFinder finder = new AsyncStructureFinder(tw.getBiomeProvider(), config, BukkitAdapter.adapt(e.getOrigin()), 0, 500, location -> { if(location != null) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java index fe4681e61..0260bf215 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java @@ -37,7 +37,7 @@ public class SpigotListener implements Listener { if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getEntity().getWorld()))) return; TerraWorld tw = main.getWorld(BukkitAdapter.adapt(e.getEntity().getWorld())); EnderSignal signal = (EnderSignal) entity; - TerraStructure config = tw.getConfig().getStructureRegistry().get(tw.getConfig().getTemplate().getLocatable().get("STRONGHOLD")); + TerraStructure config = tw.getConfig().getRegistry(TerraStructure.class).get(tw.getConfig().getTemplate().getLocatable().get("STRONGHOLD")); if(config != null) { main.getDebugLogger().info("Overriding Ender Signal..."); AsyncStructureFinder finder = new AsyncStructureFinder(tw.getBiomeProvider(), config, BukkitAdapter.adapt(e.getLocation()), 0, 500, location -> { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/TerraListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/TerraListener.java index 78615d036..f1a205e79 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/TerraListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/TerraListener.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.event.EventListener; import com.dfsek.terra.api.event.annotations.Global; import com.dfsek.terra.api.event.annotations.Priority; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; +import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.BukkitTree; import com.dfsek.terra.registry.exception.DuplicateEntryException; @@ -22,7 +23,9 @@ public class TerraListener implements EventListener { public void injectTrees(ConfigPackPreLoadEvent event) { for(TreeType value : TreeType.values()) { try { - event.getPack().getTreeRegistry().add(BukkitAdapter.TREE_TRANSFORMER.translate(value), new BukkitTree(value, main)); + String id = BukkitAdapter.TREE_TRANSFORMER.translate(value); + event.getPack().getRegistry(Tree.class).add(id, new BukkitTree(value, main)); + event.getPack().getRegistry(Tree.class).get(id); // Platform trees should never be marked "dead" } catch(DuplicateEntryException ignore) { // If another addon has already registered trees, do nothing. } } diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index bde8a8d1a..cece1888a 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -6,6 +6,7 @@ import net.fabricmc.loom.task.RemapJarTask plugins { `java-library` + `maven-publish` id("fabric-loom").version("0.6-SNAPSHOT") id("com.modrinth.minotaur").version("1.1.0") } @@ -21,8 +22,6 @@ group = "com.dfsek.terra.fabric" dependencies { "shadedApi"(project(":common")) - "shadedImplementation"("org.yaml:snakeyaml:1.27") - "shadedImplementation"("com.googlecode.json-simple:json-simple:1.1.1") "minecraft"("com.mojang:minecraft:1.16.5") "mappings"("net.fabricmc:yarn:1.16.5+build.5:v2") @@ -31,11 +30,6 @@ dependencies { "modImplementation"("net.fabricmc.fabric-api:fabric-api:0.31.0+1.16") } -tasks.named("shadowJar") { - relocate("org.json", "com.dfsek.terra.lib.json") - relocate("org.yaml", "com.dfsek.terra.lib.yaml") -} - configure { accessWidener("src/main/resources/terra.accesswidener") @@ -63,4 +57,28 @@ tasks.register("publishModrinth") { addGameVersion("1.16.4") addGameVersion("1.16.5") addLoader("fabric") +} + +publishing { + publications { + create("mavenJava") { + artifact(tasks["sourcesJar"]) + artifact(tasks["jar"]) + } + } + + repositories { + val mavenUrl = "https://repo.codemc.io/repository/maven-releases/" + + maven(mavenUrl) { + val mavenUsername: String? by project + val mavenPassword: String? by project + if (mavenUsername != null && mavenPassword != null) { + credentials { + username = mavenUsername + password = mavenPassword + } + } + } + } } \ No newline at end of file diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 57a326726..95b8f1fb5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -311,7 +311,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { RegistryKey> floraKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("terra", "flora_populator")); Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), POPULATOR_CONFIGURED_FEATURE); - registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, id)), createBiome(biome)))); // Register all Terra biomes. + registry.forEach(pack -> pack.getRegistry(BiomeBuilder.class).forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, id)), createBiome(biome)))); // Register all Terra biomes. Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC); @@ -408,7 +408,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Priority(Priority.LOWEST) @Global public void injectTrees(ConfigPackPreLoadEvent event) { - CheckedRegistry treeRegistry = event.getPack().getTreeRegistry(); + CheckedRegistry treeRegistry = event.getPack().getRegistry(Tree.class); injectTree(treeRegistry, "BROWN_MUSHROOM", ConfiguredFeatures.HUGE_BROWN_MUSHROOM); injectTree(treeRegistry, "RED_MUSHROOM", ConfiguredFeatures.HUGE_RED_MUSHROOM); injectTree(treeRegistry, "JUNGLE", ConfiguredFeatures.MEGA_JUNGLE_TREE); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java index 9379380ca..9e0b440ac 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.block.state.FabricBlockState; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; +import net.minecraft.block.FluidBlock; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; @@ -21,7 +22,10 @@ public class FabricBlock implements Block { @Override public void setBlockData(BlockData data, boolean physics) { - delegate.worldAccess.setBlockState(delegate.position, ((FabricBlockData) data).getHandle(), physics ? 3 : 1042, 0); + delegate.worldAccess.setBlockState(delegate.position, ((FabricBlockData) data).getHandle(), physics ? 3 : 1042); + if(physics && ((FabricBlockData) data).getHandle().getBlock() instanceof FluidBlock) { + delegate.worldAccess.getFluidTickScheduler().schedule(delegate.position, ((FluidBlock) ((FabricBlockData) data).getHandle().getBlock()).getFluidState(((FabricBlockData) data).getHandle()).getFluid(), 0); + } } @Override