diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java index f7a5a794f..5f609e206 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java @@ -1,6 +1,5 @@ package com.dfsek.terra.addons.biome.image; -import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import net.jafama.FastMath; @@ -11,7 +10,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; -public class ImageBiomeProvider implements BiomeProvider, BiomeProviderBuilder { // This provider does not need a seed, so it is its own builder. +public class ImageBiomeProvider implements BiomeProvider { private final Map colorBiomeMap = new HashMap<>(); private final BufferedImage image; private final int resolution; @@ -29,7 +28,7 @@ public class ImageBiomeProvider implements BiomeProvider, BiomeProviderBuilder { } @Override - public TerraBiome getBiome(int x, int z) { + public TerraBiome getBiome(int x, int z, long seed) { x /= resolution; z /= resolution; Color color = align.getColor(image, x, z); @@ -40,11 +39,6 @@ public class ImageBiomeProvider implements BiomeProvider, BiomeProviderBuilder { })); } - @Override - public BiomeProvider build(long seed) { - return this; - } - public enum Align { CENTER { @Override diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java index e71cac1b5..f0388a941 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java @@ -2,14 +2,14 @@ package com.dfsek.terra.addons.biome.image; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.api.registry.Registry; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; +import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import java.awt.image.BufferedImage; -import java.util.stream.Collectors; +import java.util.HashSet; public class ImageProviderTemplate /*extends BiomeProviderTemplate */ { - private final Registry biomes; + private final Registry biomes; @Value("image.name") private BufferedImage image; @@ -18,12 +18,12 @@ public class ImageProviderTemplate /*extends BiomeProviderTemplate */ { private int resolution; - public ImageProviderTemplate(Registry set) { + public ImageProviderTemplate(Registry set) { this.biomes = set; } //@Override - public BiomeProvider build(long seed) { - return new ImageBiomeProvider(biomes.entries().stream().map(biomeBuilder -> biomeBuilder.apply(seed)).collect(Collectors.toSet()), image, resolution, align); + public BiomeProvider build() { + return new ImageBiomeProvider(new HashSet<>(biomes.entries()), image, resolution, align); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java index 57e81917f..aff69c8b1 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java @@ -29,7 +29,7 @@ public class BiomeHolderImpl implements BiomeHolder { } @Override - public BiomeHolder expand(BiomeExpander expander) { + public BiomeHolder expand(BiomeExpander expander, long seed) { TerraBiome[][] old = biomes; int newWidth = width * 2 - 1; @@ -39,31 +39,31 @@ public class BiomeHolderImpl implements BiomeHolder { for(int z = 0; z < width; z++) { biomes[x * 2][z * 2] = old[x][z]; if(z != width - 1) - biomes[x * 2][z * 2 + 1] = expander.getBetween(x + origin.getX(), z + 1 + origin.getZ(), old[x][z], old[x][z + 1]); + biomes[x * 2][z * 2 + 1] = expander.getBetween(x + origin.getX(), z + 1 + origin.getZ(), seed, old[x][z], old[x][z + 1]); if(x != width - 1) - biomes[x * 2 + 1][z * 2] = expander.getBetween(x + 1 + origin.getX(), z + origin.getZ(), old[x][z], old[x + 1][z]); + biomes[x * 2 + 1][z * 2] = expander.getBetween(x + 1 + origin.getX(), z + origin.getZ(), seed, old[x][z], old[x + 1][z]); if(x != width - 1 && z != width - 1) - biomes[x * 2 + 1][z * 2 + 1] = expander.getBetween(x + 1 + origin.getX(), z + 1 + origin.getZ(), old[x][z], old[x + 1][z + 1], old[x][z + 1], old[x + 1][z]); + biomes[x * 2 + 1][z * 2 + 1] = expander.getBetween(x + 1 + origin.getX(), z + 1 + origin.getZ(), seed, old[x][z], old[x + 1][z + 1], old[x][z + 1], old[x + 1][z]); } } return new BiomeHolderImpl(biomes, origin.setX(origin.getX() * 2 - 1).setZ(origin.getZ() * 2 - 1), newWidth, offset); } @Override - public void mutate(BiomeMutator mutator) { + public void mutate(BiomeMutator mutator, long seed) { for(int x = 0; x < width; x++) { for(int z = 0; z < width; z++) { BiomeMutator.ViewPoint viewPoint = new BiomeMutator.ViewPoint(this, x, z); - biomes[x][z] = mutator.mutate(viewPoint, x + origin.getX(), z + origin.getZ()); + biomes[x][z] = mutator.mutate(viewPoint, x + origin.getX(), z + origin.getZ(), seed); } } } @Override - public void fill(BiomeSource source) { + public void fill(BiomeSource source, long seed) { for(int x = 0; x < width; x++) { for(int z = 0; z < width; z++) { - biomes[x][z] = source.getBiome(origin.getX() + x, origin.getZ() + z); + biomes[x][z] = source.getBiome(origin.getX() + x, origin.getZ() + z, seed); } } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java similarity index 63% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineImpl.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java index 516e5ca01..e16920325 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineImpl.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java @@ -7,15 +7,14 @@ import com.dfsek.terra.api.world.biome.generation.pipeline.BiomeSource; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; -public class BiomePipelineImpl { +public class BiomePipeline { private final BiomeSource source; private final List stages; private final int size; private final int init; - private BiomePipelineImpl(BiomeSource source, List stages, int size, int init) { + private BiomePipeline(BiomeSource source, List stages, int size, int init) { this.source = source; this.stages = stages; this.size = size; @@ -29,10 +28,10 @@ public class BiomePipelineImpl { * @param z Chunk Z coord * @return BiomeHolder containing biomes. */ - public BiomeHolder getBiomes(int x, int z) { + public BiomeHolder getBiomes(int x, int z, long seed) { BiomeHolder holder = new BiomeHolderImpl(init, new Vector2(x * (init - 1), z * (init - 1))); - holder.fill(source); - for(Stage stage : stages) holder = stage.apply(holder); + holder.fill(source, seed); + for(Stage stage : stages) holder = stage.apply(holder, seed); return holder; } @@ -42,7 +41,7 @@ public class BiomePipelineImpl { public static final class BiomePipelineBuilder { private final int init; - List stages = new ArrayList<>(); + List stages = new ArrayList<>(); private int expand; public BiomePipelineBuilder(int init) { @@ -50,17 +49,15 @@ public class BiomePipelineImpl { expand = init; } - public BiomePipelineImpl build(BiomeSource source, long seed) { - List stagesBuilt = stages.stream().map(stageBuilder -> stageBuilder.apply(seed)).collect(Collectors.toList()); - - for(Stage stage : stagesBuilt) { + public BiomePipeline build(BiomeSource source) { + for(Stage stage : stages) { if(stage.isExpansion()) expand = expand * 2 - 1; } - return new BiomePipelineImpl(source, stagesBuilt, expand, init); + return new BiomePipeline(source, stages, expand, init); } - public BiomePipelineBuilder addStage(StageSeeded stage) { + public BiomePipelineBuilder addStage(Stage stage) { stages.add(stage); return this; } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java index e82f990d0..fec99804d 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java @@ -1,16 +1,23 @@ package com.dfsek.terra.addons.biome.pipeline; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.config.BiomePipelineTemplate; -import com.dfsek.terra.addons.biome.pipeline.config.BiomeProviderBuilderLoader; +import com.dfsek.terra.addons.biome.pipeline.config.BiomeProviderLoader; import com.dfsek.terra.addons.biome.pipeline.config.NoiseSourceTemplate; -import com.dfsek.terra.addons.biome.pipeline.config.SourceBuilderLoader; -import com.dfsek.terra.addons.biome.pipeline.config.stage.StageBuilderLoader; +import com.dfsek.terra.addons.biome.pipeline.config.SourceLoader; +import com.dfsek.terra.addons.biome.pipeline.config.stage.StageLoader; import com.dfsek.terra.addons.biome.pipeline.config.stage.expander.ExpanderStageTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderListMutatorTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderMutatorTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceListMutatorTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceMutatorTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.SmoothMutatorTemplate; +import com.dfsek.terra.addons.biome.pipeline.mutator.BorderListMutator; +import com.dfsek.terra.addons.biome.pipeline.mutator.BorderMutator; +import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceListMutator; +import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceMutator; +import com.dfsek.terra.addons.biome.pipeline.mutator.SmoothMutator; +import com.dfsek.terra.addons.biome.pipeline.source.NoiseSource; import com.dfsek.terra.addons.biome.pipeline.stages.ExpanderStage; import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage; import com.dfsek.terra.api.TerraPlugin; @@ -21,10 +28,9 @@ import com.dfsek.terra.api.addon.annotations.Version; import com.dfsek.terra.api.event.EventListener; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.injection.annotations.Inject; -import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder; -import com.dfsek.terra.api.util.seeded.SourceSeeded; - -import java.lang.reflect.Type; +import com.dfsek.terra.api.util.reflection.TypeKey; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.biome.generation.pipeline.BiomeSource; @Addon("biome-provider-pipeline") @Author("Terra") @@ -33,24 +39,27 @@ public class BiomePipelineAddon extends TerraAddon implements EventListener { @Inject private TerraPlugin main; + public static final TypeKey BIOME_PROVIDER_BUILDER_TOKEN = new TypeKey<>(){}; + public static final TypeKey BIOME_SOURCE_BUILDER_TOKEN = new TypeKey<>(){}; + @Override public void initialize() { main.getEventManager().registerListener(this, this); } public void onPackLoad(ConfigPackPreLoadEvent event) { - event.getPack().applyLoader(SourceSeeded.class, new SourceBuilderLoader()) - .applyLoader(StageSeeded.class, new StageBuilderLoader()) + event.getPack().applyLoader(BIOME_SOURCE_BUILDER_TOKEN.getType(), new SourceLoader()) + .applyLoader(Stage.class, new StageLoader()) .applyLoader(ExpanderStage.Type.class, (c, o, l) -> ExpanderStage.Type.valueOf((String) o)) .applyLoader(MutatorStage.Type.class, (c, o, l) -> MutatorStage.Type.valueOf((String) o)) - .applyLoader(NoiseSourceTemplate.class, NoiseSourceTemplate::new) - .applyLoader(ReplaceMutatorTemplate.class, ReplaceMutatorTemplate::new) - .applyLoader(BorderMutatorTemplate.class, BorderMutatorTemplate::new) - .applyLoader(BorderListMutatorTemplate.class, BorderListMutatorTemplate::new) - .applyLoader(ReplaceListMutatorTemplate.class, ReplaceListMutatorTemplate::new) - .applyLoader(SmoothMutatorTemplate.class, SmoothMutatorTemplate::new) - .applyLoader(ExpanderStageTemplate.class, ExpanderStageTemplate::new) - .applyLoader((Type) BiomePipelineTemplate.class, () -> new BiomePipelineTemplate(main)) - .applyLoader(BiomeProviderBuilder.class, new BiomeProviderBuilderLoader()); + .applyLoader(NoiseSource.class, NoiseSourceTemplate::new) + .applyLoader(ReplaceMutator.class, ReplaceMutatorTemplate::new) + .applyLoader(BorderMutator.class, BorderMutatorTemplate::new) + .applyLoader(BorderListMutator.class, BorderListMutatorTemplate::new) + .applyLoader(ReplaceListMutator.class, ReplaceListMutatorTemplate::new) + .applyLoader(SmoothMutator.class, SmoothMutatorTemplate::new) + .applyLoader(ExpanderStage.class, ExpanderStageTemplate::new) + .applyLoader(BiomePipelineProvider.class, () -> new BiomePipelineTemplate(main)) + .applyLoader(BIOME_PROVIDER_BUILDER_TOKEN.getType(), new BiomeProviderLoader()); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java new file mode 100644 index 000000000..21aa51e6e --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java @@ -0,0 +1,81 @@ +package com.dfsek.terra.addons.biome.pipeline; + +import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import net.jafama.FastMath; +import org.jetbrains.annotations.NotNull; + +public class BiomePipelineProvider implements BiomeProvider { + private final LoadingCache holderCache; + private final BiomePipeline pipeline; + private final int resolution; + private final NoiseSampler mutator; + private final double noiseAmp; + + public BiomePipelineProvider(BiomePipeline pipeline, TerraPlugin main, int resolution, NoiseSampler mutator, double noiseAmp) { + this.resolution = resolution; + this.mutator = mutator; + this.noiseAmp = noiseAmp; + holderCache = CacheBuilder.newBuilder() + .maximumSize(main == null ? 32 : main.getTerraConfig().getProviderCache()) + .build( + new CacheLoader() { + @Override + public BiomeHolder load(@NotNull SeededVector key) { + return pipeline.getBiomes(key.x, key.z, key.seed); + } + } + ); + this.pipeline = pipeline; + } + + @Override + public TerraBiome getBiome(int x, int z, long seed) { + x += mutator.getNoiseSeeded(seed + 1, x, z) * noiseAmp; + z += mutator.getNoiseSeeded(seed + 2, x, z) * noiseAmp; + + + x = FastMath.floorToInt(FastMath.floorDiv(x, resolution)); + + z = FastMath.floorToInt(FastMath.floorDiv(z, resolution)); + + int fdX = FastMath.floorDiv(x, pipeline.getSize()); + int fdZ = FastMath.floorDiv(z, pipeline.getSize()); + return holderCache.getUnchecked(new SeededVector(fdX, fdZ, seed)).getBiome(x - fdX * pipeline.getSize(), z - fdZ * pipeline.getSize()); + } + + private static final class SeededVector { + private final int x; + private final int z; + private final long seed; + + private SeededVector(int x, int z, long seed) { + this.x = x; + this.z = z; + this.seed = seed; + } + + @Override + public int hashCode() { + int result = 0; + result = 31 * result + ((int) (seed ^ (seed >>> 32))); + result = 31 * result + x; + result = 31 * result + z; + return result; + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof SeededVector)) return false; + SeededVector that = (SeededVector) obj; + + return this.seed == that.seed && this.x == that.x && this.z == that.z; + } + } +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/StageSeeded.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/StageSeeded.java deleted file mode 100644 index b01109fe0..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/StageSeeded.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline; - -import com.dfsek.terra.addons.biome.pipeline.api.Stage; -import com.dfsek.terra.api.util.seeded.SeededBuilder; - -@FunctionalInterface -public interface StageSeeded extends SeededBuilder { -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/StandardBiomeProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/StandardBiomeProvider.java deleted file mode 100644 index 387f2917a..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/StandardBiomeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline; - -import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.vector.Vector2; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import net.jafama.FastMath; -import org.jetbrains.annotations.NotNull; - -public class StandardBiomeProvider implements BiomeProvider { - private final LoadingCache holderCache; - private final BiomePipelineImpl pipeline; - private final int resolution; - private final NoiseSampler mutator; - private final double noiseAmp; - private final int seed; - - public StandardBiomeProvider(BiomePipelineImpl pipeline, TerraPlugin main, int resolution, NoiseSampler mutator, double noiseAmp, int seed) { - this.resolution = resolution; - this.mutator = mutator; - this.noiseAmp = noiseAmp; - this.seed = seed; - holderCache = CacheBuilder.newBuilder() - .maximumSize(main == null ? 32 : main.getTerraConfig().getProviderCache()) - .build( - new CacheLoader() { - @Override - public BiomeHolder load(@NotNull Vector2 key) { - return pipeline.getBiomes(key.getBlockX(), key.getBlockZ()); - } - } - ); - this.pipeline = pipeline; - } - - @Override - public TerraBiome getBiome(int x, int z) { - x += mutator.getNoiseSeeded(seed, x, z) * noiseAmp; - z += mutator.getNoiseSeeded(1 + seed, x, z) * noiseAmp; - - - x = FastMath.floorToInt(FastMath.floorDiv(x, resolution)); - - z = FastMath.floorToInt(FastMath.floorDiv(z, resolution)); - - int fdX = FastMath.floorDiv(x, pipeline.getSize()); - int fdZ = FastMath.floorDiv(z, pipeline.getSize()); - return holderCache.getUnchecked(new Vector2(fdX, fdZ)).getBiome(x - fdX * pipeline.getSize(), z - fdZ * pipeline.getSize()); - } -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeExpander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeExpander.java index 3a00706ab..39bc22f73 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeExpander.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeExpander.java @@ -3,5 +3,5 @@ package com.dfsek.terra.addons.biome.pipeline.api; import com.dfsek.terra.api.world.biome.TerraBiome; public interface BiomeExpander { - TerraBiome getBetween(double x, double z, TerraBiome... others); + TerraBiome getBetween(double x, double z, long seed, TerraBiome... others); } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java index 8c9d9711a..1757176a1 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java @@ -4,11 +4,11 @@ import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.pipeline.BiomeSource; public interface BiomeHolder { - BiomeHolder expand(BiomeExpander expander); + BiomeHolder expand(BiomeExpander expander, long seed); - void mutate(BiomeMutator mutator); + void mutate(BiomeMutator mutator, long seed); - void fill(BiomeSource source); + void fill(BiomeSource source, long seed); TerraBiome getBiome(int x, int z); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java index abb8d2258..547409b5a 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java @@ -3,7 +3,7 @@ package com.dfsek.terra.addons.biome.pipeline.api; import com.dfsek.terra.api.world.biome.TerraBiome; public interface BiomeMutator { - TerraBiome mutate(ViewPoint viewPoint, double x, double z); + TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed); class ViewPoint { private final BiomeHolder biomes; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java index 64d069c11..dbf9f2722 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java @@ -3,6 +3,6 @@ package com.dfsek.terra.addons.biome.pipeline.api; public interface Stage { boolean isExpansion(); - BiomeHolder apply(BiomeHolder in); + BiomeHolder apply(BiomeHolder in, long seed); } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomePipelineTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomePipelineTemplate.java index 80708faef..a9d4a04eb 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomePipelineTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomePipelineTemplate.java @@ -2,12 +2,12 @@ package com.dfsek.terra.addons.biome.pipeline.config; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.addons.biome.pipeline.BiomePipelineImpl; -import com.dfsek.terra.addons.biome.pipeline.StageSeeded; -import com.dfsek.terra.addons.biome.pipeline.StandardBiomeProvider; +import com.dfsek.terra.addons.biome.pipeline.BiomePipeline; +import com.dfsek.terra.addons.biome.pipeline.BiomePipelineProvider; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.util.seeded.SourceSeeded; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.biome.generation.pipeline.BiomeSource; import java.util.List; @@ -19,20 +19,20 @@ public class BiomePipelineTemplate extends BiomeProviderTemplate { private int initialSize = 2; @Value("pipeline.stages") - private List stages; + private List stages; @Value("pipeline.source") - private SourceSeeded source; + private BiomeSource source; public BiomePipelineTemplate(TerraPlugin main) { this.main = main; } @Override - public BiomeProvider build(long seed) { - BiomePipelineImpl.BiomePipelineBuilder biomePipelineBuilder = new BiomePipelineImpl.BiomePipelineBuilder(initialSize); + public BiomeProvider get() { + BiomePipeline.BiomePipelineBuilder biomePipelineBuilder = new BiomePipeline.BiomePipelineBuilder(initialSize); stages.forEach(biomePipelineBuilder::addStage); - BiomePipelineImpl pipeline = biomePipelineBuilder.build(source.apply(seed), seed); - return new StandardBiomeProvider(pipeline, main, resolution, blend.apply(seed), blendAmp, (int) seed); + BiomePipeline pipeline = biomePipelineBuilder.build(source); + return new BiomePipelineProvider(pipeline, main, resolution, blend, blendAmp); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderBuilderLoader.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderBuilderLoader.java deleted file mode 100644 index bbd40e302..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderBuilderLoader.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.config; - -import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder; - -import java.lang.reflect.AnnotatedType; -import java.lang.reflect.Type; - -public class BiomeProviderBuilderLoader implements TypeLoader { - @Override - public BiomeProviderBuilder load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException { - return loader.loadType(BiomePipelineTemplate.class, c); // TODO: actually implement this lol - } -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderLoader.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderLoader.java new file mode 100644 index 000000000..2d181efe7 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderLoader.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.addons.biome.pipeline.config; + +import com.dfsek.tectonic.exception.LoadException; +import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.addons.biome.pipeline.BiomePipelineProvider; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + +import java.lang.reflect.AnnotatedType; + +public class BiomeProviderLoader implements TypeLoader { + @Override + public BiomeProvider load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException { + return loader.loadType(BiomePipelineProvider.class, c); // TODO: actually implement this lol + } +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java index 748219b3d..97e79d107 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java @@ -3,22 +3,17 @@ package com.dfsek.terra.addons.biome.pipeline.config; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -public abstract class BiomeProviderTemplate implements ObjectTemplate, BiomeProviderBuilder { +public abstract class BiomeProviderTemplate implements ObjectTemplate { @Value("resolution") @Default protected int resolution = 1; @Value("blend.noise") @Default - protected NoiseSeeded blend = NoiseSeeded.zero(2); + protected NoiseSampler blend = NoiseSampler.zero(); @Value("blend.amplitude") @Default protected double blendAmp = 0d; - - @Override - public BiomeProviderBuilder get() { - return this; - } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/NoiseSourceTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/NoiseSourceTemplate.java index 1b478c3c0..ab425be7b 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/NoiseSourceTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/NoiseSourceTemplate.java @@ -1,21 +1,21 @@ package com.dfsek.terra.addons.biome.pipeline.config; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.addons.biome.pipeline.source.RandomSource; +import com.dfsek.terra.addons.biome.pipeline.source.NoiseSource; +import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; +import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.pipeline.BiomeSource; public class NoiseSourceTemplate extends SourceTemplate { @Value("noise") - private NoiseSeeded noise; + private NoiseSampler noise; @Value("biomes") - private ProbabilityCollection biomes; + private ProbabilityCollection biomes; @Override - public BiomeSource apply(Long seed) { - return new RandomSource(biomes.map((biome) -> biome.apply(seed), false), noise.apply(seed)); + public BiomeSource get() { + return new NoiseSource(biomes, noise); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceBuilderLoader.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceLoader.java similarity index 67% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceBuilderLoader.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceLoader.java index bb0a082de..792f5455b 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceBuilderLoader.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceLoader.java @@ -3,23 +3,22 @@ package com.dfsek.terra.addons.biome.pipeline.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.util.seeded.SourceSeeded; +import com.dfsek.terra.addons.biome.pipeline.source.NoiseSource; import com.dfsek.terra.api.world.biome.generation.pipeline.BiomeSource; import java.lang.reflect.AnnotatedType; -import java.lang.reflect.Type; import java.util.Map; @SuppressWarnings("unchecked") -public class SourceBuilderLoader implements TypeLoader { +public class SourceLoader implements TypeLoader { @Override - public SourceSeeded load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException { + public BiomeSource load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException { Map source = (Map) c; BiomeSource.Type type = loader.loadType(BiomeSource.Type.class, source.get("type")); if(type == BiomeSource.Type.NOISE) { - return loader.loadType(NoiseSourceTemplate.class, source); + return loader.loadType(NoiseSource.class, source); } throw new LoadException("No such loader type: " + type); } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java index e3c9333c6..c85785ec1 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java @@ -1,11 +1,8 @@ package com.dfsek.terra.addons.biome.pipeline.config; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.api.util.seeded.SourceSeeded; +import com.dfsek.terra.api.world.biome.generation.pipeline.BiomeSource; + +public abstract class SourceTemplate implements ObjectTemplate{ -public abstract class SourceTemplate implements ObjectTemplate, SourceSeeded { - @Override - public SourceSeeded get() { - return this; - } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageBuilderLoader.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageLoader.java similarity index 66% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageBuilderLoader.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageLoader.java index 762e0eb66..6805f4fcb 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageBuilderLoader.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageLoader.java @@ -3,24 +3,28 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.addons.biome.pipeline.StageSeeded; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.config.stage.expander.ExpanderStageTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderListMutatorTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderMutatorTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceListMutatorTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceMutatorTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.SmoothMutatorTemplate; +import com.dfsek.terra.addons.biome.pipeline.mutator.BorderListMutator; +import com.dfsek.terra.addons.biome.pipeline.mutator.BorderMutator; +import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceListMutator; +import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceMutator; +import com.dfsek.terra.addons.biome.pipeline.mutator.SmoothMutator; import com.dfsek.terra.addons.biome.pipeline.stages.ExpanderStage; import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage; import java.lang.reflect.AnnotatedType; -import java.lang.reflect.Type; import java.util.Map; @SuppressWarnings("unchecked") -public class StageBuilderLoader implements TypeLoader { +public class StageLoader implements TypeLoader { @Override - public StageSeeded load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException { + public Stage load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException { Map raw = (Map) c; if(raw.size() != 1) throw new LoadException("Illegal stage map size: " + raw.size()); @@ -36,20 +40,20 @@ public class StageBuilderLoader implements TypeLoader { if(entry.getKey().equals("expand")) { ExpanderStage.Type stageType = loader.loadType(ExpanderStage.Type.class, mutator.get("type")); if(stageType.equals(ExpanderStage.Type.FRACTAL)) { - return loader.loadType(ExpanderStageTemplate.class, mutator); + return loader.loadType(ExpanderStage.class, mutator); } else throw new LoadException("No such expander \"" + stageType + "\""); } else if(entry.getKey().equals("mutate")) { switch(loader.loadType(MutatorStage.Type.class, mutator.get("type"))) { case SMOOTH: - return loader.loadType(SmoothMutatorTemplate.class, mutator); + return new MutatorStage(loader.loadType(SmoothMutator.class, mutator)); case REPLACE: - return loader.loadType(ReplaceMutatorTemplate.class, mutator); + return new MutatorStage(loader.loadType(ReplaceMutator.class, mutator)); case REPLACE_LIST: - return loader.loadType(ReplaceListMutatorTemplate.class, mutator); + return new MutatorStage(loader.loadType(ReplaceListMutator.class, mutator)); case BORDER: - return loader.loadType(BorderMutatorTemplate.class, mutator); + return new MutatorStage(loader.loadType(BorderMutator.class, mutator)); case BORDER_LIST: - return loader.loadType(BorderListMutatorTemplate.class, mutator); + return new MutatorStage(loader.loadType(BorderListMutator.class, mutator)); default: throw new LoadException("No such mutator type \"" + mutator.get("type")); } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageTemplate.java index bf3349fa0..64fe3a369 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageTemplate.java @@ -2,17 +2,10 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.addons.biome.pipeline.StageSeeded; import com.dfsek.terra.addons.biome.pipeline.api.Stage; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; -import com.dfsek.terra.api.util.seeded.SeededBuilder; +import com.dfsek.terra.api.noise.NoiseSampler; -public abstract class StageTemplate implements ObjectTemplate>, StageSeeded { +public abstract class StageTemplate implements ObjectTemplate { @Value("noise") - protected NoiseSeeded noise; - - @Override - public StageSeeded get() { - return this; - } + protected NoiseSampler noise; } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/expander/ExpanderStageTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/expander/ExpanderStageTemplate.java index e42f44f56..6ccf0e9af 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/expander/ExpanderStageTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/expander/ExpanderStageTemplate.java @@ -7,7 +7,7 @@ import com.dfsek.terra.addons.biome.pipeline.stages.ExpanderStage; public class ExpanderStageTemplate extends StageTemplate { @Override - public Stage apply(Long seed) { - return new ExpanderStage(new FractalExpander(noise.apply(seed))); + public Stage get() { + return new ExpanderStage(new FractalExpander(noise)); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java index 7a1348734..9ced2ae5a 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java @@ -4,10 +4,8 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.mutator.BorderListMutator; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; import com.dfsek.terra.api.world.biome.TerraBiome; -import java.util.HashMap; import java.util.Map; @SuppressWarnings("unused") @@ -19,18 +17,14 @@ public class BorderListMutatorTemplate extends MutatorStageTemplate { private String defaultReplace; @Value("default-to") - private ProbabilityCollection defaultTo; + private ProbabilityCollection defaultTo; @Value("replace") - private Map> replace; + private Map> replace; @Override - public BiomeMutator build(long seed) { - Map> replaceMap = new HashMap<>(); - - replace.forEach((keyBuilder, replacements) -> replaceMap.put(keyBuilder.apply(seed), replacements.map(replacement -> replacement.apply(seed), true))); - - return new BorderListMutator(replaceMap, from, defaultReplace, noise.apply(seed), defaultTo.map(biomeBuilder -> biomeBuilder.apply(seed), true)); + public BiomeMutator get() { + return new BorderListMutator(replace, from, defaultReplace, noise, defaultTo); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java index 4632b735d..3bf37de7d 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.mutator.BorderMutator; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; +import com.dfsek.terra.api.world.biome.TerraBiome; @SuppressWarnings("unused") public class BorderMutatorTemplate extends MutatorStageTemplate { @@ -15,10 +15,10 @@ public class BorderMutatorTemplate extends MutatorStageTemplate { private String replace; @Value("to") - private ProbabilityCollection to; + private ProbabilityCollection to; @Override - public BiomeMutator build(long seed) { - return new BorderMutator(from, replace, noise.apply(seed), to.map(biomeBuilder -> biomeBuilder.apply(seed), true)); + public BiomeMutator get() { + return new BorderMutator(from, replace, noise, to); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/MutatorStageTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/MutatorStageTemplate.java index e5abaa54e..285b55c93 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/MutatorStageTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/MutatorStageTemplate.java @@ -1,15 +1,15 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.loading.object.ObjectTemplate; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; -import com.dfsek.terra.addons.biome.pipeline.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage; +import com.dfsek.terra.api.noise.NoiseSampler; -public abstract class MutatorStageTemplate extends StageTemplate { - public abstract BiomeMutator build(long seed); +public abstract class MutatorStageTemplate implements ObjectTemplate { + @Value("noise") + protected NoiseSampler noise; @Override - public Stage apply(Long seed) { - return new MutatorStage(build(seed)); - } + public abstract BiomeMutator get(); } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java index bbd1b2a3a..07d60fb56 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java @@ -4,10 +4,8 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceListMutator; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; import com.dfsek.terra.api.world.biome.TerraBiome; -import java.util.HashMap; import java.util.Map; @SuppressWarnings("unused") @@ -16,17 +14,13 @@ public class ReplaceListMutatorTemplate extends MutatorStageTemplate { private String defaultFrom; @Value("default-to") - private ProbabilityCollection defaultTo; + private ProbabilityCollection defaultTo; @Value("to") - private Map> replace; + private Map> replace; @Override - public BiomeMutator build(long seed) { - Map> replaceMap = new HashMap<>(); - - replace.forEach((biomeBuilder, biomeBuilders) -> replaceMap.put(biomeBuilder.apply(seed), biomeBuilders.map(builder -> builder.apply(seed), true))); - - return new ReplaceListMutator(replaceMap, defaultFrom, defaultTo.map(biomeBuilder -> biomeBuilder.apply(seed), true), noise.apply(seed)); + public BiomeMutator get() { + return new ReplaceListMutator(replace, defaultFrom, defaultTo, noise); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java index 365da2c42..7659a0478 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceMutator; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; +import com.dfsek.terra.api.world.biome.TerraBiome; @SuppressWarnings("unused") public class ReplaceMutatorTemplate extends MutatorStageTemplate { @@ -12,10 +12,10 @@ public class ReplaceMutatorTemplate extends MutatorStageTemplate { private String from; @Value("to") - private ProbabilityCollection to; + private ProbabilityCollection to; @Override - public BiomeMutator build(long seed) { - return new ReplaceMutator(from, to.map(biomeBuilder -> biomeBuilder.apply(seed), true), noise.apply(seed)); + public BiomeMutator get() { + return new ReplaceMutator(from, to, noise); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java index 722d0ca03..20f98e993 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java @@ -5,7 +5,7 @@ import com.dfsek.terra.addons.biome.pipeline.mutator.SmoothMutator; public class SmoothMutatorTemplate extends MutatorStageTemplate { @Override - public BiomeMutator build(long seed) { - return new SmoothMutator(noise.apply(seed)); + public BiomeMutator get() { + return new SmoothMutator(noise); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java index fa9532737..894d2a86a 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java @@ -13,7 +13,7 @@ public class FractalExpander implements BiomeExpander { } @Override - public TerraBiome getBetween(double x, double z, TerraBiome... others) { - return others[MathUtil.normalizeIndex(sampler.getNoise(x, z), others.length)]; + public TerraBiome getBetween(double x, double z, long seed, TerraBiome... others) { + return others[MathUtil.normalizeIndex(sampler.getNoiseSeeded(seed, x, z), others.length)]; } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java index b99c2e841..53273973e 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java @@ -23,7 +23,7 @@ public class BorderListMutator implements BiomeMutator { } @Override - public TerraBiome mutate(ViewPoint viewPoint, double x, double z) { + public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { TerraBiome origin = viewPoint.getBiome(0, 0); if(origin.getTags().contains(defaultReplace)) { for(int xi = -1; xi <= 1; xi++) { @@ -33,10 +33,10 @@ public class BorderListMutator implements BiomeMutator { if(current == null) continue; if(current.getTags().contains(border)) { if(replace.containsKey(origin)) { - TerraBiome biome = replace.get(origin).get(noiseSampler, x, z); + TerraBiome biome = replace.get(origin).get(noiseSampler, x, z, seed); return biome == null ? origin : biome; } - TerraBiome biome = replaceDefault.get(noiseSampler, x, z); + TerraBiome biome = replaceDefault.get(noiseSampler, x, z, seed); return biome == null ? origin : biome; } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java index e09b0e17b..dfd54aa9c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java @@ -19,7 +19,7 @@ public class BorderMutator implements BiomeMutator { } @Override - public TerraBiome mutate(ViewPoint viewPoint, double x, double z) { + public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { TerraBiome origin = viewPoint.getBiome(0, 0); if(origin.getTags().contains(replaceTag)) { for(int xi = -1; xi <= 1; xi++) { @@ -28,7 +28,7 @@ public class BorderMutator implements BiomeMutator { TerraBiome current = viewPoint.getBiome(xi, zi); if(current == null) continue; if(current.getTags().contains(border)) { - TerraBiome biome = replace.get(noiseSampler, x, z); + TerraBiome biome = replace.get(noiseSampler, x, z, seed); return biome == null ? origin : biome; } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java index 029a9b668..8bdb314b8 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java @@ -21,14 +21,14 @@ public class ReplaceListMutator implements BiomeMutator { } @Override - public TerraBiome mutate(ViewPoint viewPoint, double x, double z) { + public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { TerraBiome center = viewPoint.getBiome(0, 0); if(replace.containsKey(center)) { - TerraBiome biome = replace.get(center).get(sampler, x, z); + TerraBiome biome = replace.get(center).get(sampler, x, z, seed); return biome == null ? viewPoint.getBiome(0, 0) : biome; } if(viewPoint.getBiome(0, 0).getTags().contains(defaultTag)) { - TerraBiome biome = replaceDefault.get(sampler, x, z); + TerraBiome biome = replaceDefault.get(sampler, x, z, seed); return biome == null ? viewPoint.getBiome(0, 0) : biome; } return center; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java index 59899c322..ec1c7437c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java @@ -17,9 +17,9 @@ public class ReplaceMutator implements BiomeMutator { } @Override - public TerraBiome mutate(ViewPoint viewPoint, double x, double z) { + public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { if(viewPoint.getBiome(0, 0).getTags().contains(replaceableTag)) { - TerraBiome biome = replace.get(sampler, x, z); + TerraBiome biome = replace.get(sampler, x, z, seed); return biome == null ? viewPoint.getBiome(0, 0) : biome; } return viewPoint.getBiome(0, 0); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java index a62966a67..ac1c7c8a0 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java @@ -16,7 +16,7 @@ public class SmoothMutator implements BiomeMutator { } @Override - public TerraBiome mutate(ViewPoint viewPoint, double x, double z) { + public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { TerraBiome top = viewPoint.getBiome(1, 0); TerraBiome bottom = viewPoint.getBiome(-1, 0); TerraBiome left = viewPoint.getBiome(0, 1); @@ -27,7 +27,7 @@ public class SmoothMutator implements BiomeMutator { boolean horiz = Objects.equals(left, right) && left != null; if(vert && horiz) { - return MathUtil.normalizeIndex(sampler.getNoise(x, z), 2) == 0 ? left : top; + return MathUtil.normalizeIndex(sampler.getNoiseSeeded(seed, x, z), 2) == 0 ? left : top; } if(vert) return top; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/RandomSource.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/NoiseSource.java similarity index 65% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/RandomSource.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/NoiseSource.java index 1c414ec11..9edc2859f 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/RandomSource.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/NoiseSource.java @@ -5,17 +5,17 @@ import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.pipeline.BiomeSource; -public class RandomSource implements BiomeSource { +public class NoiseSource implements BiomeSource { private final ProbabilityCollection biomes; private final NoiseSampler sampler; - public RandomSource(ProbabilityCollection biomes, NoiseSampler sampler) { + public NoiseSource(ProbabilityCollection biomes, NoiseSampler sampler) { this.biomes = biomes; this.sampler = sampler; } @Override - public TerraBiome getBiome(double x, double z) { - return biomes.get(sampler, x, z); + public TerraBiome getBiome(double x, double z, long seed) { + return biomes.get(sampler, x, z, seed); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java index d73726634..839febab5 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java @@ -17,8 +17,8 @@ public class ExpanderStage implements Stage { } @Override - public BiomeHolder apply(BiomeHolder in) { - return in.expand(expander); + public BiomeHolder apply(BiomeHolder in, long seed) { + return in.expand(expander, seed); } public enum Type { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java index fc6a18003..4f5f6bf6e 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java @@ -17,8 +17,8 @@ public class MutatorStage implements Stage { } @Override - public BiomeHolder apply(BiomeHolder in) { - in.mutate(mutator); + public BiomeHolder apply(BiomeHolder in, long seed) { + in.mutate(mutator, seed); return in; } diff --git a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java index e819c075f..2b171547f 100644 --- a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java +++ b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java @@ -1,10 +1,9 @@ package com.dfsek.terra.addons.biome.single; -import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -public class SingleBiomeProvider implements BiomeProvider, BiomeProviderBuilder { +public class SingleBiomeProvider implements BiomeProvider { private final TerraBiome biome; public SingleBiomeProvider(TerraBiome biome) { @@ -12,12 +11,7 @@ public class SingleBiomeProvider implements BiomeProvider, BiomeProviderBuilder } @Override - public TerraBiome getBiome(int x, int z) { + public TerraBiome getBiome(int x, int z, long seed) { return biome; } - - @Override - public BiomeProvider build(long seed) { - return this; - } } diff --git a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderTemplate.java b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderTemplate.java index ae22f7e5d..77dd1567c 100644 --- a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderTemplate.java +++ b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderTemplate.java @@ -2,21 +2,15 @@ package com.dfsek.terra.addons.biome.single; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; -import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder; +import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -public class SingleBiomeProviderTemplate implements ObjectTemplate, BiomeProviderBuilder { +public class SingleBiomeProviderTemplate implements ObjectTemplate { @Value("biome") - private BiomeBuilder biome; + private TerraBiome biome; @Override - public BiomeProvider build(long seed) { - return new SingleBiomeProvider(biome.apply(seed)); - } - - @Override - public BiomeProviderBuilder get() { - return this; + public BiomeProvider get() { + return new SingleBiomeProvider(biome); } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java index d6340a8ed..6aa2c2ad5 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java @@ -15,7 +15,7 @@ import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.registry.exception.DuplicateEntryException; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; +import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider; @Addon("chunk-generator-noise-3d") @@ -37,8 +37,8 @@ public class NoiseChunkGenerator3DAddon extends TerraAddon implements EventListe } public void onBiomeLoad(ConfigurationLoadEvent event) { - if(event.is(BiomeBuilder.class)) { - event.getLoadedObject(BiomeBuilder.class).getContext().put(event.load(new BiomePaletteTemplate()).get()); + if(event.is(TerraBiome.class)) { + event.getLoadedObject(TerraBiome.class).getContext().put(event.load(new BiomePaletteTemplate()).get()); } } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/generators/NoiseChunkGenerator3D.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/generators/NoiseChunkGenerator3D.java index b7f3958d3..f19ca8fd5 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/generators/NoiseChunkGenerator3D.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/generators/NoiseChunkGenerator3D.java @@ -47,14 +47,15 @@ public class NoiseChunkGenerator3D implements TerraChunkGenerator { try(ProfileFrame ignore = main.getProfiler().profile("biomes")) { int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); + long seed = world.getSeed(); BiomeProvider grid = main.getWorld(world).getBiomeProvider(); for(int x = 0; x < 4; x++) { for(int z = 0; z < 4; z++) { int cx = xOrig + (x << 2); int cz = zOrig + (z << 2); - TerraBiome b = grid.getBiome(cx, cz); + TerraBiome b = grid.getBiome(cx, cz, seed); - biome.setBiome(cx, cz, b.getVanillaBiomes().get(b.getGenerator(world).getBiomeNoise(), cx, 0, cz)); + biome.setBiome(cx, cz, b.getVanillaBiomes().get(b.getGenerator(world).getBiomeNoise(), cx, 0, cz, world.getSeed())); } } } @@ -82,6 +83,8 @@ public class NoiseChunkGenerator3D implements TerraChunkGenerator { Sampler sampler = tw.getConfig().getSamplerCache().getChunk(chunkX, chunkZ); + long seed = world.getSeed(); + for(int x = 0; x < 16; x++) { for(int z = 0; z < 16; z++) { int paletteLevel = 0; @@ -89,7 +92,7 @@ public class NoiseChunkGenerator3D implements TerraChunkGenerator { int cx = xOrig + x; int cz = zOrig + z; - TerraBiome biome = grid.getBiome(cx, cz); + TerraBiome biome = grid.getBiome(cx, cz, seed); PaletteInfo paletteInfo = biome.getContext().get(PaletteInfo.class); @@ -108,12 +111,12 @@ public class NoiseChunkGenerator3D implements TerraChunkGenerator { if(sampler.sample(x, y, z) > 0) { justSet = true; - data = PaletteUtil.getPalette(x, y, z, generator, sampler, paletteInfo).get(paletteLevel, cx, y, cz); + data = PaletteUtil.getPalette(x, y, z, generator, sampler, paletteInfo).get(paletteLevel, cx, y, cz, seed); chunk.setBlock(x, y, z, data); paletteLevel++; } else if(y <= sea) { - chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, y, z + zOrig)); + chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, y, z + zOrig, seed)); justSet = false; paletteLevel = 0; @@ -167,7 +170,7 @@ public class NoiseChunkGenerator3D implements TerraChunkGenerator { public BlockState getBlock(World world, int x, int y, int z) { TerraWorld terraWorld = main.getWorld(world); BiomeProvider provider = terraWorld.getBiomeProvider(); - TerraBiome biome = provider.getBiome(x, z); + TerraBiome biome = provider.getBiome(x, z, world.getSeed()); Sampler sampler = terraWorld.getConfig().getSamplerCache().get(x, z); PaletteInfo paletteInfo = biome.getContext().get(PaletteInfo.class); @@ -181,9 +184,9 @@ public class NoiseChunkGenerator3D implements TerraChunkGenerator { if(sampler.sample(fdX, yi, fdZ) > 0) level++; else level = 0; } - return palette.get(level, x, y, z); + return palette.get(level, x, y, z, world.getSeed()); } else if(y <= paletteInfo.getSeaLevel()) { - return paletteInfo.getOcean().get(paletteInfo.getSeaLevel() - y, x, y, z); + return paletteInfo.getOcean().get(paletteInfo.getSeaLevel() - y, x, y, z, world.getSeed()); } else return air; } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator2D.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator2D.java index 96ea6be8d..72c83a804 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator2D.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator2D.java @@ -32,11 +32,13 @@ public class ChunkInterpolator2D implements ChunkInterpolator { int xOrigin = chunkX << 4; int zOrigin = chunkZ << 4; + long seed = w.getSeed(); + double[][] noiseStorage = new double[5][5]; for(int x = 0; x < 5; x++) { for(int z = 0; z < 5; z++) { - Generator generator = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2)).getGenerator(w); + Generator generator = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed).getGenerator(w); Map genMap = new HashMap<>(); int step = generator.getBlendStep(); @@ -44,7 +46,7 @@ public class ChunkInterpolator2D implements ChunkInterpolator { for(int xi = -blend; xi <= blend; xi++) { for(int zi = -blend; zi <= blend; zi++) { - genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step)).getGenerator(w), g -> new MutableInteger(0)).increment(); // Increment by 1 + genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step), seed).getGenerator(w), g -> new MutableInteger(0)).increment(); // Increment by 1 } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator3D.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator3D.java index 0af1ab52e..4841398c8 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator3D.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator3D.java @@ -45,9 +45,11 @@ public class ChunkInterpolator3D implements ChunkInterpolator { double[][][] noiseStorage = new double[5][5][size + 1]; + long seed = w.getSeed(); + for(int x = 0; x < 5; x++) { for(int z = 0; z < 5; z++) { - Generator generator = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2)).getGenerator(w); + Generator generator = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed).getGenerator(w); Map genMap = new HashMap<>(); int step = generator.getBlendStep(); @@ -55,7 +57,7 @@ public class ChunkInterpolator3D implements ChunkInterpolator { for(int xi = -blend; xi <= blend; xi++) { for(int zi = -blend; zi <= blend; zi++) { - genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step)).getGenerator(w), g -> new MutableInteger(0)).increment(); // Increment by 1 + genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step), seed).getGenerator(w), g -> new MutableInteger(0)).increment(); // Increment by 1 } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java index bebd34b96..53a10f345 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java @@ -11,12 +11,14 @@ public class ElevationInterpolator { int xOrigin = chunkX << 4; int zOrigin = chunkZ << 4; + long seed = world.getSeed(); + Generator[][] gens = new Generator[18 + 2 * smooth][18 + 2 * smooth]; // Precompute generators. for(int x = -1 - smooth; x <= 16 + smooth; x++) { for(int z = -1 - smooth; z <= 16 + smooth; z++) { - gens[x + 1 + smooth][z + 1 + smooth] = provider.getBiome(xOrigin + x, zOrigin + z).getGenerator(world); + gens[x + 1 + smooth][z + 1 + smooth] = provider.getBiome(xOrigin + x, zOrigin + z, seed).getGenerator(world); } } @@ -27,7 +29,7 @@ public class ElevationInterpolator { for(int xi = -smooth; xi <= smooth; xi++) { for(int zi = -smooth; zi <= smooth; zi++) { Generator gen = gens[x + 1 + smooth + xi][z + 1 + smooth + zi]; - noise += gen.getElevationSampler().getNoise(xOrigin + x, zOrigin + z) * gen.getElevationWeight(); + noise += gen.getElevationSampler().getNoiseSeeded(seed, xOrigin + x, zOrigin + z) * gen.getElevationWeight(); div += gen.getElevationWeight(); } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/Sampler3D.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/Sampler3D.java index ec4215f63..d0092503c 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/Sampler3D.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/Sampler3D.java @@ -12,7 +12,7 @@ public class Sampler3D implements Sampler { private final ElevationInterpolator elevationInterpolator; public Sampler3D(int x, int z, BiomeProvider provider, World world, int elevationSmooth) { - this.interpolator = new ChunkInterpolator3D(world, x, z, provider, (generator, coord) -> generator.getBaseSampler().getNoise(coord)); + this.interpolator = new ChunkInterpolator3D(world, x, z, provider, (generator, coord) -> generator.getBaseSampler().getNoiseSeeded(coord, world.getSeed())); this.elevationInterpolator = new ElevationInterpolator(world, x, z, provider, elevationSmooth); } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigAddon.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeAddon.java similarity index 93% rename from common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigAddon.java rename to common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeAddon.java index 1fae0d0e1..7ca4191f7 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigAddon.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeAddon.java @@ -14,7 +14,7 @@ import com.dfsek.terra.api.injection.annotations.Inject; @Addon("config-biome") @Author("Terra") @Version("1.0.0") -public class BiomeConfigAddon extends TerraAddon implements EventListener { +public class BiomeAddon extends TerraAddon implements EventListener { @Inject private TerraPlugin main; diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java index 5e255b2d4..7616a3e65 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java @@ -7,14 +7,17 @@ import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.registry.OpenRegistry; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; +import com.dfsek.terra.api.util.reflection.TypeKey; +import com.dfsek.terra.api.world.biome.TerraBiome; import java.util.function.Supplier; -public class BiomeConfigType implements ConfigType { +public class BiomeConfigType implements ConfigType { private final ConfigPack pack; private final BiomeFactory factory; + public static final TypeKey BIOME_TYPE_TOKEN = new TypeKey<>() {}; + public BiomeConfigType(ConfigPack pack) { this.pack = pack; this.factory = new BiomeFactory(pack); @@ -26,20 +29,20 @@ public class BiomeConfigType implements ConfigType } @Override - public ConfigFactory getFactory() { + public ConfigFactory getFactory() { return factory; } @Override - public Class getTypeClass() { - return BiomeBuilder.class; + public TypeKey getTypeClass() { + return BIOME_TYPE_TOKEN; } @Override - public Supplier> registrySupplier() { - return () -> pack.getRegistryFactory().create(registry -> (TypeLoader) (t, c, loader) -> { + public Supplier> registrySupplier() { + return () -> pack.getRegistryFactory().create(registry -> (TypeLoader) (t, c, loader) -> { if(c.equals("SELF")) return null; - BiomeBuilder obj = registry.get((String) c); + TerraBiome obj = registry.get((String) c); if(obj == null) throw new LoadException("No such " + t.getType().getTypeName() + " matching \"" + c + "\" was found in this registry."); return obj; diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeFactory.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeFactory.java index e3cd52015..1b2526193 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeFactory.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeFactory.java @@ -3,9 +3,9 @@ package com.dfsek.terra.addons.biome; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; +import com.dfsek.terra.api.world.biome.TerraBiome; -public class BiomeFactory implements ConfigFactory { +public class BiomeFactory implements ConfigFactory { private final ConfigPack pack; public BiomeFactory(ConfigPack pack) { @@ -13,7 +13,9 @@ public class BiomeFactory implements ConfigFactory } @Override - public BiomeBuilder build(BiomeTemplate template, TerraPlugin main) { - return new UserDefinedBiomeBuilder(template); + public TerraBiome build(BiomeTemplate template, TerraPlugin main) { + UserDefinedGenerator generator = new UserDefinedGenerator(template.getNoiseEquation(), template.getElevationEquation(), template.getCarvingEquation(), template.getBiomeNoise(), template.getElevationWeight(), + template.getBlendDistance(), template.getBlendStep(), template.getBlendWeight()); + return new UserDefinedBiome(template.getVanilla(), generator, template); } } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeTemplate.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeTemplate.java index 01fb7a3e0..5cc51de9e 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeTemplate.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeTemplate.java @@ -1,19 +1,16 @@ package com.dfsek.terra.addons.biome; -import com.dfsek.paralithic.eval.parser.Parser; -import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Final; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; -import com.dfsek.terra.addons.biome.holder.PaletteHolder; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.config.AbstractableTemplate; import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.generator.Palette; @@ -43,14 +40,14 @@ public class BiomeTemplate implements AbstractableTemplate, ValidatedConfigTempl @Value("beta.carving.equation") @Default - private NoiseSeeded carvingEquation = NoiseSeeded.zero(3); + private NoiseSampler carvingEquation = NoiseSampler.zero(); @Value("vanilla") private ProbabilityCollection vanilla; @Value("biome-noise") @Default - private NoiseSeeded biomeNoise = NoiseSeeded.zero(2); + private NoiseSampler biomeNoise = NoiseSampler.zero(); @Value("blend.distance") @Default @@ -65,7 +62,7 @@ public class BiomeTemplate implements AbstractableTemplate, ValidatedConfigTempl private int blendStep = 4; @Value("noise") - private NoiseSeeded noiseEquation; + private NoiseSampler noiseEquation; @Value("ocean.level") @Default @@ -73,7 +70,7 @@ public class BiomeTemplate implements AbstractableTemplate, ValidatedConfigTempl @Value("elevation.equation") @Default - private NoiseSeeded elevationEquation = NoiseSeeded.zero(2); + private NoiseSampler elevationEquation = NoiseSampler.zero(); @Value("elevation.weight") @Default @@ -160,15 +157,15 @@ public class BiomeTemplate implements AbstractableTemplate, ValidatedConfigTempl return stairPalettes; } - public NoiseSeeded getBiomeNoise() { + public NoiseSampler getBiomeNoise() { return biomeNoise; } - public NoiseSeeded getElevationEquation() { + public NoiseSampler getElevationEquation() { return elevationEquation; } - public NoiseSeeded getCarvingEquation() { + public NoiseSampler getCarvingEquation() { return carvingEquation; } @@ -188,7 +185,7 @@ public class BiomeTemplate implements AbstractableTemplate, ValidatedConfigTempl return vanilla; } - public NoiseSeeded getNoiseEquation() { + public NoiseSampler getNoiseEquation() { return noiseEquation; } @@ -207,36 +204,6 @@ public class BiomeTemplate implements AbstractableTemplate, ValidatedConfigTempl @Override public boolean validate() throws ValidationException { color |= 0xff000000; // Alpha adjustment - Parser tester = new Parser(); - Scope testScope = new Scope(); - - variables.forEach(testScope::create); - - testScope.addInvocationVariable("x"); - testScope.addInvocationVariable("y"); - testScope.addInvocationVariable("z"); - - - //pack.getTemplate().getNoiseBuilderMap().forEach((id, builder) -> tester.registerFunction(id, new BlankFunction(builder.getDimensions()))); // Register dummy functions - - try { - noiseEquation.apply(0L); - } catch(Exception e) { - throw new ValidationException("Invalid noise sampler: ", e); - } - - try { - carvingEquation.apply(0L); - } catch(Exception e) { - throw new ValidationException("Invalid carving sampler: ", e); - } - - try { - elevationEquation.apply(0L); - } catch(Exception e) { - throw new ValidationException("Invalid elevation sampler: ", e); - } - return true; } } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiome.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiome.java index d3a2332ea..015fdc728 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiome.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiome.java @@ -20,16 +20,15 @@ public class UserDefinedBiome implements TerraBiome { private final int color; private final Set tags; - private final Context context; + private final Context context = new Context(); - public UserDefinedBiome(ProbabilityCollection vanilla, UserDefinedGenerator gen, BiomeTemplate config, Context context) { + public UserDefinedBiome(ProbabilityCollection vanilla, UserDefinedGenerator gen, BiomeTemplate config) { this.vanilla = vanilla; this.gen = gen; this.id = config.getID(); this.config = config; this.color = config.getColor(); this.tags = config.getTags(); - this.context = context; tags.add("BIOME:" + id); } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiomeBuilder.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiomeBuilder.java deleted file mode 100644 index 9d4a25a6f..000000000 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiomeBuilder.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.dfsek.terra.addons.biome; - -import com.dfsek.terra.api.properties.Context; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; -import com.dfsek.terra.api.world.biome.Biome; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class UserDefinedBiomeBuilder implements BiomeBuilder { - private final BiomeTemplate template; - private final Context context = new Context(); - - private final Map biomeMap = new ConcurrentHashMap<>(); - - public UserDefinedBiomeBuilder(BiomeTemplate template) { - this.template = template; - } - - @Override - public UserDefinedBiome apply(Long seed) { - synchronized(biomeMap) { - return biomeMap.computeIfAbsent(seed, - s -> { - UserDefinedGenerator generator = new UserDefinedGenerator(template.getNoiseEquation().apply(seed), template.getElevationEquation().apply(seed), template.getCarvingEquation().apply(seed), template.getBiomeNoise().apply(seed), template.getElevationWeight(), - template.getBlendDistance(), template.getBlendStep(), template.getBlendWeight()); - return new UserDefinedBiome(template.getVanilla(), generator, template, context); - } - ); - } - } - - @Override - public ProbabilityCollection getVanillaBiomes() { - return template.getVanilla(); - } - - @Override - public Context getContext() { - return context; - } -} diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/AsyncBiomeFinder.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/AsyncBiomeFinder.java index c6278a50a..c639d772d 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/AsyncBiomeFinder.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/AsyncBiomeFinder.java @@ -46,7 +46,7 @@ public class AsyncBiomeFinder implements Runnable { */ public boolean isValid(int x, int z, TerraBiome target) { int res = main.getTerraConfig().getBiomeSearchResolution(); - return getProvider().getBiome(x * res, z * res).equals(target); + return getProvider().getBiome(x * res, z * res, world.getSeed()).equals(target); } public Vector3 finalizeVector(Vector3 orig) { diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeCommand.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeCommand.java index e4bbd74b5..42f5b9db3 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeCommand.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeCommand.java @@ -38,7 +38,7 @@ public class BiomeCommand implements CommandTemplate { Player player = (Player) sender; BiomeProvider provider = main.getWorld(player.world()).getBiomeProvider(); - UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome(player.position()); + UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome(player.position(), player.world().getSeed()); sender.sendMessage("You are standing in " + biome.getID()); } } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeInfoCommand.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeInfoCommand.java index b208484a4..76d840cea 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeInfoCommand.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeInfoCommand.java @@ -9,11 +9,8 @@ import com.dfsek.terra.api.command.annotation.Argument; import com.dfsek.terra.api.command.annotation.Command; import com.dfsek.terra.api.command.annotation.inject.ArgumentTarget; import com.dfsek.terra.api.entity.CommandSender; -import com.dfsek.terra.api.structure.ConfiguredStructure; import com.dfsek.terra.api.world.biome.TerraBiome; -import java.util.List; - @Command( arguments = { @Argument( diff --git a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverCache.java b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverCache.java index 498d88f6f..496a2861d 100644 --- a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverCache.java +++ b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverCache.java @@ -39,7 +39,7 @@ public class CarverCache { List points = new ArrayList<>(); for(int i = 0; i < carving.getLength(); i++) { carving.step(); - TerraBiome biome = provider.getBiome(carving.getRunning()); + TerraBiome biome = provider.getBiome(carving.getRunning(), w.getSeed()); /* if(!((UserDefinedBiome) biome).getConfig().getCarvers().containsKey(CarverCache.this.carver)) { // Stop if we enter a biome this carver is not present in return Collections.emptyList(); diff --git a/common/addons/generation-stage-ore/build.gradle.kts b/common/addons/config-distributors/build.gradle.kts similarity index 100% rename from common/addons/generation-stage-ore/build.gradle.kts rename to common/addons/config-distributors/build.gradle.kts diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java new file mode 100644 index 000000000..3b6f0d0f5 --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.addons.feature.distributor; + +import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.addons.feature.distributor.config.NoiseDistributorTemplate; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.addon.TerraAddon; +import com.dfsek.terra.api.addon.annotations.Addon; +import com.dfsek.terra.api.addon.annotations.Author; +import com.dfsek.terra.api.addon.annotations.Version; +import com.dfsek.terra.api.event.EventListener; +import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; +import com.dfsek.terra.api.injection.annotations.Inject; +import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.structure.feature.Distributor; +import com.dfsek.terra.api.util.reflection.TypeKey; + +import java.util.function.Supplier; + +@Addon("config-distributors") +@Version("1.0.0") +@Author("Terra") +public class DistributorAddon extends TerraAddon implements EventListener { + public static final TypeKey>> DISTRIBUTOR_TOKEN = new TypeKey<>() {}; + @Inject + private TerraPlugin main; + + @Override + public void initialize() { + main.getEventManager().registerListener(this, this); + } + + + public void packPreLoad(ConfigPackPreLoadEvent event) { + CheckedRegistry>> distributorRegistry = event.getPack().getOrCreateRegistry(DISTRIBUTOR_TOKEN); + distributorRegistry.register("NOISE", NoiseDistributorTemplate::new); + } +} diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java new file mode 100644 index 000000000..e87ce15c2 --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.addons.feature.distributor.config; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.addons.feature.distributor.distributors.NoiseDistributor; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.structure.feature.Distributor; + +public class NoiseDistributorTemplate implements ObjectTemplate { + @Value("distribution") + private NoiseSampler noise; + + @Override + public Distributor get() { + return new NoiseDistributor(noise); + } +} diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java new file mode 100644 index 000000000..b97657e4d --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.addons.feature.distributor.distributors; + +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.structure.feature.Distributor; + +public class NoiseDistributor implements Distributor { + private final NoiseSampler sampler; + + public NoiseDistributor(NoiseSampler sampler) { + this.sampler = sampler; + } + + @Override + public boolean matches(int x, int z, long seed) { + return sampler.getNoiseSeeded(seed, x, z) > 0; + } +} diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java index aec5bf959..f0e4044c9 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.registry.OpenRegistry; +import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.Flora; import java.util.function.Supplier; @@ -13,6 +14,8 @@ public class FloraConfigType implements ConfigType { private final FloraFactory factory = new FloraFactory(); private final ConfigPack pack; + public static final TypeKey FLORA_TYPE_TOKEN = new TypeKey<>(){}; + public FloraConfigType(ConfigPack pack) { this.pack = pack; } @@ -28,8 +31,8 @@ public class FloraConfigType implements ConfigType { } @Override - public Class getTypeClass() { - return Flora.class; + public TypeKey getTypeClass() { + return FLORA_TYPE_TOKEN; } @Override diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraFactory.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraFactory.java index 4fcf0de15..e04f6cd0b 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraFactory.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraFactory.java @@ -8,6 +8,6 @@ import com.dfsek.terra.api.world.Flora; public class FloraFactory implements ConfigFactory { @Override public TerraFlora build(FloraTemplate config, TerraPlugin main) { - return new TerraFlora(config.getLayers(), config.doPhysics(), config.isCeiling(), config.getIrrigable(), config.getSpawnable(), config.getReplaceable(), config.getRotatable(), config.getMaxPlacements(), config.getSearch(), config.isSpawnBlacklist(), config.getIrrigableOffset(), main, config.getNoiseDistribution().apply(2403L)); + return new TerraFlora(config.getLayers(), config.doPhysics(), config.isCeiling(), config.getIrrigable(), config.getSpawnable(), config.getReplaceable(), config.getRotatable(), config.getMaxPlacements(), config.getSearch(), config.isSpawnBlacklist(), config.getIrrigableOffset(), main, config.getNoiseDistribution()); } } diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraTemplate.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraTemplate.java index 13c105304..3f16bbb4a 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraTemplate.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraTemplate.java @@ -6,8 +6,8 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.addons.flora.flora.gen.BlockLayer; import com.dfsek.terra.addons.flora.flora.gen.TerraFlora; import com.dfsek.terra.api.config.AbstractableTemplate; +import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.MaterialSet; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; import java.util.List; @@ -61,9 +61,9 @@ public class FloraTemplate implements AbstractableTemplate { private List layers; @Value("layer-distribution") - private NoiseSeeded noiseDistribution; + private NoiseSampler noiseDistribution; - public NoiseSeeded getNoiseDistribution() { + public NoiseSampler getNoiseDistribution() { return noiseDistribution; } diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java index b7eef8658..6563f09ef 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java @@ -116,7 +116,7 @@ public class TerraFlora implements Flora { for(int i = 0; FastMath.abs(i) < size; i += c) { // Down if ceiling, up if floor int lvl = (FastMath.abs(i)); - BlockState data = getStateCollection((ceiling ? lvl : size - lvl - 1)).get(distribution, location.getX(), location.getY(), location.getZ()).clone(); + BlockState data = getStateCollection((ceiling ? lvl : size - lvl - 1)).get(distribution, location.getX(), location.getY(), location.getZ(), world.getSeed()).clone(); if(doRotation) { Direction oneFace = new ArrayList<>(faces).get(new Random(location.getBlockX() ^ location.getBlockZ()).nextInt(faces.size())); // Get random face. diff --git a/common/addons/config-locators/build.gradle.kts b/common/addons/config-locators/build.gradle.kts new file mode 100644 index 000000000..07542d899 --- /dev/null +++ b/common/addons/config-locators/build.gradle.kts @@ -0,0 +1,45 @@ +import com.dfsek.terra.configureCompilation +import com.dfsek.terra.configureDependencies + +plugins { + `java-library` + `maven-publish` + idea +} + +configureCompilation() +configureDependencies() + +group = "com.dfsek.terra.common" + +dependencies { + "shadedApi"(project(":common:api")) + "compileOnly"("com.google.guava:guava:30.0-jre") + + "testImplementation"("com.google.guava:guava:30.0-jre") +} + +publishing { + publications { + create("mavenJava") { + artifact(tasks["sourcesJar"]) + artifact(tasks["jar"]) + } + } + + repositories { + val mavenUrl = "https://repo.codemc.io/repository/maven-releases/" + val mavenSnapshotUrl = "https://repo.codemc.io/repository/maven-snapshots/" + + 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/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java new file mode 100644 index 000000000..3bddc8a80 --- /dev/null +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.addons.feature.locator; + +import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.addons.feature.locator.config.SurfaceLocatorTemplate; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.addon.TerraAddon; +import com.dfsek.terra.api.addon.annotations.Addon; +import com.dfsek.terra.api.addon.annotations.Author; +import com.dfsek.terra.api.addon.annotations.Version; +import com.dfsek.terra.api.event.EventListener; +import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; +import com.dfsek.terra.api.injection.annotations.Inject; +import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.structure.feature.Locator; +import com.dfsek.terra.api.util.reflection.TypeKey; + +import java.util.function.Supplier; + +@Addon("config-locators") +@Version("1.0.0") +@Author("Terra") +public class LocatorAddon extends TerraAddon implements EventListener { + + public static final TypeKey>> LOCATOR_TOKEN = new TypeKey<>() {}; + @Inject + private TerraPlugin main; + + @Override + public void initialize() { + main.getEventManager().registerListener(this, this); + } + + public void onPackLoad(ConfigPackPreLoadEvent event) { + CheckedRegistry>> locatorRegistry = event.getPack().getOrCreateRegistry(LOCATOR_TOKEN); + locatorRegistry.register("SURFACE", () -> new SurfaceLocatorTemplate(main)); + } +} diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/SurfaceLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/SurfaceLocatorTemplate.java new file mode 100644 index 000000000..a85b37179 --- /dev/null +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/SurfaceLocatorTemplate.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.addons.feature.locator.config; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.addons.feature.locator.locators.SurfaceLocator; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.structure.feature.Locator; +import com.dfsek.terra.api.util.Range; + +public class SurfaceLocatorTemplate implements ObjectTemplate { + private final TerraPlugin main; + + @Value("range") + private Range range; + + public SurfaceLocatorTemplate(TerraPlugin main) { + this.main = main; + } + + @Override + public Locator get() { + return new SurfaceLocator(range, main); + } +} diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SurfaceLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SurfaceLocator.java new file mode 100644 index 000000000..8bcbde459 --- /dev/null +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SurfaceLocator.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.addons.feature.locator.locators; + +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.structure.feature.Locator; +import com.dfsek.terra.api.util.ConstantRange; +import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.world.Column; + +import java.util.Collections; +import java.util.List; + +public class SurfaceLocator implements Locator { + private final Range search; + + private final BlockState air; + + public SurfaceLocator(Range search, TerraPlugin main) { + this.search = search; + this.air = main.getWorldHandle().air(); + } + + @Override + public List getSuitableCoordinates(Column column) { + for(int y : search) { + if(column.getBlock(y).matches(air) && !column.getBlock(y-1).matches(air)) { + return Collections.singletonList(y); + } + } + return Collections.emptyList(); + } +} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java index 9fbc64aae..68420f7c0 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java @@ -1,6 +1,7 @@ package com.dfsek.terra.addons.noise; -import com.dfsek.tectonic.exception.ConfigException; +import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.addons.noise.config.NoiseSamplerBuilderLoader; import com.dfsek.terra.addons.noise.config.templates.DomainWarpTemplate; import com.dfsek.terra.addons.noise.config.templates.ImageSamplerTemplate; @@ -16,7 +17,6 @@ import com.dfsek.terra.addons.noise.config.templates.noise.fractal.RidgedFractal import com.dfsek.terra.addons.noise.config.templates.normalizer.ClampNormalizerTemplate; import com.dfsek.terra.addons.noise.config.templates.normalizer.LinearNormalizerTemplate; import com.dfsek.terra.addons.noise.config.templates.normalizer.NormalNormalizerTemplate; -import com.dfsek.terra.addons.noise.samplers.ImageSampler; import com.dfsek.terra.addons.noise.samplers.noise.CellularSampler; import com.dfsek.terra.addons.noise.samplers.noise.random.GaussianNoiseSampler; import com.dfsek.terra.addons.noise.samplers.noise.random.WhiteNoiseSampler; @@ -34,12 +34,13 @@ import com.dfsek.terra.api.addon.annotations.Version; import com.dfsek.terra.api.event.EventListener; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.injection.annotations.Inject; +import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.registry.CheckedRegistry; -import com.dfsek.terra.api.util.seeded.NoiseProvider; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; +import com.dfsek.terra.api.util.reflection.TypeKey; import java.util.HashMap; import java.util.Map; +import java.util.function.Supplier; @Addon("config-noise-function") @Author("Terra") @@ -48,23 +49,25 @@ public class NoiseAddon extends TerraAddon implements EventListener { @Inject private TerraPlugin plugin; + public static final TypeKey>> NOISE_SAMPLER_TOKEN = new TypeKey<>() {}; + @Override public void initialize() { plugin.getEventManager().registerListener(this, this); } public void packPreLoad(ConfigPackPreLoadEvent event) { - CheckedRegistry noiseRegistry = event.getPack().getOrCreateRegistry(NoiseProvider.class); + CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry(NOISE_SAMPLER_TOKEN); event.getPack() - .applyLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(noiseRegistry)) + .applyLoader(NoiseSampler.class, new NoiseSamplerBuilderLoader(noiseRegistry)) .applyLoader(ImageSamplerTemplate.class, ImageSamplerTemplate::new) + .applyLoader(CellularSampler.DistanceFunction.class, (t, o, l) -> CellularSampler.DistanceFunction.valueOf((String) o)) + .applyLoader(CellularSampler.ReturnType.class, (t, o, l) -> CellularSampler.ReturnType.valueOf((String) o)) .applyLoader(DomainWarpTemplate.class, DomainWarpTemplate::new) .applyLoader(LinearNormalizerTemplate.class, LinearNormalizerTemplate::new) .applyLoader(NormalNormalizerTemplate.class, NormalNormalizerTemplate::new) - .applyLoader(ImageSampler.Channel.class, (t, object, cf) -> ImageSampler.Channel.valueOf((String) object)) .applyLoader(ClampNormalizerTemplate.class, ClampNormalizerTemplate::new) - .applyLoader(CellularSampler.ReturnType.class, (t, object, cf) -> CellularSampler.ReturnType.valueOf((String) object)) - .applyLoader(CellularSampler.DistanceFunction.class, (t, object, cf) -> CellularSampler.DistanceFunction.valueOf((String) object)); + .applyLoader(DimensionApplicableNoiseSampler.class, DimensionApplicableNoiseSampler::new); noiseRegistry.register("LINEAR", LinearNormalizerTemplate::new); noiseRegistry.register("NORMAL", NormalNormalizerTemplate::new); @@ -97,16 +100,12 @@ public class NoiseAddon extends TerraAddon implements EventListener { noiseRegistry.register("KERNEL", KernelTemplate::new); - Map packFunctions = new HashMap<>(); + Map packFunctions = new HashMap<>(); noiseRegistry.register("EXPRESSION", () -> new ExpressionFunctionTemplate(packFunctions)); - try { - NoiseConfigPackTemplate template = new NoiseConfigPackTemplate(); - event.loadTemplate(template); - packFunctions.putAll(template.getNoiseBuilderMap()); - } catch(ConfigException e) { - throw new RuntimeException(e); - } + NoiseConfigPackTemplate template = new NoiseConfigPackTemplate(); + event.loadTemplate(template); + packFunctions.putAll(template.getNoiseBuilderMap()); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseConfigPackTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseConfigPackTemplate.java index f25164422..ab2e8baa6 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseConfigPackTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseConfigPackTemplate.java @@ -2,15 +2,15 @@ package com.dfsek.terra.addons.noise; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; +import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import java.util.Map; public class NoiseConfigPackTemplate implements ConfigTemplate { @Value("noise") - private Map noiseBuilderMap; + private Map noiseBuilderMap; - public Map getNoiseBuilderMap() { + public Map getNoiseBuilderMap() { return noiseBuilderMap; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/DimensionApplicableNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/DimensionApplicableNoiseSampler.java new file mode 100644 index 000000000..d508f37ec --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/DimensionApplicableNoiseSampler.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.addons.noise.config; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.api.noise.NoiseSampler; + +public class DimensionApplicableNoiseSampler implements ObjectTemplate { + @Value("dimensions") + private int dimensions; + + @Value(".") + private NoiseSampler sampler; + + public int getDimensions() { + return dimensions; + } + + public NoiseSampler getSampler() { + return sampler; + } + + @Override + public DimensionApplicableNoiseSampler get() { + return this; + } +} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/NoiseSamplerBuilderLoader.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/NoiseSamplerBuilderLoader.java index ec6fcebec..8d057043e 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/NoiseSamplerBuilderLoader.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/NoiseSamplerBuilderLoader.java @@ -6,30 +6,29 @@ 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.noise.NoiseSampler; import com.dfsek.terra.api.registry.Registry; -import com.dfsek.terra.api.util.seeded.NoiseProvider; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; import java.lang.reflect.AnnotatedType; -import java.util.Locale; import java.util.Map; +import java.util.function.Supplier; @SuppressWarnings("unchecked") -public class NoiseSamplerBuilderLoader implements TypeLoader { - private final Registry noiseRegistry; +public class NoiseSamplerBuilderLoader implements TypeLoader { + private final Registry>> noiseRegistry; - public NoiseSamplerBuilderLoader(Registry noiseRegistry) { + public NoiseSamplerBuilderLoader(Registry>> noiseRegistry) { this.noiseRegistry = noiseRegistry; } @Override - public NoiseSeeded load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException { + public NoiseSampler load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException { Map map = (Map) c; try { if(!noiseRegistry.contains((String) map.get("type"))) { throw new LoadException("No such noise function: " + map.get("type")); } - ObjectTemplate normalizerTemplate = noiseRegistry.get(((String) map.get("type")).toUpperCase(Locale.ROOT)).get(); + ObjectTemplate normalizerTemplate = noiseRegistry.get(((String) map.get("type"))).get(); loader.load(normalizerTemplate, new MapConfiguration(map)); return normalizerTemplate.get(); } catch(ConfigException e) { diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DomainWarpTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DomainWarpTemplate.java index 7167aca7a..ad918d654 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DomainWarpTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DomainWarpTemplate.java @@ -4,15 +4,14 @@ import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.addons.noise.samplers.DomainWarpedSampler; import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; @SuppressWarnings({"unused", "FieldMayBeFinal"}) public class DomainWarpTemplate extends SamplerTemplate { @Value("warp") - private NoiseSeeded warp; + private NoiseSampler warp; @Value("function") - private NoiseSeeded function; + private NoiseSampler function; @Value("salt") @Default @@ -23,7 +22,7 @@ public class DomainWarpTemplate extends SamplerTemplate { private double amplitude = 1; @Override - public NoiseSampler apply(Long seed) { - return new DomainWarpedSampler(function.apply(seed), warp.apply(seed), (int) (seed + salt), amplitude); + public NoiseSampler get() { + return new DomainWarpedSampler(function, warp, amplitude); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java index d5571d37e..35dfd78ef 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java @@ -19,7 +19,7 @@ public class ImageSamplerTemplate extends SamplerTemplate { private ImageSampler.Channel channel; @Override - public NoiseSampler apply(Long seed) { + public NoiseSampler get() { return new ImageSampler(image, channel, frequency); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/KernelTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/KernelTemplate.java index 0abf1a2b5..ae032efd0 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/KernelTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/KernelTemplate.java @@ -6,7 +6,6 @@ import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.terra.addons.noise.samplers.KernelSampler; import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; import java.util.List; @@ -21,14 +20,14 @@ public class KernelTemplate extends SamplerTemplate implements Va private double factor = 1; @Value("function") - private NoiseSeeded function; + private NoiseSampler function; @Value("frequency") @Default private double frequency = 1; @Override - public NoiseSampler apply(Long seed) { + public NoiseSampler get() { double[][] k = new double[kernel.size()][kernel.get(0).size()]; for(int x = 0; x < kernel.size(); x++) { @@ -37,7 +36,7 @@ public class KernelTemplate extends SamplerTemplate implements Va } } - KernelSampler sampler = new KernelSampler(k, function.apply(seed)); + KernelSampler sampler = new KernelSampler(k, function); sampler.setFrequency(frequency); return sampler; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/SamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/SamplerTemplate.java index 7dc39a6f7..393e03cce 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/SamplerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/SamplerTemplate.java @@ -6,10 +6,9 @@ import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.tectonic.loading.object.ObjectTemplate; import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; @SuppressWarnings("FieldMayBeFinal") -public abstract class SamplerTemplate implements ValidatedConfigTemplate, ObjectTemplate, NoiseSeeded { +public abstract class SamplerTemplate implements ValidatedConfigTemplate, ObjectTemplate { @Value("dimensions") @Default private int dimensions = 2; @@ -23,9 +22,4 @@ public abstract class SamplerTemplate implements Validat if(dimensions != 2 && dimensions != 3) throw new ValidationException("Illegal amount of dimensions: " + dimensions); return true; } - - @Override - public NoiseSeeded get() { - return this; - } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java index e962ad71a..eb00a599b 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java @@ -5,7 +5,6 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.addons.noise.samplers.noise.CellularSampler; import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler; import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; @SuppressWarnings("FieldMayBeFinal") public class CellularNoiseTemplate extends NoiseTemplate { @@ -24,23 +23,12 @@ public class CellularNoiseTemplate extends NoiseTemplate { @Value("lookup") @Default - private NoiseSeeded lookup = new NoiseSeeded() { - @Override - public NoiseSampler apply(Long seed) { - - return new OpenSimplex2Sampler((int) (long) seed); - } - - @Override - public int getDimensions() { - return 2; - } - }; + private NoiseSampler lookup = new OpenSimplex2Sampler(); @Override - public NoiseSampler apply(Long seed) { - CellularSampler sampler = new CellularSampler((int) (long) seed + salt); - sampler.setNoiseLookup(lookup.apply(seed)); + public NoiseSampler get() { + CellularSampler sampler = new CellularSampler(); + sampler.setNoiseLookup(lookup); sampler.setFrequency(frequency); sampler.setJitterModifier(cellularJitter); sampler.setReturnType(cellularReturnType); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ConstantNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ConstantNoiseTemplate.java index 2239eb6e0..226bcf30d 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ConstantNoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ConstantNoiseTemplate.java @@ -13,7 +13,7 @@ public class ConstantNoiseTemplate extends SamplerTemplate { private double value = 0d; @Override - public NoiseSampler apply(Long seed) { + public NoiseSampler get() { return new ConstantSampler(value); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java index b3ed21c5a..434698f3e 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java @@ -8,6 +8,7 @@ import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; +import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; import com.dfsek.terra.addons.noise.paralithic.defined.UserDefinedFunction; @@ -15,7 +16,6 @@ import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction2; import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction3; import com.dfsek.terra.addons.noise.samplers.noise.ExpressionFunction; import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; import java.util.HashMap; import java.util.LinkedHashMap; @@ -24,7 +24,7 @@ import java.util.Map; @SuppressWarnings({"FieldMayBeFinal", "unused"}) public class ExpressionFunctionTemplate extends SamplerTemplate implements ValidatedConfigTemplate { - private final Map otherFunctions; + private final Map otherFunctions; @Value("variables") @Default private Map vars = new HashMap<>(); @@ -32,19 +32,19 @@ public class ExpressionFunctionTemplate extends SamplerTemplate functions = new LinkedHashMap<>(); + private LinkedHashMap functions = new LinkedHashMap<>(); @Value("expressions") @Default private LinkedHashMap expressions = new LinkedHashMap<>(); - public ExpressionFunctionTemplate(Map otherFunctions) { + public ExpressionFunctionTemplate(Map otherFunctions) { this.otherFunctions = otherFunctions; } @Override - public NoiseSampler apply(Long seed) { + public NoiseSampler get() { try { - Map noiseFunctionMap = generateFunctions(seed); + Map noiseFunctionMap = generateFunctions(); return new ExpressionFunction(noiseFunctionMap, equation, vars); } catch(ParseException e) { throw new IllegalStateException(e); @@ -54,7 +54,7 @@ public class ExpressionFunctionTemplate extends SamplerTemplate noiseFunctionMap = generateFunctions(0L); + Map noiseFunctionMap = generateFunctions(); new ExpressionFunction(noiseFunctionMap, equation, vars); } catch(ParseException e) { throw new ValidationException("Errors occurred while parsing noise equation: ", e); @@ -62,7 +62,7 @@ public class ExpressionFunctionTemplate extends SamplerTemplate generateFunctions(Long seed) throws ParseException { + private Map generateFunctions() throws ParseException { Map noiseFunctionMap = new HashMap<>(); for(Map.Entry entry : expressions.entrySet()) { @@ -71,14 +71,14 @@ public class ExpressionFunctionTemplate extends SamplerTemplate { if(function.getDimensions() == 2) { - noiseFunctionMap.put(id, new NoiseFunction2(function.apply(seed))); - } else noiseFunctionMap.put(id, new NoiseFunction3(function.apply(seed))); + noiseFunctionMap.put(id, new NoiseFunction2(function.getSampler())); + } else noiseFunctionMap.put(id, new NoiseFunction3(function.getSampler())); }); functions.forEach((id, function) -> { if(function.getDimensions() == 2) { - noiseFunctionMap.put(id, new NoiseFunction2(function.apply(seed))); - } else noiseFunctionMap.put(id, new NoiseFunction3(function.apply(seed))); + noiseFunctionMap.put(id, new NoiseFunction2(function.getSampler())); + } else noiseFunctionMap.put(id, new NoiseFunction3(function.getSampler())); }); return noiseFunctionMap; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java index 6766b2f03..8cbb381b2 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java @@ -27,8 +27,8 @@ public class GaborNoiseTemplate extends NoiseTemplate { private double f0 = 0.625; @Override - public NoiseSampler apply(Long seed) { - GaborNoiseSampler gaborNoiseSampler = new GaborNoiseSampler((int) (long) seed + salt); + public NoiseSampler get() { + GaborNoiseSampler gaborNoiseSampler = new GaborNoiseSampler(); gaborNoiseSampler.setFrequency(frequency); gaborNoiseSampler.setRotation(rotation); gaborNoiseSampler.setIsotropic(isotropic); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/SimpleNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/SimpleNoiseTemplate.java index ef2b72be1..2e0c338d7 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/SimpleNoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/SimpleNoiseTemplate.java @@ -4,17 +4,18 @@ import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; import com.dfsek.terra.api.noise.NoiseSampler; import java.util.function.Function; +import java.util.function.Supplier; public class SimpleNoiseTemplate extends NoiseTemplate { - private final Function samplerSupplier; + private final Supplier samplerSupplier; - public SimpleNoiseTemplate(Function samplerSupplier) { + public SimpleNoiseTemplate(Supplier samplerSupplier) { this.samplerSupplier = samplerSupplier; } @Override - public NoiseSampler apply(Long seed) { - NoiseFunction sampler = samplerSupplier.apply((int) (long) seed + salt); + public NoiseSampler get() { + NoiseFunction sampler = samplerSupplier.get(); sampler.setFrequency(frequency); return sampler; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/BrownianMotionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/BrownianMotionTemplate.java index 1965f9d8c..3a3ce6c9d 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/BrownianMotionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/BrownianMotionTemplate.java @@ -5,8 +5,8 @@ import com.dfsek.terra.api.noise.NoiseSampler; public class BrownianMotionTemplate extends FractalTemplate { @Override - public NoiseSampler apply(Long seed) { - BrownianMotionSampler sampler = new BrownianMotionSampler((int) (long) seed, function.apply(seed)); + public NoiseSampler get() { + BrownianMotionSampler sampler = new BrownianMotionSampler(function); sampler.setGain(fractalGain); sampler.setLacunarity(fractalLacunarity); sampler.setOctaves(octaves); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/FractalTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/FractalTemplate.java index ceb46f3ad..2f0061ea9 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/FractalTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/FractalTemplate.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; import com.dfsek.terra.addons.noise.samplers.noise.fractal.FractalNoiseFunction; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; +import com.dfsek.terra.api.noise.NoiseSampler; public abstract class FractalTemplate extends SamplerTemplate { @Value("octaves") @@ -24,5 +24,5 @@ public abstract class FractalTemplate extends Sa protected double weightedStrength = 0.0D; @Value("function") - protected NoiseSeeded function; + protected NoiseSampler function; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/PingPongTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/PingPongTemplate.java index d8a5bc460..fafd0863b 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/PingPongTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/PingPongTemplate.java @@ -12,8 +12,8 @@ public class PingPongTemplate extends FractalTemplate { private double pingPong = 2.0D; @Override - public NoiseSampler apply(Long seed) { - PingPongSampler sampler = new PingPongSampler((int) (long) seed, function.apply(seed)); + public NoiseSampler get() { + PingPongSampler sampler = new PingPongSampler(function); sampler.setGain(fractalGain); sampler.setLacunarity(fractalLacunarity); sampler.setOctaves(octaves); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/RidgedFractalTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/RidgedFractalTemplate.java index e16f33403..85c69a4b1 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/RidgedFractalTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/RidgedFractalTemplate.java @@ -5,8 +5,8 @@ import com.dfsek.terra.api.noise.NoiseSampler; public class RidgedFractalTemplate extends FractalTemplate { @Override - public NoiseSampler apply(Long seed) { - RidgedFractalSampler sampler = new RidgedFractalSampler((int) (long) seed, function.apply(seed)); + public NoiseSampler get() { + RidgedFractalSampler sampler = new RidgedFractalSampler(function); sampler.setGain(fractalGain); sampler.setLacunarity(fractalLacunarity); sampler.setOctaves(octaves); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ClampNormalizerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ClampNormalizerTemplate.java index 689939a01..e737c0240 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ClampNormalizerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ClampNormalizerTemplate.java @@ -13,7 +13,7 @@ public class ClampNormalizerTemplate extends NormalizerTemplate private double min; @Override - public NoiseSampler apply(Long seed) { - return new ClampNormalizer(function.apply(seed), min, max); + public NoiseSampler get() { + return new ClampNormalizer(function, min, max); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/LinearNormalizerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/LinearNormalizerTemplate.java index 4de3930c5..33156d032 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/LinearNormalizerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/LinearNormalizerTemplate.java @@ -13,7 +13,7 @@ public class LinearNormalizerTemplate extends NormalizerTemplate extends SamplerTemplate { @Value("function") - protected NoiseSeeded function; + protected NoiseSampler function; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java index a4dce32c0..08cc87eda 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java @@ -12,22 +12,12 @@ public abstract class Normalizer implements NoiseSampler { public abstract double normalize(double in); @Override - public double getNoise(double x, double y) { - return normalize(sampler.getNoise(x, y)); - } - - @Override - public double getNoise(double x, double y, double z) { - return normalize(sampler.getNoise(x, y, z)); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { + public double getNoiseSeeded(long seed, double x, double y) { return normalize(sampler.getNoiseSeeded(seed, x, y)); } @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { + public double getNoiseSeeded(long seed, double x, double y, double z) { return normalize(sampler.getNoiseSeeded(seed, x, y, z)); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java index 33d93112b..d7d99aeb5 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java @@ -4,6 +4,7 @@ import com.dfsek.paralithic.Expression; import com.dfsek.paralithic.eval.parser.Parser; import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.paralithic.eval.tokenizer.ParseException; +import com.dfsek.paralithic.functions.dynamic.Context; import com.dfsek.paralithic.functions.dynamic.DynamicFunction; import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; @@ -31,6 +32,11 @@ public class UserDefinedFunction implements DynamicFunction { return expression.evaluate(args); } + @Override + public double eval(Context context, double... args) { + return expression.evaluate(context, args); + } + @Override public boolean isStateless() { return true; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction.java deleted file mode 100644 index 20c2aa909..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.dfsek.terra.addons.noise.paralithic.noise; - - -import com.dfsek.paralithic.functions.dynamic.DynamicFunction; - -public interface NoiseFunction extends DynamicFunction { -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction2.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction2.java index 4fe62fb7e..f12c1576e 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction2.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction2.java @@ -1,12 +1,13 @@ package com.dfsek.terra.addons.noise.paralithic.noise; +import com.dfsek.paralithic.functions.dynamic.Context; +import com.dfsek.paralithic.functions.dynamic.DynamicFunction; import com.dfsek.terra.addons.noise.util.HashMapDoubleDouble; import com.dfsek.terra.api.noise.NoiseSampler; -public class NoiseFunction2 implements NoiseFunction { +public class NoiseFunction2 implements DynamicFunction { private final NoiseSampler gen; - private final Cache cache = new Cache(); public NoiseFunction2(NoiseSampler gen) { this.gen = gen; @@ -19,36 +20,16 @@ public class NoiseFunction2 implements NoiseFunction { @Override public double eval(double... args) { - return cache.get(gen, args[0], args[1]); + throw new UnsupportedOperationException("Cannot evaluate seeded function without seed context."); + } + + @Override + public double eval(Context context, double... args) { + return gen.getNoiseSeeded(((SeedContext) context).getSeed(), args[0], args[1]); } @Override public boolean isStateless() { - return true; - } - - private static class Cache extends HashMapDoubleDouble { - private static final long serialVersionUID = 8915092734723467010L; - private static final int cacheSize = 384; - - public Cache() { - super(cacheSize); - } - - public double get(NoiseSampler noise, double x, double z) { - double xx = x >= 0 ? x * 2 : x * -2 - 1; - double zz = z >= 0 ? z * 2 : z * -2 - 1; - double key = (xx >= zz) ? (xx * xx + xx + zz) : (zz * zz + xx); - double value = this.get(key); - if(this.size() > cacheSize) { - this.clear(); - } - return (value == 4.9E-324D ? addAndReturn(noise.getNoise(x, z), key) : value); - } - - private synchronized double addAndReturn(double value, double key) { - this.put(key, value); - return value; - } + return false; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction3.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction3.java index 67e7400dd..827eb6596 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction3.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction3.java @@ -1,8 +1,10 @@ package com.dfsek.terra.addons.noise.paralithic.noise; +import com.dfsek.paralithic.functions.dynamic.Context; +import com.dfsek.paralithic.functions.dynamic.DynamicFunction; import com.dfsek.terra.api.noise.NoiseSampler; -public class NoiseFunction3 implements NoiseFunction { +public class NoiseFunction3 implements DynamicFunction { private final NoiseSampler gen; public NoiseFunction3(NoiseSampler gen) { @@ -16,11 +18,16 @@ public class NoiseFunction3 implements NoiseFunction { @Override public double eval(double... args) { - return gen.getNoise(args[0], args[1], args[2]); + throw new UnsupportedOperationException("Cannot evaluate seeded function without seed context."); + } + + @Override + public double eval(Context context, double... args) { + return gen.getNoiseSeeded(((SeedContext) context).getSeed(), args[0], args[1], args[2]); } @Override public boolean isStateless() { - return true; + return false; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SeedContext.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SeedContext.java new file mode 100644 index 000000000..bc490d1c4 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SeedContext.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.addons.noise.paralithic.noise; + +import com.dfsek.paralithic.functions.dynamic.Context; + +public class SeedContext implements Context { + private final long seed; + + public SeedContext(long seed) { + this.seed = seed; + } + + public long getSeed() { + return seed; + } +} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java index bb81468a6..eca97002c 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java @@ -5,40 +5,28 @@ import com.dfsek.terra.api.noise.NoiseSampler; public class DomainWarpedSampler implements NoiseSampler { private final NoiseSampler function; private final NoiseSampler warp; - private final int seed; private final double amplitude; - public DomainWarpedSampler(NoiseSampler function, NoiseSampler warp, int seed, double amplitude) { + public DomainWarpedSampler(NoiseSampler function, NoiseSampler warp, double amplitude) { this.function = function; this.warp = warp; - this.seed = seed; this.amplitude = amplitude; } @Override - public double getNoise(double x, double y) { - return getNoiseSeeded(seed, x, y); - } - - @Override - public double getNoise(double x, double y, double z) { - return getNoiseSeeded(seed, x, y, z); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { - return function.getNoise( - x + warp.getNoiseSeeded(seed, x, y) * amplitude, - y + warp.getNoiseSeeded(seed + 1, x, y) * amplitude + public double getNoiseSeeded(long seed, double x, double y) { + return function.getNoiseSeeded(seed++, + x + warp.getNoiseSeeded(seed++, x, y) * amplitude, + y + warp.getNoiseSeeded(seed, x, y) * amplitude ); } @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { - return function.getNoise( - x + warp.getNoiseSeeded(seed, x, y, z) * amplitude, - y + warp.getNoiseSeeded(seed + 1, x, y, z) * amplitude, - z + warp.getNoiseSeeded(seed + 2, x, y, z) * amplitude + public double getNoiseSeeded(long seed, double x, double y, double z) { + return function.getNoiseSeeded(seed++, + x + warp.getNoiseSeeded(seed++, x, y, z) * amplitude, + y + warp.getNoiseSeeded(seed++, x, y, z) * amplitude, + z + warp.getNoiseSeeded(seed, x, y, z) * amplitude ); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ExpressionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ExpressionSampler.java deleted file mode 100644 index a50d1fd9a..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ExpressionSampler.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers; - -import com.dfsek.paralithic.Expression; -import com.dfsek.paralithic.eval.parser.Parser; -import com.dfsek.paralithic.eval.parser.Scope; -import com.dfsek.paralithic.eval.tokenizer.ParseException; -import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; -import com.dfsek.terra.addons.noise.paralithic.defined.UserDefinedFunction; -import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction2; -import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction3; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; - -import java.util.Map; - -/** - * Sampler3D implementation using Paralithic expression - */ -public class ExpressionSampler implements NoiseSampler { - private final Expression expression; - - public ExpressionSampler(String equation, Scope parent, long seed, Map functions, Map definedFunctions) throws ParseException { - Parser parser = new Parser(); - Scope scope = new Scope().withParent(parent); - - scope.addInvocationVariable("x"); - scope.addInvocationVariable("y"); - scope.addInvocationVariable("z"); - - functions.forEach((id, noise) -> { - switch(noise.getDimensions()) { - case 2: - parser.registerFunction(id, new NoiseFunction2(noise.apply(seed))); - break; - case 3: - parser.registerFunction(id, new NoiseFunction3(noise.apply(seed))); - break; - } - }); - - for(Map.Entry entry : definedFunctions.entrySet()) { - parser.registerFunction(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue(), parser, parent)); - } - - this.expression = parser.parse(equation, scope); - } - - @Override - public double getNoise(double x, double y) { - return getNoise(x, 0, y); - } - - @Override - public double getNoise(double x, double y, double z) { - return expression.evaluate(x, y, z); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { - return getNoise(x, y); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { - return getNoise(x, y, z); - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java index 65ca10e92..d48dc2c26 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java @@ -18,23 +18,13 @@ public class ImageSampler implements NoiseSampler { } @Override - public double getNoise(double x, double y) { + public double getNoiseSeeded(long seed, double x, double y) { return ((channel.getChannel(image.getRGB(FastMath.floorMod(FastMath.floorToInt(x * frequency), image.getWidth()), FastMath.floorMod(FastMath.floorToInt(y * frequency), image.getHeight()))) / 255D) - 0.5) * 2; } @Override - public double getNoise(double x, double y, double z) { - return getNoise(x, y); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { - return getNoise(x, y); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { - return getNoise(x, y, z); + public double getNoiseSeeded(long seed, double x, double y, double z) { + return getNoiseSeeded(seed, x, y); } public enum Channel { diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java index 897d193b1..b30e16510 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java @@ -13,24 +13,14 @@ public class KernelSampler implements NoiseSampler { } @Override - public double getNoise(double x, double y) { - return getNoiseSeeded(0, x, y); - } - - @Override - public double getNoise(double x, double y, double z) { - return getNoiseSeeded(0, x, y, z); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { + public double getNoiseSeeded(long seed, double x, double y) { x *= frequency; y *= frequency; double accumulator = 0; for(int kx = 0; kx < kernel.length; kx++) { for(int ky = 0; ky < kernel[kx].length; ky++) { - accumulator += in.getNoise(x + kx, y + ky) * kernel[kx][ky]; + accumulator += in.getNoiseSeeded(seed, x + kx, y + ky) * kernel[kx][ky]; } } @@ -38,7 +28,7 @@ public class KernelSampler implements NoiseSampler { } @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { + public double getNoiseSeeded(long seed, double x, double y, double z) { x *= frequency; y *= frequency; z *= frequency; @@ -46,7 +36,7 @@ public class KernelSampler implements NoiseSampler { for(int kx = 0; kx < kernel.length; kx++) { for(int ky = 0; ky < kernel[kx].length; ky++) { - accumulator += in.getNoise(x + kx, y, z + ky) * kernel[kx][ky]; + accumulator += in.getNoiseSeeded(seed, x + kx, y, z + ky) * kernel[kx][ky]; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java index 509440db3..83f972d7b 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java @@ -192,9 +192,8 @@ public class CellularSampler extends NoiseFunction { private NoiseSampler noiseLookup; - public CellularSampler(int seed) { - super(seed); - noiseLookup = new OpenSimplex2Sampler(seed); + public CellularSampler() { + noiseLookup = new OpenSimplex2Sampler(); } public void setDistanceFunction(DistanceFunction distanceFunction) { @@ -214,7 +213,8 @@ public class CellularSampler extends NoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; int xr = fastRound(x); int yr = fastRound(y); @@ -349,7 +349,7 @@ public class CellularSampler extends NoiseFunction { case Distance2Div: return distance0 / distance1 - 1; case NoiseLookup: - return noiseLookup.getNoise(center.getX(), center.getZ()); + return noiseLookup.getNoiseSeeded(sl, center.getX(), center.getZ()); case Distance3: return distance2 - 1; case Distance3Add: @@ -366,7 +366,8 @@ public class CellularSampler extends NoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; int xr = fastRound(x); int yr = fastRound(y); int zr = fastRound(z); @@ -523,7 +524,7 @@ public class CellularSampler extends NoiseFunction { case Distance2Div: return distance0 / distance1 - 1; case NoiseLookup: - return noiseLookup.getNoise(center.getX(), center.getY(), center.getZ()); + return noiseLookup.getNoiseSeeded(sl, center.getX(), center.getY(), center.getZ()); case Distance3: return distance2 - 1; case Distance3Add: diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java index 74110466f..10833d194 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java @@ -7,17 +7,16 @@ public class ConstantSampler extends NoiseFunction { private final double constant; public ConstantSampler(double constant) { - super(0); this.constant = constant; } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y) { return constant; } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { return constant; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java index e736a8e91..469deec60 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java @@ -5,6 +5,7 @@ import com.dfsek.paralithic.eval.parser.Parser; import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.paralithic.eval.tokenizer.ParseException; import com.dfsek.paralithic.functions.Function; +import com.dfsek.terra.addons.noise.paralithic.noise.SeedContext; import java.util.Map; @@ -15,7 +16,6 @@ public class ExpressionFunction extends NoiseFunction { private final Expression expression; public ExpressionFunction(Map functions, String eq, Map vars) throws ParseException { - super(0); Parser p = new Parser(); Scope scope = new Scope(); @@ -32,12 +32,12 @@ public class ExpressionFunction extends NoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y) { - return expression.evaluate(x, 0, y); + public double getNoiseRaw(long seed, double x, double y) { + return expression.evaluate(new SeedContext(seed), x, 0, y); } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { - return expression.evaluate(x, y, z); + public double getNoiseRaw(long seed, double x, double y, double z) { + return expression.evaluate(new SeedContext(seed), x, y, z); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java index 4b779f768..00f1bde3d 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java @@ -18,9 +18,8 @@ public class GaborNoiseSampler extends NoiseFunction { private double g = FastMath.exp(-impulsesPerCell); - public GaborNoiseSampler(int seed) { - super(seed); - rand = new WhiteNoiseSampler(seed); + public GaborNoiseSampler() { + rand = new WhiteNoiseSampler(); } public void setIsotropic(boolean isotropic) { @@ -57,16 +56,16 @@ public class GaborNoiseSampler extends NoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double z) { + public double getNoiseRaw(long seed, double x, double z) { return gaborNoise(seed, x, z); } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { return gaborNoise(seed, x, z); } - private double gaborNoise(int seed, double x, double y) { + private double gaborNoise(long seed, double x, double y) { x /= kernelRadius; y /= kernelRadius; int xi = fastFloor(x); @@ -82,7 +81,7 @@ public class GaborNoiseSampler extends NoiseFunction { return noise; } - private double calculateCell(int seed, int xi, int yi, double x, double y) { + private double calculateCell(long seed, int xi, int yi, double x, double y) { long mashedSeed = murmur64(31L * xi + yi) + seed; double gaussianSource = (rand.getNoiseRaw(mashedSeed++) + 1) / 2; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java index cd7acb646..dec509e4a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java @@ -20,11 +20,6 @@ public abstract class NoiseFunction implements NoiseSampler { } protected double frequency = 0.02d; - protected int seed; - - public NoiseFunction(int seed) { - this.seed = seed; - } protected static int fastFloor(double f) { return f >= 0 ? (int) f : (int) f - 1; @@ -114,11 +109,6 @@ public abstract class NoiseFunction implements NoiseSampler { return sinLookup((int) ((a + Math.PI / 2) * precision + 0.5f)); } - - public void setSeed(int seed) { - this.seed = seed; - } - public double getFrequency() { return frequency; } @@ -128,26 +118,16 @@ public abstract class NoiseFunction implements NoiseSampler { } @Override - public double getNoise(double x, double y) { - return getNoiseSeeded(seed, x, y); - } - - @Override - public double getNoise(double x, double y, double z) { - return getNoiseSeeded(seed, x, y, z); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { + public double getNoiseSeeded(long seed, double x, double y) { return getNoiseRaw(seed, x * frequency, y * frequency); } @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { + public double getNoiseSeeded(long seed, double x, double y, double z) { return getNoiseRaw(seed, x * frequency, y * frequency, z * frequency); } - public abstract double getNoiseRaw(int seed, double x, double y); + public abstract double getNoiseRaw(long seed, double x, double y); - public abstract double getNoiseRaw(int seed, double x, double y, double z); + public abstract double getNoiseRaw(long seed, double x, double y, double z); } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java index e95f89074..556c1dd61 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java @@ -3,12 +3,12 @@ package com.dfsek.terra.addons.noise.samplers.noise.fractal; import com.dfsek.terra.api.noise.NoiseSampler; public class BrownianMotionSampler extends FractalNoiseFunction { - public BrownianMotionSampler(int seed, NoiseSampler input) { - super(seed, input); + public BrownianMotionSampler(NoiseSampler input) { + super(input); } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y) { double sum = 0; double amp = fractalBounding; @@ -26,7 +26,7 @@ public class BrownianMotionSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { double sum = 0; double amp = fractalBounding; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java index b558ef8be..32b110610 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java @@ -11,8 +11,7 @@ public abstract class FractalNoiseFunction extends NoiseFunction { protected double lacunarity = 2.0d; protected double weightedStrength = 0.0d; - public FractalNoiseFunction(int seed, NoiseSampler input) { - super(seed); + public FractalNoiseFunction(NoiseSampler input) { this.input = input; frequency = 1; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java index 1a1ef243a..72db1b168 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java @@ -5,8 +5,8 @@ import com.dfsek.terra.api.noise.NoiseSampler; public class PingPongSampler extends FractalNoiseFunction { private double pingPongStrength = 2.0; - public PingPongSampler(int seed, NoiseSampler input) { - super(seed, input); + public PingPongSampler(NoiseSampler input) { + super(input); } @@ -20,7 +20,7 @@ public class PingPongSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y) { double sum = 0; double amp = fractalBounding; @@ -38,7 +38,7 @@ public class PingPongSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { double sum = 0; double amp = fractalBounding; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java index d11af4d06..f316cb6f2 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java @@ -4,12 +4,12 @@ import com.dfsek.terra.api.noise.NoiseSampler; public class RidgedFractalSampler extends FractalNoiseFunction { - public RidgedFractalSampler(int seed, NoiseSampler input) { - super(seed, input); + public RidgedFractalSampler(NoiseSampler input) { + super(input); } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y) { double sum = 0; double amp = fractalBounding; @@ -27,7 +27,7 @@ public class RidgedFractalSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { double sum = 0; double amp = fractalBounding; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java index 1dc5e95d5..154015af2 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java @@ -8,13 +8,12 @@ import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; public class GaussianNoiseSampler extends NoiseFunction { private final WhiteNoiseSampler whiteNoiseSampler; // Back with a white noise sampler. - public GaussianNoiseSampler(int seed) { - super(seed); - whiteNoiseSampler = new WhiteNoiseSampler(seed); + public GaussianNoiseSampler() { + whiteNoiseSampler = new WhiteNoiseSampler(); } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y) { double v1, v2, s; do { v1 = whiteNoiseSampler.getNoiseSeeded(seed++, x, y); @@ -26,7 +25,7 @@ public class GaussianNoiseSampler extends NoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { double v1, v2, s; do { v1 = whiteNoiseSampler.getNoiseSeeded(seed++, x, y, z); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java index 335287137..8486ec12f 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java @@ -8,8 +8,7 @@ import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; public class WhiteNoiseSampler extends NoiseFunction { private static final long POSITIVE_POW1 = 0b01111111111L << 52; // Bits that when applied to the exponent/sign section of a double, produce a positive number with a power of 1. - public WhiteNoiseSampler(int seed) { - super(seed); + public WhiteNoiseSampler() { } public double getNoiseRaw(long seed) { @@ -17,33 +16,33 @@ public class WhiteNoiseSampler extends NoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y) { return (getNoiseUnmapped(seed, x, y) - 1.5) * 2; } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { return (getNoiseUnmapped(seed, x, y, z) - 1.5) * 2; } - public double getNoiseUnmapped(int seed, double x, double y, double z) { + public double getNoiseUnmapped(long seed, double x, double y, double z) { long base = ((randomBits(seed, x, y, z)) & 0x000fffffffffffffL) | POSITIVE_POW1; // Sign and exponent return Double.longBitsToDouble(base); } - public double getNoiseUnmapped(int seed, double x, double y) { + public double getNoiseUnmapped(long seed, double x, double y) { long base = (randomBits(seed, x, y) & 0x000fffffffffffffL) | POSITIVE_POW1; // Sign and exponent return Double.longBitsToDouble(base); } - public long randomBits(int seed, double x, double y, double z) { + public long randomBits(long seed, double x, double y, double z) { long hashX = Double.doubleToRawLongBits(x) ^ seed; long hashZ = Double.doubleToRawLongBits(y) ^ seed; long hash = (((hashX ^ (hashX >>> 32)) + ((hashZ ^ (hashZ >>> 32)) << 32)) ^ seed) + Double.doubleToRawLongBits(z); return murmur64(hash); } - public long randomBits(int seed, double x, double y) { + public long randomBits(long seed, double x, double y) { long hashX = Double.doubleToRawLongBits(x) ^ seed; long hashZ = Double.doubleToRawLongBits(y) ^ seed; long hash = ((hashX ^ (hashX >>> 32)) + ((hashZ ^ (hashZ >>> 32)) << 32)) ^ seed; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java index cb8c91d69..eb9a152f4 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java @@ -4,13 +4,10 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; * NoiseSampler implementation to provide OpenSimplex2 (Smooth Variant) noise. */ public class OpenSimplex2SSampler extends SimplexStyleSampler { - public OpenSimplex2SSampler(int seed) { - super(seed); - } - @Override @SuppressWarnings("NumericOverflow") - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; // 2D OpenSimplex2S case is a modified 2D simplex noise. final double SQRT3 = 1.7320508075688772935274463415059; @@ -117,7 +114,8 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler { @Override @SuppressWarnings("NumericOverflow") - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; // 3D OpenSimplex2S case uses two offset rotated cube grids. final double R3 = (2.0 / 3.0); double r = (x + y + z) * R3; // Rotation, not skew diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java index 6a8e46089..c4379b212 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java @@ -6,12 +6,9 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; public class OpenSimplex2Sampler extends SimplexStyleSampler { private static final double SQRT3 = 1.7320508075688772935274463415059; - public OpenSimplex2Sampler(int seed) { - super(seed); - } - @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; // 2D OpenSimplex2 case uses the same algorithm as ordinary Simplex. final double G2 = (3 - SQRT3) / 6; @@ -71,7 +68,8 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; // 3D OpenSimplex2Sampler case uses two offset rotated cube grids. final double R3 = (2.0 / 3.0); double r = (x + y + z) * R3; // Rotation, not skew diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java index a20dd5c79..044029a39 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java @@ -4,12 +4,9 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; * NoiseSampler implementation to provide Perlin Noise. */ public class PerlinSampler extends SimplexStyleSampler { - public PerlinSampler(int seed) { - super(seed); - } - @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; int x0 = fastFloor(x); int y0 = fastFloor(y); @@ -33,7 +30,8 @@ public class PerlinSampler extends SimplexStyleSampler { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; int x0 = fastFloor(x); int y0 = fastFloor(y); int z0 = fastFloor(z); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java index 9190c981a..045441534 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java @@ -23,10 +23,6 @@ public class SimplexSampler extends SimplexStyleSampler { private static final int Z_PRIME = 6971; - public SimplexSampler(int seed) { - super(seed); - } - private static double gradCoord3D(int seed, int x, int y, int z, double xd, double yd, double zd) { int hash = seed; hash ^= X_PRIME * x; @@ -55,7 +51,8 @@ public class SimplexSampler extends SimplexStyleSampler { } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; double t = (x + y) * F2; int i = fastFloor(x + t); int j = fastFloor(y + t); @@ -111,7 +108,8 @@ public class SimplexSampler extends SimplexStyleSampler { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; double t = (x + y + z) * F3; int i = fastFloor(x + t); int j = fastFloor(y + t); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java index 39c0b6c7c..f6183e1ec 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java @@ -71,10 +71,6 @@ public abstract class SimplexStyleSampler extends NoiseFunction { 1, 1, 0, 0, 0, -1, 1, 0, -1, 1, 0, 0, 0, -1, -1, 0 }; - public SimplexStyleSampler(int seed) { - super(seed); - } - protected static double gradCoord(int seed, int xPrimed, int yPrimed, double xd, double yd) { int hash = hash(seed, xPrimed, yPrimed); hash ^= hash >> 15; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java index bb61eb93b..3f19dc41e 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java @@ -1,12 +1,9 @@ package com.dfsek.terra.addons.noise.samplers.noise.value; public class ValueCubicSampler extends ValueStyleNoise { - public ValueCubicSampler(int seed) { - super(seed); - } - @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; int x1 = fastFloor(x); int y1 = fastFloor(y); @@ -35,7 +32,8 @@ public class ValueCubicSampler extends ValueStyleNoise { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; int x1 = fastFloor(x); int y1 = fastFloor(y); int z1 = fastFloor(z); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java index 1546177f6..1258c9a00 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java @@ -1,12 +1,9 @@ package com.dfsek.terra.addons.noise.samplers.noise.value; public class ValueSampler extends ValueStyleNoise { - public ValueSampler(int seed) { - super(seed); - } - @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; int x0 = fastFloor(x); int y0 = fastFloor(y); @@ -25,7 +22,8 @@ public class ValueSampler extends ValueStyleNoise { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; int x0 = fastFloor(x); int y0 = fastFloor(y); int z0 = fastFloor(z); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueStyleNoise.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueStyleNoise.java index 32483df29..8ed8f263c 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueStyleNoise.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueStyleNoise.java @@ -3,9 +3,6 @@ package com.dfsek.terra.addons.noise.samplers.noise.value; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; public abstract class ValueStyleNoise extends NoiseFunction { - public ValueStyleNoise(int seed) { - super(seed); - } protected static double valCoord(int seed, int xPrimed, int yPrimed) { int hash = hash(seed, xPrimed, yPrimed); diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java index a76f335bc..1a6fd9695 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java @@ -6,12 +6,14 @@ import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.registry.OpenRegistry; +import com.dfsek.terra.api.util.reflection.TypeKey; import java.util.function.Supplier; public class OreConfigType implements ConfigType { private final OreFactory factory = new OreFactory(); private final ConfigPack pack; + public static final TypeKey ORE_TYPE_TOKEN = new TypeKey<>(){}; public OreConfigType(ConfigPack pack) { this.pack = pack; @@ -28,8 +30,8 @@ public class OreConfigType implements ConfigType { } @Override - public Class getTypeClass() { - return Ore.class; + public TypeKey getTypeClass() { + return ORE_TYPE_TOKEN; } @Override diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OrePopulator.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OrePopulator.java index d614e656c..73489249e 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OrePopulator.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OrePopulator.java @@ -31,7 +31,7 @@ public class OrePopulator implements TerraGenerationStage { Random random = new Random(PopulationUtil.getCarverChunkSeed(chunk.getX() + cx, chunk.getZ() + cz, world.getSeed())); int originX = ((chunk.getX() + cx) << 4); int originZ = ((chunk.getZ() + cz) << 4); - TerraBiome b = tw.getBiomeProvider().getBiome(originX + 8, originZ + 8); + TerraBiome b = tw.getBiomeProvider().getBiome(originX + 8, originZ + 8, world.getSeed()); /* BiomeTemplate config = ((UserDefinedBiome) b).getConfig(); int finalCx = cx; diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java index 8e05d56c5..49c77e386 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java @@ -8,6 +8,7 @@ import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.registry.OpenRegistry; +import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.generator.Palette; import java.util.function.Supplier; @@ -17,6 +18,8 @@ public class PaletteConfigType implements ConfigType { private final ConfigPack pack; private final TerraPlugin main; + public static final TypeKey PALETTE_TYPE_TOKEN = new TypeKey<>(){}; + public PaletteConfigType(ConfigPack pack, TerraPlugin main) { this.pack = pack; this.main = main; @@ -33,8 +36,8 @@ public class PaletteConfigType implements ConfigType { } @Override - public Class getTypeClass() { - return Palette.class; + public TypeKey getTypeClass() { + return PALETTE_TYPE_TOKEN; } @Override diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java index 54a9ec4dc..f64eb7931 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java @@ -9,7 +9,7 @@ import com.dfsek.terra.api.world.generator.Palette; 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); + NoisePalette palette = new NoisePalette(config.getNoise()); for(PaletteLayerHolder layer : config.getPalette()) { palette.add(layer.getLayer(), layer.getSize(), layer.getSampler()); } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteTemplate.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteTemplate.java index 6dc9e03e2..0ded0a85b 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteTemplate.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteTemplate.java @@ -5,7 +5,7 @@ import com.dfsek.tectonic.annotations.Final; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.addons.palette.palette.PaletteLayerHolder; import com.dfsek.terra.api.config.AbstractableTemplate; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; +import com.dfsek.terra.api.noise.NoiseSampler; import java.util.List; @@ -13,7 +13,7 @@ import java.util.List; public class PaletteTemplate implements AbstractableTemplate { @Value("noise") @Default - private NoiseSeeded noise = NoiseSeeded.zero(2); + private NoiseSampler noise = NoiseSampler.zero(); @Value("id") @Final @@ -30,7 +30,7 @@ public class PaletteTemplate implements AbstractableTemplate { return palette; } - public NoiseSeeded getNoise() { + public NoiseSampler getNoise() { return noise; } } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/NoisePalette.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/NoisePalette.java index 94922fd6b..24e1bac68 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/NoisePalette.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/NoisePalette.java @@ -7,15 +7,13 @@ import java.util.List; public class NoisePalette extends PaletteImpl { private final NoiseSampler sampler; - private final boolean is2D; - public NoisePalette(NoiseSampler sampler, boolean is2D) { + public NoisePalette(NoiseSampler sampler) { this.sampler = sampler; - this.is2D = is2D; - } + } @Override - public BlockState get(int layer, double x, double y, double z) { + public BlockState get(int layer, double x, double y, double z, long seed) { PaletteLayer paletteLayer; if(layer > this.getSize()) paletteLayer = this.getLayers().get(this.getLayers().size() - 1); else { @@ -24,6 +22,6 @@ public class NoisePalette extends PaletteImpl { else paletteLayer = pl.get(layer); } NoiseSampler paletteSampler = paletteLayer.getSampler(); - return paletteLayer.get(paletteSampler == null ? sampler : paletteSampler, x, y, z, is2D); + return paletteLayer.get(paletteSampler == null ? sampler : paletteSampler, x, y, z, seed); } } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java index b034c49f4..e11462958 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java @@ -13,7 +13,7 @@ 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 PaletteImpl implements com.dfsek.terra.api.world.generator.Palette { +public abstract class PaletteImpl implements Palette { private final List pallet = new ArrayList<>(); /** @@ -86,19 +86,9 @@ public abstract class PaletteImpl implements com.dfsek.terra.api.world.generator return sampler; } - /** - * Gets a material from the layer. - * - * @return Material - the material.. - */ - public BlockState get(Random random) { - if(col) return this.collection.get(random); - return m; - } - public BlockState 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); + public BlockState get(NoiseSampler random, double x, double y, double z, long seed) { + if(col) return this.collection.get(random, x, y, z, seed); return m; } @@ -115,7 +105,7 @@ public abstract class PaletteImpl implements com.dfsek.terra.api.world.generator } @Override - public BlockState get(int layer, double x, double y, double z) { + public BlockState get(int layer, double x, double y, double z, long seed) { return item; } } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerLoader.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerLoader.java index 90b7146f2..a5c73728f 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerLoader.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerLoader.java @@ -6,10 +6,8 @@ import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; import java.lang.reflect.AnnotatedType; -import java.lang.reflect.Type; import java.util.Map; @SuppressWarnings("unchecked") @@ -34,7 +32,7 @@ public class PaletteLayerLoader implements TypeLoader { NoiseSampler sampler = null; if(map.containsKey("noise")) { - sampler = configLoader.loadType(NoiseSeeded.class, map.get("noise")).apply(2403L); + sampler = configLoader.loadType(NoiseSampler.class, map.get("noise")); } if(collection == null) throw new LoadException("Collection is null: " + map.get("materials")); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructures.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructures.java index 3336fab68..2c5e20d2e 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructures.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructures.java @@ -1,7 +1,7 @@ package com.dfsek.terra.addons.structure; import com.dfsek.terra.api.properties.Properties; -import com.dfsek.terra.api.structure.ConfiguredStructure; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import java.util.Set; diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructuresTemplate.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructuresTemplate.java index 7d5d4ce5d..a01a6c756 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructuresTemplate.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructuresTemplate.java @@ -3,7 +3,7 @@ package com.dfsek.terra.addons.structure; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.api.structure.ConfiguredStructure; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import java.util.Collections; import java.util.Set; diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureAddon.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureAddon.java index ee14c6a50..4824b8a11 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureAddon.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureAddon.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.addon.annotations.Version; import com.dfsek.terra.api.event.EventListener; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.injection.annotations.Inject; -import com.dfsek.terra.api.structure.ConfiguredStructure; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; @Addon("config-structure") @Version("1.0.0") diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureFactory.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureFactory.java index 1d5f51022..b614514b0 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureFactory.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureFactory.java @@ -2,7 +2,7 @@ package com.dfsek.terra.addons.structure; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.ConfigFactory; -import com.dfsek.terra.api.structure.ConfiguredStructure; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; public class StructureFactory implements ConfigFactory { @Override diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructurePopulator.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructurePopulator.java index 5fa54b7aa..c2a126d2d 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructurePopulator.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructurePopulator.java @@ -3,7 +3,7 @@ package com.dfsek.terra.addons.structure; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.WorldConfig; import com.dfsek.terra.api.profiler.ProfileFrame; -import com.dfsek.terra.api.structure.ConfiguredStructure; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import com.dfsek.terra.api.structure.rotation.Rotation; import com.dfsek.terra.api.util.PopulationUtil; import com.dfsek.terra.api.vector.Vector3; @@ -39,7 +39,7 @@ public class StructurePopulator implements TerraGenerationStage, Chunkified { for(ConfiguredStructure conf : config.getRegistry(TerraStructure.class).entries()) { Vector3 spawn = conf.getSpawn().getNearestSpawn(cx + 8, cz + 8, world.getSeed()); - if(!provider.getBiome(spawn).getContext().get(BiomeStructures.class).getStructures().contains(conf)) { + if(!provider.getBiome(spawn, world.getSeed()).getContext().get(BiomeStructures.class).getStructures().contains(conf)) { continue; } Random random = new Random(PopulationUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed())); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/TerraStructure.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/TerraStructure.java index 7dd9134ce..79b37e7fa 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/TerraStructure.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/TerraStructure.java @@ -1,6 +1,6 @@ package com.dfsek.terra.addons.structure; -import com.dfsek.terra.api.structure.ConfiguredStructure; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.StructureSpawn; import com.dfsek.terra.api.util.Range; diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/AsyncStructureFinder.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/AsyncStructureFinder.java index 85fded7b7..9154f0599 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/AsyncStructureFinder.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/AsyncStructureFinder.java @@ -1,7 +1,7 @@ package com.dfsek.terra.addons.structure.command; import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.structure.ConfiguredStructure; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureLocateCommand.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureLocateCommand.java index d49c5bc3d..dad15f00f 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureLocateCommand.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureLocateCommand.java @@ -16,7 +16,7 @@ import com.dfsek.terra.api.command.arg.IntegerArgumentParser; import com.dfsek.terra.api.entity.CommandSender; import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.injection.annotations.Inject; -import com.dfsek.terra.api.structure.ConfiguredStructure; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import com.dfsek.terra.api.vector.Vector3; import java.util.Locale; diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/StructureArgumentParser.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/StructureArgumentParser.java index 989d3b852..aec0dcaa5 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/StructureArgumentParser.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/StructureArgumentParser.java @@ -5,7 +5,7 @@ import com.dfsek.terra.api.command.arg.ArgumentParser; import com.dfsek.terra.api.entity.CommandSender; import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.injection.annotations.Inject; -import com.dfsek.terra.api.structure.ConfiguredStructure; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; public class StructureArgumentParser implements ArgumentParser { @Inject diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/StructureCompleter.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/StructureCompleter.java index 2fcddf53e..17007423f 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/StructureCompleter.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/StructureCompleter.java @@ -5,7 +5,7 @@ import com.dfsek.terra.api.command.tab.TabCompleter; import com.dfsek.terra.api.entity.CommandSender; import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.injection.annotations.Inject; -import com.dfsek.terra.api.structure.ConfiguredStructure; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import java.util.ArrayList; import java.util.List; diff --git a/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeConfigType.java b/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeConfigType.java index 7af6d171a..b6da598d1 100644 --- a/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeConfigType.java +++ b/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeConfigType.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.registry.OpenRegistry; +import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.Tree; import java.util.function.Supplier; @@ -13,6 +14,7 @@ public class TreeConfigType implements ConfigType { private final TreeFactory factory = new TreeFactory(); private final ConfigPack pack; + public static final TypeKey TREE_TYPE_TOKEN = new TypeKey<>(){}; public TreeConfigType(ConfigPack pack) { this.pack = pack; } @@ -28,8 +30,8 @@ public class TreeConfigType implements ConfigType { } @Override - public Class getTypeClass() { - return Tree.class; + public TypeKey getTypeClass() { + return TREE_TYPE_TOKEN; } @Override diff --git a/common/addons/generation-stage-feature/build.gradle.kts b/common/addons/generation-stage-feature/build.gradle.kts new file mode 100644 index 000000000..07542d899 --- /dev/null +++ b/common/addons/generation-stage-feature/build.gradle.kts @@ -0,0 +1,45 @@ +import com.dfsek.terra.configureCompilation +import com.dfsek.terra.configureDependencies + +plugins { + `java-library` + `maven-publish` + idea +} + +configureCompilation() +configureDependencies() + +group = "com.dfsek.terra.common" + +dependencies { + "shadedApi"(project(":common:api")) + "compileOnly"("com.google.guava:guava:30.0-jre") + + "testImplementation"("com.google.guava:guava:30.0-jre") +} + +publishing { + publications { + create("mavenJava") { + artifact(tasks["sourcesJar"]) + artifact(tasks["jar"]) + } + } + + repositories { + val mavenUrl = "https://repo.codemc.io/repository/maven-releases/" + val mavenSnapshotUrl = "https://repo.codemc.io/repository/maven-snapshots/" + + 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/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/ColumnImpl.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/ColumnImpl.java new file mode 100644 index 000000000..ed18a9b96 --- /dev/null +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/ColumnImpl.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.addons.generation.feature; + +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.world.Column; +import com.dfsek.terra.api.world.World; + +public class ColumnImpl implements Column { + private final int x; + private final int z; + private final World world; + + public ColumnImpl(int x, int z, World world) { + this.x = x; + this.z = z; + this.world = world; + } + + @Override + public int getX() { + return x; + } + + @Override + public int getZ() { + return z; + } + + @Override + public BlockState getBlock(int y) { + return world.getBlockData(x, y, z); + } + + @Override + public World getWorld() { + return world; + } +} diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java new file mode 100644 index 000000000..9016d06da --- /dev/null +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.addons.generation.feature; + +import com.dfsek.terra.addons.generation.feature.config.BiomeFeaturesTemplate; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.addon.TerraAddon; +import com.dfsek.terra.api.addon.annotations.Addon; +import com.dfsek.terra.api.addon.annotations.Author; +import com.dfsek.terra.api.addon.annotations.Version; +import com.dfsek.terra.api.event.EventListener; +import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; +import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; +import com.dfsek.terra.api.injection.annotations.Inject; +import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.api.world.generator.GenerationStageProvider; + +@Addon("generation-stage-feature") +@Version("1.0.0") +@Author("Terra") +public class FeatureGenerationAddon extends TerraAddon implements EventListener { + @Inject + private TerraPlugin main; + + @Override + public void initialize() { + main.getEventManager().registerListener(this, this); + } + + public void onPackLoad(ConfigPackPreLoadEvent event) { + event.getPack().getOrCreateRegistry(GenerationStageProvider.class).register("FEATURE", pack -> new FeatureGenerationStage(main)); + } + + public void onBiomeLoad(ConfigurationLoadEvent event) { + if(event.is(TerraBiome.class)) { + event.getLoadedObject(TerraBiome.class).getContext().put(event.load(new BiomeFeaturesTemplate()).get()); + } + } +} diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java new file mode 100644 index 000000000..9810afbce --- /dev/null +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.addons.generation.feature; + +import com.dfsek.terra.addons.generation.feature.config.BiomeFeatures; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.profiler.ProfileFrame; +import com.dfsek.terra.api.structure.rotation.Rotation; +import com.dfsek.terra.api.util.PopulationUtil; +import com.dfsek.terra.api.vector.Vector3; +import com.dfsek.terra.api.world.Chunk; +import com.dfsek.terra.api.world.TerraWorld; +import com.dfsek.terra.api.world.World; +import com.dfsek.terra.api.world.generator.TerraGenerationStage; + +public class FeatureGenerationStage implements TerraGenerationStage { + private final TerraPlugin main; + + public FeatureGenerationStage(TerraPlugin main) { + this.main = main; + } + + @Override + @SuppressWarnings("try") + public void populate(World world, Chunk chunk) { + TerraWorld terraWorld = main.getWorld(world); + try(ProfileFrame ignore = main.getProfiler().profile("feature")) { + int cx = chunk.getX() << 4; + int cz = chunk.getZ() << 4; + long seed = world.getSeed(); + for(int x = 0; x < 16; x++) { + for(int z = 0; z < 16; z++) { + int tx = cx + x; + int tz = cz + z; + ColumnImpl column = new ColumnImpl(tx, tz, world); + terraWorld.getBiomeProvider().getBiome(tx, tz, seed).getContext().get(BiomeFeatures.class).getFeatures().forEach(feature -> { + if(feature.getDistributor().matches(tx, tz, seed)) { + feature.getLocator() + .getSuitableCoordinates(column) + .forEach(y -> + feature.getStructure(world, tx, y, tz) + .generateDirect(new Vector3(tx, y, tz), world, PopulationUtil.getRandom(chunk), Rotation.NONE) + ); + } + }); + } + } + } + } +} diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeatures.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeatures.java new file mode 100644 index 000000000..bcf7d67a3 --- /dev/null +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeatures.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.generation.feature.config; + +import com.dfsek.terra.api.properties.Properties; +import com.dfsek.terra.api.structure.feature.Feature; + +import java.util.List; + +public class BiomeFeatures implements Properties { + private final List features; + + public BiomeFeatures(List features) { + this.features = features; + } + + public List getFeatures() { + return features; + } +} diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeaturesTemplate.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeaturesTemplate.java new file mode 100644 index 000000000..dc767bc9c --- /dev/null +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeaturesTemplate.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.generation.feature.config; + +import com.dfsek.tectonic.annotations.Default; +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.api.structure.feature.Feature; + +import java.util.Collections; +import java.util.List; + +public class BiomeFeaturesTemplate implements ObjectTemplate { + @Value("features") + @Default + private List features = Collections.emptyList(); + + @Override + public BiomeFeatures get() { + return new BiomeFeatures(features); + } +} diff --git a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationAddon.java b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationAddon.java index 37c2becb0..de6f38d09 100644 --- a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationAddon.java +++ b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationAddon.java @@ -9,7 +9,7 @@ import com.dfsek.terra.api.event.EventListener; import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.injection.annotations.Inject; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; +import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.generator.GenerationStageProvider; @Addon("generation-stage-flora") @@ -31,8 +31,8 @@ public class FloraGenerationAddon extends TerraAddon implements EventListener { } public void onBiomeLoad(ConfigurationLoadEvent event) { - if(BiomeBuilder.class.isAssignableFrom(event.getType().getTypeClass())) { - event.getLoadedObject(BiomeBuilder.class).getContext().put(event.load(new BiomeFloraTemplate()).get()); + if(event.is(TerraBiome.class)) { + event.getLoadedObject(TerraBiome.class).getContext().put(event.load(new BiomeFloraTemplate()).get()); } } } diff --git a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationStage.java b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationStage.java index 00a3354b8..7cf03a0b1 100644 --- a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationStage.java +++ b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationStage.java @@ -33,12 +33,13 @@ public class FloraGenerationStage implements TerraGenerationStage { try(ProfileFrame ignore = main.getProfiler().profile("flora")) { if(tw.getConfig().disableFlora()) return; + long seed = world.getSeed(); BiomeProvider provider = tw.getBiomeProvider(); Map> layers = new HashMap<>(); for(int x = 0; x < 16; x++) { for(int z = 0; z < 16; z++) { Vector2 l = new Vector2(x, z); - layers.put(l, provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z).getContext().get(BiomeFlora.class).getLayers()); + layers.put(l, provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z, seed).getContext().get(BiomeFlora.class).getLayers()); } } diff --git a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayer.java b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayer.java index d5609e4c9..7f8c23b30 100644 --- a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayer.java +++ b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayer.java @@ -39,7 +39,7 @@ public class FloraLayer { public void place(Chunk chunk, Vector2 coords) { int cx = (chunk.getX() << 4); int cz = (chunk.getZ() << 4); - Flora item = layer.get(noise, cx + coords.getX(), cz + coords.getZ()); + Flora item = layer.get(noise, cx + coords.getX(), cz + coords.getZ(), chunk.getWorld().getSeed()); item.getValidSpawnsAt(chunk, (int) coords.getX(), (int) coords.getZ(), level).forEach(block -> item.plant(block.add(cx, 0, cz), chunk.getWorld())); } } diff --git a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayerLoader.java b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayerLoader.java index 10f971852..627bedec3 100644 --- a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayerLoader.java +++ b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayerLoader.java @@ -2,9 +2,9 @@ package com.dfsek.terra.addons.generation.flora; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.world.Flora; public class FloraLayerLoader implements ObjectTemplate { @@ -18,11 +18,11 @@ public class FloraLayerLoader implements ObjectTemplate { private ProbabilityCollection items; @Value("distribution") - private NoiseSeeded distribution; + private NoiseSampler distribution; @Override public FloraLayer get() { - return new FloraLayer(density, y, items, distribution.apply(2403L)); + return new FloraLayer(density, y, items, distribution); } } diff --git a/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeGenerationAddon.java b/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeGenerationAddon.java index d4186ada5..852aac8cd 100644 --- a/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeGenerationAddon.java +++ b/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeGenerationAddon.java @@ -10,7 +10,7 @@ import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.registry.exception.DuplicateEntryException; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; +import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.generator.GenerationStageProvider; @Addon("generation-stage-tree") @@ -31,8 +31,8 @@ public class TreeGenerationAddon extends TerraAddon implements EventListener { } public void onBiomeLoad(ConfigurationLoadEvent event) { - if(BiomeBuilder.class.isAssignableFrom(event.getType().getTypeClass())) { - event.getLoadedObject(BiomeBuilder.class).getContext().put(event.load(new BiomeTreeTemplate()).get()); + if(event.is(TerraBiome.class)) { + event.getLoadedObject(TerraBiome.class).getContext().put(event.load(new BiomeTreeTemplate()).get()); } } } diff --git a/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeLayer.java b/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeLayer.java index 3f2110f51..5b454d319 100644 --- a/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeLayer.java +++ b/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeLayer.java @@ -40,7 +40,7 @@ public class TreeLayer { } public void place(Chunk chunk, Vector2 coords) { - Tree item = layer.get(noise, coords.getX(), coords.getZ()); + Tree item = layer.get(noise, coords.getX(), coords.getZ(), chunk.getWorld().getSeed()); BlockState current; int cx = (chunk.getX()) << 4; int cz = (chunk.getZ()) << 4; diff --git a/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeLayerTemplate.java b/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeLayerTemplate.java index 260bab508..3b6ba5b8a 100644 --- a/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeLayerTemplate.java +++ b/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeLayerTemplate.java @@ -2,9 +2,9 @@ package com.dfsek.terra.addons.generation.tree; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.world.Tree; public class TreeLayerTemplate implements ObjectTemplate { @@ -18,10 +18,10 @@ public class TreeLayerTemplate implements ObjectTemplate { private ProbabilityCollection items; @Value("distribution") - private NoiseSeeded distribution; + private NoiseSampler distribution; @Override public TreeLayer get() { - return new TreeLayer(density, y, items, distribution.apply(2403L)); + return new TreeLayer(density, y, items, distribution); } } diff --git a/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreePopulator.java b/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreePopulator.java index a014b4d16..6328b3497 100644 --- a/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreePopulator.java +++ b/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreePopulator.java @@ -35,9 +35,10 @@ public class TreePopulator implements TerraGenerationStage { BiomeProvider provider = tw.getBiomeProvider(); Random random = PopulationUtil.getRandom(chunk); + long seed = world.getSeed(); for(int x = 0; x < 16; x += 2) { for(int z = 0; z < 16; z += 2) { - for(TreeLayer layer : provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z).getContext().get(BiomeTrees.class).getTrees()) { + for(TreeLayer layer : provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z, seed).getContext().get(BiomeTrees.class).getTrees()) { if(layer.getDensity() >= random.nextDouble() * 100) { layer.place(chunk, new Vector2(offset(random, x), offset(random, z))); } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java index f1bfa3094..201df7fd0 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java @@ -40,7 +40,7 @@ public class BiomeFunction implements Function { BiomeProvider grid = main.getWorld(arguments.getWorld()).getBiomeProvider(); - return grid.getBiome(arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())))).getID(); + return grid.getBiome(arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ()))), arguments.getWorld().getSeed()).getID(); } diff --git a/common/api/build.gradle.kts b/common/api/build.gradle.kts index 43ffb3413..ef64d7c34 100644 --- a/common/api/build.gradle.kts +++ b/common/api/build.gradle.kts @@ -13,10 +13,10 @@ configureDependencies() group = "com.dfsek.terra.common" dependencies { - "shadedApi"("com.dfsek:Paralithic:0.3.2") + "shadedApi"("com.dfsek:Paralithic:0.4.0") - "shadedApi"("com.dfsek.tectonic:common:2.1.0") - "shadedApi"("com.dfsek.tectonic:yaml:2.1.0") + "shadedApi"("com.dfsek.tectonic:common:2.1.1") + "shadedApi"("com.dfsek.tectonic:yaml:2.1.1") "shadedApi"("net.jafama:jafama:2.3.2") "shadedApi"("org.yaml:snakeyaml:1.27") diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java index febcfce56..edcbe9bcc 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java @@ -6,19 +6,28 @@ import com.dfsek.terra.api.registry.meta.RegistryFactory; import com.dfsek.terra.api.registry.meta.RegistryHolder; import com.dfsek.terra.api.tectonic.LoaderHolder; import com.dfsek.terra.api.tectonic.LoaderRegistrar; -import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder; +import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.TerraWorld; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider; import com.dfsek.terra.api.world.generator.GenerationStageProvider; +import java.lang.reflect.Type; import java.util.List; import java.util.Map; import java.util.Set; public interface ConfigPack extends LoaderRegistrar, LoaderHolder, RegistryHolder { - BiomeProviderBuilder getBiomeProviderBuilder(); + BiomeProvider getBiomeProviderBuilder(); - CheckedRegistry getOrCreateRegistry(Class clazz); + CheckedRegistry getOrCreateRegistry(Type clazz); + default CheckedRegistry getOrCreateRegistry(Class clazz) { + return getOrCreateRegistry((Type) clazz); + } + + default CheckedRegistry getOrCreateRegistry(TypeKey type) { + return getOrCreateRegistry(type.getType()); + } WorldConfig toWorldConfig(TerraWorld world); diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java index 49e60ba6e..482bfc8d4 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api.config; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.registry.OpenRegistry; +import com.dfsek.terra.api.util.reflection.TypeKey; import java.util.function.Supplier; @@ -10,7 +11,7 @@ public interface ConfigType { ConfigFactory getFactory(); - Class getTypeClass(); + TypeKey getTypeClass(); Supplier> registrySupplier(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java b/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java index 59cec4008..03c7f5f0d 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java @@ -1,20 +1,19 @@ package com.dfsek.terra.api.config; -import com.dfsek.tectonic.config.Configuration; import com.dfsek.tectonic.exception.ConfigException; -import com.dfsek.terra.api.util.function.ExceptionalConsumer; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Consumer; public interface Loader { - Loader thenNames(ExceptionalConsumer> consumer) throws ConfigException; + Loader thenNames(Consumer> consumer) throws ConfigException; - Loader thenEntries(ExceptionalConsumer>> consumer) throws ConfigException; + Loader thenEntries(Consumer>> consumer) throws ConfigException; /** * Get a single file from this Loader. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java index 49dcdbf83..2e5492291 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java @@ -5,6 +5,7 @@ import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.event.events.PackEvent; +import com.dfsek.terra.api.util.reflection.ReflectionUtil; import java.util.function.Consumer; @@ -49,13 +50,13 @@ public class ConfigurationLoadEvent implements PackEvent { } public boolean is(Class clazz) { - return clazz.isAssignableFrom(type.getTypeClass()); + return clazz.isAssignableFrom(type.getTypeClass().getRawType()); } @SuppressWarnings("unchecked") public T getLoadedObject(Class clazz) { - if(!clazz.isAssignableFrom(type.getTypeClass())) - throw new ClassCastException("Cannot assign object from loader of type " + type.getTypeClass().getCanonicalName() + " to class " + clazz.getCanonicalName()); + if(!clazz.isAssignableFrom(type.getTypeClass().getRawType())) + throw new ClassCastException("Cannot assign object from loader of type " + ReflectionUtil.typeToString(type.getTypeClass().getType()) + " to class " + clazz.getCanonicalName()); return (T) loaded; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java index a23e90a9c..bd1836beb 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.event.events.PackEvent; import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.util.reflection.ReflectionUtil; public abstract class ConfigTypeLoadEvent implements PackEvent { private final ConfigType type; @@ -23,13 +24,13 @@ public abstract class ConfigTypeLoadEvent implements PackEvent { } public boolean is(Class clazz) { - return clazz.isAssignableFrom(type.getTypeClass()); + return clazz.isAssignableFrom(type.getTypeClass().getRawType()); } @SuppressWarnings("unchecked") public CheckedRegistry getRegistry(Class clazz) { - if(!clazz.isAssignableFrom(type.getTypeClass())) - throw new ClassCastException("Cannot assign object from loader of type " + type.getTypeClass().getCanonicalName() + " to class " + clazz.getCanonicalName()); + if(!clazz.isAssignableFrom(type.getTypeClass().getRawType())) + throw new ClassCastException("Cannot assign object from loader of type " + ReflectionUtil.typeToString(type.getTypeClass().getType()) + " to class " + clazz.getCanonicalName()); return (CheckedRegistry) registry; } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java b/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java index ad1de8b74..e3fc8a9bc 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java +++ b/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java @@ -8,50 +8,26 @@ public interface NoiseSampler { static NoiseSampler zero() { return new NoiseSampler() { @Override - public double getNoise(double x, double y) { + public double getNoiseSeeded(long seed, double x, double y) { return 0; } @Override - public double getNoise(double x, double y, double z) { - return 0; - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { - return 0; - } - - @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { + public double getNoiseSeeded(long seed, double x, double y, double z) { return 0; } }; } - /** - * 2D noise at given position using current settings - *

- * Noise output bounded between -1...1 - */ - double getNoise(double x, double y); - - /** - * 3D noise at given position using current settings - *

- * Noise output bounded between -1...1 - */ - double getNoise(double x, double y, double z); - - default double getNoise(Vector3 vector3) { - return getNoise(vector3.getX(), vector3.getY(), vector3.getZ()); + default double getNoiseSeeded(Vector3 vector3, long seed) { + return getNoiseSeeded(seed, vector3.getX(), vector3.getY(), vector3.getZ()); } - default double getNoise(Vector2 vector2) { - return getNoise(vector2.getX(), vector2.getZ()); + default double getNoiseSeeded(Vector2 vector2, long seed) { + return getNoiseSeeded(seed, vector2.getX(), vector2.getZ()); } - double getNoiseSeeded(int seed, double x, double y); + double getNoiseSeeded(long seed, double x, double y); - double getNoiseSeeded(int seed, double x, double y, double z); + double getNoiseSeeded(long seed, double x, double y, double z); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryHolder.java b/common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryHolder.java index 29a8fd8a8..e1e839a81 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryHolder.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryHolder.java @@ -2,9 +2,30 @@ package com.dfsek.terra.api.registry.meta; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.util.reflection.TypeKey; + +import java.lang.reflect.Type; public interface RegistryHolder { - Registry getRegistry(Class clazz); + default Registry getRegistry(Class clazz) { + return getRegistry((Type) clazz); + } - CheckedRegistry getCheckedRegistry(Class clazz) throws IllegalStateException; + default Registry getRegistry(TypeKey type) { + return getRegistry(type.getType()); + } + + Registry getRegistry(Type type); + + default CheckedRegistry getCheckedRegistry(Class clazz) throws IllegalStateException { + return getCheckedRegistry((Type) clazz); + } + + default CheckedRegistry getCheckedRegistry(TypeKey type) throws IllegalStateException { + return getCheckedRegistry(type.getType()); + } + + default CheckedRegistry getCheckedRegistry(Type type) throws IllegalStateException { + throw new IllegalStateException("Cannot get checked registry."); + } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/ConfiguredStructure.java b/common/api/src/main/java/com/dfsek/terra/api/structure/configured/ConfiguredStructure.java similarity index 65% rename from common/api/src/main/java/com/dfsek/terra/api/structure/ConfiguredStructure.java rename to common/api/src/main/java/com/dfsek/terra/api/structure/configured/ConfiguredStructure.java index 0d192ca29..1e04d096a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/ConfiguredStructure.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/configured/ConfiguredStructure.java @@ -1,5 +1,7 @@ -package com.dfsek.terra.api.structure; +package com.dfsek.terra.api.structure.configured; +import com.dfsek.terra.api.structure.Structure; +import com.dfsek.terra.api.structure.StructureSpawn; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.ProbabilityCollection; diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java new file mode 100644 index 000000000..2d9d33ca1 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.api.structure.feature; + +public interface Distributor { + boolean matches(int x, int z, long seed); + + default Distributor and(Distributor other) { + return (x, z, seed) -> this.matches(x, z, seed) && other.matches(x, z, seed); + } + + default Distributor or(Distributor other) { + return (x, z, seed) -> this.matches(x, z, seed) || other.matches(x, z, seed); + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java new file mode 100644 index 000000000..ee6785c62 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.api.structure.feature; + +import com.dfsek.terra.api.structure.Structure; +import com.dfsek.terra.api.world.World; + +public interface Feature { + Structure getStructure(World world, int x, int y, int z); + + Distributor getDistributor(); + + Locator getLocator(); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Locator.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Locator.java new file mode 100644 index 000000000..c49ebd2f5 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Locator.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.api.structure.feature; + +import com.dfsek.terra.api.world.Column; + +import java.util.List; + +public interface Locator { + List getSuitableCoordinates(Column column); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/ReflectionUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/ReflectionUtil.java deleted file mode 100644 index 1614bac0d..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/ReflectionUtil.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.dfsek.terra.api.util; - -import org.jetbrains.annotations.NotNull; - -import java.lang.annotation.Annotation; -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.function.Consumer; -import java.util.stream.Stream; - -public final class ReflectionUtil { - public static Field[] getFields(@NotNull Class type) { - Field[] result = type.getDeclaredFields(); - Class parentClass = type.getSuperclass(); - if(parentClass != null) { - result = Stream.concat(Arrays.stream(result), Arrays.stream(getFields(parentClass))).toArray(Field[]::new); - } - return result; - } - - public static Method[] getMethods(@NotNull Class type) { - Method[] result = type.getDeclaredMethods(); - Class parentClass = type.getSuperclass(); - if(parentClass != null) { - result = Stream.concat(Arrays.stream(result), Arrays.stream(getMethods(parentClass))).toArray(Method[]::new); - } - return result; - } - - public static void ifAnnotationPresent(AnnotatedElement element, Class annotation, Consumer operation) { - T a = element.getAnnotation(annotation); - if(a != null) operation.accept(a); - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java b/common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java index b82017112..f2b7b1926 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java @@ -38,15 +38,15 @@ public class ProbabilityCollection implements Collection { } @SuppressWarnings("unchecked") - public E get(NoiseSampler n, double x, double y, double z) { + public E get(NoiseSampler n, double x, double y, double z, long seed) { if(array.length == 0) return null; - return (E) array[MathUtil.normalizeIndex(n.getNoise(x, y, z), array.length)]; + return (E) array[MathUtil.normalizeIndex(n.getNoiseSeeded(seed, x, y, z), array.length)]; } @SuppressWarnings("unchecked") - public E get(NoiseSampler n, double x, double z) { + public E get(NoiseSampler n, double x, double z, long seed) { if(array.length == 0) return null; - return (E) array[MathUtil.normalizeIndex(n.getNoise(x, z), array.length)]; + return (E) array[MathUtil.normalizeIndex(n.getNoiseSeeded(seed, x, z), array.length)]; } @SuppressWarnings("unchecked") @@ -183,12 +183,12 @@ public class ProbabilityCollection implements Collection { } @Override - public T get(NoiseSampler n, double x, double y, double z) { + public T get(NoiseSampler n, double x, double y, double z, long seed) { return single; } @Override - public T get(NoiseSampler n, double x, double z) { + public T get(NoiseSampler n, double x, double z, long seed) { return single; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/ExceptionalConsumer.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/ExceptionalConsumer.java deleted file mode 100644 index 2bdd3c06e..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/function/ExceptionalConsumer.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.api.util.function; - -import com.dfsek.tectonic.exception.ConfigException; - -@FunctionalInterface -public interface ExceptionalConsumer { - void accept(T t) throws ConfigException; -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java new file mode 100644 index 000000000..b7f558a7a --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java @@ -0,0 +1,67 @@ +package com.dfsek.terra.api.util.reflection; + +import org.jetbrains.annotations.NotNull; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; +import java.lang.reflect.WildcardType; +import java.util.Arrays; +import java.util.function.Consumer; +import java.util.stream.Stream; + +public final class ReflectionUtil { + public static Field[] getFields(@NotNull Class type) { + Field[] result = type.getDeclaredFields(); + Class parentClass = type.getSuperclass(); + if(parentClass != null) { + result = Stream.concat(Arrays.stream(result), Arrays.stream(getFields(parentClass))).toArray(Field[]::new); + } + return result; + } + + public static Method[] getMethods(@NotNull Class type) { + Method[] result = type.getDeclaredMethods(); + Class parentClass = type.getSuperclass(); + if(parentClass != null) { + result = Stream.concat(Arrays.stream(result), Arrays.stream(getMethods(parentClass))).toArray(Method[]::new); + } + return result; + } + + public static void ifAnnotationPresent(AnnotatedElement element, Class annotation, Consumer operation) { + T a = element.getAnnotation(annotation); + if(a != null) operation.accept(a); + } + + public static Class getRawType(Type type) { + if (type instanceof Class) { + return (Class) type; + } else if (type instanceof ParameterizedType) { + ParameterizedType parameterizedType = (ParameterizedType) type; + Type rawType = parameterizedType.getRawType(); + return (Class) rawType; + } else if (type instanceof GenericArrayType) { + Type componentType = ((GenericArrayType)type).getGenericComponentType(); + return Array.newInstance(getRawType(componentType), 0).getClass(); + } else if (type instanceof TypeVariable) { + return Object.class; + } else if (type instanceof WildcardType) { + return getRawType(((WildcardType) type).getUpperBounds()[0]); + } else { + String className = type == null ? "null" : type.getClass().getName(); + throw new IllegalArgumentException("Expected a Class, ParameterizedType, or " + + "GenericArrayType, but <" + type + "> is of type " + className); + } + } + + public static String typeToString(Type type) { + return type instanceof Class ? ((Class) type).getName() : type.toString(); + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/reflection/TypeKey.java b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/TypeKey.java new file mode 100644 index 000000000..5cbafe7d8 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/TypeKey.java @@ -0,0 +1,104 @@ +package com.dfsek.terra.api.util.reflection; + +import java.lang.reflect.*; +import java.util.Arrays; +import java.util.Objects; + +public class TypeKey { + final Class rawType; + final Type type; + final int hashCode; + + @SuppressWarnings("unchecked") + protected TypeKey() { + this.type = getSuperclassTypeParameter(getClass()); + this.rawType = (Class) ReflectionUtil.getRawType(type); + this.hashCode = type.hashCode(); + } + + + static Type getSuperclassTypeParameter(Class subclass) { + Type superclass = subclass.getGenericSuperclass(); + if(superclass instanceof Class) { + throw new RuntimeException("Missing type parameter."); + } + ParameterizedType parameterized = (ParameterizedType) superclass; + return parameterized.getActualTypeArguments()[0]; + } + + /** + * Returns the raw (non-generic) type for this type. + */ + public final Class getRawType() { + return rawType; + } + + /** + * Gets underlying {@code Type} instance. + */ + public final Type getType() { + return type; + } + + @Override + public final int hashCode() { + return this.hashCode; + } + + @Override + public final boolean equals(Object o) { + return o instanceof TypeKey + && equals(type, ((TypeKey) o).type); + } + + @Override + public final String toString() { + return ReflectionUtil.typeToString(type); + } + + public static boolean equals(Type a, Type b) { + if(a == b) { + return true; + } else if(a instanceof Class) { + return a.equals(b); + } else if(a instanceof ParameterizedType) { + if(!(b instanceof ParameterizedType)) { + return false; + } + + ParameterizedType pa = (ParameterizedType) a; + ParameterizedType pb = (ParameterizedType) b; + return Objects.equals(pa.getOwnerType(), pb.getOwnerType()) + && pa.getRawType().equals(pb.getRawType()) + && Arrays.equals(pa.getActualTypeArguments(), pb.getActualTypeArguments()); + } else if(a instanceof GenericArrayType) { + if(!(b instanceof GenericArrayType)) { + return false; + } + + GenericArrayType ga = (GenericArrayType) a; + GenericArrayType gb = (GenericArrayType) b; + return equals(ga.getGenericComponentType(), gb.getGenericComponentType()); + } else if(a instanceof WildcardType) { + if(!(b instanceof WildcardType)) { + return false; + } + + WildcardType wa = (WildcardType) a; + WildcardType wb = (WildcardType) b; + return Arrays.equals(wa.getUpperBounds(), wb.getUpperBounds()) + && Arrays.equals(wa.getLowerBounds(), wb.getLowerBounds()); + } else if(a instanceof TypeVariable) { + if(!(b instanceof TypeVariable)) { + return false; + } + TypeVariable va = (TypeVariable) a; + TypeVariable vb = (TypeVariable) b; + return va.getGenericDeclaration() == vb.getGenericDeclaration() + && va.getName().equals(vb.getName()); + } else { + return false; + } + } +} + diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/seeded/BiomeBuilder.java b/common/api/src/main/java/com/dfsek/terra/api/util/seeded/BiomeBuilder.java deleted file mode 100644 index f27567cb3..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/seeded/BiomeBuilder.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dfsek.terra.api.util.seeded; - -import com.dfsek.terra.api.properties.PropertyHolder; -import com.dfsek.terra.api.properties.annotations.Linked; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.biome.TerraBiome; - -@Linked(TerraBiome.class) -public interface BiomeBuilder extends SeededBuilder, PropertyHolder { - ProbabilityCollection getVanillaBiomes(); -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/seeded/BiomeProviderBuilder.java b/common/api/src/main/java/com/dfsek/terra/api/util/seeded/BiomeProviderBuilder.java deleted file mode 100644 index 0d1e05dbe..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/seeded/BiomeProviderBuilder.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.dfsek.terra.api.util.seeded; - -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; - -public interface BiomeProviderBuilder { - BiomeProvider build(long seed); -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java b/common/api/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java deleted file mode 100644 index 90b04c3f1..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java +++ /dev/null @@ -1,9 +0,0 @@ -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/api/src/main/java/com/dfsek/terra/api/util/seeded/NoiseSeeded.java b/common/api/src/main/java/com/dfsek/terra/api/util/seeded/NoiseSeeded.java deleted file mode 100644 index 6df4adedc..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/seeded/NoiseSeeded.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dfsek.terra.api.util.seeded; - -import com.dfsek.terra.api.noise.NoiseSampler; - -public interface NoiseSeeded extends SeededBuilder { - static NoiseSeeded zero(int dimensions) { - return new NoiseSeeded() { - @Override - public NoiseSampler apply(Long seed) { - return NoiseSampler.zero(); - } - - @Override - public int getDimensions() { - return dimensions; - } - }; - } - - @Override - NoiseSampler apply(Long seed); - - int getDimensions(); -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/seeded/SeededBuilder.java b/common/api/src/main/java/com/dfsek/terra/api/util/seeded/SeededBuilder.java deleted file mode 100644 index 1a7d15d39..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/seeded/SeededBuilder.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.api.util.seeded; - -import java.util.function.Function; - -@FunctionalInterface -public interface SeededBuilder extends Function { - -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/seeded/SourceSeeded.java b/common/api/src/main/java/com/dfsek/terra/api/util/seeded/SourceSeeded.java deleted file mode 100644 index 5f1d03f95..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/seeded/SourceSeeded.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.dfsek.terra.api.util.seeded; - -import com.dfsek.terra.api.world.biome.generation.pipeline.BiomeSource; - -@FunctionalInterface -public interface SourceSeeded extends SeededBuilder { -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/Column.java b/common/api/src/main/java/com/dfsek/terra/api/world/Column.java new file mode 100644 index 000000000..7f2ed0b43 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/world/Column.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.api.world; + +import com.dfsek.terra.api.block.state.BlockState; + +/** + * A single vertical column of a world. + */ +public interface Column { + int getX(); + + int getZ(); + + BlockState getBlock(int y); + + World getWorld(); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/TerraBiome.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/TerraBiome.java index 68abb8d73..92464823b 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/TerraBiome.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/TerraBiome.java @@ -2,9 +2,7 @@ package com.dfsek.terra.api.world.biome; import com.dfsek.terra.api.properties.PropertyHolder; -import com.dfsek.terra.api.properties.annotations.Linked; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; import com.dfsek.terra.api.world.World; import java.util.Set; @@ -12,7 +10,6 @@ import java.util.Set; /** * Represents a custom biome */ -@Linked(BiomeBuilder.class) public interface TerraBiome extends PropertyHolder { /** diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java index c42557317..807fd7888 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java @@ -5,18 +5,13 @@ import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.biome.TerraBiome; public interface BiomeProvider { - TerraBiome getBiome(int x, int z); + TerraBiome getBiome(int x, int z, long seed); - default TerraBiome getBiome(Vector2 vector2) { - return getBiome(vector2.getBlockX(), vector2.getBlockZ()); + default TerraBiome getBiome(Vector2 vector2, long seed) { + return getBiome(vector2.getBlockX(), vector2.getBlockZ(), seed); } - default TerraBiome getBiome(Vector3 vector3) { - return getBiome(vector3.getBlockX(), vector3.getBlockZ()); - } - - @Deprecated - enum Type { - IMAGE, PIPELINE, SINGLE + default TerraBiome getBiome(Vector3 vector3, long seed) { + return getBiome(vector3.getBlockX(), vector3.getBlockZ(), seed); } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/pipeline/BiomeSource.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/pipeline/BiomeSource.java index ad8c208d0..6c6cc3629 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/pipeline/BiomeSource.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/pipeline/BiomeSource.java @@ -3,7 +3,7 @@ package com.dfsek.terra.api.world.biome.generation.pipeline; import com.dfsek.terra.api.world.biome.TerraBiome; public interface BiomeSource { - TerraBiome getBiome(double x, double z); + TerraBiome getBiome(double x, double z, long seed); enum Type { NOISE diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/generator/Palette.java b/common/api/src/main/java/com/dfsek/terra/api/world/generator/Palette.java index ca4f846d7..9d3de225e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/generator/Palette.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/generator/Palette.java @@ -15,7 +15,7 @@ public interface Palette { * @param layer - The layer at which to fetch the material. * @return BlockData - The material fetched. */ - BlockState get(int layer, double x, double y, double z); + BlockState get(int layer, double x, double y, double z, long seed); int getSize(); } diff --git a/common/implementation/src/main/java/com/dfsek/terra/commands/TerraCommandManager.java b/common/implementation/src/main/java/com/dfsek/terra/commands/TerraCommandManager.java index 8438b9de0..34e3f29c5 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/commands/TerraCommandManager.java +++ b/common/implementation/src/main/java/com/dfsek/terra/commands/TerraCommandManager.java @@ -22,7 +22,7 @@ import com.dfsek.terra.api.command.tab.TabCompleter; import com.dfsek.terra.api.entity.CommandSender; import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.injection.exception.InjectionException; -import com.dfsek.terra.api.util.ReflectionUtil; +import com.dfsek.terra.api.util.reflection.ReflectionUtil; import com.dfsek.terra.inject.InjectorImpl; import net.jafama.FastMath; diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/fileloaders/LoaderImpl.java b/common/implementation/src/main/java/com/dfsek/terra/config/fileloaders/LoaderImpl.java index 8f1c17fa2..839cdf325 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/fileloaders/LoaderImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/fileloaders/LoaderImpl.java @@ -2,7 +2,6 @@ package com.dfsek.terra.config.fileloaders; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.terra.api.config.Loader; -import com.dfsek.terra.api.util.function.ExceptionalConsumer; import java.io.IOException; import java.io.InputStream; @@ -11,18 +10,19 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Consumer; public abstract class LoaderImpl implements Loader { protected final Map streams = new HashMap<>(); @Override - public Loader thenNames(ExceptionalConsumer> consumer) throws ConfigException { + public Loader thenNames(Consumer> consumer) throws ConfigException { consumer.accept(new ArrayList<>(streams.keySet())); return this; } @Override - public Loader thenEntries(ExceptionalConsumer>> consumer) throws ConfigException { + public Loader thenEntries(Consumer>> consumer) throws ConfigException { consumer.accept(streams.entrySet()); return this; } diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java b/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java index cdb8087ff..15d66e5ca 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java @@ -28,9 +28,10 @@ import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.registry.exception.DuplicateEntryException; import com.dfsek.terra.api.registry.meta.RegistryFactory; +import com.dfsek.terra.api.util.reflection.ReflectionUtil; import com.dfsek.terra.api.util.generic.pair.ImmutablePair; -import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder; import com.dfsek.terra.api.world.TerraWorld; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider; import com.dfsek.terra.api.world.generator.GenerationStageProvider; import com.dfsek.terra.config.dummy.DummyWorld; @@ -82,9 +83,9 @@ public class ConfigPackImpl implements ConfigPack { private final Set addons; - private final BiomeProviderBuilder biomeProviderBuilder; + private final BiomeProvider seededBiomeProvider; - private final Map, ImmutablePair, CheckedRegistry>> registryMap = new HashMap<>(); + private final Map, CheckedRegistry>> registryMap = new HashMap<>(); private final ConfigTypeRegistry configTypeRegistry; @@ -122,8 +123,7 @@ public class ConfigPackImpl implements ConfigPack { ConfigPackPostTemplate packPostTemplate = new ConfigPackPostTemplate(); selfLoader.load(packPostTemplate, configuration); - biomeProviderBuilder = packPostTemplate.getProviderBuilder(); - biomeProviderBuilder.build(0); // Build dummy provider to catch errors at load time. + seededBiomeProvider = packPostTemplate.getProviderBuilder(); checkDeadEntries(main); } catch(FileNotFoundException e) { throw new LoadException("No pack.yml file found in " + folder.getAbsolutePath(), e); @@ -175,8 +175,7 @@ public class ConfigPackImpl implements ConfigPack { ConfigPackPostTemplate packPostTemplate = new ConfigPackPostTemplate(); selfLoader.load(packPostTemplate, configuration); - biomeProviderBuilder = packPostTemplate.getProviderBuilder(); - biomeProviderBuilder.build(0); // Build dummy provider to catch errors at load time. + seededBiomeProvider = packPostTemplate.getProviderBuilder(); checkDeadEntries(main); } catch(IOException e) { throw new LoadException("Unable to load pack.yml from ZIP file", e); @@ -189,21 +188,21 @@ public class ConfigPackImpl implements ConfigPack { toWorldConfig(new TerraWorldImpl(new DummyWorld(), this, main)); // Build now to catch any errors immediately. } + @SuppressWarnings("unchecked") private ConfigTypeRegistry createRegistry() { return new ConfigTypeRegistry(main, (id, configType) -> { OpenRegistry openRegistry = configType.registrySupplier().get(); - if(registryMap.containsKey(configType.getTypeClass())) { // Someone already registered something; we need to copy things to the new registry. - //noinspection unchecked - registryMap.get(configType.getTypeClass()).getLeft().forEach(((OpenRegistry) openRegistry)::register); + if(registryMap.containsKey(configType.getTypeClass().getType())) { // Someone already registered something; we need to copy things to the new registry. + registryMap.get(configType.getTypeClass().getType()).getLeft().forEach(((OpenRegistry) openRegistry)::register); } - selfLoader.registerLoader(configType.getTypeClass(), openRegistry); - abstractConfigLoader.registerLoader(configType.getTypeClass(), openRegistry); - registryMap.put(configType.getTypeClass(), ImmutablePair.of(openRegistry, new CheckedRegistryImpl<>(openRegistry))); + selfLoader.registerLoader(configType.getTypeClass().getType(), openRegistry); + abstractConfigLoader.registerLoader(configType.getTypeClass().getType(), openRegistry); + registryMap.put(configType.getTypeClass().getType(), ImmutablePair.of(openRegistry, new CheckedRegistryImpl<>(openRegistry))); }); } private void checkDeadEntries(TerraPlugin main) { - registryMap.forEach((clazz, pair) -> ((OpenRegistryImpl) pair.getLeft()).getDeadEntries().forEach((id, value) -> main.getDebugLogger().warning("Dead entry in '" + clazz + "' registry: '" + id + "'"))); + registryMap.forEach((clazz, pair) -> ((OpenRegistryImpl) pair.getLeft()).getDeadEntries().forEach((id, value) -> main.getDebugLogger().warning("Dead entry in '" + ReflectionUtil.typeToString(clazz) + "' registry: '" + id + "'"))); } @Override @@ -220,7 +219,7 @@ public class ConfigPackImpl implements ConfigPack { return this; } - protected Map, ImmutablePair, CheckedRegistry>> getRegistryMap() { + protected Map, CheckedRegistry>> getRegistryMap() { return registryMap; } @@ -269,14 +268,14 @@ public class ConfigPackImpl implements ConfigPack { @Override @SuppressWarnings("unchecked") - public CheckedRegistry getRegistry(Class clazz) { - return (CheckedRegistry) registryMap.getOrDefault(clazz, ImmutablePair.ofNull()).getRight(); + public CheckedRegistry getRegistry(Type type) { + return (CheckedRegistry) registryMap.getOrDefault(type, ImmutablePair.ofNull()).getRight(); } @SuppressWarnings("unchecked") @Override - public CheckedRegistry getCheckedRegistry(Class clazz) throws IllegalStateException { - return (CheckedRegistry) registryMap.getOrDefault(clazz, ImmutablePair.ofNull()).getRight(); + public CheckedRegistry getCheckedRegistry(Type type) throws IllegalStateException { + return (CheckedRegistry) registryMap.getOrDefault(type, ImmutablePair.ofNull()).getRight(); } @SuppressWarnings("unchecked") @@ -293,18 +292,18 @@ public class ConfigPackImpl implements ConfigPack { } @Override - public BiomeProviderBuilder getBiomeProviderBuilder() { - return biomeProviderBuilder; + public BiomeProvider getBiomeProviderBuilder() { + return seededBiomeProvider; } @SuppressWarnings("unchecked") @Override - public CheckedRegistry getOrCreateRegistry(Class clazz) { - return (CheckedRegistry) registryMap.computeIfAbsent(clazz, c -> { + public CheckedRegistry getOrCreateRegistry(Type type) { + return (CheckedRegistry) registryMap.computeIfAbsent(type, c -> { OpenRegistry registry = new OpenRegistryImpl<>(); selfLoader.registerLoader(c, registry); abstractConfigLoader.registerLoader(c, registry); - main.getDebugLogger().info("Registered loader for registry of class " + c); + main.getDebugLogger().info("Registered loader for registry of class " + ReflectionUtil.typeToString(c)); return ImmutablePair.of(registry, new CheckedRegistryImpl<>(registry)); }).getRight(); } diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackPostTemplate.java b/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackPostTemplate.java index 0c03a2e3f..e0e220e80 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackPostTemplate.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackPostTemplate.java @@ -2,13 +2,13 @@ package com.dfsek.terra.config.pack; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; public class ConfigPackPostTemplate implements ConfigTemplate { @Value("biomes") - private BiomeProviderBuilder providerBuilder; + private BiomeProvider providerBuilder; - public BiomeProviderBuilder getProviderBuilder() { + public BiomeProvider getProviderBuilder() { return providerBuilder; } } diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/pack/WorldConfigImpl.java b/common/implementation/src/main/java/com/dfsek/terra/config/pack/WorldConfigImpl.java index 4b15d26fe..1b13aacdd 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/pack/WorldConfigImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/pack/WorldConfigImpl.java @@ -2,24 +2,15 @@ package com.dfsek.terra.config.pack; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.WorldConfig; -import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.registry.Registry; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; import com.dfsek.terra.api.world.TerraWorld; -import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import com.dfsek.terra.api.world.generator.GenerationStage; -import com.dfsek.terra.api.world.generator.GenerationStageProvider; import com.dfsek.terra.api.world.generator.SamplerCache; -import com.dfsek.terra.api.world.generator.TerraGenerationStage; import com.dfsek.terra.registry.LockedRegistryImpl; -import com.dfsek.terra.registry.OpenRegistryImpl; import com.dfsek.terra.world.SamplerCacheImpl; -import com.google.common.collect.ImmutableList; -import java.util.ArrayList; +import java.lang.reflect.Type; import java.util.HashMap; -import java.util.List; import java.util.Map; public class WorldConfigImpl implements WorldConfig { @@ -30,7 +21,7 @@ public class WorldConfigImpl implements WorldConfig { private final TerraWorld world; private final ConfigPackImpl pack; - private final Map, Registry> registryMap = new HashMap<>(); + private final Map> registryMap = new HashMap<>(); public WorldConfigImpl(TerraWorld world, ConfigPackImpl pack, TerraPlugin main) { this.world = world; @@ -39,11 +30,7 @@ public class WorldConfigImpl implements WorldConfig { pack.getRegistryMap().forEach((clazz, pair) -> registryMap.put(clazz, new LockedRegistryImpl<>(pair.getLeft()))); - OpenRegistry biomeOpenRegistry = new OpenRegistryImpl<>(); - pack.getCheckedRegistry(BiomeBuilder.class).forEach((id, biome) -> biomeOpenRegistry.register(id, biome.apply(world.getWorld().getSeed()))); - registryMap.put(TerraBiome.class, new LockedRegistryImpl<>(biomeOpenRegistry)); - - this.provider = pack.getBiomeProviderBuilder().build(world.getWorld().getSeed()); + this.provider = pack.getBiomeProviderBuilder(); } @Override diff --git a/common/implementation/src/main/java/com/dfsek/terra/event/EventManagerImpl.java b/common/implementation/src/main/java/com/dfsek/terra/event/EventManagerImpl.java index 43b606cfc..4b2d13d6d 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/event/EventManagerImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/event/EventManagerImpl.java @@ -9,7 +9,7 @@ import com.dfsek.terra.api.event.annotations.Priority; import com.dfsek.terra.api.event.events.Cancellable; import com.dfsek.terra.api.event.events.Event; import com.dfsek.terra.api.event.events.PackEvent; -import com.dfsek.terra.api.util.ReflectionUtil; +import com.dfsek.terra.api.util.reflection.ReflectionUtil; import java.io.PrintWriter; import java.io.StringWriter; diff --git a/common/implementation/src/main/java/com/dfsek/terra/inject/InjectorImpl.java b/common/implementation/src/main/java/com/dfsek/terra/inject/InjectorImpl.java index 25f991b52..5be71bc86 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/inject/InjectorImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/inject/InjectorImpl.java @@ -3,7 +3,7 @@ package com.dfsek.terra.inject; import com.dfsek.terra.api.injection.Injector; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.injection.exception.InjectionException; -import com.dfsek.terra.api.util.ReflectionUtil; +import com.dfsek.terra.api.util.reflection.ReflectionUtil; import java.lang.reflect.Field; import java.lang.reflect.Modifier; diff --git a/common/implementation/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java b/common/implementation/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java index eb48c2639..b12af27ef 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java +++ b/common/implementation/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java @@ -2,6 +2,7 @@ package com.dfsek.terra.registry.config; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.ConfigType; +import com.dfsek.terra.api.util.reflection.ReflectionUtil; import com.dfsek.terra.registry.OpenRegistryImpl; import java.util.LinkedHashMap; @@ -21,7 +22,7 @@ public class ConfigTypeRegistry extends OpenRegistryImpl> { @Override public boolean register(String identifier, Entry> value) { callback.accept(identifier, value.getValue()); - main.getDebugLogger().info("Registered config registry with ID " + identifier + " to class " + value.getValue().getTypeClass().getCanonicalName()); + main.getDebugLogger().info("Registered config registry with ID " + identifier + " to type " + ReflectionUtil.typeToString(value.getValue().getTypeClass().getType())); return super.register(identifier, value); } } diff --git a/common/implementation/src/test/java/noise/NoiseConfigTemplate.java b/common/implementation/src/test/java/noise/NoiseConfigTemplate.java index 8d671db4e..17c0da528 100644 --- a/common/implementation/src/test/java/noise/NoiseConfigTemplate.java +++ b/common/implementation/src/test/java/noise/NoiseConfigTemplate.java @@ -2,15 +2,15 @@ package noise; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; +import com.dfsek.terra.api.noise.NoiseSampler; @SuppressWarnings("unused") public class NoiseConfigTemplate implements ConfigTemplate { @Value(".") - private NoiseSeeded builder; + private NoiseSampler builder; - public NoiseSeeded getBuilder() { + public NoiseSampler getBuilder() { return builder; } } 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 826a0172d..f8c25b0b4 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 @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.listeners; import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.structure.ConfiguredStructure; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import com.dfsek.terra.api.world.TerraWorld; import com.dfsek.terra.api.world.locate.AsyncStructureFinder; import com.dfsek.terra.bukkit.world.BukkitAdapter; 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 20aacc383..340f9efa1 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 @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.listeners; import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.structure.ConfiguredStructure; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import com.dfsek.terra.api.world.TerraWorld; import com.dfsek.terra.api.world.locate.AsyncStructureFinder; import com.dfsek.terra.bukkit.world.BukkitAdapter; 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 697fc746f..44f621772 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 @@ -28,10 +28,10 @@ import com.dfsek.terra.api.profiler.Profiler; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.exception.DuplicateEntryException; import com.dfsek.terra.api.util.generic.pair.Pair; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; import com.dfsek.terra.api.world.TerraWorld; import com.dfsek.terra.api.world.Tree; import com.dfsek.terra.api.world.World; +import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.commands.CommandUtil; import com.dfsek.terra.commands.TerraCommandManager; import com.dfsek.terra.config.GenericLoaders; @@ -364,7 +364,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { public void injectBiomes(BiomeRegistrationEvent event) { logger.info("Registering biomes..."); Registry biomeRegistry = event.getRegistryManager().get(Registry.BIOME_KEY); - configRegistry.forEach(pack -> pack.getCheckedRegistry(BiomeBuilder.class).forEach((id, biome) -> FabricUtil.registerOrOverwrite(biomeRegistry, Registry.BIOME_KEY, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(biome, pack, event.getRegistryManager())))); // Register all Terra biomes. + configRegistry.forEach(pack -> pack.getCheckedRegistry(TerraBiome.class).forEach((id, biome) -> FabricUtil.registerOrOverwrite(biomeRegistry, Registry.BIOME_KEY, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(biome, pack, event.getRegistryManager())))); // Register all Terra biomes. logger.info("Biomes registered."); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PostLoadCompatibilityOptions.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PostLoadCompatibilityOptions.java index aa1ff2262..ed6d64444 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PostLoadCompatibilityOptions.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PostLoadCompatibilityOptions.java @@ -3,7 +3,7 @@ package com.dfsek.terra.fabric.config; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; +import com.dfsek.terra.api.world.biome.TerraBiome; import net.minecraft.util.Identifier; import java.util.HashMap; @@ -14,17 +14,17 @@ import java.util.Set; public class PostLoadCompatibilityOptions implements ConfigTemplate { @Value("structures.inject-biome.exclude-biomes") @Default - private Map> excludedPerBiomeStructures = new HashMap<>(); + private Map> excludedPerBiomeStructures = new HashMap<>(); @Value("features.inject-biome.exclude-biomes") @Default - private Map> excludedPerBiomeFeatures = new HashMap<>(); + private Map> excludedPerBiomeFeatures = new HashMap<>(); - public Map> getExcludedPerBiomeFeatures() { + public Map> getExcludedPerBiomeFeatures() { return excludedPerBiomeFeatures; } - public Map> getExcludedPerBiomeStructures() { + public Map> getExcludedPerBiomeStructures() { return excludedPerBiomeStructures; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java index 3b43d6c96..f054a0c20 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java @@ -28,7 +28,7 @@ public class TerraBiomeSource extends BiomeSource { private final Registry biomeRegistry; private final long seed; - private final BiomeProvider grid; + private final BiomeProvider provider; private final ConfigPack pack; public TerraBiomeSource(Registry biomes, long seed, ConfigPack pack) { @@ -37,7 +37,7 @@ public class TerraBiomeSource extends BiomeSource { .collect(Collectors.toList())); this.biomeRegistry = biomes; this.seed = seed; - this.grid = pack.getBiomeProviderBuilder().build(seed); + this.provider = pack.getBiomeProviderBuilder(); this.pack = pack; } @@ -53,7 +53,7 @@ public class TerraBiomeSource extends BiomeSource { @Override public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) { - TerraBiome biome = grid.getBiome(biomeX << 2, biomeZ << 2); + TerraBiome biome = provider.getBiome(biomeX << 2, biomeZ << 2, seed); return biomeRegistry.get(new Identifier("terra", FabricUtil.createBiomeID(pack, biome.getID()))); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java index 63def136b..574e4ab50 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java @@ -5,7 +5,7 @@ import com.dfsek.terra.api.block.entity.Container; import com.dfsek.terra.api.block.entity.MobSpawner; import com.dfsek.terra.api.block.entity.Sign; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.util.seeded.BiomeBuilder; +import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; import com.mojang.serialization.Lifecycle; @@ -43,7 +43,7 @@ public final class FabricUtil { * @param pack The ConfigPack this biome belongs to. * @return The Minecraft delegate biome. */ - public static Biome createBiome(BiomeBuilder biome, ConfigPack pack, DynamicRegistryManager registryManager) { + public static Biome createBiome(TerraBiome biome, ConfigPack pack, DynamicRegistryManager registryManager) { // BiomeTemplate template = biome.getTemplate(); Map colors = new HashMap<>(); // template.getColors(); diff --git a/settings.gradle.kts b/settings.gradle.kts index eb7138e27..08e0f339c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,7 +9,7 @@ include("common:loader:addon") fun includeImmediateChildren(dir: File, type: String) { dir.walkTopDown().maxDepth(1).forEach { if(!it.isDirectory || !File(it, "build.gradle.kts").exists()) return@forEach - val addonDir = it.relativeTo(file(".")).path.replace("/", ":"); + val addonDir = it.relativeTo(file(".")).path.replace("/", ":") println("Including $type directory \"$addonDir\" as subproject.") include(addonDir) }