diff --git a/build.gradle.kts b/build.gradle.kts index 722a59e4b..1d785b1a0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.6.5")) -versionProjects(":common:implementation", version("6.6.5")) -versionProjects(":platforms", version("6.6.5")) +versionProjects(":common:api", version("7.0.0")) +versionProjects(":common:implementation", version("7.0.0")) +versionProjects(":platforms", version("7.0.0")) allprojects { diff --git a/buildSrc/src/main/kotlin/DistributionConfig.kt b/buildSrc/src/main/kotlin/DistributionConfig.kt index 65d295aba..0ad6c4491 100644 --- a/buildSrc/src/main/kotlin/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/DistributionConfig.kt @@ -49,10 +49,21 @@ fun Project.configureDistribution() { doFirst { try { file("${buildDir}/resources/main/packs/").deleteRecursively() + file("${buildDir}/resources/main/metapacks/").deleteRecursively() + val overworldPackUrl = + URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/" + Versions.Terra.overworldConfig + "/Overworld.zip") + val reimagENDPackUrl = + URL("https://github.com/PolyhedralDev/ReimagEND/releases/download/" + Versions.Terra.reimagENDConfig + "/ReimagEND.zip") + val tartarusPackUrl = + URL("https://github.com/PolyhedralDev/Tartarus/releases/download/" + Versions.Terra.tartarusConfig + "/Tartarus.zip") val defaultPackUrl = - URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/" + Versions.Terra.overworldConfig + "/default.zip") - downloadPack(defaultPackUrl, project) - } catch (_:Exception) {} + URL("https://github.com/PolyhedralDev/DefaultMetapack/releases/download/" + Versions.Terra.defaultConfig + "/default.zip") + downloadPack(overworldPackUrl, project) + downloadPack(reimagENDPackUrl, project) + downloadPack(tartarusPackUrl, project) + downloadPack(defaultPackUrl, project, true) + } catch (_: Exception) { + } } } @@ -96,6 +107,13 @@ fun Project.configureDistribution() { resources.computeIfAbsent("packs") { ArrayList() }.add(it.name) } + val metaPacksDir = File("${project.buildDir}/resources/main/metapacks/") + + metaPacksDir.walkTopDown().forEach { + if (it.isDirectory || !it.name.endsWith(".zip")) return@forEach + resources.computeIfAbsent("metapacks") { ArrayList() }.add(it.name) + } + val langDir = File("${project(":common:implementation").buildDir}/resources/main/lang/") langDir.walkTopDown().forEach { @@ -163,9 +181,10 @@ fun Project.configureDistribution() { } } -fun downloadPack(packUrl: URL, project: Project) { +fun downloadPack(packUrl: URL, project: Project, metapack: Boolean = false) { val fileName = packUrl.file.substring(packUrl.file.lastIndexOf("/")) - val file = File("${project.buildDir}/resources/main/packs/${fileName}") + val resourceType = if (metapack) "metapacks" else "packs" + val file = File("${project.buildDir}/resources/main/${resourceType}/${fileName}") file.parentFile.mkdirs() file.outputStream().write(packUrl.readBytes()) } diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 7949c495e..a15448b01 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -1,12 +1,16 @@ object Versions { object Terra { - const val overworldConfig = "v1.5.2" + const val overworldConfig = "latest" + const val reimagENDConfig = "latest" + const val tartarusConfig = "latest" + const val defaultConfig = "latest" } object Libraries { const val tectonic = "4.2.1" - const val paralithic = "0.8.1" + const val paralithic = "2.0.1" const val strata = "1.3.2" + const val seismic = "2.0.4" const val cloud = "2.0.0" @@ -28,7 +32,7 @@ object Versions { } object Fabric { - const val fabricAPI = "0.129.0+${Mod.minecraft}" + const val fabricAPI = "0.133.14+${Mod.minecraft}" const val cloud = "2.0.0-beta.11" } // @@ -41,12 +45,12 @@ object Versions { const val mixin = "0.15.5+mixin.0.8.7" const val mixinExtras = "0.4.1" - const val minecraft = "1.21.8" + const val minecraft = "1.21.9" const val yarn = "$minecraft+build.1" - const val fabricLoader = "0.16.14" + const val fabricLoader = "0.17.2" - const val architecuryLoom = "1.10.431" - const val architecturyPlugin = "3.4.161" + const val architecuryLoom = "1.11.440" + const val architecturyPlugin = "3.4.162" } // @@ -56,13 +60,14 @@ object Versions { // } object Bukkit { - const val minecraft = "1.21.8-R0.1" - const val paperBuild = "$minecraft-20250717.233435-4" + const val minecraft = "1.21.9-rc1-R0.1" + const val paperBuild = "$minecraft-20250930.133904-13" const val paper = paperBuild const val paperLib = "1.0.8" const val reflectionRemapper = "0.1.2" const val paperDevBundle = paperBuild const val runPaper = "2.3.1" + const val runPaperMinecraft = "1.21.9" const val paperWeight = "2.0.0-beta.17" const val cloud = "2.0.0-beta.11" const val multiverse = "5.0.2" @@ -91,6 +96,6 @@ object Versions { } object Minestom { - const val minestom = "1_21_6-c3ccee696b" + const val minestom = "1_21_6-a40d7115d4" } } diff --git a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/BiomeExtrusionProvider.java b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/BiomeExtrusionProvider.java index 621c2d37a..bc658c8ca 100644 --- a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/BiomeExtrusionProvider.java +++ b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/BiomeExtrusionProvider.java @@ -14,14 +14,14 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider; public class BiomeExtrusionProvider implements BiomeProvider { private final BiomeProvider delegate; private final Set biomes; - private final List extrusions; + private final Extrusion[] extrusions; private final int resolution; public BiomeExtrusionProvider(BiomeProvider delegate, List extrusions, int resolution) { this.delegate = delegate; this.biomes = delegate.stream().collect(Collectors.toSet()); extrusions.forEach(e -> biomes.addAll(e.getBiomes())); - this.extrusions = extrusions; + this.extrusions = extrusions.toArray(new Extrusion[0]); this.resolution = resolution; } @@ -33,8 +33,8 @@ public class BiomeExtrusionProvider implements BiomeProvider { } public Biome extrude(Biome original, int x, int y, int z, long seed) { - for(Extrusion extrusion : extrusions) { - original = extrusion.extrude(original, x, y, z, seed); + for(int i = 0; i < extrusions.length; i++) { + original = extrusions[i].extrude(original, x, y, z, seed); } return original; } diff --git a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/api/Extrusion.java b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/api/Extrusion.java index c1d5f5524..4c4ca972a 100644 --- a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/api/Extrusion.java +++ b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/api/Extrusion.java @@ -1,9 +1,9 @@ package com.dfsek.terra.addons.biome.extrusion.api; -import com.dfsek.terra.api.world.biome.Biome; - import java.util.Collection; +import com.dfsek.terra.api.world.biome.Biome; + public interface Extrusion { Biome extrude(Biome original, int x, int y, int z, long seed); diff --git a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/config/extrusions/SamplerExtrusionTemplate.java b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/config/extrusions/SamplerExtrusionTemplate.java index 4389ab28f..866596c2e 100644 --- a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/config/extrusions/SamplerExtrusionTemplate.java +++ b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/config/extrusions/SamplerExtrusionTemplate.java @@ -1,17 +1,17 @@ package com.dfsek.terra.addons.biome.extrusion.config.extrusions; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.biome.extrusion.api.Extrusion; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; public abstract class SamplerExtrusionTemplate implements ObjectTemplate { @Value("sampler") - protected @Meta NoiseSampler sampler; + protected @Meta Sampler sampler; @Value("range") protected @Meta Range range; diff --git a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/ReplaceExtrusion.java b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/ReplaceExtrusion.java index 26b1ec4bb..0e062977d 100644 --- a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/ReplaceExtrusion.java +++ b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/ReplaceExtrusion.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.biome.extrusion.extrusions; +import com.dfsek.seismic.type.sampler.Sampler; + import java.util.Collection; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -7,9 +9,8 @@ import java.util.stream.Collectors; import com.dfsek.terra.addons.biome.extrusion.api.Extrusion; import com.dfsek.terra.addons.biome.extrusion.api.ReplaceableBiome; import com.dfsek.terra.addons.biome.query.api.BiomeQueries; -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.range.Range; import com.dfsek.terra.api.world.biome.Biome; @@ -17,7 +18,7 @@ import com.dfsek.terra.api.world.biome.Biome; * Sets biomes at locations based on a sampler. */ public class ReplaceExtrusion implements Extrusion { - private final NoiseSampler sampler; + private final Sampler sampler; private final Range range; @@ -25,7 +26,7 @@ public class ReplaceExtrusion implements Extrusion { private final Predicate hasTag; - public ReplaceExtrusion(NoiseSampler sampler, Range range, ProbabilityCollection biomes, String tag) { + public ReplaceExtrusion(Sampler sampler, Range range, ProbabilityCollection biomes, String tag) { this.sampler = sampler; this.range = range; this.biomes = biomes; diff --git a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/SetExtrusion.java b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/SetExtrusion.java index b3f4edd62..53aeda03f 100644 --- a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/SetExtrusion.java +++ b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/SetExtrusion.java @@ -1,14 +1,15 @@ package com.dfsek.terra.addons.biome.extrusion.extrusions; +import com.dfsek.seismic.type.sampler.Sampler; + import java.util.Collection; import java.util.function.Predicate; import java.util.stream.Collectors; import com.dfsek.terra.addons.biome.extrusion.api.Extrusion; import com.dfsek.terra.addons.biome.extrusion.api.ReplaceableBiome; -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.range.Range; import com.dfsek.terra.api.world.biome.Biome; @@ -16,13 +17,13 @@ import com.dfsek.terra.api.world.biome.Biome; * Sets biomes at locations based on a sampler. */ public class SetExtrusion implements Extrusion { - private final NoiseSampler sampler; + private final Sampler sampler; private final Range range; private final ProbabilityCollection biomes; - public SetExtrusion(NoiseSampler sampler, Range range, ProbabilityCollection biomes) { + public SetExtrusion(Sampler sampler, Range range, ProbabilityCollection biomes) { this.sampler = sampler; this.range = range; this.biomes = biomes; diff --git a/common/addons/biome-provider-image-v2/LICENSE b/common/addons/biome-provider-image-v2/LICENSE deleted file mode 100644 index da43ecc81..000000000 --- a/common/addons/biome-provider-image-v2/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020-2025 Polyhedral Development - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/common/addons/biome-provider-image-v2/README.md b/common/addons/biome-provider-image-v2/README.md deleted file mode 100644 index 573eabee7..000000000 --- a/common/addons/biome-provider-image-v2/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# biome-provider-image-v2 - -Implements and registers the `IMAGE` biome provider, which -utilizes various config types provided by the `library-image` addon to -distribute biomes based on images. diff --git a/common/addons/biome-provider-image-v2/build.gradle.kts b/common/addons/biome-provider-image-v2/build.gradle.kts deleted file mode 100644 index 989c8567c..000000000 --- a/common/addons/biome-provider-image-v2/build.gradle.kts +++ /dev/null @@ -1,8 +0,0 @@ -version = version("1.0.1") - -dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) - compileOnlyApi(project(":common:addons:library-image")) - - -} diff --git a/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/ImageBiomeProvider.java b/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/ImageBiomeProvider.java deleted file mode 100644 index 966b12dbb..000000000 --- a/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/ImageBiomeProvider.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.image.v2; - -import java.util.Optional; - -import com.dfsek.terra.addons.image.colorsampler.ColorSampler; -import com.dfsek.terra.addons.image.converter.ColorConverter; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; - - -public class ImageBiomeProvider implements BiomeProvider { - private final int resolution; - - private final ColorConverter colorConverter; - - private final ColorSampler colorSampler; - - public ImageBiomeProvider(ColorConverter colorConverter, ColorSampler colorSampler, int resolution) { - this.resolution = resolution; - this.colorConverter = colorConverter; - this.colorSampler = colorSampler; - } - - @Override - public Biome getBiome(int x, int y, int z, long seed) { - return getBiome(x, z); - } - - public Biome getBiome(int x, int z) { - x /= resolution; - z /= resolution; - return colorConverter.apply(colorSampler.apply(x, z)); - } - - @Override - public Optional getBaseBiome(int x, int z, long seed) { - return Optional.of(getBiome(x, z)); - } - - @Override - public Iterable getBiomes() { - return colorConverter.getEntries(); - } -} diff --git a/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/ImageBiomeProviderAddon.java b/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/ImageBiomeProviderAddon.java deleted file mode 100644 index 94d9f1d3c..000000000 --- a/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/ImageBiomeProviderAddon.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.image.v2; - -import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; - -import java.util.function.Supplier; - -import com.dfsek.terra.addons.biome.image.v2.config.ImageProviderTemplate; -import com.dfsek.terra.addons.biome.image.v2.config.converter.ClosestBiomeColorConverterTemplate; -import com.dfsek.terra.addons.biome.image.v2.config.converter.ExactBiomeColorConverterTemplate; -import com.dfsek.terra.addons.biome.image.v2.config.converter.mapping.DefinedBiomeColorMappingTemplate; -import com.dfsek.terra.addons.image.converter.ColorConverter; -import com.dfsek.terra.addons.image.converter.mapping.BiomeDefinedColorMapping; -import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; -import com.dfsek.terra.addons.manifest.api.AddonInitializer; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; -import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; -import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; -import com.dfsek.terra.api.registry.CheckedRegistry; -import com.dfsek.terra.api.util.reflection.TypeKey; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; - - -public class ImageBiomeProviderAddon implements AddonInitializer { - public static final TypeKey>> PROVIDER_REGISTRY_KEY = new TypeKey<>() { - }; - - public static final TypeKey>>> BIOME_COLOR_CONVERTER_REGISTRY_KEY = new TypeKey<>() { - }; - - public static final TypeKey>>> BIOME_COLOR_MAPPING_REGISTRY_KEY = new TypeKey<>() { - }; - - @Inject - private Platform platform; - - @Inject - private BaseAddon addon; - - @Override - public void initialize() { - platform.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(addon, ConfigPackPreLoadEvent.class) - .priority(501) - .then(event -> { - CheckedRegistry>> providerRegistry = event.getPack().getOrCreateRegistry( - PROVIDER_REGISTRY_KEY); - providerRegistry.register(addon.key("IMAGE"), ImageProviderTemplate::new); - }) - .then(event -> { - CheckedRegistry>>> biomeColorConverterRegistry = - event.getPack().getOrCreateRegistry( - BIOME_COLOR_CONVERTER_REGISTRY_KEY); - biomeColorConverterRegistry.register(addon.key("EXACT"), ExactBiomeColorConverterTemplate::new); - biomeColorConverterRegistry.register(addon.key("CLOSEST"), ClosestBiomeColorConverterTemplate::new); - }) - .then(event -> { - CheckedRegistry>>> biomeColorMappingRegistry = - event.getPack().getOrCreateRegistry( - BIOME_COLOR_MAPPING_REGISTRY_KEY); - biomeColorMappingRegistry.register(addon.key("USE_BIOME_COLORS"), - () -> () -> new BiomeDefinedColorMapping<>(event.getPack().getRegistry(Biome.class), - b -> b)); - biomeColorMappingRegistry.register(addon.key("MAP"), DefinedBiomeColorMappingTemplate::new); - }) - .failThrough(); - } -} diff --git a/common/addons/biome-provider-image-v2/src/main/resources/terra.addon.yml b/common/addons/biome-provider-image-v2/src/main/resources/terra.addon.yml deleted file mode 100644 index be3dd2af4..000000000 --- a/common/addons/biome-provider-image-v2/src/main/resources/terra.addon.yml +++ /dev/null @@ -1,14 +0,0 @@ -schema-version: 1 -contributors: - - Terra contributors -id: biome-provider-image-v2 -version: @VERSION@ -entrypoints: - - "com.dfsek.terra.addons.biome.image.v2.ImageBiomeProviderAddon" -website: - issues: https://github.com/PolyhedralDev/Terra/issues - source: https://github.com/PolyhedralDev/Terra - docs: https://terra.polydev.org -license: MIT License -depends: - library-image: "1.+" diff --git a/common/addons/biome-provider-image/README.md b/common/addons/biome-provider-image/README.md index 49e9b8fdb..573eabee7 100644 --- a/common/addons/biome-provider-image/README.md +++ b/common/addons/biome-provider-image/README.md @@ -1,6 +1,5 @@ -# biome-provider-image +# biome-provider-image-v2 -Implements and registers the `IMAGE` biome provider, a biome provider which -generates biomes from an image, using the `color` attribute of biomes. - -This addon registers the provider type, and all associated config options. \ No newline at end of file +Implements and registers the `IMAGE` biome provider, which +utilizes various config types provided by the `library-image` addon to +distribute biomes based on images. diff --git a/common/addons/biome-provider-image/build.gradle.kts b/common/addons/biome-provider-image/build.gradle.kts index e01ce95f8..55b7f98aa 100644 --- a/common/addons/biome-provider-image/build.gradle.kts +++ b/common/addons/biome-provider-image/build.gradle.kts @@ -1,7 +1,8 @@ -version = version("1.0.1") +version = version("2.0.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:library-image")) } 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 45b517ba6..30c00ad6e 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 @@ -7,32 +7,25 @@ package com.dfsek.terra.addons.biome.image; -import java.awt.Color; -import java.awt.image.BufferedImage; -import java.util.HashMap; -import java.util.Map; import java.util.Optional; -import java.util.Set; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; +import com.dfsek.terra.addons.image.converter.ColorConverter; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; public class ImageBiomeProvider implements BiomeProvider { - private final Map colorBiomeMap = new HashMap<>(); - private final BufferedImage image; private final int resolution; - private final Align align; - public ImageBiomeProvider(Set registry, BufferedImage image, int resolution, Align align) { - this.image = image; + private final ColorConverter colorConverter; + + private final ColorSampler colorSampler; + + public ImageBiomeProvider(ColorConverter colorConverter, ColorSampler colorSampler, int resolution) { this.resolution = resolution; - this.align = align; - registry.forEach(biome -> colorBiomeMap.put(new Color(biome.getColor()), biome)); - } - - private static int distance(Color a, Color b) { - return Math.abs(a.getRed() - b.getRed()) + Math.abs(a.getGreen() - b.getGreen()) + Math.abs(a.getBlue() - b.getBlue()); + this.colorConverter = colorConverter; + this.colorSampler = colorSampler; } @Override @@ -43,15 +36,7 @@ public class ImageBiomeProvider implements BiomeProvider { public Biome getBiome(int x, int z) { x /= resolution; z /= resolution; - Color color = align.getColor(image, x, z); - return colorBiomeMap.get(colorBiomeMap.keySet() - .stream() - .reduce(colorBiomeMap.keySet().stream().findAny().orElseThrow(IllegalStateException::new), - (running, element) -> { - int d1 = distance(color, running); - int d2 = distance(color, element); - return d1 < d2 ? running : element; - })); + return colorConverter.apply(colorSampler.apply(x, z)); } @Override @@ -61,24 +46,6 @@ public class ImageBiomeProvider implements BiomeProvider { @Override public Iterable getBiomes() { - return colorBiomeMap.values(); - } - - public enum Align { - CENTER { - @Override - public Color getColor(BufferedImage image, int x, int z) { - return new Color(image.getRGB(Math.floorMod(x - image.getWidth() / 2, image.getWidth()), - Math.floorMod(z - image.getHeight() / 2, image.getHeight()))); - } - }, - NONE { - @Override - public Color getColor(BufferedImage image, int x, int z) { - return new Color(image.getRGB(Math.floorMod(x, image.getWidth()), Math.floorMod(z, image.getHeight()))); - } - }; - - public abstract Color getColor(BufferedImage image, int x, int z); + return colorConverter.getEntries(); } } diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java index 32fab174d..ba0e05ebf 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java @@ -8,11 +8,16 @@ package com.dfsek.terra.addons.biome.image; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.function.Supplier; +import com.dfsek.terra.addons.biome.image.config.ImageProviderTemplate; +import com.dfsek.terra.addons.biome.image.config.converter.ClosestBiomeColorConverterTemplate; +import com.dfsek.terra.addons.biome.image.config.converter.ExactBiomeColorConverterTemplate; +import com.dfsek.terra.addons.biome.image.config.converter.mapping.DefinedBiomeColorMappingTemplate; +import com.dfsek.terra.addons.image.converter.ColorConverter; +import com.dfsek.terra.addons.image.converter.mapping.BiomeDefinedColorMapping; +import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; @@ -26,10 +31,15 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider; public class ImageBiomeProviderAddon implements AddonInitializer { - public static final TypeKey>> PROVIDER_REGISTRY_KEY = new TypeKey<>() { }; - private static final Logger logger = LoggerFactory.getLogger(ImageBiomeProviderAddon.class); + + public static final TypeKey>>> BIOME_COLOR_CONVERTER_REGISTRY_KEY = new TypeKey<>() { + }; + + public static final TypeKey>>> BIOME_COLOR_MAPPING_REGISTRY_KEY = new TypeKey<>() { + }; + @Inject private Platform platform; @@ -41,16 +51,28 @@ public class ImageBiomeProviderAddon implements AddonInitializer { platform.getEventManager() .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) + .priority(501) .then(event -> { CheckedRegistry>> providerRegistry = event.getPack().getOrCreateRegistry( PROVIDER_REGISTRY_KEY); - providerRegistry.register(addon.key("IMAGE"), - () -> new ImageProviderTemplate(event.getPack().getRegistry(Biome.class))); + providerRegistry.register(addon.key("IMAGE"), ImageProviderTemplate::new); + }) + .then(event -> { + CheckedRegistry>>> biomeColorConverterRegistry = + event.getPack().getOrCreateRegistry( + BIOME_COLOR_CONVERTER_REGISTRY_KEY); + biomeColorConverterRegistry.register(addon.key("EXACT"), ExactBiomeColorConverterTemplate::new); + biomeColorConverterRegistry.register(addon.key("CLOSEST"), ClosestBiomeColorConverterTemplate::new); + }) + .then(event -> { + CheckedRegistry>>> biomeColorMappingRegistry = + event.getPack().getOrCreateRegistry( + BIOME_COLOR_MAPPING_REGISTRY_KEY); + biomeColorMappingRegistry.register(addon.key("USE_BIOME_COLORS"), + () -> () -> new BiomeDefinedColorMapping<>(event.getPack().getRegistry(Biome.class), + b -> b)); + biomeColorMappingRegistry.register(addon.key("MAP"), DefinedBiomeColorMappingTemplate::new); }) .failThrough(); - if(platform.getTerraConfig().isDebugLog()) - logger.warn( - "The biome-provider-image addon is deprecated and scheduled for removal in Terra 7.0. It is recommended to use the " + - "biome-provider-image-v2 addon for future pack development instead."); } } 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 deleted file mode 100644 index 17b915326..000000000 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.image; - -import com.dfsek.tectonic.api.config.template.annotations.Default; -import com.dfsek.tectonic.api.config.template.annotations.Description; -import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; - -import java.awt.image.BufferedImage; -import java.util.HashSet; - -import com.dfsek.terra.api.registry.Registry; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; - - -@SuppressWarnings("FieldMayBeFinal") -public class ImageProviderTemplate implements ObjectTemplate { - private final Registry biomes; - @Value("resolution") - @Default - @Description("Sets the resolution at which to sample the image.") - private int resolution = 1; - @Value("image.name") - @Description("Sets the location of the image on the filesystem, relative to the pack root.") - private BufferedImage image; - @Value("image.align") - @Description("Sets the alignment style to use for the image.") - private ImageBiomeProvider.Align align; - - public ImageProviderTemplate(Registry set) { - this.biomes = set; - } - - @Override - public BiomeProvider get() { - return new ImageBiomeProvider(new HashSet<>(biomes.entries()), image, resolution, align); - } -} diff --git a/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/ImageProviderTemplate.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/ImageProviderTemplate.java similarity index 91% rename from common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/ImageProviderTemplate.java rename to common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/ImageProviderTemplate.java index 810a041c2..3d459036f 100644 --- a/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/ImageProviderTemplate.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/ImageProviderTemplate.java @@ -5,14 +5,14 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.image.v2.config; +package com.dfsek.terra.addons.biome.image.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Description; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import com.dfsek.terra.addons.biome.image.v2.ImageBiomeProvider; +import com.dfsek.terra.addons.biome.image.ImageBiomeProvider; import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import com.dfsek.terra.addons.image.converter.ColorConverter; import com.dfsek.terra.api.world.biome.Biome; diff --git a/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/ClosestBiomeColorConverterTemplate.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ClosestBiomeColorConverterTemplate.java similarity index 88% rename from common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/ClosestBiomeColorConverterTemplate.java rename to common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ClosestBiomeColorConverterTemplate.java index 5581aa5a1..f88960e0e 100644 --- a/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/ClosestBiomeColorConverterTemplate.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ClosestBiomeColorConverterTemplate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.image.v2.config.converter; +package com.dfsek.terra.addons.biome.image.config.converter; import com.dfsek.tectonic.api.config.template.annotations.Value; diff --git a/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/ExactBiomeColorConverterTemplate.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java similarity index 93% rename from common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/ExactBiomeColorConverterTemplate.java rename to common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java index ce00bcb2f..c05d63916 100644 --- a/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/ExactBiomeColorConverterTemplate.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.image.v2.config.converter; +package com.dfsek.terra.addons.biome.image.config.converter; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; diff --git a/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/mapping/DefinedBiomeColorMappingTemplate.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/mapping/DefinedBiomeColorMappingTemplate.java similarity index 90% rename from common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/mapping/DefinedBiomeColorMappingTemplate.java rename to common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/mapping/DefinedBiomeColorMappingTemplate.java index 8cfc22408..17864a01f 100644 --- a/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/mapping/DefinedBiomeColorMappingTemplate.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/mapping/DefinedBiomeColorMappingTemplate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.image.v2.config.converter.mapping; +package com.dfsek.terra.addons.biome.image.config.converter.mapping; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; diff --git a/common/addons/biome-provider-image/src/main/resources/terra.addon.yml b/common/addons/biome-provider-image/src/main/resources/terra.addon.yml index 3fd86ad52..f031ef124 100644 --- a/common/addons/biome-provider-image/src/main/resources/terra.addon.yml +++ b/common/addons/biome-provider-image/src/main/resources/terra.addon.yml @@ -9,4 +9,6 @@ website: issues: https://github.com/PolyhedralDev/Terra/issues source: https://github.com/PolyhedralDev/Terra docs: https://terra.polydev.org -license: MIT License \ No newline at end of file +license: MIT License +depends: + library-image: "1.+" diff --git a/common/addons/biome-provider-pipeline-v2/LICENSE b/common/addons/biome-provider-pipeline-v2/LICENSE deleted file mode 100644 index da43ecc81..000000000 --- a/common/addons/biome-provider-pipeline-v2/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020-2025 Polyhedral Development - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/common/addons/biome-provider-pipeline-v2/README.md b/common/addons/biome-provider-pipeline-v2/README.md deleted file mode 100644 index 745ffa241..000000000 --- a/common/addons/biome-provider-pipeline-v2/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# biome-provider-pipeline-2 - -The second version of the Biome Pipeline, a procedural biome provider that uses a series -of "stages" to apply "mutations" to a 2D grid of biomes. - -Version 2 is a re-implementation of the original addon with the primary goal of providing -consistent scaling for noise relative to the world -(See https://github.com/PolyhedralDev/Terra/issues/264 for more details), and has been -included as a separate addon to maintain parity with packs utilizing the first version. - -This addon registers the `PIPELINE` biome provider type, and all associated -configurations. \ No newline at end of file diff --git a/common/addons/biome-provider-pipeline-v2/build.gradle.kts b/common/addons/biome-provider-pipeline-v2/build.gradle.kts deleted file mode 100644 index f0b8af23a..000000000 --- a/common/addons/biome-provider-pipeline-v2/build.gradle.kts +++ /dev/null @@ -1,5 +0,0 @@ -version = version("1.0.1") - -dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) -} \ No newline at end of file diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineAddon.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineAddon.java deleted file mode 100644 index af29892cb..000000000 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineAddon.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.v2; - -import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; - -import java.util.function.Supplier; - -import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.config.BiomePipelineTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.config.PipelineBiomeLoader; -import com.dfsek.terra.addons.biome.pipeline.v2.config.source.SamplerSourceTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.expander.ExpanderStageTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.BorderListStageTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.BorderStageTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.ReplaceListStageTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.ReplaceStageTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.SmoothStageTemplate; -import com.dfsek.terra.addons.manifest.api.AddonInitializer; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; -import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent; -import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; -import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; -import com.dfsek.terra.api.registry.CheckedRegistry; -import com.dfsek.terra.api.registry.Registry; -import com.dfsek.terra.api.util.reflection.TypeKey; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; - - -public class BiomePipelineAddon implements AddonInitializer { - - public static final TypeKey>> SOURCE_REGISTRY_KEY = new TypeKey<>() { - }; - - public static final TypeKey>> STAGE_REGISTRY_KEY = new TypeKey<>() { - }; - public static final TypeKey>> PROVIDER_REGISTRY_KEY = new TypeKey<>() { - }; - @Inject - private Platform platform; - - @Inject - private BaseAddon addon; - - @Override - public void initialize() { - platform.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(addon, ConfigPackPreLoadEvent.class) - .then(event -> { - CheckedRegistry>> providerRegistry = event.getPack().getOrCreateRegistry( - PROVIDER_REGISTRY_KEY); - providerRegistry.register(addon.key("PIPELINE"), BiomePipelineTemplate::new); - }) - .then(event -> { - CheckedRegistry>> sourceRegistry = event.getPack().getOrCreateRegistry( - SOURCE_REGISTRY_KEY); - sourceRegistry.register(addon.key("SAMPLER"), SamplerSourceTemplate::new); - }) - .then(event -> { - CheckedRegistry>> stageRegistry = event.getPack().getOrCreateRegistry( - STAGE_REGISTRY_KEY); - stageRegistry.register(addon.key("FRACTAL_EXPAND"), ExpanderStageTemplate::new); - stageRegistry.register(addon.key("SMOOTH"), SmoothStageTemplate::new); - stageRegistry.register(addon.key("REPLACE"), ReplaceStageTemplate::new); - stageRegistry.register(addon.key("REPLACE_LIST"), ReplaceListStageTemplate::new); - stageRegistry.register(addon.key("BORDER"), BorderStageTemplate::new); - stageRegistry.register(addon.key("BORDER_LIST"), BorderListStageTemplate::new); - }) - .failThrough(); - platform.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(addon, ConfigPackPostLoadEvent.class) - .then(event -> { - Registry biomeRegistry = event.getPack().getRegistry(Biome.class); - event.getPack().applyLoader(PipelineBiome.class, new PipelineBiomeLoader(biomeRegistry)); - }); - } -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineColumn.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineColumn.java deleted file mode 100644 index 736211517..000000000 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineColumn.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.v2; - -import java.util.function.Consumer; - -import com.dfsek.terra.api.util.Column; -import com.dfsek.terra.api.util.function.IntIntObjConsumer; -import com.dfsek.terra.api.util.function.IntObjConsumer; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; - - -public class BiomePipelineColumn implements Column { - private final int min; - private final int max; - - private final int x; - private final int z; - private final Biome biome; - - protected BiomePipelineColumn(BiomeProvider biomeProvider, int min, int max, int x, int z, long seed) { - this.min = min; - this.max = max; - this.x = x; - this.z = z; - this.biome = biomeProvider.getBiome(x, 0, z, seed); - } - - @Override - public int getMinY() { - return min; - } - - @Override - public int getMaxY() { - return max; - } - - @Override - public int getX() { - return x; - } - - @Override - public int getZ() { - return z; - } - - @Override - public Biome get(int y) { - return biome; - } - - @Override - public void forRanges(int resolution, IntIntObjConsumer consumer) { - consumer.accept(min, max, biome); - } - - @Override - public void forEach(Consumer consumer) { - for(int y = min; y < max; y++) { - consumer.accept(biome); - } - } - - @Override - public void forEach(IntObjConsumer consumer) { - for(int y = min; y < max; y++) { - consumer.accept(y, biome); - } - } -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/BiomeChunk.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/BiomeChunk.java deleted file mode 100644 index 93e84fe3b..000000000 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/BiomeChunk.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.api; - - -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; - - -public interface BiomeChunk { - - PipelineBiome get(int xInChunk, int zInChunk); -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Source.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Source.java deleted file mode 100644 index 4a4953e41..000000000 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Source.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.api; - - -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; - - -public interface Source { - PipelineBiome get(long seed, int x, int z); - - Iterable getBiomes(); -} \ No newline at end of file diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Stage.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Stage.java deleted file mode 100644 index 973af0882..000000000 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Stage.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.api; - -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl.ViewPoint; - - -public interface Stage { - PipelineBiome apply(ViewPoint viewPoint); - - int maxRelativeReadDistance(); - - default Iterable getBiomes(Iterable biomes) { - return biomes; - } -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/BiomePipelineTemplate.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/BiomePipelineTemplate.java deleted file mode 100644 index 1aae87a23..000000000 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/BiomePipelineTemplate.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.v2.config; - -import com.dfsek.tectonic.api.config.template.annotations.Default; -import com.dfsek.tectonic.api.config.template.annotations.Description; -import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; - -import java.util.List; - -import com.dfsek.terra.addons.biome.pipeline.v2.PipelineBiomeProvider; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.PipelineImpl; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; - - -@SuppressWarnings({ "FieldMayBeFinal", "unused" }) -public class BiomePipelineTemplate implements ObjectTemplate { - @Value("resolution") - @Default - @Description(""" - The resolution at which to sample biomes. - - Larger values are quadratically faster, but produce lower quality results. - For example, a value of 3 would sample every 3 blocks.""") - protected @Meta int resolution = 1; - @Value("blend.sampler") - @Default - @Description("A sampler to use for blending the edges of biomes via domain warping.") - protected @Meta NoiseSampler blendSampler = NoiseSampler.zero(); - @Value("blend.amplitude") - @Default - @Description("The amplitude at which to perform blending.") - protected @Meta double blendAmplitude = 0d; - @Value("pipeline.source") - @Description("The Biome Source to use for initial population of biomes.") - private @Meta Source source; - @Value("pipeline.stages") - @Description("A list of pipeline stages to apply to the result of #source") - private @Meta List<@Meta Stage> stages; - - @Override - public BiomeProvider get() { - return new PipelineBiomeProvider(new PipelineImpl(source, stages, resolution, 128), resolution, blendSampler, blendAmplitude); - } -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/StageTemplate.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/StageTemplate.java deleted file mode 100644 index ab7e8c969..000000000 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/StageTemplate.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.v2.config.stage; - -import com.dfsek.tectonic.api.config.template.annotations.Description; -import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; - -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; - - -public abstract class StageTemplate implements ObjectTemplate { - @Value("sampler") - @Description("Sampler to use for stage distribution.") - protected @Meta NoiseSampler noise; -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/expander/ExpanderStageTemplate.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/expander/ExpanderStageTemplate.java deleted file mode 100644 index 24733c003..000000000 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/expander/ExpanderStageTemplate.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.expander; - -import com.dfsek.terra.addons.biome.pipeline.v2.api.Expander; -import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.stage.expander.FractalExpander; - - -public class ExpanderStageTemplate extends StageTemplate { - @Override - public Expander get() { - return new FractalExpander(noise); - } -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/SmoothStageTemplate.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/SmoothStageTemplate.java deleted file mode 100644 index 600eeaa58..000000000 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/SmoothStageTemplate.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator; - -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.SmoothStage; - - -public class SmoothStageTemplate extends StageTemplate { - @Override - public Stage get() { - return new SmoothStage(noise); - } -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SamplerSource.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SamplerSource.java deleted file mode 100644 index 6ff9d98cd..000000000 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SamplerSource.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.source; - -import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; - - -public class SamplerSource implements Source { - private final ProbabilityCollection biomes; - private final NoiseSampler sampler; - - public SamplerSource(ProbabilityCollection biomes, NoiseSampler sampler) { - this.biomes = biomes; - this.sampler = sampler; - } - - @Override - public PipelineBiome get(long seed, int x, int z) { - return biomes.get(sampler, x, z, seed); - } - - @Override - public Iterable getBiomes() { - return biomes.getContents(); - } -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/resources/terra.addon.yml b/common/addons/biome-provider-pipeline-v2/src/main/resources/terra.addon.yml deleted file mode 100644 index f800574ca..000000000 --- a/common/addons/biome-provider-pipeline-v2/src/main/resources/terra.addon.yml +++ /dev/null @@ -1,12 +0,0 @@ -schema-version: 1 -contributors: - - Terra contributors -id: biome-provider-pipeline-v2 -version: @VERSION@ -entrypoints: - - "com.dfsek.terra.addons.biome.pipeline.v2.BiomePipelineAddon" -website: - issues: https://github.com/PolyhedralDev/Terra/issues - source: https://github.com/PolyhedralDev/Terra - docs: https://terra.polydev.org -license: MIT License \ No newline at end of file diff --git a/common/addons/biome-provider-pipeline/README.md b/common/addons/biome-provider-pipeline/README.md index 9e55109a7..745ffa241 100644 --- a/common/addons/biome-provider-pipeline/README.md +++ b/common/addons/biome-provider-pipeline/README.md @@ -1,7 +1,12 @@ -# biome-provider-pipeline +# biome-provider-pipeline-2 -Implements the Biome Pipeline, a procedural biome provider that uses a series +The second version of the Biome Pipeline, a procedural biome provider that uses a series of "stages" to apply "mutations" to a 2D grid of biomes. +Version 2 is a re-implementation of the original addon with the primary goal of providing +consistent scaling for noise relative to the world +(See https://github.com/PolyhedralDev/Terra/issues/264 for more details), and has been +included as a separate addon to maintain parity with packs utilizing the first version. + This addon registers the `PIPELINE` biome provider type, and all associated configurations. \ No newline at end of file diff --git a/common/addons/biome-provider-pipeline/build.gradle.kts b/common/addons/biome-provider-pipeline/build.gradle.kts index 2e19b7c85..2bbce32db 100644 --- a/common/addons/biome-provider-pipeline/build.gradle.kts +++ b/common/addons/biome-provider-pipeline/build.gradle.kts @@ -1,5 +1,5 @@ -version = version("1.0.2") +version = version("2.0.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) -} +} \ No newline at end of file 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 deleted file mode 100644 index 2e1898cdf..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline; - -import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeExpander; -import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator; -import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; -import com.dfsek.terra.api.util.vector.Vector2; - - -public class BiomeHolderImpl implements BiomeHolder { - private final Vector2.Mutable origin; - private final int width; - private final int offset; - private BiomeDelegate[][] biomes; - - public BiomeHolderImpl(int width, Vector2.Mutable origin) { - width += 4; - this.width = width; - biomes = new BiomeDelegate[width][width]; - this.origin = origin; - this.offset = 2; - } - - private BiomeHolderImpl(BiomeDelegate[][] biomes, Vector2.Mutable origin, int width, int offset) { - this.biomes = biomes; - this.origin = origin; - this.width = width; - this.offset = 2 * offset; - } - - @Override - public BiomeHolder expand(BiomeExpander expander, long seed) { - BiomeDelegate[][] old = biomes; - int newWidth = width * 2 - 1; - - biomes = new BiomeDelegate[newWidth][newWidth]; - - for(int x = 0; x < width; x++) { - 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(), 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(), 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(), 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, 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(), seed); - } - } - } - - @Override - 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, seed); - } - } - } - - @Override - public BiomeDelegate getBiome(int x, int z) { - x += offset; - z += offset; - return getBiomeRaw(x, z); - } - - @Override - public BiomeDelegate getBiomeRaw(int x, int z) { - if(x >= width || z >= width || x < 0 || z < 0) return null; - return biomes[x][z]; - } -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java deleted file mode 100644 index 678347084..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; -import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; -import com.dfsek.terra.api.util.vector.Vector2; - - -public class BiomePipeline { - private final BiomeSource source; - private final List stages; - private final int size; - private final int init; - - private BiomePipeline(BiomeSource source, List stages, int size, int init) { - this.source = source; - this.stages = stages; - this.size = size; - this.init = init; - } - - /** - * Get biomes in a chunk - * - * @param x Chunk X coord - * @param z Chunk Z coord - * - * @return BiomeHolder containing biomes. - */ - public BiomeHolder getBiomes(int x, int z, long seed) { - BiomeHolder holder = new BiomeHolderImpl(init, Vector2.of(x * (init - 1), z * (init - 1)).mutable()); - holder.fill(source, seed); - for(Stage stage : stages) holder = stage.apply(holder, seed); - return holder; - } - - public BiomeSource getSource() { - return source; - } - - public List getStages() { - return Collections.unmodifiableList(stages); - } - - public int getSize() { - return size; - } - - public static final class BiomePipelineBuilder { - private final int init; - private final List stages = new ArrayList<>(); - private int expand; - - public BiomePipelineBuilder(int init) { - this.init = init; - expand = init; - } - - public BiomePipeline build(BiomeSource source) { - for(Stage stage : stages) { - if(stage.isExpansion()) expand = expand * 2 - 1; - } - - return new BiomePipeline(source, stages, expand, init); - } - - 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 da0cf38cc..432fd4dec 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 @@ -8,23 +8,21 @@ package com.dfsek.terra.addons.biome.pipeline; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.function.Supplier; -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; -import com.dfsek.terra.addons.biome.pipeline.config.BiomeDelegateLoader; +import com.dfsek.terra.addons.biome.pipeline.api.Source; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.addons.biome.pipeline.config.BiomePipelineTemplate; -import com.dfsek.terra.addons.biome.pipeline.config.SamplerSourceTemplate; +import com.dfsek.terra.addons.biome.pipeline.config.PipelineBiomeLoader; +import com.dfsek.terra.addons.biome.pipeline.config.source.SamplerSourceTemplate; 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.source.BiomeSource; +import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderListStageTemplate; +import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderStageTemplate; +import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceListStageTemplate; +import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceStageTemplate; +import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.SmoothStageTemplate; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; @@ -41,13 +39,13 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider; public class BiomePipelineAddon implements AddonInitializer { - public static final TypeKey>> SOURCE_REGISTRY_KEY = new TypeKey<>() { + public static final TypeKey>> SOURCE_REGISTRY_KEY = new TypeKey<>() { }; + public static final TypeKey>> STAGE_REGISTRY_KEY = new TypeKey<>() { }; public static final TypeKey>> PROVIDER_REGISTRY_KEY = new TypeKey<>() { }; - private static final Logger logger = LoggerFactory.getLogger(BiomePipelineAddon.class); @Inject private Platform platform; @@ -65,7 +63,7 @@ public class BiomePipelineAddon implements AddonInitializer { providerRegistry.register(addon.key("PIPELINE"), BiomePipelineTemplate::new); }) .then(event -> { - CheckedRegistry>> sourceRegistry = event.getPack().getOrCreateRegistry( + CheckedRegistry>> sourceRegistry = event.getPack().getOrCreateRegistry( SOURCE_REGISTRY_KEY); sourceRegistry.register(addon.key("SAMPLER"), SamplerSourceTemplate::new); }) @@ -73,11 +71,11 @@ public class BiomePipelineAddon implements AddonInitializer { CheckedRegistry>> stageRegistry = event.getPack().getOrCreateRegistry( STAGE_REGISTRY_KEY); stageRegistry.register(addon.key("FRACTAL_EXPAND"), ExpanderStageTemplate::new); - stageRegistry.register(addon.key("SMOOTH"), SmoothMutatorTemplate::new); - stageRegistry.register(addon.key("REPLACE"), ReplaceMutatorTemplate::new); - stageRegistry.register(addon.key("REPLACE_LIST"), ReplaceListMutatorTemplate::new); - stageRegistry.register(addon.key("BORDER"), BorderMutatorTemplate::new); - stageRegistry.register(addon.key("BORDER_LIST"), BorderListMutatorTemplate::new); + stageRegistry.register(addon.key("SMOOTH"), SmoothStageTemplate::new); + stageRegistry.register(addon.key("REPLACE"), ReplaceStageTemplate::new); + stageRegistry.register(addon.key("REPLACE_LIST"), ReplaceListStageTemplate::new); + stageRegistry.register(addon.key("BORDER"), BorderStageTemplate::new); + stageRegistry.register(addon.key("BORDER_LIST"), BorderListStageTemplate::new); }) .failThrough(); platform.getEventManager() @@ -85,12 +83,7 @@ public class BiomePipelineAddon implements AddonInitializer { .register(addon, ConfigPackPostLoadEvent.class) .then(event -> { Registry biomeRegistry = event.getPack().getRegistry(Biome.class); - event.getPack().applyLoader(BiomeDelegate.class, new BiomeDelegateLoader(biomeRegistry)); + event.getPack().applyLoader(PipelineBiome.class, new PipelineBiomeLoader(biomeRegistry)); }); - - if(platform.getTerraConfig().isDebugLog()) - logger.warn( - "The biome-provider-pipeline addon is deprecated and scheduled for removal in Terra 7.0. It is recommended to use the" + - " biome-provider-pipeline-v2 addon for future pack development instead."); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineColumn.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineColumn.java index 1c03359af..9f6bb4d6b 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineColumn.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineColumn.java @@ -9,7 +9,7 @@ import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -class BiomePipelineColumn implements Column { +public class BiomePipelineColumn implements Column { private final int min; private final int max; 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 deleted file mode 100644 index 2424b6ce6..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline; - -import com.github.benmanes.caffeine.cache.Caffeine; -import com.github.benmanes.caffeine.cache.LoadingCache; - -import java.util.Comparator; -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; -import java.util.stream.StreamSupport; - -import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.registry.key.StringIdentifiable; -import com.dfsek.terra.api.util.Column; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; - - -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; - - private final Set biomes; - - public BiomePipelineProvider(BiomePipeline pipeline, int resolution, NoiseSampler mutator, double noiseAmp) { - this.resolution = resolution; - this.mutator = mutator; - this.noiseAmp = noiseAmp; - holderCache = Caffeine.newBuilder() - .maximumSize(1024) - .build(key -> pipeline.getBiomes(key.x, key.z, key.seed)); - this.pipeline = pipeline; - - Set biomeSet = new HashSet<>(); - pipeline.getSource().getBiomes().forEach(biomeSet::add); - Iterable result = biomeSet; - for(Stage stage : pipeline.getStages()) { - result = stage.getBiomes(result); // pass through all stages - } - this.biomes = new HashSet<>(); - Iterable finalResult = result; - result.forEach(biomeDelegate -> { - if(biomeDelegate.isEphemeral()) { - - StringBuilder biomeList = new StringBuilder("\n"); - StreamSupport.stream(finalResult.spliterator(), false) - .sorted(Comparator.comparing(StringIdentifiable::getID)) - .forEach(delegate -> biomeList - .append(" - ") - .append(delegate.getID()) - .append(':') - .append(delegate.getClass().getCanonicalName()) - .append('\n')); - throw new IllegalArgumentException("Biome Pipeline leaks ephemeral biome \"" + biomeDelegate.getID() + - "\". Ensure there is a stage to guarantee replacement of the ephemeral biome. Biomes: " + - biomeList); - } - this.biomes.add(biomeDelegate.getBiome()); - }); - } - - @Override - public Biome getBiome(int x, int y, int z, long seed) { - return getBiome(x, z, seed); - } - - public Biome getBiome(int x, int z, long seed) { - x += mutator.noise(seed + 1, x, z) * noiseAmp; - z += mutator.noise(seed + 2, x, z) * noiseAmp; - - - x /= resolution; - z /= resolution; - - int fdX = Math.floorDiv(x, pipeline.getSize()); - int fdZ = Math.floorDiv(z, pipeline.getSize()); - return holderCache.get(new SeededVector(fdX, fdZ, seed)).getBiome(x - fdX * pipeline.getSize(), - z - fdZ * pipeline.getSize()).getBiome(); - } - - @Override - public Optional getBaseBiome(int x, int z, long seed) { - return Optional.of(getBiome(x, z, seed)); - } - - @Override - public Iterable getBiomes() { - return biomes; - } - - @Override - public Column getColumn(int x, int z, long seed, int min, int max) { - return new BiomePipelineColumn(this, min, max, x, z, seed); - } - - @Override - public int resolution() { - return resolution; - } - - private record SeededVector(int x, int z, long seed) { - @Override - public boolean equals(Object obj) { - if(obj instanceof SeededVector that) { - return this.z == that.z && this.x == that.x && this.seed == that.seed; - } - return false; - } - - @Override - public int hashCode() { - int code = x; - code = 31 * code + z; - return 31 * code + ((int) (seed ^ (seed >>> 32))); - } - } -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java similarity index 82% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java index 6858a3731..5344cf8fe 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java @@ -1,7 +1,13 @@ -package com.dfsek.terra.addons.biome.pipeline.v2; +/* + * Copyright (c) 2020-2025 Polyhedral Development + * + * The Terra Core Addons are licensed under the terms of the MIT License. For more details, + * reference the LICENSE file in this module's root directory. + */ -import com.dfsek.terra.api.util.cache.SeededVector2Key; +package com.dfsek.terra.addons.biome.pipeline; +import com.dfsek.seismic.type.sampler.Sampler; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; @@ -11,13 +17,13 @@ import java.util.Optional; import java.util.Set; import java.util.stream.StreamSupport; -import com.dfsek.terra.addons.biome.pipeline.v2.api.BiomeChunk; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Pipeline; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.addons.biome.pipeline.api.BiomeChunk; +import com.dfsek.terra.addons.biome.pipeline.api.Pipeline; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.registry.key.StringIdentifiable; import com.dfsek.terra.api.util.Column; +import com.dfsek.terra.api.util.cache.SeededVector2Key; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; @@ -27,11 +33,11 @@ public class PipelineBiomeProvider implements BiomeProvider { private final LoadingCache biomeChunkCache; private final int chunkSize; private final int resolution; - private final NoiseSampler mutator; + private final Sampler mutator; private final double noiseAmp; private final Set biomes; - public PipelineBiomeProvider(Pipeline pipeline, int resolution, NoiseSampler mutator, double noiseAmp) { + public PipelineBiomeProvider(Pipeline pipeline, int resolution, Sampler mutator, double noiseAmp) { this.resolution = resolution; this.mutator = mutator; this.noiseAmp = noiseAmp; @@ -76,8 +82,8 @@ public class PipelineBiomeProvider implements BiomeProvider { public Biome getBiome(int x, int z, long seed) { - x += mutator.noise(seed + 1, x, z) * noiseAmp; - z += mutator.noise(seed + 2, x, z) * noiseAmp; + x += (int) (mutator.getSample(seed + 1, x, z) * noiseAmp); + z += (int) (mutator.getSample(seed + 2, x, z) * noiseAmp); x /= resolution; z /= resolution; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeChunk.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeChunk.java new file mode 100644 index 000000000..c9a2a9cb3 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeChunk.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.addons.biome.pipeline.api; + + +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; + + +public interface BiomeChunk { + + PipelineBiome get(int xInChunk, int zInChunk); +} 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 deleted file mode 100644 index ad442f283..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.api; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeExpander; -import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator; -import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; - - -public interface BiomeHolder { - BiomeHolder expand(BiomeExpander expander, long seed); - - void mutate(BiomeMutator mutator, long seed); - - void fill(BiomeSource source, long seed); - - BiomeDelegate getBiome(int x, int z); - - BiomeDelegate getBiomeRaw(int x, int z); -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Expander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Expander.java similarity index 60% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Expander.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Expander.java index abf4416b8..8f8bfde0a 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Expander.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Expander.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.api; +package com.dfsek.terra.addons.biome.pipeline.api; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl; /** @@ -10,7 +10,7 @@ import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl.ViewPoin */ public interface Expander extends Stage { - PipelineBiome fillBiome(ViewPoint viewPoint); + PipelineBiome fillBiome(BiomeChunkImpl.ViewPoint viewPoint); @Override default int maxRelativeReadDistance() { @@ -18,7 +18,7 @@ public interface Expander extends Stage { } @Override - default PipelineBiome apply(ViewPoint viewPoint) { + default PipelineBiome apply(BiomeChunkImpl.ViewPoint viewPoint) { PipelineBiome currentBiome = viewPoint.getBiome(); if(currentBiome == null) { return fillBiome(viewPoint); diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Pipeline.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Pipeline.java similarity index 82% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Pipeline.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Pipeline.java index 9c48aff9f..35474f495 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Pipeline.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Pipeline.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.api; - -import com.dfsek.terra.api.util.cache.SeededVector2Key; +package com.dfsek.terra.addons.biome.pipeline.api; import java.util.List; +import com.dfsek.terra.api.util.cache.SeededVector2Key; + public interface Pipeline { BiomeChunk generateChunk(SeededVector2Key worldCoordinates); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Source.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Source.java new file mode 100644 index 000000000..fd9a35bac --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Source.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.addons.biome.pipeline.api; + + +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; + + +public interface Source { + PipelineBiome get(long seed, int x, int z); + + Iterable getBiomes(); +} \ No newline at end of file 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 new file mode 100644 index 000000000..f08d382de --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.addons.biome.pipeline.api; + +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl; + + +public interface Stage { + PipelineBiome apply(BiomeChunkImpl.ViewPoint viewPoint); + + int maxRelativeReadDistance(); + + default Iterable getBiomes(Iterable biomes) { + return biomes; + } +} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/DelegatedPipelineBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/DelegatedPipelineBiome.java similarity index 92% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/DelegatedPipelineBiome.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/DelegatedPipelineBiome.java index 85e6a99ad..a915e32f2 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/DelegatedPipelineBiome.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/DelegatedPipelineBiome.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.api.biome; +package com.dfsek.terra.addons.biome.pipeline.api.biome; import java.util.Set; diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PipelineBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PipelineBiome.java similarity index 91% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PipelineBiome.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PipelineBiome.java index 9ee5f6a65..fdcc77cc7 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PipelineBiome.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PipelineBiome.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.api.biome; +package com.dfsek.terra.addons.biome.pipeline.api.biome; import java.util.Set; diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PlaceholderPipelineBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PlaceholderPipelineBiome.java similarity index 94% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PlaceholderPipelineBiome.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PlaceholderPipelineBiome.java index b527564e2..5a458676e 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PlaceholderPipelineBiome.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PlaceholderPipelineBiome.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.api.biome; +package com.dfsek.terra.addons.biome.pipeline.api.biome; import java.util.HashSet; import java.util.Set; diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/SelfPipelineBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/SelfPipelineBiome.java similarity index 92% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/SelfPipelineBiome.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/SelfPipelineBiome.java index 2f0be6d4e..7a00ef5fd 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/SelfPipelineBiome.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/SelfPipelineBiome.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.api.biome; +package com.dfsek.terra.addons.biome.pipeline.api.biome; import java.util.Collections; import java.util.Set; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/BiomeDelegate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/BiomeDelegate.java deleted file mode 100644 index c7e96c01e..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/BiomeDelegate.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.api.delegate; - -import java.util.Set; - -import com.dfsek.terra.api.registry.key.StringIdentifiable; -import com.dfsek.terra.api.world.biome.Biome; - - -public interface BiomeDelegate extends StringIdentifiable { - static BiomeDelegate ephemeral(String id) { - return new EphemeralBiomeDelegate(id); - } - - static BiomeDelegate from(Biome biome) { - return new DelegatedBiome(biome); - } - - static BiomeDelegate self() { - return SelfDelegate.INSTANCE; - } - - Biome getBiome(); - - Set getTags(); - - default boolean isEphemeral() { - return false; - } - - default boolean isSelf() { - return false; - } - - -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/DelegatedBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/DelegatedBiome.java deleted file mode 100644 index ea724928f..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/DelegatedBiome.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.api.delegate; - -import java.util.Set; - -import com.dfsek.terra.api.world.biome.Biome; - - -final class DelegatedBiome implements BiomeDelegate { - private final Biome biome; - - public DelegatedBiome(Biome biome) { - this.biome = biome; - } - - @Override - public Biome getBiome() { - return biome; - } - - @Override - public int hashCode() { - return biome.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if(!(obj instanceof DelegatedBiome that)) return false; - return that.biome.equals(this.biome); - } - - @Override - public Set getTags() { - return biome.getTags(); - } - - @Override - public String getID() { - return biome.getID(); - } -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/EphemeralBiomeDelegate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/EphemeralBiomeDelegate.java deleted file mode 100644 index e8e000dff..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/EphemeralBiomeDelegate.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.api.delegate; - -import java.util.HashSet; -import java.util.Set; - -import com.dfsek.terra.api.world.biome.Biome; - - -final class EphemeralBiomeDelegate implements BiomeDelegate { - private final Set tags; - private final String id; - - public EphemeralBiomeDelegate(String id) { - this.id = id; - tags = new HashSet<>(); - tags.add(id); - tags.add("ALL"); - } - - @Override - public Biome getBiome() { - throw new UnsupportedOperationException("Cannot get biome from ephemeral delegate"); - } - - @Override - public Set getTags() { - return tags; - } - - @Override - public String getID() { - return id; - } - - @Override - public boolean isEphemeral() { - return true; - } - - @Override - public int hashCode() { - return id.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if(!(obj instanceof EphemeralBiomeDelegate that)) return false; - - return this.id.equals(that.id); - } -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/SelfDelegate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/SelfDelegate.java deleted file mode 100644 index 6b62818d2..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/SelfDelegate.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.api.delegate; - -import java.util.Collections; -import java.util.Set; - -import com.dfsek.terra.api.world.biome.Biome; - - -final class SelfDelegate implements BiomeDelegate { - public static final SelfDelegate INSTANCE = new SelfDelegate(); - - private SelfDelegate() { - - } - - @Override - public Biome getBiome() { - throw new UnsupportedOperationException("Cannot get biome from self delegate"); - } - - @Override - public boolean isSelf() { - return true; - } - - @Override - public boolean isEphemeral() { - return true; - } - - @Override - public Set getTags() { - return Collections.emptySet(); - } - - @Override - public String getID() { - return "SELF"; - } -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/Stage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/Stage.java deleted file mode 100644 index 4dc8ff534..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/Stage.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.api.stage; - -import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; - - -public interface Stage { - BiomeHolder apply(BiomeHolder in, long seed); - - boolean isExpansion(); - - Iterable getBiomes(Iterable biomes); -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/type/BiomeExpander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/type/BiomeExpander.java deleted file mode 100644 index 952f51f33..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/type/BiomeExpander.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.api.stage.type; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; - - -public interface BiomeExpander { - BiomeDelegate getBetween(double x, double z, long seed, BiomeDelegate... others); -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/type/BiomeMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/type/BiomeMutator.java deleted file mode 100644 index f04523498..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/type/BiomeMutator.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.api.stage.type; - -import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; - - -public interface BiomeMutator { - BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed); - - default Iterable getBiomes(Iterable biomes) { - return biomes; - } - - class ViewPoint { - private final BiomeHolder biomes; - private final int offX; - private final int offZ; - - public ViewPoint(BiomeHolder biomes, int offX, int offZ) { - this.biomes = biomes; - this.offX = offX; - this.offZ = offZ; - } - - - public BiomeDelegate getBiome(int x, int z) { - return biomes.getBiomeRaw(x + offX, z + offZ); - } - } -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeDelegateLoader.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeDelegateLoader.java deleted file mode 100644 index 9c755ce2d..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeDelegateLoader.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.config; - -import com.dfsek.tectonic.api.depth.DepthTracker; -import com.dfsek.tectonic.api.exception.LoadException; -import com.dfsek.tectonic.api.loader.ConfigLoader; -import com.dfsek.tectonic.api.loader.type.TypeLoader; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.AnnotatedType; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.api.registry.Registry; -import com.dfsek.terra.api.world.biome.Biome; - - -public class BiomeDelegateLoader implements TypeLoader { - private final Registry biomeRegistry; - - public BiomeDelegateLoader(Registry biomeRegistry) { - this.biomeRegistry = biomeRegistry; - } - - @Override - public BiomeDelegate load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) - throws LoadException { - if(c.equals("SELF")) return BiomeDelegate.self(); - return biomeRegistry - .getByID((String) c) - .map(BiomeDelegate::from) - .orElseGet(() -> BiomeDelegate.ephemeral((String) c)); - } -} 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 5a851252e..e78c3137a 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 @@ -7,48 +7,49 @@ package com.dfsek.terra.addons.biome.pipeline.config; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Description; import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.List; -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.Stage; -import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; +import com.dfsek.terra.addons.biome.pipeline.PipelineBiomeProvider; +import com.dfsek.terra.addons.biome.pipeline.api.Source; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.pipeline.PipelineImpl; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; @SuppressWarnings({ "FieldMayBeFinal", "unused" }) -public class BiomePipelineTemplate extends BiomeProviderTemplate { - @Value("pipeline.initial-size") +public class BiomePipelineTemplate implements ObjectTemplate { + @Value("resolution") @Default @Description(""" - The initial size of biome chunks. This value must be at least 2. - This is not the final size of biome chunks. Final chunks will be much larger. + The resolution at which to sample biomes. - It is recommended to keep biome chunks' final size in the range of [50, 300] - to prevent performance issues. To calculate the size of biome chunks, simply - take initial-size and for each expand stage, multiply the running value by 2 - and subtract 1. (The size is also printed to the server console if you - have debug mode enabled)""") - private @Meta int initialSize = 2; - + Larger values are quadratically faster, but produce lower quality results. + For example, a value of 3 would sample every 3 blocks.""") + protected @Meta int resolution = 1; + @Value("blend.sampler") + @Default + @Description("A sampler to use for blending the edges of biomes via domain warping.") + protected @Meta Sampler blendSampler = Sampler.zero(); + @Value("blend.amplitude") + @Default + @Description("The amplitude at which to perform blending.") + protected @Meta double blendAmplitude = 0d; @Value("pipeline.source") @Description("The Biome Source to use for initial population of biomes.") - private @Meta BiomeSource source; - + private @Meta Source source; @Value("pipeline.stages") @Description("A list of pipeline stages to apply to the result of #source") private @Meta List<@Meta Stage> stages; @Override public BiomeProvider get() { - BiomePipeline.BiomePipelineBuilder biomePipelineBuilder = new BiomePipeline.BiomePipelineBuilder(initialSize); - stages.forEach(biomePipelineBuilder::addStage); - BiomePipeline pipeline = biomePipelineBuilder.build(source); - return new BiomePipelineProvider(pipeline, resolution, blend, blendAmp); + return new PipelineBiomeProvider(new PipelineImpl(source, stages, resolution, 128), resolution, blendSampler, blendAmplitude); } } 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 deleted file mode 100644 index 70e985d92..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.config; - -import com.dfsek.tectonic.api.config.template.annotations.Default; -import com.dfsek.tectonic.api.config.template.annotations.Description; -import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; - -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; - - -public abstract class BiomeProviderTemplate implements ObjectTemplate { - @Value("resolution") - @Default - @Description(""" - The resolution at which to sample biomes. - - Larger values are quadratically faster, but produce lower quality results. - For example, a value of 3 would sample every 3 blocks.""") - protected @Meta int resolution = 1; - @Value("blend.sampler") - @Default - @Description("A sampler to use for blending the edges of biomes via domain warping.") - protected @Meta NoiseSampler blend = NoiseSampler.zero(); - @Value("blend.amplitude") - @Default - @Description("The amplitude at which to perform blending.") - protected @Meta double blendAmp = 0d; -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/PipelineBiomeLoader.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java similarity index 88% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/PipelineBiomeLoader.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java index 8f8e5d50d..afd249c25 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/PipelineBiomeLoader.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.config; +package com.dfsek.terra.addons.biome.pipeline.config; import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.world.biome.Biome; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SamplerSourceTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SamplerSourceTemplate.java deleted file mode 100644 index 58ba49902..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SamplerSourceTemplate.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.config; - -import com.dfsek.tectonic.api.config.template.annotations.Description; -import com.dfsek.tectonic.api.config.template.annotations.Value; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; -import com.dfsek.terra.addons.biome.pipeline.source.SamplerSource; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; - - -public class SamplerSourceTemplate extends SourceTemplate { - @Value("sampler") - @Description("The sampler used to distribute biomes.") - private @Meta NoiseSampler noise; - - @Value("biomes") - @Description("The biomes to be distributed.") - private @Meta ProbabilityCollection<@Meta BiomeDelegate> biomes; - - @Override - public BiomeSource get() { - return new SamplerSource(biomes, noise); - } -} 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 deleted file mode 100644 index c9321e0df..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.config; - -import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; - -import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; - - -public abstract class SourceTemplate implements ObjectTemplate { - -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SamplerSourceTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/source/SamplerSourceTemplate.java similarity index 70% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SamplerSourceTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/source/SamplerSourceTemplate.java index 5429ff9c2..ac3ad01dc 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SamplerSourceTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/source/SamplerSourceTemplate.java @@ -5,23 +5,23 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.v2.config.source; +package com.dfsek.terra.addons.biome.pipeline.config.source; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Description; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.source.SamplerSource; +import com.dfsek.terra.addons.biome.pipeline.api.Source; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.source.SamplerSource; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; public class SamplerSourceTemplate extends SourceTemplate { @Value("sampler") @Description("The sampler used to distribute biomes.") - private @Meta NoiseSampler noise; + private @Meta Sampler noise; @Value("biomes") @Description("The biomes to be distributed.") diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SourceTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/source/SourceTemplate.java similarity index 74% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SourceTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/source/SourceTemplate.java index 79d24a10a..47d89aa6f 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SourceTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/source/SourceTemplate.java @@ -5,11 +5,11 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.v2.config.source; +package com.dfsek.terra.addons.biome.pipeline.config.source; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; +import com.dfsek.terra.addons.biome.pipeline.api.Source; public abstract class SourceTemplate implements ObjectTemplate { 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 62cffb13d..13906de82 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 @@ -7,17 +7,17 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Description; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; public abstract class StageTemplate implements ObjectTemplate { @Value("sampler") @Description("Sampler to use for stage distribution.") - protected @Meta NoiseSampler noise; + protected @Meta Sampler 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 3d3f7910b..420d307e3 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,15 +7,14 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.expander; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.Expander; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.expand.FractalExpander; -import com.dfsek.terra.addons.biome.pipeline.stages.ExpanderStage; +import com.dfsek.terra.addons.biome.pipeline.stage.expander.FractalExpander; public class ExpanderStageTemplate extends StageTemplate { @Override - public Stage get() { - return new ExpanderStage(new FractalExpander(noise)); + public Expander get() { + return 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 deleted file mode 100644 index f1b0b31f7..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; - -import com.dfsek.tectonic.api.config.template.annotations.Value; - -import java.util.Map; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; -import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.mutator.BorderListMutator; -import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; - - -@SuppressWarnings("unused") -public class BorderListMutatorTemplate extends StageTemplate { - @Value("from") - private @Meta String from; - - @Value("default-replace") - private @Meta String defaultReplace; - - @Value("default-to") - private @Meta ProbabilityCollection<@Meta BiomeDelegate> defaultTo; - - @Value("replace") - private @Meta Map<@Meta BiomeDelegate, @Meta ProbabilityCollection<@Meta BiomeDelegate>> replace; - - - @Override - public Stage get() { - return new MutatorStage(new BorderListMutator(replace, from, defaultReplace, noise, defaultTo)); - } -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderListStageTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListStageTemplate.java similarity index 73% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderListStageTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListStageTemplate.java index 4bcb5d65e..4d767ef26 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderListStageTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListStageTemplate.java @@ -5,16 +5,16 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator; +package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; import com.dfsek.tectonic.api.config.template.annotations.Value; import java.util.Map; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.BorderListStage; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; +import com.dfsek.terra.addons.biome.pipeline.stage.mutators.BorderListStage; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; 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 deleted file mode 100644 index 5c5301fdd..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; - -import com.dfsek.tectonic.api.config.template.annotations.Value; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; -import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.mutator.BorderMutator; -import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; - - -@SuppressWarnings("unused") -public class BorderMutatorTemplate extends StageTemplate { - @Value("from") - private @Meta String from; - - @Value("replace") - private @Meta String replace; - - @Value("to") - private @Meta ProbabilityCollection<@Meta BiomeDelegate> to; - - @Override - public Stage get() { - return new MutatorStage(new BorderMutator(from, replace, noise, to)); - } -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderStageTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderStageTemplate.java similarity index 68% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderStageTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderStageTemplate.java index 8651c64bd..4aa3e83ed 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderStageTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderStageTemplate.java @@ -5,14 +5,14 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator; +package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.BorderStage; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; +import com.dfsek.terra.addons.biome.pipeline.stage.mutators.BorderStage; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; 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 deleted file mode 100644 index cdbbbe3e7..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; - -import com.dfsek.tectonic.api.config.template.annotations.Value; - -import java.util.Map; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; -import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceListMutator; -import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; - - -@SuppressWarnings("unused") -public class ReplaceListMutatorTemplate extends StageTemplate { - @Value("default-from") - private @Meta String defaultFrom; - - @Value("default-to") - private @Meta ProbabilityCollection<@Meta BiomeDelegate> defaultTo; - - @Value("to") - private @Meta Map<@Meta BiomeDelegate, @Meta ProbabilityCollection<@Meta BiomeDelegate>> replace; - - @Override - public Stage get() { - return new MutatorStage(new ReplaceListMutator(replace, defaultFrom, defaultTo, noise)); - } -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceListStageTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListStageTemplate.java similarity index 71% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceListStageTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListStageTemplate.java index ef7a23b14..e1cfcb4cb 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceListStageTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListStageTemplate.java @@ -5,16 +5,16 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator; +package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; import com.dfsek.tectonic.api.config.template.annotations.Value; import java.util.Map; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.ReplaceListStage; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; +import com.dfsek.terra.addons.biome.pipeline.stage.mutators.ReplaceListStage; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; 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 deleted file mode 100644 index ad851afca..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; - -import com.dfsek.tectonic.api.config.template.annotations.Value; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; -import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceMutator; -import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; - - -@SuppressWarnings("unused") -public class ReplaceMutatorTemplate extends StageTemplate { - @Value("from") - private @Meta String from; - - @Value("to") - private @Meta ProbabilityCollection<@Meta BiomeDelegate> to; - - @Override - public Stage get() { - return new MutatorStage(new ReplaceMutator(from, to, noise)); - } -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceStageTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceStageTemplate.java similarity index 66% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceStageTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceStageTemplate.java index 25e76cb11..4c2d33266 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceStageTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceStageTemplate.java @@ -5,14 +5,14 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator; +package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.ReplaceStage; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; +import com.dfsek.terra.addons.biome.pipeline.stage.mutators.ReplaceStage; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; 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/SmoothStageTemplate.java similarity index 56% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothStageTemplate.java index 9c03e9784..a837bded1 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/SmoothStageTemplate.java @@ -7,15 +7,14 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; +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.mutator.SmoothMutator; -import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage; +import com.dfsek.terra.addons.biome.pipeline.stage.mutators.SmoothStage; -public class SmoothMutatorTemplate extends StageTemplate { +public class SmoothStageTemplate extends StageTemplate { @Override public Stage get() { - return new MutatorStage(new SmoothMutator(noise)); + return new SmoothStage(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 deleted file mode 100644 index 3555ca8ca..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.expand; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeExpander; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.MathUtil; - - -public class FractalExpander implements BiomeExpander { - private final NoiseSampler sampler; - - public FractalExpander(NoiseSampler sampler) { - this.sampler = sampler; - } - - @Override - public BiomeDelegate getBetween(double x, double z, long seed, BiomeDelegate... others) { - return others[MathUtil.normalizeIndex(sampler.noise(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 deleted file mode 100644 index 7565f5ced..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.mutator; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.function.Predicate; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; - - -public class BorderListMutator implements BiomeMutator { - private final String border; - private final NoiseSampler noiseSampler; - private final ProbabilityCollection replaceDefault; - private final String defaultReplace; - private final Map> replace; - - public BorderListMutator(Map> replace, String border, String defaultReplace, - NoiseSampler noiseSampler, ProbabilityCollection replaceDefault) { - this.border = border; - this.noiseSampler = noiseSampler; - this.replaceDefault = replaceDefault; - this.defaultReplace = defaultReplace; - this.replace = replace; - } - - @Override - public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) { - BiomeDelegate origin = viewPoint.getBiome(0, 0); - if(origin.getTags().contains(defaultReplace)) { - for(int xi = -1; xi <= 1; xi++) { - for(int zi = -1; zi <= 1; zi++) { - if(xi == 0 && zi == 0) continue; - BiomeDelegate current = viewPoint.getBiome(xi, zi); - if(current != null && current.getTags().contains(border)) { - if(replace.containsKey(origin)) { - BiomeDelegate biome = replace.get(origin).get(noiseSampler, x, z, seed); - return biome.isSelf() ? origin : biome; - } - BiomeDelegate biome = replaceDefault.get(noiseSampler, x, z, seed); - return biome.isSelf() ? origin : biome; - } - } - } - } - return origin; - } - - @Override - public Iterable getBiomes(Iterable biomes) { - Set biomeSet = new HashSet<>(); - biomes.forEach(biomeSet::add); - biomeSet.addAll(replaceDefault.getContents().stream().filter(Predicate.not(BiomeDelegate::isSelf)).toList()); - replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents())); - return biomeSet; - } -} 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 deleted file mode 100644 index 33705ca47..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.mutator; - -import java.util.HashSet; -import java.util.Set; -import java.util.function.Predicate; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; - - -public class BorderMutator implements BiomeMutator { - private final String border; - private final NoiseSampler noiseSampler; - private final ProbabilityCollection replace; - private final String replaceTag; - - public BorderMutator(String border, String replaceTag, NoiseSampler noiseSampler, ProbabilityCollection replace) { - this.border = border; - this.noiseSampler = noiseSampler; - this.replace = replace; - this.replaceTag = replaceTag; - } - - @Override - public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) { - BiomeDelegate origin = viewPoint.getBiome(0, 0); - if(origin.getTags().contains(replaceTag)) { - for(int xi = -1; xi <= 1; xi++) { - for(int zi = -1; zi <= 1; zi++) { - if(xi == 0 && zi == 0) continue; - BiomeDelegate current = viewPoint.getBiome(xi, zi); - if(current != null && current.getTags().contains(border)) { - BiomeDelegate biome = replace.get(noiseSampler, x, z, seed); - return biome.isSelf() ? origin : biome; - } - } - } - } - return origin; - } - - @Override - public Iterable getBiomes(Iterable biomes) { - Set biomeSet = new HashSet<>(); - biomes.forEach(biomeSet::add); - biomeSet.addAll( - replace - .getContents() - .stream() - .filter( - Predicate.not(BiomeDelegate::isSelf) - ) - .toList() - ); - return biomeSet; - } -} 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 deleted file mode 100644 index 3c89a8e32..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.mutator; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.stream.Stream; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; - - -public class ReplaceListMutator implements BiomeMutator { - private final Map> replace; - private final NoiseSampler sampler; - private final ProbabilityCollection replaceDefault; - private final String defaultTag; - - public ReplaceListMutator(Map> replace, String defaultTag, - ProbabilityCollection replaceDefault, NoiseSampler sampler) { - this.replace = replace; - this.sampler = sampler; - this.defaultTag = defaultTag; - this.replaceDefault = replaceDefault; - } - - @Override - public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) { - BiomeDelegate center = viewPoint.getBiome(0, 0); - if(replace.containsKey(center)) { - BiomeDelegate biome = replace.get(center).get(sampler, x, z, seed); - return biome.isSelf() ? viewPoint.getBiome(0, 0) : biome; - } - if(viewPoint.getBiome(0, 0).getTags().contains(defaultTag)) { - BiomeDelegate biome = replaceDefault.get(sampler, x, z, seed); - return biome.isSelf() ? viewPoint.getBiome(0, 0) : biome; - } - return center; - } - - @Override - public Iterable getBiomes(Iterable biomes) { - Set biomeSet = new HashSet<>(); - - Set reject = new HashSet<>(); - - biomes.forEach(biome -> { - if(!biome.getTags().contains(defaultTag) && !replace.containsKey(biome)) { - biomeSet.add(biome); - } else { - reject.add(biome); - } - }); - biomeSet.addAll(replaceDefault.getContents().stream().flatMap(terraBiome -> { - if(terraBiome.isSelf()) return reject.stream(); - return Stream.of(terraBiome); - }).toList()); - replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents().stream().map(terraBiome -> { - if(terraBiome.isSelf()) return biome; - return terraBiome; - }).toList())); - return biomeSet; - } -} 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 deleted file mode 100644 index 88dc8e989..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.mutator; - -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Stream; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; - - -public class ReplaceMutator implements BiomeMutator { - private final String replaceableTag; - private final ProbabilityCollection replace; - private final NoiseSampler sampler; - - public ReplaceMutator(String replaceable, ProbabilityCollection replace, NoiseSampler sampler) { - this.replaceableTag = replaceable; - this.replace = replace; - this.sampler = sampler; - } - - @Override - public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) { - if(viewPoint.getBiome(0, 0).getTags().contains(replaceableTag)) { - BiomeDelegate biome = replace.get(sampler, x, z, seed); - return biome.isSelf() ? viewPoint.getBiome(0, 0) : biome; - } - return viewPoint.getBiome(0, 0); - } - - @Override - public Iterable getBiomes(Iterable biomes) { - Set biomeSet = new HashSet<>(); - Set reject = new HashSet<>(); - biomes.forEach(biome -> { - if(!biome.getTags().contains(replaceableTag)) { - biomeSet.add(biome); - } else { - reject.add(biome); - } - }); - biomeSet.addAll(replace.getContents().stream().flatMap(terraBiome -> { - if(terraBiome.isSelf()) return reject.stream(); - return Stream.of(terraBiome); - }).toList()); - return biomeSet; - } -} 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 deleted file mode 100644 index 7870bfde5..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.mutator; - -import java.util.Objects; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.MathUtil; - - -public class SmoothMutator implements BiomeMutator { - - private final NoiseSampler sampler; - - public SmoothMutator(NoiseSampler sampler) { - this.sampler = sampler; - } - - @Override - public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) { - BiomeDelegate top = viewPoint.getBiome(1, 0); - BiomeDelegate bottom = viewPoint.getBiome(-1, 0); - BiomeDelegate left = viewPoint.getBiome(0, 1); - BiomeDelegate right = viewPoint.getBiome(0, -1); - - - boolean vert = Objects.equals(top, bottom) && top != null; - boolean horiz = Objects.equals(left, right) && left != null; - - if(vert && horiz) { - return MathUtil.normalizeIndex(sampler.noise(seed, x, z), 2) == 0 ? left : top; - } - - if(vert) return top; - if(horiz) return left; - - return viewPoint.getBiome(0, 0); - } -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/BiomeChunkImpl.java similarity index 94% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/BiomeChunkImpl.java index 0e0b4d5f6..9eba36720 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/BiomeChunkImpl.java @@ -1,11 +1,13 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.pipeline; +package com.dfsek.terra.addons.biome.pipeline.pipeline; + +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; import java.util.List; -import com.dfsek.terra.addons.biome.pipeline.v2.api.BiomeChunk; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Expander; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.api.BiomeChunk; +import com.dfsek.terra.addons.biome.pipeline.api.Expander; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.util.cache.SeededVector2Key; @@ -98,7 +100,7 @@ public class BiomeChunkImpl implements BiomeChunk { // chunk samples points on the same overall grid. // Without this, shared chunk borders (required because of adjacent cell reads) will not be identical // because points would be sampled on grids at different offsets, resulting in artifacts at borders. - return (int) Math.ceil((double) finalGridOrigin / initialGridInterval) * initialGridInterval; + return FloatingPointFunctions.ceil((double) finalGridOrigin / initialGridInterval) * initialGridInterval; } private static int calculateFinalGridOrigin(int totalExpanderCount, List stages) { diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/PipelineImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/PipelineImpl.java similarity index 87% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/PipelineImpl.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/PipelineImpl.java index 71032531a..025dd4c9e 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/PipelineImpl.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/PipelineImpl.java @@ -1,17 +1,16 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.pipeline; - -import com.dfsek.terra.api.util.cache.SeededVector2Key; +package com.dfsek.terra.addons.biome.pipeline.pipeline; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; -import com.dfsek.terra.addons.biome.pipeline.v2.api.BiomeChunk; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Expander; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Pipeline; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.BiomeChunk; +import com.dfsek.terra.addons.biome.pipeline.api.Expander; +import com.dfsek.terra.addons.biome.pipeline.api.Pipeline; +import com.dfsek.terra.addons.biome.pipeline.api.Source; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.api.util.cache.SeededVector2Key; public class PipelineImpl implements Pipeline { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java deleted file mode 100644 index 072282194..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.source; - -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; - - -public interface BiomeSource { - BiomeDelegate getBiome(double x, double z, long seed); - - Iterable getBiomes(); -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SamplerSource.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SamplerSource.java index 7afabf3eb..31e5a0243 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SamplerSource.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SamplerSource.java @@ -7,27 +7,29 @@ package com.dfsek.terra.addons.biome.pipeline.source; -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.seismic.type.sampler.Sampler; + +import com.dfsek.terra.addons.biome.pipeline.api.Source; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -public class SamplerSource implements BiomeSource { - private final ProbabilityCollection biomes; - private final NoiseSampler sampler; +public class SamplerSource implements Source { + private final ProbabilityCollection biomes; + private final Sampler sampler; - public SamplerSource(ProbabilityCollection biomes, NoiseSampler sampler) { + public SamplerSource(ProbabilityCollection biomes, Sampler sampler) { this.biomes = biomes; this.sampler = sampler; } @Override - public BiomeDelegate getBiome(double x, double z, long seed) { + public PipelineBiome get(long seed, int x, int z) { return biomes.get(sampler, x, z, seed); } @Override - public Iterable getBiomes() { + public Iterable getBiomes() { return biomes.getContents(); } } diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SingleSource.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SingleSource.java similarity index 69% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SingleSource.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SingleSource.java index 5649c3db4..dbd1e3747 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SingleSource.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SingleSource.java @@ -1,10 +1,10 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.source; +package com.dfsek.terra.addons.biome.pipeline.source; import java.util.Collections; import java.util.Set; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.api.Source; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; public class SingleSource implements Source { diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/expander/FractalExpander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/expander/FractalExpander.java similarity index 65% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/expander/FractalExpander.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/expander/FractalExpander.java index 957972e61..8c2a73182 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/expander/FractalExpander.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/expander/FractalExpander.java @@ -1,16 +1,17 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.stage.expander; +package com.dfsek.terra.addons.biome.pipeline.stage.expander; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Expander; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.seismic.type.sampler.Sampler; + +import com.dfsek.terra.addons.biome.pipeline.api.Expander; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl; public class FractalExpander implements Expander { - private final NoiseSampler sampler; + private final Sampler sampler; - public FractalExpander(NoiseSampler sampler) { + public FractalExpander(Sampler sampler) { this.sampler = sampler; } @@ -20,7 +21,7 @@ public class FractalExpander implements Expander { int xMod2 = viewPoint.gridX() % 2; int zMod2 = viewPoint.gridZ() % 2; - double roll = sampler.noise(viewPoint.worldSeed(), viewPoint.worldX(), viewPoint.worldZ()); + double roll = sampler.getSample(viewPoint.worldSeed(), viewPoint.worldX(), viewPoint.worldZ()); if(xMod2 == 1 && zMod2 == 0) { // Pick one of 2 neighbors on X axis randomly return roll > 0 ? viewPoint.getRelativeBiome(-1, 0) : viewPoint.getRelativeBiome(1, 0); diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderListStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderListStage.java similarity index 80% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderListStage.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderListStage.java index c8ddc8a48..dd4e64e5d 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderListStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderListStage.java @@ -5,7 +5,10 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.stage.mutators; + +import com.dfsek.seismic.type.sampler.Sampler; +import com.dfsek.seismic.type.vector.Vector2Int; import java.util.ArrayList; import java.util.HashSet; @@ -14,17 +17,15 @@ import java.util.Map; import java.util.Set; import java.util.function.Predicate; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.vector.Vector2Int; public class BorderListStage implements Stage { private final String border; - private final NoiseSampler noiseSampler; + private final Sampler Sampler; private final ProbabilityCollection replaceDefault; private final String defaultReplace; private final Map> replace; @@ -32,9 +33,9 @@ public class BorderListStage implements Stage { private final Vector2Int[] borderPoints; public BorderListStage(Map> replace, String border, String defaultReplace, - NoiseSampler noiseSampler, ProbabilityCollection replaceDefault) { + Sampler Sampler, ProbabilityCollection replaceDefault) { this.border = border; - this.noiseSampler = noiseSampler; + this.Sampler = Sampler; this.replaceDefault = replaceDefault; this.defaultReplace = defaultReplace; this.replace = replace; @@ -67,11 +68,11 @@ public class BorderListStage implements Stage { PipelineBiome current = viewPoint.getRelativeBiome(point.getX(), point.getZ()); if(current != null && current.getTags().contains(border)) { if(replace.containsKey(center)) { - PipelineBiome replacement = replace.get(center).get(noiseSampler, viewPoint.worldX(), viewPoint.worldZ(), + PipelineBiome replacement = replace.get(center).get(Sampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed()); return replacement.isSelf() ? center : replacement; } - PipelineBiome replacement = replaceDefault.get(noiseSampler, viewPoint.worldX(), viewPoint.worldZ(), + PipelineBiome replacement = replaceDefault.get(Sampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed()); return replacement.isSelf() ? center : replacement; } diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderStage.java similarity index 74% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderStage.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderStage.java index 0130fa9a8..339fdb366 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderStage.java @@ -5,7 +5,10 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.stage.mutators; + +import com.dfsek.seismic.type.sampler.Sampler; +import com.dfsek.seismic.type.vector.Vector2Int; import java.util.ArrayList; import java.util.HashSet; @@ -13,24 +16,22 @@ import java.util.List; import java.util.Set; import java.util.function.Predicate; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.vector.Vector2Int; public class BorderStage implements Stage { private final String border; - private final NoiseSampler noiseSampler; + private final Sampler Sampler; private final ProbabilityCollection replace; private final String replaceTag; private final Vector2Int[] borderPoints; - public BorderStage(String border, String replaceTag, NoiseSampler noiseSampler, ProbabilityCollection replace) { + public BorderStage(String border, String replaceTag, Sampler Sampler, ProbabilityCollection replace) { this.border = border; - this.noiseSampler = noiseSampler; + this.Sampler = Sampler; this.replace = replace; this.replaceTag = replaceTag; List points = new ArrayList<>(); @@ -50,7 +51,7 @@ public class BorderStage implements Stage { for(Vector2Int point : borderPoints) { PipelineBiome current = viewPoint.getRelativeBiome(point.getX(), point.getZ()); if(current != null && current.getTags().contains(border)) { - PipelineBiome replacement = replace.get(noiseSampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed()); + PipelineBiome replacement = replace.get(Sampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed()); return replacement.isSelf() ? center : replacement; } } diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceListStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceListStage.java similarity index 86% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceListStage.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceListStage.java index 267eea405..ca4f0db09 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceListStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceListStage.java @@ -5,28 +5,29 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.stage.mutators; + +import com.dfsek.seismic.type.sampler.Sampler; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.stream.Stream; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl; import com.dfsek.terra.api.util.collection.ProbabilityCollection; public class ReplaceListStage implements Stage { private final Map> replace; - private final NoiseSampler sampler; + private final Sampler sampler; private final ProbabilityCollection replaceDefault; private final String defaultTag; public ReplaceListStage(Map> replace, String defaultTag, - ProbabilityCollection replaceDefault, NoiseSampler sampler) { + ProbabilityCollection replaceDefault, Sampler sampler) { this.replace = replace; this.sampler = sampler; this.defaultTag = defaultTag; diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceStage.java similarity index 81% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceStage.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceStage.java index d5b0746a3..2c7ab9bf9 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceStage.java @@ -5,25 +5,26 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.stage.mutators; + +import com.dfsek.seismic.type.sampler.Sampler; import java.util.HashSet; import java.util.Set; import java.util.stream.Stream; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl; import com.dfsek.terra.api.util.collection.ProbabilityCollection; public class ReplaceStage implements Stage { private final String replaceableTag; private final ProbabilityCollection replace; - private final NoiseSampler sampler; + private final Sampler sampler; - public ReplaceStage(String replaceable, ProbabilityCollection replace, NoiseSampler sampler) { + public ReplaceStage(String replaceable, ProbabilityCollection replace, Sampler sampler) { this.replaceableTag = replaceable; this.replace = replace; this.sampler = sampler; diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/SmoothStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/SmoothStage.java similarity index 70% rename from common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/SmoothStage.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/SmoothStage.java index 50ba4da87..cbb757ba7 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/SmoothStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/SmoothStage.java @@ -5,21 +5,22 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.stage.mutators; + +import com.dfsek.seismic.type.sampler.Sampler; import java.util.Objects; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl; public class SmoothStage implements Stage { - private final NoiseSampler sampler; + private final Sampler sampler; - public SmoothStage(NoiseSampler sampler) { + public SmoothStage(Sampler sampler) { this.sampler = sampler; } @@ -30,7 +31,7 @@ public class SmoothStage implements Stage { PipelineBiome left = viewPoint.getRelativeBiome(0, 1); PipelineBiome right = viewPoint.getRelativeBiome(0, -1); - double roll = sampler.noise(viewPoint.worldSeed(), viewPoint.worldX(), viewPoint.worldZ()); + double roll = sampler.getSample(viewPoint.worldSeed(), viewPoint.worldX(), viewPoint.worldZ()); boolean vert = Objects.equals(top, bottom); boolean horiz = Objects.equals(left, right); 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 deleted file mode 100644 index 1640d8103..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.stages; - -import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; -import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeExpander; - - -public class ExpanderStage implements Stage { - private final BiomeExpander expander; - - public ExpanderStage(BiomeExpander expander) { - this.expander = expander; - } - - @Override - public BiomeHolder apply(BiomeHolder in, long seed) { - return in.expand(expander, seed); - } - - @Override - public boolean isExpansion() { - return true; - } - - @Override - public Iterable getBiomes(Iterable biomes) { - return biomes; - } -} 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 deleted file mode 100644 index a95566d16..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.biome.pipeline.stages; - -import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; -import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator; - - -public class MutatorStage implements Stage { - private final BiomeMutator mutator; - - public MutatorStage(BiomeMutator mutator) { - this.mutator = mutator; - } - - @Override - public BiomeHolder apply(BiomeHolder in, long seed) { - in.mutate(mutator, seed); - return in; - } - - @Override - public boolean isExpansion() { - return false; - } - - @Override - public Iterable getBiomes(Iterable biomes) { - return mutator.getBiomes(biomes); - } - - public enum Type { - REPLACE, - REPLACE_LIST, - BORDER, - BORDER_LIST, - SMOOTH - } -} diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/noise/BiomeNoiseConfigTemplate.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/noise/BiomeNoiseConfigTemplate.java index a0231bce8..609a912b7 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/noise/BiomeNoiseConfigTemplate.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/noise/BiomeNoiseConfigTemplate.java @@ -1,24 +1,24 @@ package com.dfsek.terra.addons.chunkgenerator.config.noise; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; public class BiomeNoiseConfigTemplate implements ObjectTemplate { @Value("terrain.sampler") - private @Meta NoiseSampler baseSampler; + private @Meta Sampler baseSampler; @Value("terrain.sampler-2d") @Default - private @Meta NoiseSampler elevationSampler = NoiseSampler.zero(); + private @Meta Sampler elevationSampler = Sampler.zero(); @Value("carving.sampler") @Default - private @Meta NoiseSampler carvingSampler = NoiseSampler.zero(); + private @Meta Sampler carvingSampler = Sampler.zero(); @Value("terrain.blend.distance") @Default diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/noise/BiomeNoiseProperties.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/noise/BiomeNoiseProperties.java index 7f4b20a88..d4c8aa00e 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/noise/BiomeNoiseProperties.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/noise/BiomeNoiseProperties.java @@ -1,12 +1,13 @@ package com.dfsek.terra.addons.chunkgenerator.config.noise; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.seismic.type.sampler.Sampler; + import com.dfsek.terra.api.properties.Properties; -public record BiomeNoiseProperties(NoiseSampler base, - NoiseSampler elevation, - NoiseSampler carving, +public record BiomeNoiseProperties(Sampler base, + Sampler elevation, + Sampler carving, int blendDistance, int blendStep, double blendWeight, diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/noise/ThreadLocalNoiseHolder.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/noise/ThreadLocalNoiseHolder.java index 22cb181ca..781f82e59 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/noise/ThreadLocalNoiseHolder.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/noise/ThreadLocalNoiseHolder.java @@ -1,19 +1,19 @@ package com.dfsek.terra.addons.chunkgenerator.config.noise; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.seismic.type.sampler.Sampler; public class ThreadLocalNoiseHolder { private final ThreadLocal holder = ThreadLocal.withInitial(Holder::new); - public double getNoise(NoiseSampler sampler, int x, int y, int z, long seed) { + public double getNoise(Sampler sampler, int x, int y, int z, long seed) { Holder holder = this.holder.get(); if(holder.init && holder.y == y && holder.z == z && holder.x == x && holder.seed == seed) { return holder.noise; } - double noise = sampler.noise(seed, x, y, z); + double noise = sampler.getSample(seed, x, y, z); holder.noise = noise; holder.x = x; holder.y = y; diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/SlantCalculationMethod.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/SlantCalculationMethod.java index 1c03a038a..de524764f 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/SlantCalculationMethod.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/SlantCalculationMethod.java @@ -1,7 +1,8 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math; +import com.dfsek.seismic.type.vector.Vector3; + import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D; -import com.dfsek.terra.api.util.vector.Vector3; public enum SlantCalculationMethod { @@ -22,7 +23,7 @@ public enum SlantCalculationMethod { Vector3.Mutable normalApproximation = Vector3.Mutable.of(0, 0, 0); for(Vector3 point : DOT_PRODUCT_SAMPLE_POINTS) { var scalar = -sampler.sample(x + point.getX(), y + point.getY(), z + point.getZ()); - normalApproximation.add(point.mutable().multiply(scalar)); + normalApproximation.add(point.mutable().mulScalar(scalar)); } return DOT_PRODUCT_DIRECTION.dot(normalApproximation.normalize()); } 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 e7f698742..8d9a6cc84 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 @@ -55,12 +55,12 @@ public class ElevationInterpolator { } if(same) { - values[x + 1][z + 1] = center.elevation().noise(seed, xOrigin + x, zOrigin + z); // no weighting needed! + values[x + 1][z + 1] = center.elevation().getSample(seed, xOrigin + x, zOrigin + z); // no weighting needed! } else { for(int xi = -smooth; xi <= smooth; xi++) { for(int zi = -smooth; zi <= smooth; zi++) { BiomeNoiseProperties gen = gens[x + 1 + smooth + xi][z + 1 + smooth + zi]; - noise += gen.elevation().noise(seed, xOrigin + x, zOrigin + z) * gen.elevationWeight(); + noise += gen.elevation().getSample(seed, xOrigin + x, zOrigin + z) * gen.elevationWeight(); div += gen.elevationWeight(); } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator.java index 0e90a1cc3..62fc2d836 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator.java @@ -7,7 +7,8 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation; -import com.dfsek.terra.api.util.MathUtil; + +import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions; /** @@ -31,6 +32,8 @@ public class Interpolator { this.v3 = v3; } + //TODO this system is not very good, replace it wholesale + /** * 2D Bilinear interpolation between 4 points on a unit square. * @@ -40,8 +43,8 @@ public class Interpolator { * @return double - The interpolated value. */ public double bilerp(double s, double t) { - double v01 = MathUtil.lerp(s, v0, v1); - double v23 = MathUtil.lerp(s, v2, v3); - return MathUtil.lerp(t, v01, v23); + double v01 = InterpolationFunctions.lerp(v0, v1, s); + double v23 = InterpolationFunctions.lerp(v2, v3, s); + return InterpolationFunctions.lerp(v01, v23, t); } } \ No newline at end of file diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator3.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator3.java index 2b3c82b36..5c07e767e 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator3.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator3.java @@ -7,7 +7,8 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation; -import com.dfsek.terra.api.util.MathUtil; + +import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions; /** @@ -36,7 +37,8 @@ public class Interpolator3 { this.bottom = new Interpolator(_100, _110, _101, _111); } + //TODO this system is not very good, replace it wholesale public double trilerp(double x, double y, double z) { - return MathUtil.lerp(x, top.bilerp(y, z), bottom.bilerp(y, z)); + return InterpolationFunctions.lerp(top.bilerp(y, z), bottom.bilerp(y, z), x); } } \ No newline at end of file diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/LazilyEvaluatedInterpolator.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/LazilyEvaluatedInterpolator.java index b215ba809..947387298 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/LazilyEvaluatedInterpolator.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/LazilyEvaluatedInterpolator.java @@ -1,8 +1,10 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions; + import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties; import com.dfsek.terra.api.properties.PropertyKey; -import com.dfsek.terra.api.util.MathUtil; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; @@ -27,8 +29,8 @@ public class LazilyEvaluatedInterpolator { PropertyKey noisePropertiesKey, int min, int horizontalRes, int verticalRes, long seed) { this.noisePropertiesKey = noisePropertiesKey; - int hSamples = (int) Math.ceil(16.0 / horizontalRes); - int vSamples = (int) Math.ceil((double) (max - min) / verticalRes); + int hSamples = FloatingPointFunctions.ceil(16.0 / horizontalRes); + int vSamples = FloatingPointFunctions.ceil((double) (max - min) / verticalRes); this.zMul = (hSamples + 1); this.yMul = zMul * zMul; samples = new Double[yMul * (vSamples + 1)]; @@ -56,7 +58,7 @@ public class LazilyEvaluatedInterpolator { .getContext() .get(noisePropertiesKey) .carving() - .noise(seed, xi, y, zi); + .getSample(seed, xi, y, zi); samples[index] = sample; } return sample; @@ -81,10 +83,10 @@ public class LazilyEvaluatedInterpolator { double xFrac = (double) (x % horizontalRes) / horizontalRes; double zFrac = (double) (z % horizontalRes) / horizontalRes; - double lerp_bottom_0 = MathUtil.lerp(zFrac, sample_0_0_0, sample_0_0_1); - double lerp_bottom_1 = MathUtil.lerp(zFrac, sample_1_0_0, sample_1_0_1); + double lerp_bottom_0 = InterpolationFunctions.lerp(sample_0_0_0, sample_0_0_1, zFrac); + double lerp_bottom_1 = InterpolationFunctions.lerp(sample_1_0_0, sample_1_0_1, zFrac); - double lerp_bottom = MathUtil.lerp(xFrac, lerp_bottom_0, lerp_bottom_1); + double lerp_bottom = InterpolationFunctions.lerp(lerp_bottom_0, lerp_bottom_1, xFrac); if(yRange) { // we can do bilerp return lerp_bottom; @@ -100,11 +102,11 @@ public class LazilyEvaluatedInterpolator { double sample_1_1_0 = sample(xIndex + 1, yIndex + 1, zIndex, x + horizontalRes, y + verticalRes, z); double sample_1_1_1 = sample(xIndex + 1, yIndex + 1, zIndex + 1, x + horizontalRes, y + verticalRes, z + horizontalRes); - double lerp_top_0 = MathUtil.lerp(zFrac, sample_0_1_0, sample_0_1_1); - double lerp_top_1 = MathUtil.lerp(zFrac, sample_1_1_0, sample_1_1_1); + double lerp_top_0 = InterpolationFunctions.lerp(sample_0_1_0, sample_0_1_1, zFrac); + double lerp_top_1 = InterpolationFunctions.lerp(sample_1_1_0, sample_1_1_1, zFrac); - double lerp_top = MathUtil.lerp(xFrac, lerp_top_0, lerp_top_1); + double lerp_top = InterpolationFunctions.lerp(lerp_top_0, lerp_top_1, xFrac); - return MathUtil.lerp(yFrac, lerp_bottom, lerp_top); + return InterpolationFunctions.lerp(lerp_bottom, lerp_top, yFrac); } } 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 90d69461a..f043ffb7b 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 @@ -7,6 +7,8 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.samplers; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; + import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties; import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ChunkInterpolator; import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ElevationInterpolator; @@ -26,7 +28,8 @@ public class Sampler3D { } public double sample(double x, double y, double z) { - return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation((int) Math.round(x), (int) Math.round(z)); + return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation(FloatingPointFunctions.round(x), + FloatingPointFunctions.round(z)); } public double sample(int x, int y, int z) { diff --git a/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java b/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java index e3e9f0c7b..0ec8f3891 100644 --- a/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java +++ b/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.commands.structure; + +import com.dfsek.seismic.type.Rotation; import org.incendo.cloud.CommandManager; import org.incendo.cloud.component.DefaultValue; import org.incendo.cloud.context.CommandContext; @@ -7,7 +9,8 @@ import org.incendo.cloud.description.Description; import org.incendo.cloud.parser.standard.EnumParser; import org.incendo.cloud.parser.standard.LongParser; -import java.util.Random; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; @@ -20,7 +23,6 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.Rotation; import com.dfsek.terra.api.util.reflection.TypeKey; @@ -57,7 +59,11 @@ public class StructureCommandAddon implements AddonInitializer { structure.generate( sender.position().toInt(), sender.world(), - ((Long) context.get("seed") == 0) ? new Random() : new Random(context.get("seed")), + ((Long) context.get("seed") == 0) + ? RandomGeneratorFactory.of("Xoroshiro128PlusPlus") + .create() + : RandomGeneratorFactory.of("Xoroshiro128PlusPlus") + .create(context.get("seed")), context.get("rotation") ); }) diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderBuilder.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderBuilder.java index e2313ecc6..f7fa87b14 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderBuilder.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderBuilder.java @@ -7,11 +7,11 @@ package com.dfsek.terra.addons.biome.holder; -import com.dfsek.terra.api.world.chunk.generation.util.Palette; - import java.util.Map; import java.util.TreeMap; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + public class PaletteHolderBuilder { private final TreeMap paletteMap = new TreeMap<>(); diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/SamplerDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/SamplerDistributorTemplate.java index 8925b92df..4ceb145ed 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/SamplerDistributorTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/SamplerDistributorTemplate.java @@ -7,13 +7,13 @@ package com.dfsek.terra.addons.feature.distributor.config; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.feature.distributor.distributors.SamplerDistributor; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.structure.feature.Distributor; @@ -23,7 +23,7 @@ public class SamplerDistributorTemplate implements ObjectTemplate { @Default private @Meta double threshold = 0; @Value("sampler") - private @Meta NoiseSampler noise; + private @Meta Sampler noise; @Override public Distributor get() { diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PaddedGridDistributor.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PaddedGridDistributor.java index 1779c98d1..48d67b3da 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PaddedGridDistributor.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PaddedGridDistributor.java @@ -1,9 +1,12 @@ package com.dfsek.terra.addons.feature.distributor.distributors; -import java.util.Random; +import com.dfsek.seismic.algorithms.hashing.HashingFunctions; +import com.dfsek.seismic.math.integer.IntegerFunctions; + +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; import com.dfsek.terra.api.structure.feature.Distributor; -import com.dfsek.terra.api.util.MathUtil; public class PaddedGridDistributor implements Distributor { @@ -24,7 +27,8 @@ public class PaddedGridDistributor implements Distributor { int cellX = Math.floorDiv(x, cellWidth); int cellZ = Math.floorDiv(z, cellWidth); - Random random = new Random((MathUtil.murmur64(MathUtil.squash(cellX, cellZ)) ^ seed) + salt); + RandomGenerator random = RandomGeneratorFactory.of("Xoroshiro128PlusPlus").create( + (HashingFunctions.murmur64(IntegerFunctions.squash(cellX, cellZ)) ^ seed) + salt); int pointX = random.nextInt(width) + cellX * cellWidth; int pointZ = random.nextInt(width) + cellZ * cellWidth; diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java index c429cf78e..ae7bdd479 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java @@ -7,11 +7,11 @@ package com.dfsek.terra.addons.feature.distributor.distributors; +import java.util.Set; + import com.dfsek.terra.addons.feature.distributor.util.Point; import com.dfsek.terra.api.structure.feature.Distributor; -import java.util.Set; - public class PointSetDistributor implements Distributor { private final Set points; diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/SamplerDistributor.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/SamplerDistributor.java index 8b4d8e9d7..01ad25b29 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/SamplerDistributor.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/SamplerDistributor.java @@ -7,22 +7,23 @@ package com.dfsek.terra.addons.feature.distributor.distributors; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.seismic.type.sampler.Sampler; + import com.dfsek.terra.api.structure.feature.Distributor; public class SamplerDistributor implements Distributor { - private final NoiseSampler sampler; + private final Sampler sampler; private final double threshold; - public SamplerDistributor(NoiseSampler sampler, double threshold) { + public SamplerDistributor(Sampler sampler, double threshold) { this.sampler = sampler; this.threshold = threshold; } @Override public boolean matches(int x, int z, long seed) { - return sampler.noise(seed, x, z) < threshold; + return sampler.getSample(seed, x, z) < threshold; } } diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/ConfiguredFeature.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/ConfiguredFeature.java index 67d7323db..6ff703652 100644 --- a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/ConfiguredFeature.java +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/ConfiguredFeature.java @@ -7,7 +7,8 @@ package com.dfsek.terra.addons.feature; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.seismic.type.sampler.Sampler; + import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.feature.Distributor; import com.dfsek.terra.api.structure.feature.Feature; @@ -19,13 +20,13 @@ import com.dfsek.terra.api.world.WritableWorld; public class ConfiguredFeature implements Feature { private final ProbabilityCollection structures; - private final NoiseSampler structureSelector; + private final Sampler structureSelector; private final Distributor distributor; private final Locator locator; private final String id; - public ConfiguredFeature(ProbabilityCollection structures, NoiseSampler structureSelector, Distributor distributor, + public ConfiguredFeature(ProbabilityCollection structures, Sampler structureSelector, Distributor distributor, Locator locator, String id) { this.structures = structures; this.structureSelector = structureSelector; diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureTemplate.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureTemplate.java index 9798af4e1..68e125bda 100644 --- a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureTemplate.java +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureTemplate.java @@ -7,12 +7,12 @@ package com.dfsek.terra.addons.feature; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Final; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.terra.api.config.AbstractableTemplate; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.feature.Distributor; import com.dfsek.terra.api.structure.feature.Locator; @@ -31,7 +31,7 @@ public class FeatureTemplate implements AbstractableTemplate { private @Meta Locator locator; @Value("structures.distribution") - private @Meta NoiseSampler structureNoise; + private @Meta Sampler structureNoise; @Value("structures.structures") private @Meta ProbabilityCollection structures; @@ -49,7 +49,7 @@ public class FeatureTemplate implements AbstractableTemplate { return locator; } - public NoiseSampler getStructureNoise() { + public Sampler getStructureNoise() { return structureNoise; } 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 708a8a7f5..6be89444e 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 @@ -7,6 +7,7 @@ package com.dfsek.terra.addons.flora; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Final; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -16,7 +17,6 @@ import java.util.List; import com.dfsek.terra.addons.flora.flora.gen.BlockLayer; import com.dfsek.terra.api.config.AbstractableTemplate; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.MaterialSet; @@ -41,13 +41,13 @@ public class FloraTemplate implements AbstractableTemplate { private @Meta List<@Meta BlockLayer> layers; @Value("layer-distribution") - private @Meta NoiseSampler noiseDistribution; + private @Meta Sampler noiseDistribution; public boolean doPhysics() { return doPhysics; } - public NoiseSampler getNoiseDistribution() { + public Sampler 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 b828b24e6..26c8fbd26 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 @@ -7,19 +7,21 @@ package com.dfsek.terra.addons.flora.flora.gen; +import com.dfsek.seismic.type.Rotation; +import com.dfsek.seismic.type.sampler.Sampler; +import com.dfsek.seismic.type.vector.Vector3Int; + import java.util.ArrayList; import java.util.EnumSet; import java.util.List; -import java.util.Random; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.properties.enums.Direction; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.Rotation; import com.dfsek.terra.api.util.collection.MaterialSet; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.WritableWorld; @@ -30,13 +32,13 @@ public class TerraFlora implements Structure { private final MaterialSet testRotation; - private final NoiseSampler distribution; + private final Sampler distribution; private final String id; public TerraFlora(List layers, boolean physics, boolean ceiling, MaterialSet testRotation, - NoiseSampler distribution, String id) { + Sampler distribution, String id) { this.physics = physics; this.testRotation = testRotation; this.ceiling = ceiling; @@ -71,7 +73,7 @@ public class TerraFlora implements Structure { } @Override - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation) { boolean doRotation = testRotation.size() > 0; int size = layers.size(); int c = ceiling ? -1 : 1; @@ -86,7 +88,9 @@ public class TerraFlora implements Structure { location.getZ(), world.getSeed()); if(doRotation) { Direction oneFace = new ArrayList<>(faces).get( - new Random(location.getX() ^ location.getZ()).nextInt(faces.size())); // Get random face. + RandomGeneratorFactory.of("Xoroshiro128PlusPlus") + .create(location.getX() ^ location.getZ()) + .nextInt(faces.size())); // Get RandomGenerator face. } world.setBlockState(location.mutable().add(0, i + c, 0).immutable(), data, physics); } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/AdjacentPatternLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/AdjacentPatternLocatorTemplate.java index a15e4be6e..ead732fb7 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/AdjacentPatternLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/AdjacentPatternLocatorTemplate.java @@ -15,7 +15,7 @@ import com.dfsek.terra.addons.feature.locator.locators.AdjacentPatternLocator; import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Locator; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; @SuppressWarnings({ "FieldCanBeLocal", "FieldMayBeFinal" }) diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/GaussianRandomLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/GaussianRandomLocatorTemplate.java index 55ebe84ed..fbfe620ff 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/GaussianRandomLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/GaussianRandomLocatorTemplate.java @@ -14,7 +14,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.feature.locator.locators.GaussianRandomLocator; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Locator; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; @SuppressWarnings("FieldMayBeFinal") diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/PatternLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/PatternLocatorTemplate.java index bcb5dfbae..030381c8e 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/PatternLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/PatternLocatorTemplate.java @@ -14,7 +14,7 @@ import com.dfsek.terra.addons.feature.locator.locators.PatternLocator; import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Locator; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; public class PatternLocatorTemplate implements ObjectTemplate { diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/RandomLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/RandomLocatorTemplate.java index 5f51482d4..5c4ef2475 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/RandomLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/RandomLocatorTemplate.java @@ -14,7 +14,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.feature.locator.locators.RandomLocator; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Locator; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; @SuppressWarnings("FieldMayBeFinal") diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/Sampler3DLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/Sampler3DLocatorTemplate.java index c248627a4..1598c969a 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/Sampler3DLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/Sampler3DLocatorTemplate.java @@ -7,18 +7,18 @@ package com.dfsek.terra.addons.feature.locator.config; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.feature.locator.locators.Sampler3DLocator; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.structure.feature.Locator; public class Sampler3DLocatorTemplate implements ObjectTemplate { @Value("sampler") - private @Meta NoiseSampler sampler; + private @Meta Sampler sampler; @Override public Locator get() { diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/SamplerLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/SamplerLocatorTemplate.java index df2fac430..1e4adc33a 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/SamplerLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/SamplerLocatorTemplate.java @@ -7,6 +7,7 @@ package com.dfsek.terra.addons.feature.locator.config; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; @@ -14,13 +15,12 @@ import java.util.List; import com.dfsek.terra.addons.feature.locator.locators.SamplerLocator; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.structure.feature.Locator; public class SamplerLocatorTemplate implements ObjectTemplate { @Value("samplers") - private @Meta List<@Meta NoiseSampler> samplers; + private @Meta List<@Meta Sampler> samplers; @Override public Locator get() { 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 index a77829587..a433abd21 100644 --- 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 @@ -13,7 +13,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.feature.locator.locators.SurfaceLocator; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Locator; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; public class SurfaceLocatorTemplate implements ObjectTemplate { diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/TopLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/TopLocatorTemplate.java index 67fd28464..437e3e04b 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/TopLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/TopLocatorTemplate.java @@ -13,7 +13,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.feature.locator.locators.TopLocator; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Locator; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; public class TopLocatorTemplate implements ObjectTemplate { diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AirMatchPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AirMatchPatternTemplate.java index c977a8d81..673d28ce1 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AirMatchPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AirMatchPatternTemplate.java @@ -14,7 +14,7 @@ import com.dfsek.terra.addons.feature.locator.patterns.MatchPattern; import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; public class AirMatchPatternTemplate implements ObjectTemplate { diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java index 08a1a7c17..08116ae0c 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java @@ -13,8 +13,8 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.feature.locator.patterns.MatchPattern; import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.MaterialSet; +import com.dfsek.terra.api.util.range.Range; public class BlockSetMatchPatternTemplate implements ObjectTemplate { diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SingleBlockMatchPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SingleBlockMatchPatternTemplate.java index 607abfd72..645002790 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SingleBlockMatchPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SingleBlockMatchPatternTemplate.java @@ -14,7 +14,7 @@ import com.dfsek.terra.addons.feature.locator.patterns.MatchPattern; import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; public class SingleBlockMatchPatternTemplate implements ObjectTemplate { diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SolidMatchPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SolidMatchPatternTemplate.java index 6fc7b535d..ba5cb76b1 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SolidMatchPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SolidMatchPatternTemplate.java @@ -12,7 +12,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.feature.locator.patterns.MatchPattern; import com.dfsek.terra.addons.feature.locator.patterns.Pattern; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; public class SolidMatchPatternTemplate implements ObjectTemplate { diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/AdjacentPatternLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/AdjacentPatternLocator.java index 7be0d29aa..f8ff3bb72 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/AdjacentPatternLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/AdjacentPatternLocator.java @@ -10,7 +10,7 @@ package com.dfsek.terra.addons.feature.locator.locators; import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.structure.feature.BinaryColumn; import com.dfsek.terra.api.structure.feature.Locator; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.api.world.WritableWorld; import com.dfsek.terra.api.world.chunk.generation.util.Column; diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/GaussianRandomLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/GaussianRandomLocator.java index d13c80ee0..426adadd9 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/GaussianRandomLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/GaussianRandomLocator.java @@ -7,11 +7,12 @@ package com.dfsek.terra.addons.feature.locator.locators; -import java.util.Random; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; import com.dfsek.terra.api.structure.feature.BinaryColumn; import com.dfsek.terra.api.structure.feature.Locator; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.api.world.chunk.generation.util.Column; import com.dfsek.terra.api.world.chunk.generation.util.Column.BinaryColumnBuilder; @@ -40,7 +41,7 @@ public class GaussianRandomLocator implements Locator { seed = 31 * seed + column.getZ(); seed += salt; - Random r = new Random(seed); + RandomGenerator r = RandomGeneratorFactory.of("Xoroshiro128PlusPlus").create(seed); int size = points.get(r); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/PatternLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/PatternLocator.java index 4a5c9720b..4098bc992 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/PatternLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/PatternLocator.java @@ -10,7 +10,7 @@ package com.dfsek.terra.addons.feature.locator.locators; import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.structure.feature.BinaryColumn; import com.dfsek.terra.api.structure.feature.Locator; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.api.world.chunk.generation.util.Column; diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/RandomLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/RandomLocator.java index d5b008bfe..34d5124b7 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/RandomLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/RandomLocator.java @@ -7,11 +7,12 @@ package com.dfsek.terra.addons.feature.locator.locators; -import java.util.Random; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; import com.dfsek.terra.api.structure.feature.BinaryColumn; import com.dfsek.terra.api.structure.feature.Locator; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.api.world.chunk.generation.util.Column; import com.dfsek.terra.api.world.chunk.generation.util.Column.BinaryColumnBuilder; @@ -36,7 +37,7 @@ public class RandomLocator implements Locator { seed = 31 * seed + column.getZ(); seed += salt; - Random r = new Random(seed); + RandomGenerator r = RandomGeneratorFactory.of("Xoroshiro128PlusPlus").create(seed); int size = points.get(r); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/Sampler3DLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/Sampler3DLocator.java index c41f65b1a..baa4f9f81 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/Sampler3DLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/Sampler3DLocator.java @@ -7,16 +7,17 @@ package com.dfsek.terra.addons.feature.locator.locators; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.seismic.type.sampler.Sampler; + import com.dfsek.terra.api.structure.feature.BinaryColumn; import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.world.chunk.generation.util.Column; public class Sampler3DLocator implements Locator { - private final NoiseSampler sampler; + private final Sampler sampler; - public Sampler3DLocator(NoiseSampler sampler) { + public Sampler3DLocator(Sampler sampler) { this.sampler = sampler; } @@ -25,6 +26,6 @@ public class Sampler3DLocator implements Locator { long seed = column.getWorld().getSeed(); int x = column.getX(); int z = column.getZ(); - return column.newBinaryColumn(y -> sampler.noise(seed, x, y, z) > 0); + return column.newBinaryColumn(y -> sampler.getSample(seed, x, y, z) > 0); } } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SamplerLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SamplerLocator.java index 8eea6d75b..5508c4e99 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SamplerLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SamplerLocator.java @@ -7,9 +7,10 @@ package com.dfsek.terra.addons.feature.locator.locators; +import com.dfsek.seismic.type.sampler.Sampler; + import java.util.List; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.structure.feature.BinaryColumn; import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.world.chunk.generation.util.Column; @@ -17,9 +18,9 @@ import com.dfsek.terra.api.world.chunk.generation.util.Column.BinaryColumnBuilde public class SamplerLocator implements Locator { - private final List samplers; + private final List samplers; - public SamplerLocator(List samplers) { + public SamplerLocator(List samplers) { this.samplers = samplers; } @@ -42,7 +43,7 @@ public class SamplerLocator implements Locator { long seed = column.getWorld().getSeed(); samplers.forEach(sampler -> { - int y = floorToInt(sampler.noise(seed, column.getX(), column.getZ())); + int y = floorToInt(sampler.getSample(seed, column.getX(), column.getZ())); if(y >= column.getMaxY() || y < column.getMinY()) return; results.set(y); }); 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 index 3f2f9e654..4eafba82c 100644 --- 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 @@ -9,7 +9,7 @@ package com.dfsek.terra.addons.feature.locator.locators; import com.dfsek.terra.api.structure.feature.BinaryColumn; import com.dfsek.terra.api.structure.feature.Locator; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.api.world.chunk.generation.util.Column; import com.dfsek.terra.api.world.chunk.generation.util.Column.BinaryColumnBuilder; diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/TopLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/TopLocator.java index bdf9ea4d2..ec8890fda 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/TopLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/TopLocator.java @@ -9,7 +9,7 @@ package com.dfsek.terra.addons.feature.locator.locators; import com.dfsek.terra.api.structure.feature.BinaryColumn; import com.dfsek.terra.api.structure.feature.Locator; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.api.world.chunk.generation.util.Column; diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java index 6774b5b63..f64733b36 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java @@ -10,7 +10,7 @@ package com.dfsek.terra.addons.feature.locator.patterns; import java.util.function.Predicate; import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.api.world.WritableWorld; import com.dfsek.terra.api.world.chunk.generation.util.Column; 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 2be951055..0a3aeb102 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 @@ -8,6 +8,26 @@ package com.dfsek.terra.addons.noise; import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; +import com.dfsek.seismic.algorithms.sampler.arithmetic.AdditionSampler; +import com.dfsek.seismic.algorithms.sampler.arithmetic.DivisionSampler; +import com.dfsek.seismic.algorithms.sampler.arithmetic.MaxSampler; +import com.dfsek.seismic.algorithms.sampler.arithmetic.MinSampler; +import com.dfsek.seismic.algorithms.sampler.arithmetic.MultiplicationSampler; +import com.dfsek.seismic.algorithms.sampler.arithmetic.SubtractionSampler; +import com.dfsek.seismic.algorithms.sampler.noise.cellular.CellularStyleSampler; +import com.dfsek.seismic.algorithms.sampler.noise.random.GaussianNoiseSampler; +import com.dfsek.seismic.algorithms.sampler.noise.random.PositiveWhiteNoiseSampler; +import com.dfsek.seismic.algorithms.sampler.noise.random.WhiteNoiseSampler; +import com.dfsek.seismic.algorithms.sampler.noise.simplex.OpenSimplex2SSampler; +import com.dfsek.seismic.algorithms.sampler.noise.simplex.OpenSimplex2Sampler; +import com.dfsek.seismic.algorithms.sampler.noise.simplex.PerlinSampler; +import com.dfsek.seismic.algorithms.sampler.noise.simplex.SimplexSampler; +import com.dfsek.seismic.algorithms.sampler.noise.value.ValueCubicSampler; +import com.dfsek.seismic.algorithms.sampler.noise.value.ValueSampler; +import com.dfsek.seismic.type.CubicSpline; +import com.dfsek.seismic.type.DistanceFunction; +import com.dfsek.seismic.type.sampler.DerivativeSampler; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.LinkedHashMap; @@ -16,13 +36,12 @@ import java.util.function.Supplier; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.noise.config.CubicSplinePointTemplate; -import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; +import com.dfsek.terra.addons.noise.config.DimensionApplicableSampler; import com.dfsek.terra.addons.noise.config.templates.BinaryArithmeticTemplate; import com.dfsek.terra.addons.noise.config.templates.CacheSamplerTemplate; -import com.dfsek.terra.addons.noise.config.templates.DerivativeNoiseSamplerTemplate; +import com.dfsek.terra.addons.noise.config.templates.DerivativeSamplerTemplate; import com.dfsek.terra.addons.noise.config.templates.DomainWarpTemplate; import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; -import com.dfsek.terra.addons.noise.config.templates.ImageSamplerTemplate; import com.dfsek.terra.addons.noise.config.templates.KernelTemplate; import com.dfsek.terra.addons.noise.config.templates.LinearHeightmapSamplerTemplate; import com.dfsek.terra.addons.noise.config.templates.TranslateSamplerTemplate; @@ -45,37 +64,17 @@ import com.dfsek.terra.addons.noise.config.templates.normalizer.NormalNormalizer import com.dfsek.terra.addons.noise.config.templates.normalizer.PosterizationNormalizerTemplate; import com.dfsek.terra.addons.noise.config.templates.normalizer.ProbabilityNormalizerTemplate; import com.dfsek.terra.addons.noise.config.templates.normalizer.ScaleNormalizerTemplate; -import com.dfsek.terra.addons.noise.math.CubicSpline; -import com.dfsek.terra.addons.noise.samplers.arithmetic.AdditionSampler; -import com.dfsek.terra.addons.noise.samplers.arithmetic.DivisionSampler; -import com.dfsek.terra.addons.noise.samplers.arithmetic.MaxSampler; -import com.dfsek.terra.addons.noise.samplers.arithmetic.MinSampler; -import com.dfsek.terra.addons.noise.samplers.arithmetic.MultiplicationSampler; -import com.dfsek.terra.addons.noise.samplers.arithmetic.SubtractionSampler; -import com.dfsek.terra.addons.noise.samplers.noise.CellularSampler; -import com.dfsek.terra.addons.noise.samplers.noise.DistanceSampler; -import com.dfsek.terra.addons.noise.samplers.noise.random.GaussianNoiseSampler; -import com.dfsek.terra.addons.noise.samplers.noise.random.PositiveWhiteNoiseSampler; -import com.dfsek.terra.addons.noise.samplers.noise.random.WhiteNoiseSampler; -import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2SSampler; -import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler; -import com.dfsek.terra.addons.noise.samplers.noise.simplex.PerlinSampler; -import com.dfsek.terra.addons.noise.samplers.noise.simplex.SimplexSampler; -import com.dfsek.terra.addons.noise.samplers.noise.value.ValueCubicSampler; -import com.dfsek.terra.addons.noise.samplers.noise.value.ValueSampler; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.inject.annotations.Inject; -import com.dfsek.terra.api.noise.DerivativeNoiseSampler; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; public class NoiseAddon implements AddonInitializer { - public static final TypeKey>> NOISE_SAMPLER_TOKEN = new TypeKey<>() { + public static final TypeKey>> NOISE_SAMPLER_TOKEN = new TypeKey<>() { }; @Inject private Platform plugin; @@ -91,19 +90,19 @@ public class NoiseAddon implements AddonInitializer { .then(event -> { ParseOptions expressionParseOptions = event.getPack().getExpressionParseOptions(); - CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry( + CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry( NOISE_SAMPLER_TOKEN); event.getPack() - .applyLoader(CellularSampler.DistanceFunction.class, - (type, o, loader, depthTracker) -> CellularSampler.DistanceFunction.valueOf((String) o)) - .applyLoader(CellularSampler.ReturnType.class, - (type, o, loader, depthTracker) -> CellularSampler.ReturnType.valueOf((String) o)) - .applyLoader(DistanceSampler.DistanceFunction.class, - (type, o, loader, depthTracker) -> DistanceSampler.DistanceFunction.valueOf((String) o)) - .applyLoader(DimensionApplicableNoiseSampler.class, DimensionApplicableNoiseSampler::new) + .applyLoader(DistanceFunction.class, + (type, o, loader, depthTracker) -> DistanceFunction.valueOf((String) o)) + .applyLoader(CellularStyleSampler.CellularReturnType.class, + (type, o, loader, depthTracker) -> CellularStyleSampler.CellularReturnType.valueOf((String) o)) + .applyLoader(DistanceFunction.class, + (type, o, loader, depthTracker) -> DistanceFunction.valueOf((String) o)) + .applyLoader(DimensionApplicableSampler.class, DimensionApplicableSampler::new) .applyLoader(FunctionTemplate.class, () -> new FunctionTemplate(expressionParseOptions)) .applyLoader(CubicSpline.Point.class, CubicSplinePointTemplate::new) - .applyLoader(DerivativeNoiseSampler.class, DerivativeNoiseSamplerTemplate::new); + .applyLoader(DerivativeSampler.class, DerivativeSamplerTemplate::new); noiseRegistry.register(addon.key("LINEAR"), LinearNormalizerTemplate::new); noiseRegistry.register(addon.key("LINEAR_MAP"), LinearMapNormalizerTemplate::new); @@ -114,29 +113,27 @@ public class NoiseAddon implements AddonInitializer { noiseRegistry.register(addon.key("POSTERIZATION"), PosterizationNormalizerTemplate::new); noiseRegistry.register(addon.key("CUBIC_SPLINE"), CubicSplineNormalizerTemplate::new); - noiseRegistry.register(addon.key("IMAGE"), ImageSamplerTemplate::new); - noiseRegistry.register(addon.key("DOMAIN_WARP"), DomainWarpTemplate::new); noiseRegistry.register(addon.key("FBM"), BrownianMotionTemplate::new); noiseRegistry.register(addon.key("PING_PONG"), PingPongTemplate::new); noiseRegistry.register(addon.key("RIDGED"), RidgedFractalTemplate::new); - noiseRegistry.register(addon.key("OPEN_SIMPLEX_2"), () -> new SimpleNoiseTemplate(OpenSimplex2Sampler::new)); - noiseRegistry.register(addon.key("OPEN_SIMPLEX_2S"), () -> new SimpleNoiseTemplate(OpenSimplex2SSampler::new)); - noiseRegistry.register(addon.key("PERLIN"), () -> new SimpleNoiseTemplate(PerlinSampler::new)); - noiseRegistry.register(addon.key("SIMPLEX"), () -> new SimpleNoiseTemplate(SimplexSampler::new)); + noiseRegistry.register(addon.key("OPEN_SIMPLEX_2"), () -> new SimpleNoiseTemplate<>(OpenSimplex2Sampler.class)); + noiseRegistry.register(addon.key("OPEN_SIMPLEX_2S"), () -> new SimpleNoiseTemplate<>(OpenSimplex2SSampler.class)); + noiseRegistry.register(addon.key("PERLIN"), () -> new SimpleNoiseTemplate<>(PerlinSampler.class)); + noiseRegistry.register(addon.key("SIMPLEX"), () -> new SimpleNoiseTemplate<>(SimplexSampler.class)); noiseRegistry.register(addon.key("GABOR"), GaborNoiseTemplate::new); noiseRegistry.register(addon.key("PSEUDOEROSION"), PseudoErosionTemplate::new); - noiseRegistry.register(addon.key("VALUE"), () -> new SimpleNoiseTemplate(ValueSampler::new)); - noiseRegistry.register(addon.key("VALUE_CUBIC"), () -> new SimpleNoiseTemplate(ValueCubicSampler::new)); + noiseRegistry.register(addon.key("VALUE"), () -> new SimpleNoiseTemplate<>(ValueSampler.class)); + noiseRegistry.register(addon.key("VALUE_CUBIC"), () -> new SimpleNoiseTemplate<>(ValueCubicSampler.class)); noiseRegistry.register(addon.key("CELLULAR"), CellularNoiseTemplate::new); - noiseRegistry.register(addon.key("WHITE_NOISE"), () -> new SimpleNoiseTemplate(WhiteNoiseSampler::new)); - noiseRegistry.register(addon.key("POSITIVE_WHITE_NOISE"), () -> new SimpleNoiseTemplate(PositiveWhiteNoiseSampler::new)); - noiseRegistry.register(addon.key("GAUSSIAN"), () -> new SimpleNoiseTemplate(GaussianNoiseSampler::new)); + noiseRegistry.register(addon.key("WHITE_NOISE"), () -> new SimpleNoiseTemplate<>(WhiteNoiseSampler.class)); + noiseRegistry.register(addon.key("POSITIVE_WHITE_NOISE"), () -> new SimpleNoiseTemplate<>(PositiveWhiteNoiseSampler.class)); + noiseRegistry.register(addon.key("GAUSSIAN"), () -> new SimpleNoiseTemplate<>(GaussianNoiseSampler.class)); noiseRegistry.register(addon.key("DISTANCE"), DistanceSamplerTemplate::new); @@ -157,9 +154,10 @@ public class NoiseAddon implements AddonInitializer { noiseRegistry.register(addon.key("CACHE"), CacheSamplerTemplate::new); - Map packSamplers = new LinkedHashMap<>(); + Map packSamplers = new LinkedHashMap<>(); Map packFunctions = new LinkedHashMap<>(); - noiseRegistry.register(addon.key("EXPRESSION"), () -> new ExpressionFunctionTemplate(packSamplers, packFunctions, expressionParseOptions)); + noiseRegistry.register(addon.key("EXPRESSION"), + () -> new ExpressionFunctionTemplate(packSamplers, packFunctions, expressionParseOptions)); noiseRegistry.register(addon.key("EXPRESSION_NORMALIZER"), () -> new ExpressionNormalizerTemplate(packSamplers, packFunctions, expressionParseOptions)); 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 e4f8c11e8..15c23fd0d 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 @@ -11,26 +11,26 @@ import com.dfsek.tectonic.api.config.template.ConfigTemplate; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dfsek.terra.addons.noise.config.DimensionApplicableSampler; import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.properties.Properties; -import java.util.LinkedHashMap; -import java.util.Map; - @SuppressWarnings("FieldMayBeFinal") public class NoiseConfigPackTemplate implements ConfigTemplate, Properties { @Value("samplers") @Default - private @Meta Map noiseBuilderMap = new LinkedHashMap<>(); + private @Meta Map noiseBuilderMap = new LinkedHashMap<>(); @Value("functions") @Default private @Meta LinkedHashMap expressions = new LinkedHashMap<>(); - public Map getSamplers() { + public Map getSamplers() { return noiseBuilderMap; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/CubicSplinePointTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/CubicSplinePointTemplate.java index 1a0c7c35a..34c598f6b 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/CubicSplinePointTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/CubicSplinePointTemplate.java @@ -1,9 +1,9 @@ package com.dfsek.terra.addons.noise.config; +import com.dfsek.seismic.type.CubicSpline.Point; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import com.dfsek.terra.addons.noise.math.CubicSpline.Point; import com.dfsek.terra.api.config.meta.Meta; 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/DimensionApplicableSampler.java similarity index 70% rename from common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/DimensionApplicableNoiseSampler.java rename to common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/DimensionApplicableSampler.java index 1179c622e..6a3a1d39e 100644 --- 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/DimensionApplicableSampler.java @@ -7,22 +7,22 @@ package com.dfsek.terra.addons.noise.config; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; -public class DimensionApplicableNoiseSampler implements ObjectTemplate { +public class DimensionApplicableSampler implements ObjectTemplate { @Value("dimensions") private @Meta int dimensions; @Value(".") - private @Meta NoiseSampler sampler; + private @Meta Sampler sampler; @Override - public DimensionApplicableNoiseSampler get() { + public DimensionApplicableSampler get() { return this; } @@ -30,7 +30,7 @@ public class DimensionApplicableNoiseSampler implements ObjectTemplate>> cache2D; private final ThreadLocal>> cache3D; - public CacheSampler(NoiseSampler sampler, int dimensions) { + public CacheSampler(Sampler sampler, int dimensions) { this.sampler = sampler; - if (dimensions == 2) { + if(dimensions == 2) { this.cache2D = ThreadLocal.withInitial(() -> { LoadingCache cache = Caffeine .newBuilder() @@ -54,16 +52,16 @@ public class CacheSampler implements NoiseSampler { private Double sampleNoise(DoubleSeededVector2Key vec) { this.cache2D.get().setLeft(new DoubleSeededVector2Key(0, 0, 0)); - return this.sampler.noise(vec.seed, vec.x, vec.z); + return this.sampler.getSample(vec.seed, vec.x, vec.z); } private Double sampleNoise(DoubleSeededVector3Key vec) { this.cache3D.get().setLeft(new DoubleSeededVector3Key(0, 0, 0, 0)); - return this.sampler.noise(vec.seed, vec.x, vec.y, vec.z); + return this.sampler.getSample(vec.seed, vec.x, vec.y, vec.z); } @Override - public double noise(long seed, double x, double y) { + public double getSample(long seed, double x, double y) { Mutable> cachePair = cache2D.get(); DoubleSeededVector2Key mutableKey = cachePair.getLeft(); mutableKey.set(x, y, seed); @@ -71,7 +69,7 @@ public class CacheSampler implements NoiseSampler { } @Override - public double noise(long seed, double x, double y, double z) { + public double getSample(long seed, double x, double y, double z) { Mutable> cachePair = cache3D.get(); DoubleSeededVector3Key mutableKey = cachePair.getLeft(); mutableKey.set(x, y, z, seed); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/BinaryArithmeticTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/BinaryArithmeticTemplate.java index 67427c189..c7fd71d01 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/BinaryArithmeticTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/BinaryArithmeticTemplate.java @@ -1,22 +1,22 @@ package com.dfsek.terra.addons.noise.config.templates; +import com.dfsek.seismic.algorithms.sampler.arithmetic.BinaryArithmeticSampler; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Value; import java.util.function.BiFunction; -import com.dfsek.terra.addons.noise.samplers.arithmetic.BinaryArithmeticSampler; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; public class BinaryArithmeticTemplate extends SamplerTemplate { - private final BiFunction function; + private final BiFunction function; @Value("left") - private @Meta NoiseSampler left; + private @Meta Sampler left; @Value("right") - private @Meta NoiseSampler right; + private @Meta Sampler right; - public BinaryArithmeticTemplate(BiFunction function) { + public BinaryArithmeticTemplate(BiFunction function) { this.function = function; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/CacheSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/CacheSamplerTemplate.java index ba6f73bce..f94af9484 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/CacheSamplerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/CacheSamplerTemplate.java @@ -1,27 +1,25 @@ package com.dfsek.terra.addons.noise.config.templates; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; - -import com.dfsek.terra.addons.noise.samplers.CacheSampler; -import com.dfsek.terra.addons.noise.samplers.LinearHeightmapSampler; -import com.dfsek.terra.api.noise.NoiseSampler; - import org.jetbrains.annotations.ApiStatus.Experimental; +import com.dfsek.terra.addons.noise.config.sampler.CacheSampler; + @Experimental public class CacheSamplerTemplate extends SamplerTemplate { @Value("sampler") @Default - private NoiseSampler sampler; + private Sampler sampler; public CacheSamplerTemplate() { } @Override - public NoiseSampler get() { + public Sampler get() { return new CacheSampler(sampler, getDimensions()); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java deleted file mode 100644 index 9e66b23ea..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dfsek.terra.addons.noise.config.templates; - -import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.tectonic.api.exception.ValidationException; - -import com.dfsek.terra.api.noise.DerivativeNoiseSampler; -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class DerivativeNoiseSamplerTemplate extends SamplerTemplate { - - @Value(".") - private NoiseSampler sampler; - - @Override - public boolean validate() throws ValidationException { - if(!DerivativeNoiseSampler.isDifferentiable(sampler)) throw new ValidationException( - "Provided sampler does not support calculating a derivative"); - return super.validate(); - } - - @Override - public DerivativeNoiseSampler get() { - return (DerivativeNoiseSampler) sampler; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeSamplerTemplate.java new file mode 100644 index 000000000..c3367de8e --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeSamplerTemplate.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.addons.noise.config.templates; + +import com.dfsek.seismic.type.sampler.DerivativeSampler; +import com.dfsek.seismic.type.sampler.Sampler; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.exception.ValidationException; + + +public class DerivativeSamplerTemplate extends SamplerTemplate { + + @Value(".") + private Sampler sampler; + + @Override + public boolean validate() throws ValidationException { + if(!DerivativeSampler.isDifferentiable(sampler)) throw new ValidationException( + "Provided sampler does not support calculating a derivative"); + return super.validate(); + } + + @Override + public DerivativeSampler get() { + return (DerivativeSampler) sampler; + } +} 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 4330a7814..067a928a9 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 @@ -7,28 +7,28 @@ package com.dfsek.terra.addons.noise.config.templates; +import com.dfsek.seismic.algorithms.sampler.DomainWarpedSampler; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.samplers.DomainWarpedSampler; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; @SuppressWarnings({ "unused", "FieldMayBeFinal" }) public class DomainWarpTemplate extends SamplerTemplate { @Value("warp") - private @Meta NoiseSampler warp; + private @Meta Sampler warp; @Value("sampler") - private @Meta NoiseSampler function; + private @Meta Sampler function; @Value("amplitude") @Default private @Meta double amplitude = 1; @Override - public NoiseSampler get() { + public Sampler 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 deleted file mode 100644 index 953aaffd7..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.config.templates; - -import com.dfsek.tectonic.api.config.template.annotations.Value; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.awt.image.BufferedImage; - -import com.dfsek.terra.addons.noise.samplers.ImageSampler; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; - - -@SuppressWarnings({ "unused", "FieldMayBeFinal" }) -public class ImageSamplerTemplate extends SamplerTemplate { - - private static final Logger logger = LoggerFactory.getLogger(ImageSamplerTemplate.class); - - private static boolean used = false; - - @Value("image") - private @Meta BufferedImage image; - - @Value("frequency") - private @Meta double frequency; - - @Value("channel") - private ImageSampler.@Meta Channel channel; - - @Override - public NoiseSampler get() { - if(!used) { - logger.warn("The IMAGE NoiseSampler implemented by the config-noise-function addon is deprecated. " + - "It is recommended to use the IMAGE NoiseSampler implemented by the config-noise-image " + - "addon instead."); - used = true; - } - 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 2c2f9e336..75ad7edbe 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 @@ -7,15 +7,15 @@ package com.dfsek.terra.addons.noise.config.templates; +import com.dfsek.seismic.algorithms.sampler.KernelSampler; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.exception.ValidationException; import java.util.List; -import com.dfsek.terra.addons.noise.samplers.KernelSampler; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; @SuppressWarnings({ "unused", "FieldMayBeFinal" }) @@ -29,14 +29,14 @@ public class KernelTemplate extends SamplerTemplate { private @Meta double factor = 1; @Value("sampler") - private @Meta NoiseSampler function; + private @Meta Sampler function; @Value("frequency") @Default private @Meta double frequency = 1; @Override - public NoiseSampler get() { + public Sampler get() { double[][] k = new double[kernel.size()][kernel.get(0).size()]; for(int x = 0; x < kernel.size(); x++) { @@ -45,8 +45,7 @@ public class KernelTemplate extends SamplerTemplate { } } - KernelSampler sampler = new KernelSampler(k, function); - sampler.setFrequency(frequency); + KernelSampler sampler = new KernelSampler(frequency, k, function); return sampler; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/LinearHeightmapSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/LinearHeightmapSamplerTemplate.java index 0ee38f28d..8bc0f057e 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/LinearHeightmapSamplerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/LinearHeightmapSamplerTemplate.java @@ -1,18 +1,18 @@ package com.dfsek.terra.addons.noise.config.templates; +import com.dfsek.seismic.algorithms.sampler.LinearHeightmapSampler; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.samplers.LinearHeightmapSampler; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; @SuppressWarnings("FieldMayBeFinal") public class LinearHeightmapSamplerTemplate extends SamplerTemplate { @Value("sampler") @Default - private @Meta NoiseSampler sampler = NoiseSampler.zero(); + private @Meta Sampler sampler = Sampler.zero(); @Value("base") private @Meta double base; @@ -22,7 +22,7 @@ public class LinearHeightmapSamplerTemplate extends SamplerTemplate implements ValidatedConfigTemplate, ObjectTemplate { +public abstract class SamplerTemplate implements ValidatedConfigTemplate, ObjectTemplate { @Value("dimensions") @Default private @Meta int dimensions = 2; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/TranslateSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/TranslateSamplerTemplate.java index a37d125d0..6d4a448db 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/TranslateSamplerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/TranslateSamplerTemplate.java @@ -1,17 +1,17 @@ package com.dfsek.terra.addons.noise.config.templates; +import com.dfsek.seismic.algorithms.sampler.TranslateSampler; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.samplers.TranslateSampler; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; public class TranslateSamplerTemplate extends SamplerTemplate { @Value("sampler") - private NoiseSampler sampler; + private Sampler sampler; @Value("x") @Default @@ -26,7 +26,7 @@ public class TranslateSamplerTemplate extends SamplerTemplate private @Meta double z = 0; @Override - public NoiseSampler get() { + public Sampler get() { return new TranslateSampler(sampler, x, y, z); } } 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 4716318a8..308e4481d 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 @@ -7,48 +7,43 @@ package com.dfsek.terra.addons.noise.config.templates.noise; +import com.dfsek.seismic.algorithms.sampler.noise.cellular.CellularSampler; +import com.dfsek.seismic.algorithms.sampler.noise.cellular.CellularStyleSampler; +import com.dfsek.seismic.algorithms.sampler.noise.simplex.OpenSimplex2Sampler; +import com.dfsek.seismic.type.DistanceFunction; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.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.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; @SuppressWarnings("FieldMayBeFinal") public class CellularNoiseTemplate extends NoiseTemplate { @Value("distance") @Default - private CellularSampler.@Meta DistanceFunction cellularDistanceFunction = CellularSampler.DistanceFunction.EuclideanSq; + private @Meta DistanceFunction cellularDistanceFunction = DistanceFunction.EuclideanSq; @Value("return") @Default - private CellularSampler.@Meta ReturnType cellularReturnType = CellularSampler.ReturnType.Distance; + private CellularStyleSampler.@Meta CellularReturnType cellularReturnType = CellularStyleSampler.CellularReturnType.Distance; @Value("jitter") @Default private @Meta double cellularJitter = 1.0D; - @Value("lookup") @Default - private @Meta NoiseSampler lookup = new OpenSimplex2Sampler(); - + private @Meta Sampler lookup = new OpenSimplex2Sampler(0.02d, 0); + @Value("salt-lookup") @Default private @Meta boolean saltLookup = true; - + @Override - public NoiseSampler get() { - CellularSampler sampler = new CellularSampler(); - sampler.setNoiseLookup(lookup); - sampler.setFrequency(frequency); - sampler.setJitterModifier(cellularJitter); - sampler.setReturnType(cellularReturnType); - sampler.setDistanceFunction(cellularDistanceFunction); - sampler.setSalt(salt); - sampler.setSaltLookup(saltLookup); + public Sampler get() { + CellularSampler sampler = new CellularSampler(frequency, salt, lookup, cellularDistanceFunction, cellularReturnType, cellularJitter, + saltLookup); return sampler; } } 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 9068ad4e9..de23bca7c 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 @@ -7,13 +7,13 @@ package com.dfsek.terra.addons.noise.config.templates.noise; +import com.dfsek.seismic.algorithms.sampler.noise.ConstantSampler; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; -import com.dfsek.terra.addons.noise.samplers.noise.ConstantSampler; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; @SuppressWarnings("FieldMayBeFinal") @@ -23,7 +23,7 @@ public class ConstantNoiseTemplate extends SamplerTemplate { private @Meta double value = 0d; @Override - public NoiseSampler get() { + public Sampler get() { return new ConstantSampler(value); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeNoiseTemplate.java deleted file mode 100644 index c9100e344..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeNoiseTemplate.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.addons.noise.config.templates.noise; - -import com.dfsek.terra.addons.noise.samplers.noise.DerivativeNoiseFunction; - - -public abstract class DerivativeNoiseTemplate extends NoiseTemplate { - -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DistanceSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DistanceSamplerTemplate.java index f39405cf4..2e1f0a12a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DistanceSamplerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DistanceSamplerTemplate.java @@ -1,19 +1,18 @@ package com.dfsek.terra.addons.noise.config.templates.noise; +import com.dfsek.seismic.algorithms.sampler.noise.DistanceSampler; +import com.dfsek.seismic.type.DistanceFunction; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; -import com.dfsek.terra.addons.noise.samplers.noise.DistanceSampler; -import com.dfsek.terra.addons.noise.samplers.noise.DistanceSampler.DistanceFunction; import com.dfsek.terra.api.config.meta.Meta; -public class DistanceSamplerTemplate extends SamplerTemplate { +public class DistanceSamplerTemplate extends NoiseTemplate { @Value("distance-function") @Default - private DistanceSampler.@Meta DistanceFunction distanceFunction = DistanceFunction.Euclidean; + private @Meta DistanceFunction distanceFunction = DistanceFunction.Euclidean; @Value("point.x") @Default @@ -37,6 +36,6 @@ public class DistanceSamplerTemplate extends SamplerTemplate { @Override public DistanceSampler get() { - return new DistanceSampler(distanceFunction, x, y, z, normalize, normalizeRadius); + return new DistanceSampler(salt, distanceFunction, x, y, z, normalize, normalizeRadius); } } 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 a6e0bf9a9..c20db2d54 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 @@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.config.templates.noise; import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; import com.dfsek.paralithic.eval.tokenizer.ParseException; +import com.dfsek.paralithic.sampler.noise.ExpressionNoiseFunction; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -16,19 +18,17 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; +import com.dfsek.terra.addons.noise.config.DimensionApplicableSampler; import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; -import com.dfsek.terra.addons.noise.samplers.noise.ExpressionFunction; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; import static com.dfsek.terra.addons.noise.paralithic.FunctionUtil.convertFunctionsAndSamplers; @SuppressWarnings({ "FieldMayBeFinal", "unused" }) -public class ExpressionFunctionTemplate extends SamplerTemplate { - private final Map globalSamplers; +public class ExpressionFunctionTemplate extends SamplerTemplate { + private final Map globalSamplers; private final Map globalFunctions; private final ParseOptions parseOptions; @Value("variables") @@ -38,12 +38,12 @@ public class ExpressionFunctionTemplate extends SamplerTemplate samplers = new LinkedHashMap<>(); + private @Meta LinkedHashMap samplers = new LinkedHashMap<>(); @Value("functions") @Default private @Meta LinkedHashMap functions = new LinkedHashMap<>(); - public ExpressionFunctionTemplate(Map globalSamplers, + public ExpressionFunctionTemplate(Map globalSamplers, Map globalFunctions, ParseOptions parseOptions) { this.globalSamplers = globalSamplers; @@ -52,13 +52,14 @@ public class ExpressionFunctionTemplate extends SamplerTemplate(globalFunctions); mergedFunctions.putAll(functions); var mergedSamplers = new HashMap<>(globalSamplers); mergedSamplers.putAll(samplers); try { - return new ExpressionFunction(convertFunctionsAndSamplers(mergedFunctions, mergedSamplers), expression, vars, parseOptions); + return new ExpressionNoiseFunction(convertFunctionsAndSamplers(mergedFunctions, mergedSamplers), expression, vars, + parseOptions); } catch(ParseException e) { throw new RuntimeException("Failed to parse expression.", e); } 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 597cdd668..e8bda1c5f 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 @@ -7,16 +7,16 @@ package com.dfsek.terra.addons.noise.config.templates.noise; +import com.dfsek.seismic.algorithms.sampler.noise.GaborSampler; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.samplers.noise.GaborNoiseSampler; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; @SuppressWarnings("FieldMayBeFinal") -public class GaborNoiseTemplate extends NoiseTemplate { +public class GaborNoiseTemplate extends NoiseTemplate { @Value("rotation") @Default private @Meta double rotation = 0.25; @@ -37,16 +37,13 @@ public class GaborNoiseTemplate extends NoiseTemplate { @Default private @Meta double f0 = 0.625; + @Value("a") + @Default + private @Meta double a = 0.1; + @Override - public NoiseSampler get() { - GaborNoiseSampler gaborNoiseSampler = new GaborNoiseSampler(); - gaborNoiseSampler.setFrequency(frequency); - gaborNoiseSampler.setRotation(rotation); - gaborNoiseSampler.setIsotropic(isotropic); - gaborNoiseSampler.setDeviation(deviation); - gaborNoiseSampler.setImpulsesPerKernel(impulses); - gaborNoiseSampler.setFrequency0(f0); - gaborNoiseSampler.setSalt(salt); - return gaborNoiseSampler; + public Sampler get() { + GaborSampler gaborSampler = new GaborSampler(frequency, salt, f0, deviation, rotation, impulses, a, isotropic); + return gaborSampler; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/NoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/NoiseTemplate.java index 6129ae591..b7f91da27 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/NoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/NoiseTemplate.java @@ -7,11 +7,11 @@ package com.dfsek.terra.addons.noise.config.templates.noise; +import com.dfsek.seismic.algorithms.sampler.noise.NoiseFunction; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; -import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; import com.dfsek.terra.api.config.meta.Meta; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java index cda91ec32..508dc7874 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java @@ -1,12 +1,12 @@ package com.dfsek.terra.addons.noise.config.templates.noise; +import com.dfsek.seismic.algorithms.sampler.noise.PseudoErosionSampler; +import com.dfsek.seismic.algorithms.sampler.noise.simplex.OpenSimplex2Sampler; +import com.dfsek.seismic.type.sampler.DerivativeSampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.samplers.noise.PseudoErosionSampler; -import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.DerivativeNoiseSampler; public class PseudoErosionTemplate extends NoiseTemplate { @@ -45,7 +45,7 @@ public class PseudoErosionTemplate extends NoiseTemplate { @Value("sampler") @Default - private DerivativeNoiseSampler heightSampler = new OpenSimplex2Sampler(); + private DerivativeSampler heightSampler = new OpenSimplex2Sampler(0.02d, 0); @Value("slope-mask.enable") @Default @@ -69,11 +69,9 @@ public class PseudoErosionTemplate extends NoiseTemplate { @Override public PseudoErosionSampler get() { - PseudoErosionSampler pseudoErosion = new PseudoErosionSampler(octaves, gain, lacunarity, + PseudoErosionSampler pseudoErosion = new PseudoErosionSampler(frequency, salt, octaves, gain, lacunarity, slopeStrength, branchStrength, strength, erosionFrequency, heightSampler, slopeMask, slopeMaskFull, slopeMaskNone, jitterModifier, averageErosionImpulses); - pseudoErosion.setFrequency(frequency); - pseudoErosion.setSalt(salt); return pseudoErosion; } } 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 f22ae3d36..d3822ec1a 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 @@ -7,24 +7,28 @@ package com.dfsek.terra.addons.noise.config.templates.noise; -import java.util.function.Supplier; +import com.dfsek.seismic.algorithms.sampler.noise.NoiseFunction; +import com.dfsek.seismic.type.sampler.Sampler; -import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; -import com.dfsek.terra.api.noise.NoiseSampler; +import java.lang.reflect.InvocationTargetException; -public class SimpleNoiseTemplate extends NoiseTemplate { - private final Supplier samplerSupplier; +public class SimpleNoiseTemplate extends NoiseTemplate { + private final Class samplerClass; - public SimpleNoiseTemplate(Supplier samplerSupplier) { - this.samplerSupplier = samplerSupplier; + public SimpleNoiseTemplate(Class samplerClass) { + this.samplerClass = samplerClass; } @Override - public NoiseSampler get() { - NoiseFunction sampler = samplerSupplier.get(); - sampler.setFrequency(frequency); - sampler.setSalt(salt); + public Sampler get() { + NoiseFunction sampler; + try { + sampler = samplerClass.getConstructor(double.class, long.class) + .newInstance(frequency, salt); + } catch(InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + throw new RuntimeException(e); + } 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 ebcf76c43..01a8cb11b 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 @@ -7,18 +7,16 @@ package com.dfsek.terra.addons.noise.config.templates.noise.fractal; -import com.dfsek.terra.addons.noise.samplers.noise.fractal.BrownianMotionSampler; -import com.dfsek.terra.api.noise.NoiseSampler; + +import com.dfsek.seismic.algorithms.sampler.noise.fractal.BrownianMotionSampler; +import com.dfsek.seismic.type.sampler.Sampler; public class BrownianMotionTemplate extends FractalTemplate { @Override - public NoiseSampler get() { - BrownianMotionSampler sampler = new BrownianMotionSampler(function); - sampler.setGain(fractalGain); - sampler.setLacunarity(fractalLacunarity); - sampler.setOctaves(octaves); - sampler.setWeightedStrength(weightedStrength); + public Sampler get() { + BrownianMotionSampler sampler = new BrownianMotionSampler(salt, function, fractalGain, fractalLacunarity, weightedStrength, + octaves); return sampler; } } 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 a9b8e9ac2..0b47c537b 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 @@ -7,16 +7,16 @@ package com.dfsek.terra.addons.noise.config.templates.noise.fractal; +import com.dfsek.seismic.algorithms.sampler.noise.fractal.FractalNoiseFunction; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.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.addons.noise.config.templates.noise.NoiseTemplate; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; -public abstract class FractalTemplate extends SamplerTemplate { +public abstract class FractalTemplate extends NoiseTemplate { @Value("octaves") @Default protected @Meta int octaves = 3; @@ -34,5 +34,5 @@ public abstract class FractalTemplate extends Sa protected @Meta double weightedStrength = 0.0D; @Value("sampler") - protected @Meta NoiseSampler function; + protected @Meta Sampler 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 f5386fe60..6d98e44a6 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 @@ -7,12 +7,12 @@ package com.dfsek.terra.addons.noise.config.templates.noise.fractal; +import com.dfsek.seismic.algorithms.sampler.noise.fractal.PingPongSampler; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.samplers.noise.fractal.PingPongSampler; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; @SuppressWarnings({ "unused", "FieldMayBeFinal" }) @@ -22,13 +22,8 @@ public class PingPongTemplate extends FractalTemplate { private @Meta double pingPong = 2.0D; @Override - public NoiseSampler get() { - PingPongSampler sampler = new PingPongSampler(function); - sampler.setGain(fractalGain); - sampler.setLacunarity(fractalLacunarity); - sampler.setOctaves(octaves); - sampler.setWeightedStrength(weightedStrength); - sampler.setPingPongStrength(pingPong); + public Sampler get() { + PingPongSampler sampler = new PingPongSampler(salt, function, fractalGain, fractalLacunarity, weightedStrength, octaves, pingPong); return sampler; } } 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 8570f3391..e7900e537 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 @@ -7,18 +7,15 @@ package com.dfsek.terra.addons.noise.config.templates.noise.fractal; -import com.dfsek.terra.addons.noise.samplers.noise.fractal.RidgedFractalSampler; -import com.dfsek.terra.api.noise.NoiseSampler; + +import com.dfsek.seismic.algorithms.sampler.noise.fractal.RidgedFractalSampler; +import com.dfsek.seismic.type.sampler.Sampler; public class RidgedFractalTemplate extends FractalTemplate { @Override - public NoiseSampler get() { - RidgedFractalSampler sampler = new RidgedFractalSampler(function); - sampler.setGain(fractalGain); - sampler.setLacunarity(fractalLacunarity); - sampler.setOctaves(octaves); - sampler.setWeightedStrength(weightedStrength); + public Sampler get() { + RidgedFractalSampler sampler = new RidgedFractalSampler(salt, function, fractalGain, fractalLacunarity, weightedStrength, octaves); return sampler; } } 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 5b99c6643..a6b0658d9 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 @@ -7,11 +7,11 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer; +import com.dfsek.seismic.algorithms.sampler.normalizer.ClampNormalizer; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.normalizer.ClampNormalizer; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; @SuppressWarnings({ "unused", "FieldMayBeFinal" }) @@ -23,7 +23,7 @@ public class ClampNormalizerTemplate extends NormalizerTemplate private @Meta double min; @Override - public NoiseSampler get() { + public Sampler 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/CubicSplineNormalizerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/CubicSplineNormalizerTemplate.java index 672d1db90..2174b0ee0 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/CubicSplineNormalizerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/CubicSplineNormalizerTemplate.java @@ -1,23 +1,24 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer; + +import com.dfsek.seismic.algorithms.sampler.normalizer.CubicSplineNormalizer; +import com.dfsek.seismic.type.CubicSpline; +import com.dfsek.seismic.type.CubicSpline.Point; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Value; import java.util.List; -import com.dfsek.terra.addons.noise.math.CubicSpline; -import com.dfsek.terra.addons.noise.math.CubicSpline.Point; -import com.dfsek.terra.addons.noise.normalizer.CubicSplineNoiseSampler; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; -public class CubicSplineNormalizerTemplate extends NormalizerTemplate { +public class CubicSplineNormalizerTemplate extends NormalizerTemplate { @Value("points") private @Meta List<@Meta Point> points; @Override - public NoiseSampler get() { - return new CubicSplineNoiseSampler(function, new CubicSpline(points)); + public Sampler get() { + return new CubicSplineNormalizer(function, new CubicSpline(points)); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ExpressionNormalizerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ExpressionNormalizerTemplate.java index 6852c52b2..f71ebd870 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ExpressionNormalizerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ExpressionNormalizerTemplate.java @@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer; import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; import com.dfsek.paralithic.eval.tokenizer.ParseException; +import com.dfsek.paralithic.sampler.normalizer.ExpressionNormalizer; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -16,11 +18,9 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; +import com.dfsek.terra.addons.noise.config.DimensionApplicableSampler; import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; -import com.dfsek.terra.addons.noise.normalizer.ExpressionNormalizer; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; import static com.dfsek.terra.addons.noise.paralithic.FunctionUtil.convertFunctionsAndSamplers; @@ -28,7 +28,7 @@ import static com.dfsek.terra.addons.noise.paralithic.FunctionUtil.convertFuncti @SuppressWarnings({ "unused", "FieldMayBeFinal" }) public class ExpressionNormalizerTemplate extends NormalizerTemplate { - private final Map globalSamplers; + private final Map globalSamplers; private final Map globalFunctions; private final ParseOptions parseOptions; @@ -41,13 +41,13 @@ public class ExpressionNormalizerTemplate extends NormalizerTemplate samplers = new LinkedHashMap<>(); + private @Meta LinkedHashMap samplers = new LinkedHashMap<>(); @Value("functions") @Default private @Meta LinkedHashMap functions = new LinkedHashMap<>(); - public ExpressionNormalizerTemplate(Map globalSamplers, + public ExpressionNormalizerTemplate(Map globalSamplers, Map globalFunctions, ParseOptions parseOptions) { this.globalSamplers = globalSamplers; @@ -56,13 +56,14 @@ public class ExpressionNormalizerTemplate extends NormalizerTemplate(globalFunctions); mergedFunctions.putAll(functions); var mergedSamplers = new HashMap<>(globalSamplers); mergedSamplers.putAll(samplers); try { - return new ExpressionNormalizer(function, convertFunctionsAndSamplers(mergedFunctions, mergedSamplers), expression, vars, parseOptions); + return new ExpressionNormalizer(function, convertFunctionsAndSamplers(mergedFunctions, mergedSamplers), expression, vars, + parseOptions); } catch(ParseException e) { throw new RuntimeException("Failed to parse expression.", e); } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/LinearMapNormalizerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/LinearMapNormalizerTemplate.java index 1a04fe190..064efbcee 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/LinearMapNormalizerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/LinearMapNormalizerTemplate.java @@ -1,31 +1,31 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer; +import com.dfsek.seismic.algorithms.sampler.normalizer.LinearMapNormalizer; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.normalizer.LinearMapNormalizer; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; public class LinearMapNormalizerTemplate extends NormalizerTemplate { - + @Value("from.a") @Default private @Meta double aFrom = -1; - + @Value("from.b") @Default private @Meta double bFrom = 1; - + @Value("to.a") private @Meta double aTo; - + @Value("to.b") private @Meta double bTo; - + @Override - public NoiseSampler get() { + public Sampler get() { return new LinearMapNormalizer(function, aFrom, aTo, bFrom, bTo); } } 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 aa54ea6bb..384180b64 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 @@ -7,11 +7,11 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer; +import com.dfsek.seismic.algorithms.sampler.normalizer.LinearNormalizer; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.normalizer.LinearNormalizer; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; @SuppressWarnings({ "unused", "FieldMayBeFinal" }) @@ -23,7 +23,7 @@ public class LinearNormalizerTemplate extends NormalizerTemplate extends SamplerTemplate { @Value("sampler") - protected @Meta NoiseSampler function; + protected @Meta Sampler function; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/PosterizationNormalizerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/PosterizationNormalizerTemplate.java index c0ec213d7..253229ff1 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/PosterizationNormalizerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/PosterizationNormalizerTemplate.java @@ -7,11 +7,11 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer; +import com.dfsek.seismic.algorithms.sampler.normalizer.PosterizationNormalizer; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.normalizer.PosterizationNormalizer; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; @SuppressWarnings({ "unused", "FieldMayBeFinal" }) @@ -20,7 +20,7 @@ public class PosterizationNormalizerTemplate extends NormalizerTemplate { @Override - public NoiseSampler get() { + public Sampler get() { return new ProbabilityNormalizer(function); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ScaleNormalizerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ScaleNormalizerTemplate.java index c21966cd2..af851f44a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ScaleNormalizerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ScaleNormalizerTemplate.java @@ -1,10 +1,10 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer; +import com.dfsek.seismic.algorithms.sampler.normalizer.ScaleNormalizer; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.normalizer.ScaleNormalizer; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; public class ScaleNormalizerTemplate extends NormalizerTemplate { @@ -12,7 +12,7 @@ public class ScaleNormalizerTemplate extends NormalizerTemplate private @Meta double amplitude; @Override - public NoiseSampler get() { + public Sampler get() { return new ScaleNormalizer(function, amplitude); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/math/CubicSpline.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/math/CubicSpline.java deleted file mode 100644 index a9b0764b6..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/math/CubicSpline.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.dfsek.terra.addons.noise.math; - -import org.jetbrains.annotations.NotNull; - -import java.util.Collections; -import java.util.List; - -import static com.dfsek.terra.api.util.MathUtil.lerp; - - -public class CubicSpline { - - private final double[] fromValues; - private final double[] toValues; - private final double[] gradients; - - public CubicSpline(List points) { - Collections.sort(points); - - this.fromValues = new double[points.size()]; - this.toValues = new double[points.size()]; - this.gradients = new double[points.size()]; - - for(int i = 0; i < points.size(); i++) { - fromValues[i] = points.get(i).from; - toValues[i] = points.get(i).to; - gradients[i] = points.get(i).gradient; - } - } - - public static double calculate(double in, double[] fromValues, double[] toValues, double[] gradients) { - int pointIdx = floorBinarySearch(in, fromValues) - 1; - - int pointIdxLast = fromValues.length - 1; - - if(pointIdx < 0) { // If to left of first point return linear function intersecting said point using point's gradient - return gradients[0] * (in - fromValues[0]) + toValues[0]; - } else if(pointIdx == pointIdxLast) { // Do same if to right of last point - return gradients[pointIdxLast] * (in - fromValues[pointIdxLast]) + toValues[pointIdxLast]; - } else { - double fromLeft = fromValues[pointIdx]; - double fromRight = fromValues[pointIdx + 1]; - - double toLeft = toValues[pointIdx]; - double toRight = toValues[pointIdx + 1]; - - double gradientLeft = gradients[pointIdx]; - double gradientRight = gradients[pointIdx + 1]; - - double fromDelta = fromRight - fromLeft; - double toDelta = toRight - toLeft; - - double t = (in - fromLeft) / fromDelta; - - return lerp(t, toLeft, toRight) + t * (1.0F - t) * lerp(t, gradientLeft * fromDelta - toDelta, - -gradientRight * fromDelta + toDelta); - } - } - - private static int floorBinarySearch(double targetValue, double[] values) { - int left = 0; - int right = values.length; - int idx = right - left; - while(idx > 0) { - int halfDelta = idx / 2; - int mid = left + halfDelta; - if(targetValue < values[mid]) { - idx = halfDelta; - } else { - left = mid + 1; - idx -= halfDelta + 1; - } - } - return left; - } - - public double apply(double in) { - return calculate(in, fromValues, toValues, gradients); - } - - - public record Point(double from, double to, double gradient) implements Comparable { - - @Override - public int compareTo(@NotNull CubicSpline.Point o) { - return Double.compare(from, o.from); - } - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ClampNormalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ClampNormalizer.java deleted file mode 100644 index 3d709fcc5..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ClampNormalizer.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.normalizer; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class ClampNormalizer extends Normalizer { - private final double min; - private final double max; - - public ClampNormalizer(NoiseSampler sampler, double min, double max) { - super(sampler); - this.min = min; - this.max = max; - } - - @Override - public double normalize(double in) { - return Math.max(Math.min(in, max), min); - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/CubicSplineNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/CubicSplineNoiseSampler.java deleted file mode 100644 index 4786d69c6..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/CubicSplineNoiseSampler.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dfsek.terra.addons.noise.normalizer; - -import com.dfsek.terra.addons.noise.math.CubicSpline; -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class CubicSplineNoiseSampler extends Normalizer { - - private final CubicSpline spline; - - public CubicSplineNoiseSampler(NoiseSampler sampler, CubicSpline spline) { - super(sampler); - this.spline = spline; - } - - @Override - public double normalize(double in) { - return spline.apply(in); - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ExpressionNormalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ExpressionNormalizer.java deleted file mode 100644 index e6d25f2d5..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ExpressionNormalizer.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.dfsek.terra.addons.noise.normalizer; - -import com.dfsek.paralithic.Expression; -import com.dfsek.paralithic.eval.parser.Parser; -import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; -import com.dfsek.paralithic.eval.parser.Scope; -import com.dfsek.paralithic.eval.tokenizer.ParseException; -import com.dfsek.paralithic.functions.Function; - -import java.util.Arrays; -import java.util.Map; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class ExpressionNormalizer extends Normalizer { - - private final Expression expression; - - public ExpressionNormalizer(NoiseSampler sampler, Map functions, String eq, Map vars, ParseOptions parseOptions) - throws ParseException { - super(sampler); - - Parser p = new Parser(parseOptions); - Scope scope = new Scope(); - - // 'in' was used as the invocation variable but conflicts with - // the new 'in' keyword in Paralithic used to denote the end of a let - // expression. To maintain backwards compatibility but also enable the use - // of let expressions, if they're enabled then use the longer 'input' - // invocation variable instead. - if (parseOptions.useLetExpressions()) { - scope.addInvocationVariable("input"); - } else { - scope.addInvocationVariable("in"); - } - - vars.forEach(scope::create); - functions.forEach(p::registerFunction); - expression = p.parse(eq, scope); - } - - @Override - public double normalize(double in) { - return expression.evaluate(in); - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/LinearMapNormalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/LinearMapNormalizer.java deleted file mode 100644 index d124ef8de..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/LinearMapNormalizer.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.dfsek.terra.addons.noise.normalizer; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class LinearMapNormalizer extends Normalizer { - - private final double aFrom; - - private final double aTo; - - private final double bFrom; - - private final double bTo; - - public LinearMapNormalizer(NoiseSampler sampler, double aFrom, double aTo, double bFrom, double bTo) { - super(sampler); - this.aFrom = aFrom; - this.aTo = aTo; - this.bFrom = bFrom; - this.bTo = bTo; - } - - @Override - public double normalize(double in) { - return (in - aFrom) * (aTo - bTo) / (aFrom - bFrom) + aTo; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/LinearNormalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/LinearNormalizer.java deleted file mode 100644 index 5e1053bdf..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/LinearNormalizer.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.normalizer; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -/** - * Normalizer to linearly scale data's range. - */ -public class LinearNormalizer extends Normalizer { - private final double min; - private final double max; - - public LinearNormalizer(NoiseSampler sampler, double min, double max) { - super(sampler); - this.min = min; - this.max = max; - } - - @Override - public double normalize(double in) { - return (in - min) * (2 / (max - min)) - 1; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/NormalNormalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/NormalNormalizer.java deleted file mode 100644 index 7538f9187..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/NormalNormalizer.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.normalizer; - -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.MathUtil; - - -/** - * Normalizer to redistribute normally distributed data to a continuous distribution via an automatically generated lookup table. - */ -public class NormalNormalizer extends Normalizer { - - private final double[] lookup; - - public NormalNormalizer(NoiseSampler sampler, int buckets, double mean, double standardDeviation) { - super(sampler); - this.lookup = new double[buckets]; - - for(int i = 0; i < buckets; i++) { - lookup[i] = MathUtil.normalInverse((double) i / buckets, mean, standardDeviation); - } - } - - @Override - public double normalize(double in) { - int start = 0; - int end = lookup.length - 1; - while(start + 1 < end) { - int mid = start + (end - start) / 2; - if(lookup[mid] <= in) { - start = mid; - } else { - end = mid; - } - } - double left = Math.abs(lookup[start] - in); - double right = Math.abs(lookup[end] - in); - - double fin; - if(left <= right) { - fin = (double) start / (lookup.length); - } else fin = (double) end / (lookup.length); - - return (fin - 0.5) * 2; - } -} 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 deleted file mode 100644 index 539e2e394..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.normalizer; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public abstract class Normalizer implements NoiseSampler { - private final NoiseSampler sampler; - - public Normalizer(NoiseSampler sampler) { - this.sampler = sampler; - } - - public abstract double normalize(double in); - - @Override - public double noise(long seed, double x, double y) { - return normalize(sampler.noise(seed, x, y)); - } - - @Override - public double noise(long seed, double x, double y, double z) { - return normalize(sampler.noise(seed, x, y, z)); - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/PosterizationNormalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/PosterizationNormalizer.java deleted file mode 100644 index eb5fe8085..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/PosterizationNormalizer.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2022 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.normalizer; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class PosterizationNormalizer extends Normalizer { - private final double stepSize; - - public PosterizationNormalizer(NoiseSampler sampler, int steps) { - super(sampler); - this.stepSize = 2.0 / (steps - 1); - } - - @Override - public double normalize(double in) { - return (int) Math.round((in + 1) / stepSize) * stepSize - 1; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ProbabilityNormalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ProbabilityNormalizer.java deleted file mode 100644 index e254b2d9c..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ProbabilityNormalizer.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dfsek.terra.addons.noise.normalizer; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class ProbabilityNormalizer extends Normalizer { - public ProbabilityNormalizer(NoiseSampler sampler) { - super(sampler); - } - - @Override - public double normalize(double in) { - return (in + 1) / 2; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ScaleNormalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ScaleNormalizer.java deleted file mode 100644 index 2f0baf86d..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ScaleNormalizer.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dfsek.terra.addons.noise.normalizer; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class ScaleNormalizer extends Normalizer { - private final double scale; - - public ScaleNormalizer(NoiseSampler sampler, double scale) { - super(sampler); - this.scale = scale; - } - - @Override - public double normalize(double in) { - return in * scale; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java index d47693cde..f9754793e 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java @@ -2,24 +2,23 @@ package com.dfsek.terra.addons.noise.paralithic; import com.dfsek.paralithic.eval.tokenizer.ParseException; import com.dfsek.paralithic.functions.Function; +import com.dfsek.paralithic.functions.dynamic.noise.NoiseFunction2; +import com.dfsek.paralithic.functions.dynamic.noise.NoiseFunction3; +import com.dfsek.paralithic.functions.dynamic.noise.SaltedNoiseFunction2; +import com.dfsek.paralithic.functions.dynamic.noise.SaltedNoiseFunction3; import java.util.HashMap; import java.util.Map; -import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; +import com.dfsek.terra.addons.noise.config.DimensionApplicableSampler; 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.addons.noise.paralithic.noise.SaltedNoiseFunction2; -import com.dfsek.terra.addons.noise.paralithic.noise.SaltedNoiseFunction3; public class FunctionUtil { private FunctionUtil() { } public static Map convertFunctionsAndSamplers(Map functions, - Map samplers) + Map samplers) throws ParseException { Map functionMap = new HashMap<>(); for(Map.Entry entry : functions.entrySet()) { 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/UserDefinedFunction.java similarity index 97% rename from common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java rename to common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/UserDefinedFunction.java index 3d2703bed..0e192d13c 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/UserDefinedFunction.java @@ -5,7 +5,7 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.noise.paralithic.defined; +package com.dfsek.terra.addons.noise.paralithic; import com.dfsek.paralithic.Expression; import com.dfsek.paralithic.eval.parser.Parser; 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 deleted file mode 100644 index 3cf48bfaf..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction2.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -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.paralithic.node.Statefulness; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class NoiseFunction2 implements DynamicFunction { - private final NoiseSampler gen; - - public NoiseFunction2(NoiseSampler gen) { - this.gen = gen; - } - - @Override - public double eval(double... args) { - throw new UnsupportedOperationException("Cannot evaluate seeded function without seed context."); - } - - @Override - public double eval(Context context, double... args) { - return gen.noise(((SeedContext) context).getSeed(), args[0], args[1]); - } - - @Override - public int getArgNumber() { - return 2; - } - - @Override - public Statefulness statefulness() { - return Statefulness.CONTEXTUAL; - } -} 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 deleted file mode 100644 index 5c52b414a..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction3.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -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.paralithic.node.Statefulness; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class NoiseFunction3 implements DynamicFunction { - private final NoiseSampler gen; - - public NoiseFunction3(NoiseSampler gen) { - this.gen = gen; - } - - @Override - public double eval(double... args) { - throw new UnsupportedOperationException("Cannot evaluate seeded function without seed context."); - } - - @Override - public double eval(Context context, double... args) { - return gen.noise(((SeedContext) context).getSeed(), args[0], args[1], args[2]); - } - - @Override - public int getArgNumber() { - return 3; - } - - @Override - public Statefulness statefulness() { - return Statefulness.CONTEXTUAL; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java deleted file mode 100644 index 41ddd1247..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java +++ /dev/null @@ -1,37 +0,0 @@ -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.paralithic.node.Statefulness; -import org.jetbrains.annotations.NotNull; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class SaltedNoiseFunction2 implements DynamicFunction { - private final NoiseSampler gen; - - public SaltedNoiseFunction2(NoiseSampler gen) { - this.gen = gen; - } - - @Override - public double eval(double... args) { - throw new UnsupportedOperationException("Cannot evaluate seeded function without seed context."); - } - - @Override - public double eval(Context context, double... args) { - return gen.noise(((SeedContext) context).getSeed() + (long) args[2], args[0], args[1]); - } - - @Override - public int getArgNumber() { - return 3; - } - - @Override - public @NotNull Statefulness statefulness() { - return Statefulness.CONTEXTUAL; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction3.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction3.java deleted file mode 100644 index d4549127c..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction3.java +++ /dev/null @@ -1,37 +0,0 @@ -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.paralithic.node.Statefulness; -import org.jetbrains.annotations.NotNull; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class SaltedNoiseFunction3 implements DynamicFunction { - private final NoiseSampler gen; - - public SaltedNoiseFunction3(NoiseSampler gen) { - this.gen = gen; - } - - @Override - public double eval(double... args) { - throw new UnsupportedOperationException("Cannot evaluate seeded function without seed context."); - } - - @Override - public double eval(Context context, double... args) { - return gen.noise(((SeedContext) context).getSeed() + (long) args[3], args[0], args[1], args[2]); - } - - @Override - public int getArgNumber() { - return 4; - } - - @Override - public @NotNull Statefulness statefulness() { - return Statefulness.CONTEXTUAL; - } -} 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 deleted file mode 100644 index e104561b3..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SeedContext.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -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 deleted file mode 100644 index d452ce5f9..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class DomainWarpedSampler implements NoiseSampler { - private final NoiseSampler function; - private final NoiseSampler warp; - private final double amplitude; - - public DomainWarpedSampler(NoiseSampler function, NoiseSampler warp, double amplitude) { - this.function = function; - this.warp = warp; - this.amplitude = amplitude; - } - - @Override - public double noise(long seed, double x, double y) { - return function.noise(seed++, - x + warp.noise(seed++, x, y) * amplitude, - y + warp.noise(seed, x, y) * amplitude - ); - } - - @Override - public double noise(long seed, double x, double y, double z) { - return function.noise(seed++, - x + warp.noise(seed++, x, y, z) * amplitude, - y + warp.noise(seed++, x, y, z) * amplitude, - z + warp.noise(seed, x, y, z) * amplitude - ); - } -} 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 deleted file mode 100644 index c42532651..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers; - -import java.awt.image.BufferedImage; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class ImageSampler implements NoiseSampler { - private final BufferedImage image; - private final Channel channel; - - private final double frequency; - - public ImageSampler(BufferedImage image, Channel channel, double frequency) { - this.image = image; - this.channel = channel; - this.frequency = frequency; - } - - @Override - public double noise(long seed, double x, double y) { - return ((channel.getChannel(image.getRGB(Math.floorMod((int) Math.floor(x * frequency), image.getWidth()), - Math.floorMod((int) Math.floor(y * frequency), image.getHeight()))) / 255D) - 0.5) * - 2; - } - - @Override - public double noise(long seed, double x, double y, double z) { - return noise(seed, x, y); - } - - public enum Channel { - RED { - @Override - public int getChannel(int mashed) { - return (mashed >> 16) & 0xff; - } - }, - GREEN { - @Override - public int getChannel(int mashed) { - return (mashed >> 8) & 0xff; - } - }, - BLUE { - @Override - public int getChannel(int mashed) { - return mashed & 0xff; - } - }, - GRAYSCALE { - @Override - public int getChannel(int mashed) { - return (RED.getChannel(mashed) + GREEN.getChannel(mashed) + BLUE.getChannel(mashed)) / 3; - } - }, - ALPHA { - @Override - public int getChannel(int mashed) { - return (mashed >> 24) & 0xff; - } - }; - - public abstract int getChannel(int mashed); - } -} 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 deleted file mode 100644 index 8de30482a..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class KernelSampler implements NoiseSampler { - private final double[][] kernel; - private final NoiseSampler in; - private double frequency = 1; - - public KernelSampler(double[][] kernel, NoiseSampler in) { - this.kernel = kernel; - this.in = in; - } - - public void setFrequency(double frequency) { - this.frequency = frequency; - } - - @Override - public double noise(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++) { - double k = kernel[kx][ky]; - if(k != 0) { - accumulator += in.noise(seed, x + kx, y + ky) * k; - } - } - } - - return accumulator; - } - - @Override - public double noise(long seed, double x, double y, double z) { - x *= frequency; - y *= frequency; - z *= frequency; - double accumulator = 0; - - for(int kx = 0; kx < kernel.length; kx++) { - for(int ky = 0; ky < kernel[kx].length; ky++) { - double k = kernel[kx][ky]; - if(k != 0) { - accumulator += in.noise(seed, x + kx, y, z + ky) * k; - } - } - } - - return accumulator; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/LinearHeightmapSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/LinearHeightmapSampler.java deleted file mode 100644 index 500b44e4f..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/LinearHeightmapSampler.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class LinearHeightmapSampler implements NoiseSampler { - private final NoiseSampler sampler; - private final double scale; - private final double base; - - public LinearHeightmapSampler(NoiseSampler sampler, double scale, double base) { - this.sampler = sampler; - this.scale = scale; - this.base = base; - } - - - @Override - public double noise(long seed, double x, double y) { - return noise(seed, x, 0, y); - } - - @Override - public double noise(long seed, double x, double y, double z) { - return -y + base + sampler.noise(seed, x, y, z) * scale; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/TranslateSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/TranslateSampler.java deleted file mode 100644 index cb886c948..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/TranslateSampler.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class TranslateSampler implements NoiseSampler { - - private final NoiseSampler sampler; - private final double dx, dy, dz; - - public TranslateSampler(NoiseSampler sampler, double dx, double dy, double dz) { - this.sampler = sampler; - this.dx = dx; - this.dy = dy; - this.dz = dz; - } - - @Override - public double noise(long seed, double x, double y) { - return sampler.noise(seed, x - dx, y - dz); - } - - @Override - public double noise(long seed, double x, double y, double z) { - return sampler.noise(seed, x - dx, y - dy, z - dz); - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/AdditionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/AdditionSampler.java deleted file mode 100644 index 4006e126c..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/AdditionSampler.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers.arithmetic; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class AdditionSampler extends BinaryArithmeticSampler { - public AdditionSampler(NoiseSampler left, NoiseSampler right) { - super(left, right); - } - - @Override - public double operate(double left, double right) { - return left + right; - } - - @Override - public double[] operateDerivative(double[] left, double[] right) { - int dimensions = left.length; - double[] out = new double[dimensions]; - for(int i = 0; i < dimensions; i++) { - out[i] = left[i] + right[i]; - } - return out; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/BinaryArithmeticSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/BinaryArithmeticSampler.java deleted file mode 100644 index 66abb393c..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/BinaryArithmeticSampler.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers.arithmetic; - -import com.dfsek.terra.api.noise.DerivativeNoiseSampler; -import com.dfsek.terra.api.noise.NoiseSampler; - - -public abstract class BinaryArithmeticSampler implements DerivativeNoiseSampler { - private final NoiseSampler left; - private final NoiseSampler right; - - protected BinaryArithmeticSampler(NoiseSampler left, NoiseSampler right) { - this.left = left; - this.right = right; - } - - @Override - public boolean isDifferentiable() { - return DerivativeNoiseSampler.isDifferentiable(left) && DerivativeNoiseSampler.isDifferentiable(right); - } - - @Override - public double noise(long seed, double x, double y) { - return operate(left.noise(seed, x, y), right.noise(seed, x, y)); - } - - @Override - public double noise(long seed, double x, double y, double z) { - return operate(left.noise(seed, x, y, z), right.noise(seed, x, y, z)); - } - - @Override - public double[] noised(long seed, double x, double y) { - return operateDerivative(((DerivativeNoiseSampler)left).noised(seed, x, y), ((DerivativeNoiseSampler)right).noised(seed, x, y)); - } - - @Override - public double[] noised(long seed, double x, double y, double z) { - return operateDerivative(((DerivativeNoiseSampler)left).noised(seed, x, y, z), ((DerivativeNoiseSampler)right).noised(seed, x, y, z)); - } - - public abstract double operate(double left, double right); - - public abstract double[] operateDerivative(double[] left, double[] right); -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/DivisionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/DivisionSampler.java deleted file mode 100644 index fe6c1a79d..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/DivisionSampler.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers.arithmetic; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class DivisionSampler extends BinaryArithmeticSampler { - public DivisionSampler(NoiseSampler left, NoiseSampler right) { - super(left, right); - } - - @Override - public double operate(double left, double right) { - return left / right; - } - - @Override - public double[] operateDerivative(double[] left, double[] right) { - int dimensions = left.length; - double[] out = new double[dimensions]; - out[0] = left[0] / right[0]; - for(int i = 1; i < dimensions; i++) { - out[i] = (left[i] * right[0] - left[0] * right[i]) / (right[0] * right[0]); - } - return out; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MaxSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MaxSampler.java deleted file mode 100644 index 4012de57f..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MaxSampler.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers.arithmetic; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class MaxSampler extends BinaryArithmeticSampler { - public MaxSampler(NoiseSampler left, NoiseSampler right) { - super(left, right); - } - - @Override - public double operate(double left, double right) { - return Math.max(left, right); - } - - @Override - public double[] operateDerivative(double[] left, double[] right) { - double leftValue = left[0]; - double rightValue = right[0]; - return leftValue > rightValue ? left : right; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MinSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MinSampler.java deleted file mode 100644 index a29064794..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MinSampler.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers.arithmetic; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class MinSampler extends BinaryArithmeticSampler { - public MinSampler(NoiseSampler left, NoiseSampler right) { - super(left, right); - } - - @Override - public double operate(double left, double right) { - return Math.min(left, right); - } - - @Override - public double[] operateDerivative(double[] left, double[] right) { - double leftValue = left[0]; - double rightValue = right[0]; - return leftValue < rightValue ? left : right; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MultiplicationSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MultiplicationSampler.java deleted file mode 100644 index 1033b980e..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MultiplicationSampler.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers.arithmetic; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class MultiplicationSampler extends BinaryArithmeticSampler { - public MultiplicationSampler(NoiseSampler left, NoiseSampler right) { - super(left, right); - } - - @Override - public double operate(double left, double right) { - return left * right; - } - - @Override - public double[] operateDerivative(double[] left, double[] right) { - int dimensions = left.length; - double[] out = new double[dimensions]; - out[0] = left[0] * right[0]; - for(int i = 1; i < dimensions; i++) { - out[i] = left[i] * right[0] + left[0] * right[i]; - } - return out; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/SubtractionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/SubtractionSampler.java deleted file mode 100644 index c7e69d49e..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/SubtractionSampler.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers.arithmetic; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class SubtractionSampler extends BinaryArithmeticSampler { - public SubtractionSampler(NoiseSampler left, NoiseSampler right) { - super(left, right); - } - - @Override - public double operate(double left, double right) { - return left - right; - } - - @Override - public double[] operateDerivative(double[] left, double[] right) { - int dimensions = left.length; - double[] out = new double[dimensions]; - for(int i = 0; i < dimensions; i++) { - out[i] = left[i] - right[i]; - } - return out; - } -} 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 deleted file mode 100644 index fea5ccec5..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java +++ /dev/null @@ -1,424 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise; - -import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler; -import com.dfsek.terra.api.noise.NoiseSampler; - - -/** - * NoiseSampler implementation for Cellular (Voronoi/Worley) Noise. - */ -public class CellularSampler extends NoiseFunction { - private static final double[] RAND_VECS_3D = { - -0.7292736885d, -0.6618439697d, 0.1735581948d, 0, 0.790292081d, -0.5480887466d, -0.2739291014d, 0, 0.7217578935d, 0.6226212466d, - -0.3023380997d, 0, 0.565683137d, -0.8208298145d, -0.0790000257d, 0, 0.760049034d, -0.5555979497d, -0.3370999617d, 0, - 0.3713945616d, 0.5011264475d, 0.7816254623d, 0, -0.1277062463d, -0.4254438999d, -0.8959289049d, 0, -0.2881560924d, - -0.5815838982d, 0.7607405838d, 0, 0.5849561111d, -0.662820239d, -0.4674352136d, 0, 0.3307171178d, 0.0391653737d, 0.94291689d, 0, - 0.8712121778d, -0.4113374369d, -0.2679381538d, 0, 0.580981015d, 0.7021915846d, 0.4115677815d, 0, 0.503756873d, 0.6330056931d, - -0.5878203852d, 0, 0.4493712205d, 0.601390195d, 0.6606022552d, 0, -0.6878403724d, 0.09018890807d, -0.7202371714d, 0, - -0.5958956522d, -0.6469350577d, 0.475797649d, 0, -0.5127052122d, 0.1946921978d, -0.8361987284d, 0, -0.9911507142d, - -0.05410276466d, -0.1212153153d, 0, -0.2149721042d, 0.9720882117d, -0.09397607749d, 0, -0.7518650936d, -0.5428057603d, - 0.3742469607d, 0, 0.5237068895d, 0.8516377189d, -0.02107817834d, 0, 0.6333504779d, 0.1926167129d, -0.7495104896d, 0, - -0.06788241606d, 0.3998305789d, 0.9140719259d, 0, -0.5538628599d, -0.4729896695d, -0.6852128902d, 0, -0.7261455366d, - -0.5911990757d, 0.3509933228d, 0, -0.9229274737d, -0.1782808786d, 0.3412049336d, 0, -0.6968815002d, 0.6511274338d, - 0.3006480328d, 0, 0.9608044783d, -0.2098363234d, -0.1811724921d, 0, 0.06817146062d, -0.9743405129d, 0.2145069156d, 0, - -0.3577285196d, -0.6697087264d, -0.6507845481d, 0, -0.1868621131d, 0.7648617052d, -0.6164974636d, 0, -0.6541697588d, - 0.3967914832d, 0.6439087246d, 0, 0.6993340405d, -0.6164538506d, 0.3618239211d, 0, -0.1546665739d, 0.6291283928d, 0.7617583057d, - 0, -0.6841612949d, -0.2580482182d, -0.6821542638d, 0, 0.5383980957d, 0.4258654885d, 0.7271630328d, 0, -0.5026987823d, - -0.7939832935d, -0.3418836993d, 0, 0.3202971715d, 0.2834415347d, 0.9039195862d, 0, 0.8683227101d, -0.0003762656404d, - -0.4959995258d, 0, 0.791120031d, -0.08511045745d, 0.6057105799d, 0, -0.04011016052d, -0.4397248749d, 0.8972364289d, 0, - 0.9145119872d, 0.3579346169d, -0.1885487608d, 0, -0.9612039066d, -0.2756484276d, 0.01024666929d, 0, 0.6510361721d, - -0.2877799159d, -0.7023778346d, 0, -0.2041786351d, 0.7365237271d, 0.644859585d, 0, -0.7718263711d, 0.3790626912d, 0.5104855816d, - 0, -0.3060082741d, -0.7692987727d, 0.5608371729d, 0, 0.454007341d, -0.5024843065d, 0.7357899537d, 0, 0.4816795475d, - 0.6021208291d, -0.6367380315d, 0, 0.6961980369d, -0.3222197429d, 0.641469197d, 0, -0.6532160499d, -0.6781148932d, 0.3368515753d, - 0, 0.5089301236d, -0.6154662304d, -0.6018234363d, 0, -0.1635919754d, -0.9133604627d, -0.372840892d, 0, 0.52408019d, - -0.8437664109d, 0.1157505864d, 0, 0.5902587356d, 0.4983817807d, -0.6349883666d, 0, 0.5863227872d, 0.494764745d, 0.6414307729d, - 0, 0.6779335087d, 0.2341345225d, 0.6968408593d, 0, 0.7177054546d, -0.6858979348d, 0.120178631d, 0, -0.5328819713d, - -0.5205125012d, 0.6671608058d, 0, -0.8654874251d, -0.0700727088d, -0.4960053754d, 0, -0.2861810166d, 0.7952089234d, - 0.5345495242d, 0, -0.04849529634d, 0.9810836427d, -0.1874115585d, 0, -0.6358521667d, 0.6058348682d, 0.4781800233d, 0, - 0.6254794696d, -0.2861619734d, 0.7258696564d, 0, -0.2585259868d, 0.5061949264d, -0.8227581726d, 0, 0.02136306781d, - 0.5064016808d, -0.8620330371d, 0, 0.200111773d, 0.8599263484d, 0.4695550591d, 0, 0.4743561372d, 0.6014985084d, -0.6427953014d, - 0, 0.6622993731d, -0.5202474575d, -0.5391679918d, 0, 0.08084972818d, -0.6532720452d, 0.7527940996d, 0, -0.6893687501d, - 0.0592860349d, 0.7219805347d, 0, -0.1121887082d, -0.9673185067d, 0.2273952515d, 0, 0.7344116094d, 0.5979668656d, -0.3210532909d, - 0, 0.5789393465d, -0.2488849713d, 0.7764570201d, 0, 0.6988182827d, 0.3557169806d, -0.6205791146d, 0, -0.8636845529d, - -0.2748771249d, -0.4224826141d, 0, -0.4247027957d, -0.4640880967d, 0.777335046d, 0, 0.5257722489d, -0.8427017621d, - 0.1158329937d, 0, 0.9343830603d, 0.316302472d, -0.1639543925d, 0, -0.1016836419d, -0.8057303073d, -0.5834887393d, 0, - -0.6529238969d, 0.50602126d, -0.5635892736d, 0, -0.2465286165d, -0.9668205684d, -0.06694497494d, 0, -0.9776897119d, - -0.2099250524d, -0.007368825344d, 0, 0.7736893337d, 0.5734244712d, 0.2694238123d, 0, -0.6095087895d, 0.4995678998d, - 0.6155736747d, 0, 0.5794535482d, 0.7434546771d, 0.3339292269d, 0, -0.8226211154d, 0.08142581855d, 0.5627293636d, 0, - -0.510385483d, 0.4703667658d, 0.7199039967d, 0, -0.5764971849d, -0.07231656274d, -0.8138926898d, 0, 0.7250628871d, - 0.3949971505d, -0.5641463116d, 0, -0.1525424005d, 0.4860840828d, -0.8604958341d, 0, -0.5550976208d, -0.4957820792d, - 0.667882296d, 0, -0.1883614327d, 0.9145869398d, 0.357841725d, 0, 0.7625556724d, -0.5414408243d, -0.3540489801d, 0, - -0.5870231946d, -0.3226498013d, -0.7424963803d, 0, 0.3051124198d, 0.2262544068d, -0.9250488391d, 0, 0.6379576059d, 0.577242424d, - -0.5097070502d, 0, -0.5966775796d, 0.1454852398d, -0.7891830656d, 0, -0.658330573d, 0.6555487542d, -0.3699414651d, 0, - 0.7434892426d, 0.2351084581d, 0.6260573129d, 0, 0.5562114096d, 0.8264360377d, -0.0873632843d, 0, -0.3028940016d, -0.8251527185d, - 0.4768419182d, 0, 0.1129343818d, -0.985888439d, -0.1235710781d, 0, 0.5937652891d, -0.5896813806d, 0.5474656618d, 0, - 0.6757964092d, -0.5835758614d, -0.4502648413d, 0, 0.7242302609d, -0.1152719764d, 0.6798550586d, 0, -0.9511914166d, - 0.0753623979d, -0.2992580792d, 0, 0.2539470961d, -0.1886339355d, 0.9486454084d, 0, 0.571433621d, -0.1679450851d, -0.8032795685d, - 0, -0.06778234979d, 0.3978269256d, 0.9149531629d, 0, 0.6074972649d, 0.733060024d, -0.3058922593d, 0, -0.5435478392d, - 0.1675822484d, 0.8224791405d, 0, -0.5876678086d, -0.3380045064d, -0.7351186982d, 0, -0.7967562402d, 0.04097822706d, - -0.6029098428d, 0, -0.1996350917d, 0.8706294745d, 0.4496111079d, 0, -0.02787660336d, -0.9106232682d, -0.4122962022d, 0, - -0.7797625996d, -0.6257634692d, 0.01975775581d, 0, -0.5211232846d, 0.7401644346d, -0.4249554471d, 0, 0.8575424857d, - 0.4053272873d, -0.3167501783d, 0, 0.1045223322d, 0.8390195772d, -0.5339674439d, 0, 0.3501822831d, 0.9242524096d, -0.1520850155d, - 0, 0.1987849858d, 0.07647613266d, 0.9770547224d, 0, 0.7845996363d, 0.6066256811d, -0.1280964233d, 0, 0.09006737436d, - -0.9750989929d, -0.2026569073d, 0, -0.8274343547d, -0.542299559d, 0.1458203587d, 0, -0.3485797732d, -0.415802277d, 0.840000362d, - 0, -0.2471778936d, -0.7304819962d, -0.6366310879d, 0, -0.3700154943d, 0.8577948156d, 0.3567584454d, 0, 0.5913394901d, - -0.548311967d, -0.5913303597d, 0, 0.1204873514d, -0.7626472379d, -0.6354935001d, 0, 0.616959265d, 0.03079647928d, 0.7863922953d, - 0, 0.1258156836d, -0.6640829889d, -0.7369967419d, 0, -0.6477565124d, -0.1740147258d, -0.7417077429d, 0, 0.6217889313d, - -0.7804430448d, -0.06547655076d, 0, 0.6589943422d, -0.6096987708d, 0.4404473475d, 0, -0.2689837504d, -0.6732403169d, - -0.6887635427d, 0, -0.3849775103d, 0.5676542638d, 0.7277093879d, 0, 0.5754444408d, 0.8110471154d, -0.1051963504d, 0, - 0.9141593684d, 0.3832947817d, 0.131900567d, 0, -0.107925319d, 0.9245493968d, 0.3654593525d, 0, 0.377977089d, 0.3043148782d, - 0.8743716458d, 0, -0.2142885215d, -0.8259286236d, 0.5214617324d, 0, 0.5802544474d, 0.4148098596d, -0.7008834116d, 0, - -0.1982660881d, 0.8567161266d, -0.4761596756d, 0, -0.03381553704d, 0.3773180787d, -0.9254661404d, 0, -0.6867922841d, - -0.6656597827d, 0.2919133642d, 0, 0.7731742607d, -0.2875793547d, -0.5652430251d, 0, -0.09655941928d, 0.9193708367d, - -0.3813575004d, 0, 0.2715702457d, -0.9577909544d, -0.09426605581d, 0, 0.2451015704d, -0.6917998565d, -0.6792188003d, 0, - 0.977700782d, -0.1753855374d, 0.1155036542d, 0, -0.5224739938d, 0.8521606816d, 0.02903615945d, 0, -0.7734880599d, - -0.5261292347d, 0.3534179531d, 0, -0.7134492443d, -0.269547243d, 0.6467878011d, 0, 0.1644037271d, 0.5105846203d, -0.8439637196d, - 0, 0.6494635788d, 0.05585611296d, 0.7583384168d, 0, -0.4711970882d, 0.5017280509d, -0.7254255765d, 0, -0.6335764307d, - -0.2381686273d, -0.7361091029d, 0, -0.9021533097d, -0.270947803d, -0.3357181763d, 0, -0.3793711033d, 0.872258117d, - 0.3086152025d, 0, -0.6855598966d, -0.3250143309d, 0.6514394162d, 0, 0.2900942212d, -0.7799057743d, -0.5546100667d, 0, - -0.2098319339d, 0.85037073d, 0.4825351604d, 0, -0.4592603758d, 0.6598504336d, -0.5947077538d, 0, 0.8715945488d, 0.09616365406d, - -0.4807031248d, 0, -0.6776666319d, 0.7118504878d, -0.1844907016d, 0, 0.7044377633d, 0.312427597d, 0.637304036d, 0, - -0.7052318886d, -0.2401093292d, -0.6670798253d, 0, 0.081921007d, -0.7207336136d, -0.6883545647d, 0, -0.6993680906d, - -0.5875763221d, -0.4069869034d, 0, -0.1281454481d, 0.6419895885d, 0.7559286424d, 0, -0.6337388239d, -0.6785471501d, - -0.3714146849d, 0, 0.5565051903d, -0.2168887573d, -0.8020356851d, 0, -0.5791554484d, 0.7244372011d, -0.3738578718d, 0, - 0.1175779076d, -0.7096451073d, 0.6946792478d, 0, -0.6134619607d, 0.1323631078d, 0.7785527795d, 0, 0.6984635305d, - -0.02980516237d, -0.715024719d, 0, 0.8318082963d, -0.3930171956d, 0.3919597455d, 0, 0.1469576422d, 0.05541651717d, - -0.9875892167d, 0, 0.708868575d, -0.2690503865d, 0.6520101478d, 0, 0.2726053183d, 0.67369766d, -0.68688995d, 0, -0.6591295371d, - 0.3035458599d, -0.6880466294d, 0, 0.4815131379d, -0.7528270071d, 0.4487723203d, 0, 0.9430009463d, 0.1675647412d, -0.2875261255d, - 0, 0.434802957d, 0.7695304522d, -0.4677277752d, 0, 0.3931996188d, 0.594473625d, 0.7014236729d, 0, 0.7254336655d, -0.603925654d, - 0.3301814672d, 0, 0.7590235227d, -0.6506083235d, 0.02433313207d, 0, -0.8552768592d, -0.3430042733d, 0.3883935666d, 0, - -0.6139746835d, 0.6981725247d, 0.3682257648d, 0, -0.7465905486d, -0.5752009504d, 0.3342849376d, 0, 0.5730065677d, 0.810555537d, - -0.1210916791d, 0, -0.9225877367d, -0.3475211012d, -0.167514036d, 0, -0.7105816789d, -0.4719692027d, -0.5218416899d, 0, - -0.08564609717d, 0.3583001386d, 0.929669703d, 0, -0.8279697606d, -0.2043157126d, 0.5222271202d, 0, 0.427944023d, 0.278165994d, - 0.8599346446d, 0, 0.5399079671d, -0.7857120652d, -0.3019204161d, 0, 0.5678404253d, -0.5495413974d, -0.6128307303d, 0, - -0.9896071041d, 0.1365639107d, -0.04503418428d, 0, -0.6154342638d, -0.6440875597d, 0.4543037336d, 0, 0.1074204368d, - -0.7946340692d, 0.5975094525d, 0, -0.3595449969d, -0.8885529948d, 0.28495784d, 0, -0.2180405296d, 0.1529888965d, 0.9638738118d, - 0, -0.7277432317d, -0.6164050508d, -0.3007234646d, 0, 0.7249729114d, -0.00669719484d, 0.6887448187d, 0, -0.5553659455d, - -0.5336586252d, 0.6377908264d, 0, 0.5137558015d, 0.7976208196d, -0.3160000073d, 0, -0.3794024848d, 0.9245608561d, - -0.03522751494d, 0, 0.8229248658d, 0.2745365933d, -0.4974176556d, 0, -0.5404114394d, 0.6091141441d, 0.5804613989d, 0, - 0.8036581901d, -0.2703029469d, 0.5301601931d, 0, 0.6044318879d, 0.6832968393d, 0.4095943388d, 0, 0.06389988817d, 0.9658208605d, - -0.2512108074d, 0, 0.1087113286d, 0.7402471173d, -0.6634877936d, 0, -0.713427712d, -0.6926784018d, 0.1059128479d, 0, - 0.6458897819d, -0.5724548511d, -0.5050958653d, 0, -0.6553931414d, 0.7381471625d, 0.159995615d, 0, 0.3910961323d, 0.9188871375d, - -0.05186755998d, 0, -0.4879022471d, -0.5904376907d, 0.6429111375d, 0, 0.6014790094d, 0.7707441366d, -0.2101820095d, 0, - -0.5677173047d, 0.7511360995d, 0.3368851762d, 0, 0.7858573506d, 0.226674665d, 0.5753666838d, 0, -0.4520345543d, -0.604222686d, - -0.6561857263d, 0, 0.002272116345d, 0.4132844051d, -0.9105991643d, 0, -0.5815751419d, -0.5162925989d, 0.6286591339d, 0, - -0.03703704785d, 0.8273785755d, 0.5604221175d, 0, -0.5119692504d, 0.7953543429d, -0.3244980058d, 0, -0.2682417366d, - -0.9572290247d, -0.1084387619d, 0, -0.2322482736d, -0.9679131102d, -0.09594243324d, 0, 0.3554328906d, -0.8881505545d, - 0.2913006227d, 0, 0.7346520519d, -0.4371373164d, 0.5188422971d, 0, 0.9985120116d, 0.04659011161d, -0.02833944577d, 0, - -0.3727687496d, -0.9082481361d, 0.1900757285d, 0, 0.91737377d, -0.3483642108d, 0.1925298489d, 0, 0.2714911074d, 0.4147529736d, - -0.8684886582d, 0, 0.5131763485d, -0.7116334161d, 0.4798207128d, 0, -0.8737353606d, 0.18886992d, -0.4482350644d, 0, - 0.8460043821d, -0.3725217914d, 0.3814499973d, 0, 0.8978727456d, -0.1780209141d, -0.4026575304d, 0, 0.2178065647d, - -0.9698322841d, -0.1094789531d, 0, -0.1518031304d, -0.7788918132d, -0.6085091231d, 0, -0.2600384876d, -0.4755398075d, - -0.8403819825d, 0, 0.572313509d, -0.7474340931d, -0.3373418503d, 0, -0.7174141009d, 0.1699017182d, -0.6756111411d, 0, - -0.684180784d, 0.02145707593d, -0.7289967412d, 0, -0.2007447902d, 0.06555605789d, -0.9774476623d, 0, -0.1148803697d, - -0.8044887315d, 0.5827524187d, 0, -0.7870349638d, 0.03447489231d, 0.6159443543d, 0, -0.2015596421d, 0.6859872284d, - 0.6991389226d, 0, -0.08581082512d, -0.10920836d, -0.9903080513d, 0, 0.5532693395d, 0.7325250401d, -0.396610771d, 0, - -0.1842489331d, -0.9777375055d, -0.1004076743d, 0, 0.0775473789d, -0.9111505856d, 0.4047110257d, 0, 0.1399838409d, - 0.7601631212d, -0.6344734459d, 0, 0.4484419361d, -0.845289248d, 0.2904925424d, 0 - }; - - private static final double[] RAND_VECS_2D = { - -0.2700222198d, -0.9628540911d, 0.3863092627d, -0.9223693152d, 0.04444859006d, -0.999011673d, -0.5992523158d, -0.8005602176d, - -0.7819280288d, 0.6233687174d, 0.9464672271d, 0.3227999196d, -0.6514146797d, -0.7587218957d, 0.9378472289d, 0.347048376d, - -0.8497875957d, -0.5271252623d, -0.879042592d, 0.4767432447d, -0.892300288d, -0.4514423508d, -0.379844434d, -0.9250503802d, - -0.9951650832d, 0.0982163789d, 0.7724397808d, -0.6350880136d, 0.7573283322d, -0.6530343002d, -0.9928004525d, -0.119780055d, - -0.0532665713d, 0.9985803285d, 0.9754253726d, -0.2203300762d, -0.7665018163d, 0.6422421394d, 0.991636706d, 0.1290606184d, - -0.994696838d, 0.1028503788d, -0.5379205513d, -0.84299554d, 0.5022815471d, -0.8647041387d, 0.4559821461d, -0.8899889226d, - -0.8659131224d, -0.5001944266d, 0.0879458407d, -0.9961252577d, -0.5051684983d, 0.8630207346d, 0.7753185226d, -0.6315704146d, - -0.6921944612d, 0.7217110418d, -0.5191659449d, -0.8546734591d, 0.8978622882d, -0.4402764035d, -0.1706774107d, 0.9853269617d, - -0.9353430106d, -0.3537420705d, -0.9992404798d, 0.03896746794d, -0.2882064021d, -0.9575683108d, -0.9663811329d, 0.2571137995d, - -0.8759714238d, -0.4823630009d, -0.8303123018d, -0.5572983775d, 0.05110133755d, -0.9986934731d, -0.8558373281d, -0.5172450752d, - 0.09887025282d, 0.9951003332d, 0.9189016087d, 0.3944867976d, -0.2439375892d, -0.9697909324d, -0.8121409387d, -0.5834613061d, - -0.9910431363d, 0.1335421355d, 0.8492423985d, -0.5280031709d, -0.9717838994d, -0.2358729591d, 0.9949457207d, 0.1004142068d, - 0.6241065508d, -0.7813392434d, 0.662910307d, 0.7486988212d, -0.7197418176d, 0.6942418282d, -0.8143370775d, -0.5803922158d, - 0.104521054d, -0.9945226741d, -0.1065926113d, -0.9943027784d, 0.445799684d, -0.8951327509d, 0.105547406d, 0.9944142724d, - -0.992790267d, 0.1198644477d, -0.8334366408d, 0.552615025d, 0.9115561563d, -0.4111755999d, 0.8285544909d, -0.5599084351d, - 0.7217097654d, -0.6921957921d, 0.4940492677d, -0.8694339084d, -0.3652321272d, -0.9309164803d, -0.9696606758d, 0.2444548501d, - 0.08925509731d, -0.996008799d, 0.5354071276d, -0.8445941083d, -0.1053576186d, 0.9944343981d, -0.9890284586d, 0.1477251101d, - 0.004856104961d, 0.9999882091d, 0.9885598478d, 0.1508291331d, 0.9286129562d, -0.3710498316d, -0.5832393863d, -0.8123003252d, - 0.3015207509d, 0.9534596146d, -0.9575110528d, 0.2883965738d, 0.9715802154d, -0.2367105511d, 0.229981792d, 0.9731949318d, - 0.955763816d, -0.2941352207d, 0.740956116d, 0.6715534485d, -0.9971513787d, -0.07542630764d, 0.6905710663d, -0.7232645452d, - -0.290713703d, -0.9568100872d, 0.5912777791d, -0.8064679708d, -0.9454592212d, -0.325740481d, 0.6664455681d, 0.74555369d, - 0.6236134912d, 0.7817328275d, 0.9126993851d, -0.4086316587d, -0.8191762011d, 0.5735419353d, -0.8812745759d, -0.4726046147d, - 0.9953313627d, 0.09651672651d, 0.9855650846d, -0.1692969699d, -0.8495980887d, 0.5274306472d, 0.6174853946d, -0.7865823463d, - 0.8508156371d, 0.52546432d, 0.9985032451d, -0.05469249926d, 0.1971371563d, -0.9803759185d, 0.6607855748d, -0.7505747292d, - -0.03097494063d, 0.9995201614d, -0.6731660801d, 0.739491331d, -0.7195018362d, -0.6944905383d, 0.9727511689d, 0.2318515979d, - 0.9997059088d, -0.0242506907d, 0.4421787429d, -0.8969269532d, 0.9981350961d, -0.061043673d, -0.9173660799d, -0.3980445648d, - -0.8150056635d, -0.5794529907d, -0.8789331304d, 0.4769450202d, 0.0158605829d, 0.999874213d, -0.8095464474d, 0.5870558317d, - -0.9165898907d, -0.3998286786d, -0.8023542565d, 0.5968480938d, -0.5176737917d, 0.8555780767d, -0.8154407307d, -0.5788405779d, - 0.4022010347d, -0.9155513791d, -0.9052556868d, -0.4248672045d, 0.7317445619d, 0.6815789728d, -0.5647632201d, -0.8252529947d, - -0.8403276335d, -0.5420788397d, -0.9314281527d, 0.363925262d, 0.5238198472d, 0.8518290719d, 0.7432803869d, -0.6689800195d, - -0.985371561d, -0.1704197369d, 0.4601468731d, 0.88784281d, 0.825855404d, 0.5638819483d, 0.6182366099d, 0.7859920446d, - 0.8331502863d, -0.553046653d, 0.1500307506d, 0.9886813308d, -0.662330369d, -0.7492119075d, -0.668598664d, 0.743623444d, - 0.7025606278d, 0.7116238924d, -0.5419389763d, -0.8404178401d, -0.3388616456d, 0.9408362159d, 0.8331530315d, 0.5530425174d, - -0.2989720662d, -0.9542618632d, 0.2638522993d, 0.9645630949d, 0.124108739d, -0.9922686234d, -0.7282649308d, -0.6852956957d, - 0.6962500149d, 0.7177993569d, -0.9183535368d, 0.3957610156d, -0.6326102274d, -0.7744703352d, -0.9331891859d, -0.359385508d, - -0.1153779357d, -0.9933216659d, 0.9514974788d, -0.3076565421d, -0.08987977445d, -0.9959526224d, 0.6678496916d, 0.7442961705d, - 0.7952400393d, -0.6062947138d, -0.6462007402d, -0.7631674805d, -0.2733598753d, 0.9619118351d, 0.9669590226d, -0.254931851d, - -0.9792894595d, 0.2024651934d, -0.5369502995d, -0.8436138784d, -0.270036471d, -0.9628500944d, -0.6400277131d, 0.7683518247d, - -0.7854537493d, -0.6189203566d, 0.06005905383d, -0.9981948257d, -0.02455770378d, 0.9996984141d, -0.65983623d, 0.751409442d, - -0.6253894466d, -0.7803127835d, -0.6210408851d, -0.7837781695d, 0.8348888491d, 0.5504185768d, -0.1592275245d, 0.9872419133d, - 0.8367622488d, 0.5475663786d, -0.8675753916d, -0.4973056806d, -0.2022662628d, -0.9793305667d, 0.9399189937d, 0.3413975472d, - 0.9877404807d, -0.1561049093d, -0.9034455656d, 0.4287028224d, 0.1269804218d, -0.9919052235d, -0.3819600854d, 0.924178821d, - 0.9754625894d, 0.2201652486d, -0.3204015856d, -0.9472818081d, -0.9874760884d, 0.1577687387d, 0.02535348474d, -0.9996785487d, - 0.4835130794d, -0.8753371362d, -0.2850799925d, -0.9585037287d, -0.06805516006d, -0.99768156d, -0.7885244045d, -0.6150034663d, - 0.3185392127d, -0.9479096845d, 0.8880043089d, 0.4598351306d, 0.6476921488d, -0.7619021462d, 0.9820241299d, 0.1887554194d, - 0.9357275128d, -0.3527237187d, -0.8894895414d, 0.4569555293d, 0.7922791302d, 0.6101588153d, 0.7483818261d, 0.6632681526d, - -0.7288929755d, -0.6846276581d, 0.8729032783d, -0.4878932944d, 0.8288345784d, 0.5594937369d, 0.08074567077d, 0.9967347374d, - 0.9799148216d, -0.1994165048d, -0.580730673d, -0.8140957471d, -0.4700049791d, -0.8826637636d, 0.2409492979d, 0.9705377045d, - 0.9437816757d, -0.3305694308d, -0.8927998638d, -0.4504535528d, -0.8069622304d, 0.5906030467d, 0.06258973166d, 0.9980393407d, - -0.9312597469d, 0.3643559849d, 0.5777449785d, 0.8162173362d, -0.3360095855d, -0.941858566d, 0.697932075d, -0.7161639607d, - -0.002008157227d, -0.9999979837d, -0.1827294312d, -0.9831632392d, -0.6523911722d, 0.7578824173d, -0.4302626911d, -0.9027037258d, - -0.9985126289d, -0.05452091251d, -0.01028102172d, -0.9999471489d, -0.4946071129d, 0.8691166802d, -0.2999350194d, 0.9539596344d, - 0.8165471961d, 0.5772786819d, 0.2697460475d, 0.962931498d, -0.7306287391d, -0.6827749597d, -0.7590952064d, -0.6509796216d, - -0.907053853d, 0.4210146171d, -0.5104861064d, -0.8598860013d, 0.8613350597d, 0.5080373165d, 0.5007881595d, -0.8655698812d, - -0.654158152d, 0.7563577938d, -0.8382755311d, -0.545246856d, 0.6940070834d, 0.7199681717d, 0.06950936031d, 0.9975812994d, - 0.1702942185d, -0.9853932612d, 0.2695973274d, 0.9629731466d, 0.5519612192d, -0.8338697815d, 0.225657487d, -0.9742067022d, - 0.4215262855d, -0.9068161835d, 0.4881873305d, -0.8727388672d, -0.3683854996d, -0.9296731273d, -0.9825390578d, 0.1860564427d, - 0.81256471d, 0.5828709909d, 0.3196460933d, -0.9475370046d, 0.9570913859d, 0.2897862643d, -0.6876655497d, -0.7260276109d, - -0.9988770922d, -0.047376731d, -0.1250179027d, 0.992154486d, -0.8280133617d, 0.560708367d, 0.9324863769d, -0.3612051451d, - 0.6394653183d, 0.7688199442d, -0.01623847064d, -0.9998681473d, -0.9955014666d, -0.09474613458d, -0.81453315d, 0.580117012d, - 0.4037327978d, -0.9148769469d, 0.9944263371d, 0.1054336766d, -0.1624711654d, 0.9867132919d, -0.9949487814d, -0.100383875d, - -0.6995302564d, 0.7146029809d, 0.5263414922d, -0.85027327d, -0.5395221479d, 0.841971408d, 0.6579370318d, 0.7530729462d, - 0.01426758847d, -0.9998982128d, -0.6734383991d, 0.7392433447d, 0.639412098d, -0.7688642071d, 0.9211571421d, 0.3891908523d, - -0.146637214d, -0.9891903394d, -0.782318098d, 0.6228791163d, -0.5039610839d, -0.8637263605d, -0.7743120191d, -0.6328039957d, - }; - - - private DistanceFunction distanceFunction = DistanceFunction.EuclideanSq; - private ReturnType returnType = ReturnType.Distance; - private double jitterModifier = 1.0; - - private NoiseSampler noiseLookup; - - private boolean saltLookup; - - public CellularSampler() { - noiseLookup = new OpenSimplex2Sampler(); - } - - public void setDistanceFunction(DistanceFunction distanceFunction) { - this.distanceFunction = distanceFunction; - } - - public void setJitterModifier(double jitterModifier) { - this.jitterModifier = jitterModifier; - } - - public void setNoiseLookup(NoiseSampler noiseLookup) { - this.noiseLookup = noiseLookup; - } - - public void setReturnType(ReturnType returnType) { - this.returnType = returnType; - } - - public void setSaltLookup(boolean saltLookup) { - this.saltLookup = saltLookup; - } - - @Override - public double getNoiseRaw(long sl, double x, double y) { - int seed = (int) sl; - int xr = (int) Math.round(x); - int yr = (int) Math.round(y); - - double distance0 = Double.MAX_VALUE; - double distance1 = Double.MAX_VALUE; - double distance2 = Double.MAX_VALUE; - - int closestHash = 0; - - double cellularJitter = 0.43701595 * jitterModifier; - - int xPrimed = (xr - 1) * PRIME_X; - int yPrimedBase = (yr - 1) * PRIME_Y; - - double centerX = x; - double centerY = y; - - for(int xi = xr - 1; xi <= xr + 1; xi++) { - int yPrimed = yPrimedBase; - - for(int yi = yr - 1; yi <= yr + 1; yi++) { - int hash = hash(seed, xPrimed, yPrimed); - int idx = hash & (255 << 1); - - double vecX = (xi - x) + RAND_VECS_2D[idx] * cellularJitter; - double vecY = (yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter; - - double newDistance = switch(distanceFunction) { - case Manhattan -> Math.abs(vecX) + Math.abs(vecY); - case Hybrid -> (Math.abs(vecX) + Math.abs(vecY)) + (vecX * vecX + vecY * vecY); - default -> vecX * vecX + vecY * vecY; - }; - - distance1 = Math.max(Math.min(distance1, newDistance), distance0); - if(newDistance < distance0) { - distance0 = newDistance; - closestHash = hash; - centerX = ((xi + RAND_VECS_2D[idx] * cellularJitter) / frequency); - centerY = ((yi + RAND_VECS_2D[idx | 1] * cellularJitter) / frequency); - } else if(newDistance < distance1) { - distance2 = distance1; - distance1 = newDistance; - } else if(newDistance < distance2) { - distance2 = newDistance; - } - yPrimed += PRIME_Y; - } - xPrimed += PRIME_X; - } - - if(distanceFunction == DistanceFunction.Euclidean && returnType != ReturnType.CellValue) { - distance0 = Math.sqrt(distance0); - - if (returnType != ReturnType.Distance) { - distance1 = Math.sqrt(distance1); - } - } - - return switch(returnType) { - case CellValue -> closestHash * (1 / 2147483648.0); - case Distance -> distance0 - 1; - case Distance2 -> distance1 - 1; - case Distance2Add -> (distance1 + distance0) * 0.5 - 1; - case Distance2Sub -> distance1 - distance0 - 1; - case Distance2Mul -> distance1 * distance0 * 0.5 - 1; - case Distance2Div -> distance0 / distance1 - 1; - case NoiseLookup -> noiseLookup.noise(sl - (saltLookup ? 0 : salt), centerX, centerY); - case LocalNoiseLookup -> noiseLookup.noise(sl - (saltLookup ? 0 : salt), x / frequency - centerX, y / frequency - centerY); - case Distance3 -> distance2 - 1; - case Distance3Add -> (distance2 + distance0) * 0.5 - 1; - case Distance3Sub -> distance2 - distance0 - 1; - case Distance3Mul -> distance2 * distance0 - 1; - case Distance3Div -> distance0 / distance2 - 1; - case Angle -> Math.atan2(y / frequency - centerY, x / frequency - centerX); - }; - } - - @Override - public double getNoiseRaw(long sl, double x, double y, double z) { - int seed = (int) sl; - int xr = (int) Math.round(x); - int yr = (int) Math.round(y); - int zr = (int) Math.round(z); - - double distance0 = Double.MAX_VALUE; - double distance1 = Double.MAX_VALUE; - double distance2 = Double.MAX_VALUE; - int closestHash = 0; - - double cellularJitter = 0.39614353 * jitterModifier; - - int xPrimed = (xr - 1) * PRIME_X; - int yPrimedBase = (yr - 1) * PRIME_Y; - int zPrimedBase = (zr - 1) * PRIME_Z; - - double centerX = x; - double centerY = y; - double centerZ = z; - - for(int xi = xr - 1; xi <= xr + 1; xi++) { - int yPrimed = yPrimedBase; - - for(int yi = yr - 1; yi <= yr + 1; yi++) { - int zPrimed = zPrimedBase; - - for(int zi = zr - 1; zi <= zr + 1; zi++) { - int hash = hash(seed, xPrimed, yPrimed, zPrimed); - int idx = hash & (255 << 2); - - double vecX = (xi - x) + RAND_VECS_3D[idx] * cellularJitter; - double vecY = (yi - y) + RAND_VECS_3D[idx | 1] * cellularJitter; - double vecZ = (zi - z) + RAND_VECS_3D[idx | 2] * cellularJitter; - - double newDistance = 0; - switch(distanceFunction) { - case Euclidean, EuclideanSq -> newDistance = vecX * vecX + vecY * vecY + vecZ * vecZ; - case Manhattan -> newDistance = Math.abs(vecX) + Math.abs(vecY) + Math.abs(vecZ); - case Hybrid -> { - newDistance = (Math.abs(vecX) + Math.abs(vecY) + Math.abs(vecZ)) + (vecX * vecX + vecY * vecY + vecZ * vecZ); - distance1 = Math.max(Math.min(distance1, newDistance), distance0); - } - } - - if(newDistance < distance0) { - distance0 = newDistance; - closestHash = hash; - centerX = ((xi + RAND_VECS_3D[idx] * cellularJitter) / frequency); - centerY = ((yi + RAND_VECS_3D[idx | 1] * cellularJitter) / frequency); - centerZ = ((zi + RAND_VECS_3D[idx | 2] * cellularJitter) / frequency); - } else if(newDistance < distance1) { - distance2 = distance1; - distance1 = newDistance; - } else if(newDistance < distance2) { - distance2 = newDistance; - } - zPrimed += PRIME_Z; - } - yPrimed += PRIME_Y; - } - xPrimed += PRIME_X; - } - - if(distanceFunction == DistanceFunction.Euclidean && returnType != ReturnType.CellValue) { - distance0 = Math.sqrt(distance0); - - if (returnType != ReturnType.Distance) { - distance1 = Math.sqrt(distance1); - } - } - - return switch(returnType) { - case CellValue -> closestHash * (1 / 2147483648.0); - case Distance -> distance0 - 1; - case Distance2 -> distance1 - 1; - case Distance2Add -> (distance1 + distance0) * 0.5 - 1; - case Distance2Sub -> distance1 - distance0 - 1; - case Distance2Mul -> distance1 * distance0 * 0.5 - 1; - case Distance2Div -> distance0 / distance1 - 1; - case NoiseLookup -> noiseLookup.noise(sl - (saltLookup ? 0 : salt), centerX, centerY, centerZ); - case LocalNoiseLookup -> noiseLookup.noise(sl - (saltLookup ? 0 : salt), x / frequency - centerX, y / frequency - centerY, z / frequency - centerZ); - case Distance3 -> distance2 - 1; - case Distance3Add -> (distance2 + distance0) * 0.5 - 1; - case Distance3Sub -> distance2 - distance0 - 1; - case Distance3Mul -> distance2 * distance0 - 1; - case Distance3Div -> distance0 / distance2 - 1; - case Angle -> Math.atan2(y / frequency - centerY, x / frequency - centerX); - }; - } - - public enum DistanceFunction { - Euclidean, - EuclideanSq, - Manhattan, - Hybrid - } - - - public enum ReturnType { - CellValue, - Distance, - Distance2, - Distance2Add, - Distance2Sub, - Distance2Mul, - Distance2Div, - NoiseLookup, - LocalNoiseLookup, - Distance3, - Distance3Add, - Distance3Sub, - Distance3Mul, - Distance3Div, - Angle - } -} 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 deleted file mode 100644 index 19430d232..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise; - -/** - * Sampler3D implementation that returns a constant. - */ -public class ConstantSampler extends NoiseFunction { - private final double constant; - - public ConstantSampler(double constant) { - this.constant = constant; - } - - @Override - public double getNoiseRaw(long seed, double x, double y) { - return constant; - } - - @Override - 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/DerivativeNoiseFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DerivativeNoiseFunction.java deleted file mode 100644 index 0d654eb64..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DerivativeNoiseFunction.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers.noise; - -import com.dfsek.terra.api.noise.DerivativeNoiseSampler; - - -public abstract class DerivativeNoiseFunction extends NoiseFunction implements DerivativeNoiseSampler { - @Override - public boolean isDifferentiable() { - return true; - } - - @Override - public double[] noised(long seed, double x, double y) { - return getNoiseDerivativeRaw(seed + salt, x * frequency, y * frequency); - } - - @Override - public double[] noised(long seed, double x, double y, double z) { - return getNoiseDerivativeRaw(seed + salt, x * frequency, y * frequency, z * frequency); - } - - public abstract double[] getNoiseDerivativeRaw(long seed, double x, double y); - - public abstract double[] getNoiseDerivativeRaw(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/DistanceSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DistanceSampler.java deleted file mode 100644 index 0cc9087b4..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DistanceSampler.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers.noise; - - -public class DistanceSampler extends NoiseFunction { - - private final DistanceFunction distanceFunction; - private final double ox, oy, oz; - private final boolean normalize; - private final double radius; - - private final double distanceAtRadius; - - public DistanceSampler(DistanceFunction distanceFunction, double ox, double oy, double oz, boolean normalize, double radius) { - frequency = 1; - this.distanceFunction = distanceFunction; - this.ox = ox; - this.oy = oy; - this.oz = oz; - this.normalize = normalize; - this.radius = radius; - this.distanceAtRadius = distance2d(distanceFunction, radius, 0); // distance2d and distance3d should return the same value - } - - private static double distance2d(DistanceFunction distanceFunction, double x, double z) { - return switch(distanceFunction) { - case Euclidean -> Math.sqrt(x * x + z * z); - case EuclideanSq -> x * x + z * z; - case Manhattan -> Math.abs(x) + Math.abs(z); - }; - } - - private static double distance3d(DistanceFunction distanceFunction, double x, double y, double z) { - return switch(distanceFunction) { - case Euclidean -> Math.sqrt(x * x + y * y + z * z); - case EuclideanSq -> x * x + y * y + z * z; - case Manhattan -> Math.abs(x) + Math.abs(y) + Math.abs(z); - }; - } - - @Override - public double getNoiseRaw(long seed, double x, double y) { - double dx = x - ox; - double dy = y - oz; - if(normalize && (Math.abs(dx) > radius || Math.abs(dy) > radius)) return 1; - double dist = distance2d(distanceFunction, dx, dy); - if(normalize) return Math.min(((2 * dist) / distanceAtRadius) - 1, 1); - return dist; - } - - @Override - public double getNoiseRaw(long seed, double x, double y, double z) { - double dx = x - ox; - double dy = y - oy; - double dz = z - oz; - if(normalize && (Math.abs(dx) > radius || Math.abs(dy) > radius || Math.abs(dz) > radius)) return 1; - double dist = distance3d(distanceFunction, dx, dy, dz); - if(normalize) return Math.min(((2 * dist) / distanceAtRadius) - 1, 1); - return dist; - } - - public enum DistanceFunction { - Euclidean, - EuclideanSq, - Manhattan - } -} 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 deleted file mode 100644 index 08212025d..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise; - -import com.dfsek.paralithic.Expression; -import com.dfsek.paralithic.eval.parser.Parser; -import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; -import com.dfsek.paralithic.eval.parser.Scope; -import com.dfsek.paralithic.eval.tokenizer.ParseException; -import com.dfsek.paralithic.functions.Function; - -import java.util.Map; - -import com.dfsek.terra.addons.noise.paralithic.noise.SeedContext; - - -/** - * NoiseSampler implementation using a Paralithic expression. - */ -public class ExpressionFunction extends NoiseFunction { - private final Expression expression; - - public ExpressionFunction(Map functions, String eq, Map vars, ParseOptions parseOptions) throws ParseException { - Parser p = new Parser(parseOptions); - Scope scope = new Scope(); - - scope.addInvocationVariable("x"); - scope.addInvocationVariable("y"); - scope.addInvocationVariable("z"); - - vars.forEach(scope::create); - - functions.forEach(p::registerFunction); - - expression = p.parse(eq, scope); - frequency = 1; - } - - @Override - public double getNoiseRaw(long seed, double x, double y) { - return expression.evaluate(new SeedContext(seed), x, 0, y); - } - - @Override - 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 deleted file mode 100644 index c285203b1..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise; - -import com.dfsek.terra.addons.noise.samplers.noise.random.WhiteNoiseSampler; -import com.dfsek.terra.api.util.MathUtil; - - -public class GaborNoiseSampler extends NoiseFunction { - private final WhiteNoiseSampler rand; - private double k = 1.0; - private double a = 0.1; - private double f0 = 0.625; - private double kernelRadius = (Math.sqrt(-Math.log(0.05) / Math.PI) / a); - private double impulsesPerKernel = 64d; - private double impulseDensity = (impulsesPerKernel / (Math.PI * kernelRadius * kernelRadius)); - private double impulsesPerCell = impulseDensity * kernelRadius * kernelRadius; - private double g = Math.exp(-impulsesPerCell); - private double omega0 = Math.PI * 0.25; - private boolean isotropic = true; - - - public GaborNoiseSampler() { - rand = new WhiteNoiseSampler(); - } - - private void recalculateRadiusAndDensity() { - kernelRadius = (Math.sqrt(-Math.log(0.05) / Math.PI) / this.a); - impulseDensity = (impulsesPerKernel / (Math.PI * kernelRadius * kernelRadius)); - impulsesPerCell = impulseDensity * kernelRadius * kernelRadius; - g = Math.exp(-impulsesPerCell); - } - - private double gaborNoise(long seed, double x, double y) { - x /= kernelRadius; - y /= kernelRadius; - int xi = (int) Math.floor(x); - int yi = (int) Math.floor(y); - double xf = x - xi; - double yf = y - yi; - double noise = 0; - for(int dx = -1; dx <= 1; dx++) { - for(int dz = -1; dz <= 1; dz++) { - noise += calculateCell(seed, xi + dx, yi + dz, xf - dx, yf - dz); - } - } - return noise; - } - - private double calculateCell(long seed, int xi, int yi, double x, double y) { - long mashedSeed = MathUtil.murmur64(31L * xi + yi) + seed; - - double gaussianSource = (rand.getNoiseRaw(mashedSeed++) + 1) / 2; - int impulses = 0; - while(gaussianSource > g) { - impulses++; - gaussianSource *= (rand.getNoiseRaw(mashedSeed++) + 1) / 2; - } - - double noise = 0; - for(int i = 0; i < impulses; i++) { - noise += rand.getNoiseRaw(mashedSeed++) * gabor(isotropic ? (rand.getNoiseRaw(mashedSeed++) + 1) * Math.PI : omega0, - x * kernelRadius, y * kernelRadius); - } - return noise; - } - - private double gabor(double omega_0, double x, double y) { - return k * (Math.exp(-Math.PI * (a * a) * (x * x + y * y)) * MathUtil.cos(2 * Math.PI * f0 * (x * MathUtil.cos(omega_0) + - y * MathUtil.sin( - omega_0)))); - } - - public void setA(double a) { - this.a = a; - recalculateRadiusAndDensity(); - } - - public void setDeviation(double k) { - this.k = k; - } - - public void setFrequency0(double f0) { - this.f0 = f0; - } - - public void setImpulsesPerKernel(double impulsesPerKernel) { - this.impulsesPerKernel = impulsesPerKernel; - recalculateRadiusAndDensity(); - } - - public void setIsotropic(boolean isotropic) { - this.isotropic = isotropic; - } - - public void setRotation(double omega0) { - this.omega0 = Math.PI * omega0; - } - - @Override - public double getNoiseRaw(long seed, double x, double z) { - return gaborNoise(seed, x, z); - } - - @Override - public double getNoiseRaw(long seed, double x, double y, double z) { - return gaborNoise(seed, x, z); - } -} 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 deleted file mode 100644 index 49635ef52..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public abstract class NoiseFunction implements NoiseSampler { - // Hashing - protected static final int PRIME_X = 501125321; - protected static final int PRIME_Y = 1136930381; - protected static final int PRIME_Z = 1720413743; - - protected double frequency = 0.02d; - protected long salt; - - public NoiseFunction() { - this.salt = 0; - } - - protected static int hash(int seed, int xPrimed, int yPrimed, int zPrimed) { - int hash = seed ^ xPrimed ^ yPrimed ^ zPrimed; - - hash *= 0x27d4eb2d; - return hash; - } - - protected static int hash(int seed, int xPrimed, int yPrimed) { - int hash = seed ^ xPrimed ^ yPrimed; - - hash *= 0x27d4eb2d; - return hash; - } - - public void setSalt(long salt) { - this.salt = salt; - } - - public double getFrequency() { - return frequency; - } - - public void setFrequency(double frequency) { - this.frequency = frequency; - } - - @Override - public double noise(long seed, double x, double y) { - return getNoiseRaw(seed + salt, x * frequency, y * frequency); - } - - @Override - public double noise(long seed, double x, double y, double z) { - return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency); - } - - public abstract double getNoiseRaw(long seed, double x, double y); - - 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/PseudoErosionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java deleted file mode 100644 index ecb566ca7..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers.noise; - - -import com.dfsek.terra.api.noise.DerivativeNoiseSampler; -import com.dfsek.terra.api.util.MathUtil; - - -public class PseudoErosionSampler extends NoiseFunction { - public static final double TAU = 2.0 * Math.PI; - private static final double HASH_X = 0.3183099f; - private static final double HASH_Y = 0.3678794f; - public final double gain; - public final double lacunarity; - public final double slopeStrength; - public final double branchStrength; - public final double erosionStrength; - private final int octaves; - private final double erosionFrequency; - private final DerivativeNoiseSampler sampler; - private final boolean slopeMask; - private final double slopeMaskFullSq; - private final double slopeMaskNoneSq; - private final double jitter; - private final double maxCellDistSq; - private final double maxCellDistSqRecip; - private final boolean averageErosionImpulses; - - public PseudoErosionSampler(int octaves, double gain, double lacunarity, double slopeStrength, double branchStrength, - double erosionStrength, double erosionFrequency, DerivativeNoiseSampler sampler, - boolean slopeMask, double slopeMaskFull, double slopeMaskNone, double jitterModifier, - boolean averageErosionImpulses) { - this.octaves = octaves; - this.gain = gain; - this.lacunarity = lacunarity; - this.slopeStrength = slopeStrength; - this.branchStrength = branchStrength; - this.erosionStrength = erosionStrength; - this.erosionFrequency = erosionFrequency; - this.sampler = sampler; - this.slopeMask = slopeMask; - // Square these values and maintain sign since they're compared to a - // squared value, otherwise a sqrt would need to be used - this.slopeMaskFullSq = slopeMaskFull * slopeMaskFull * Math.signum(slopeMaskFull); - this.slopeMaskNoneSq = slopeMaskNone * slopeMaskNone * Math.signum((slopeMaskNone)); - this.jitter = 0.43701595 * jitterModifier; - this.averageErosionImpulses = averageErosionImpulses; - this.maxCellDistSq = 1 + jitter * jitter; - this.maxCellDistSqRecip = 1 / maxCellDistSq; - } - - public static double hashX(double seed, double n) { - // Swapped the components here - double nx = HASH_X * n * seed; - return -1.0f + 2.0f * fract(nx); - } - - public static double hashY(double seed, double n) { - double ny = HASH_Y * n * seed; - return -1.0f + 2.0f * fract(ny); - } - - public static double fract(double x) { - return (x - Math.floor(x)); - } - - public static double smoothstep(double edge0, double edge1, double x) { - // Scale, bias and saturate x to 0..1 range - x = clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f); - // Evaluate polynomial - return x * x * (3 - 2 * x); - } - - public static double clamp(double x, double minVal, double maxVal) { - return Math.max(minVal, Math.min(maxVal, x)); - } - - public static double dot(double x1, double y1, double x2, double y2) { - return x1 * x2 + y1 * y2; - } - - public double[] erosion(int seed, double x, double y, double dirX, double dirY) { - int gridX = (int) Math.round(x); - int gridY = (int) Math.round(y); - double noise = 0.0f; - double dirOutX = 0.0f; - double dirOutY = 0.0f; - double cumAmp = 0.0f; - - for(int cellX = gridX - 1; cellX <= gridX + 1; cellX++) { - for(int cellY = gridY - 1; cellY <= gridY + 1; cellY++) { - double cellHash = hash(seed, cellX, cellY); - double cellOffsetX = hashX(seed, cellHash) * jitter; - double cellOffsetY = hashY(seed, cellHash) * jitter; - double cellOriginDeltaX = (x - cellX) + cellOffsetX; - double cellOriginDeltaY = (y - cellY) + cellOffsetY; - double cellOriginDistSq = cellOriginDeltaX * cellOriginDeltaX + cellOriginDeltaY * cellOriginDeltaY; - if(cellOriginDistSq > maxCellDistSq) continue; // Skip calculating cells too far away - double ampTmp = (cellOriginDistSq * maxCellDistSqRecip) - 1; - double amp = ampTmp * ampTmp; // Decrease cell amplitude further away - cumAmp += amp; - double directionalStrength = dot(cellOriginDeltaX, cellOriginDeltaY, dirX, dirY) * TAU; - noise += MathUtil.cos(directionalStrength) * amp; - double sinAngle = MathUtil.sin(directionalStrength) * amp; - dirOutX -= sinAngle * (cellOriginDeltaX + dirX); - dirOutY -= sinAngle * (cellOriginDeltaY + dirY); - } - } - if(averageErosionImpulses && cumAmp != 0) { - noise /= cumAmp; - dirOutX /= cumAmp; - dirOutY /= cumAmp; - } - return new double[]{ noise, dirOutX, dirOutY }; - } - - public double heightMap(long seed, double x, double y) { - double[] sample = sampler.noised(seed, x, y); - double height = sample[0]; - double heightDirX = sample[1]; - double heightDirY = sample[2]; - - // Take the curl of the normal to get the gradient facing down the slope - double baseDirX = heightDirY * slopeStrength; - double baseDirY = -heightDirX * slopeStrength; - - double erosion = 0.0f; - double dirX = 0.0f; - double dirY = 0.0f; - double amp = 1.0f; - double cumAmp = 0.0f; - double freq = 1.0f; - - // Stack erosion octaves - for(int i = 0; i < octaves; i++) { - double[] erosionResult = erosion((int) seed, - x * freq * erosionFrequency, - y * freq * erosionFrequency, - baseDirX + dirY * branchStrength, - baseDirY - dirX * branchStrength); - erosion += erosionResult[0] * amp; - dirX += erosionResult[1] * amp * freq; - dirY += erosionResult[2] * amp * freq; - cumAmp += amp; - amp *= gain; - freq *= lacunarity; - } - - // Normalize erosion noise - erosion /= cumAmp; - // [-1, 1] -> [0, 1] - erosion = erosion * 0.5F + 0.5F; - - // Without masking, erosion noise in areas with small gradients tend to produce mounds, - // this reduces erosion amplitude towards smaller gradients to avoid this - if(slopeMask) { - double dirMagSq = dot(baseDirX, baseDirY, baseDirX, baseDirY); - double flatness = smoothstep((double) slopeMaskNoneSq, slopeMaskFullSq, dirMagSq); - erosion *= flatness; - } - - return height + erosion * erosionStrength; - } - - @Override - public double getNoiseRaw(long seed, double x, double y) { - return heightMap(seed, x, y); - } - - @Override - public double getNoiseRaw(long seed, double x, double y, double z) { - return getNoiseRaw(seed, x, z); - } -} \ No newline at end of file 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 deleted file mode 100644 index 26884bcdd..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.fractal; - -import com.dfsek.terra.api.noise.DerivativeNoiseSampler; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.MathUtil; - - -public class BrownianMotionSampler extends FractalNoiseFunction { - public BrownianMotionSampler(NoiseSampler input) { - super(input); - } - - @Override - public double getNoiseRaw(long seed, double x, double y) { - double sum = 0; - double amp = fractalBounding; - - for(int i = 0; i < octaves; i++) { - double noise = input.noise(seed++, x, y); - sum += noise * amp; - amp *= MathUtil.lerp(weightedStrength, 1.0, Math.min(noise + 1, 2) * 0.5); - - x *= lacunarity; - y *= lacunarity; - amp *= gain; - } - - return sum; - } - - @Override - public double getNoiseRaw(long seed, double x, double y, double z) { - double sum = 0; - double amp = fractalBounding; - - for(int i = 0; i < octaves; i++) { - double noise = input.noise(seed++, x, y, z); - sum += noise * amp; - amp *= MathUtil.lerp(weightedStrength, 1.0, (noise + 1) * 0.5); - - x *= lacunarity; - y *= lacunarity; - z *= lacunarity; - amp *= gain; - } - - return sum; - } - - @Override - public boolean isDifferentiable() { - return DerivativeNoiseSampler.isDifferentiable(input); - } - - @Override - public double[] getNoiseDerivativeRaw(long seed, double x, double y) { - double[] sum = {0, 0, 0}; - double amp = fractalBounding; - - for(int i = 0; i < octaves; i++) { - // This should only be called after `input` is verified as a `DerivativeNoiseSampler` - // so this should be a safe cast - double[] noise = ((DerivativeNoiseSampler) input).noised(seed++, x, y); - sum[0] += noise[0] * amp; - - // Directional derivative of each octave can be subject to the same addition and product - // as per derivative sum and product rules in order to produce the correct final derivative - sum[1] += noise[1] * amp; - sum[2] += noise[2] * amp; - - amp *= MathUtil.lerp(weightedStrength, 1.0, Math.min(noise[0] + 1, 2) * 0.5); - - x *= lacunarity; - y *= lacunarity; - amp *= gain; - } - - return sum; - } - - @Override - public double[] getNoiseDerivativeRaw(long seed, double x, double y, double z) { - double[] sum = {0, 0, 0, 0}; - double amp = fractalBounding; - - for(int i = 0; i < octaves; i++) { - double[] noise = ((DerivativeNoiseSampler) input).noised(seed++, x, y, z); - sum[0] += noise[0] * amp; - - // See comment in 2D version - sum[1] += noise[1] * amp; - sum[2] += noise[2] * amp; - sum[3] += noise[3] * amp; - - amp *= MathUtil.lerp(weightedStrength, 1.0, (noise[0] + 1) * 0.5); - - x *= lacunarity; - y *= lacunarity; - z *= lacunarity; - amp *= gain; - } - - return sum; - } -} 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 deleted file mode 100644 index 49e5365da..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.fractal; - -import com.dfsek.terra.addons.noise.samplers.noise.DerivativeNoiseFunction; -import com.dfsek.terra.api.noise.NoiseSampler; - - -public abstract class FractalNoiseFunction extends DerivativeNoiseFunction { - protected final NoiseSampler input; - protected double fractalBounding = 1 / 1.75; - protected int octaves = 3; - protected double gain = 0.5; - protected double lacunarity = 2.0d; - protected double weightedStrength = 0.0d; - - public FractalNoiseFunction(NoiseSampler input) { - this.input = input; - frequency = 1; - } - - protected void calculateFractalBounding() { - double gain = Math.abs(this.gain); - double amp = gain; - double ampFractal = 1.0; - for(int i = 1; i < octaves; i++) { - ampFractal += amp; - amp *= gain; - } - fractalBounding = 1 / ampFractal; - } - - public void setGain(double gain) { - this.gain = gain; - calculateFractalBounding(); - } - - public void setLacunarity(double lacunarity) { - this.lacunarity = lacunarity; - } - - public void setOctaves(int octaves) { - this.octaves = octaves; - calculateFractalBounding(); - } - - public void setWeightedStrength(double weightedStrength) { - this.weightedStrength = weightedStrength; - } - - @Override - public boolean isDifferentiable() { - return false; - } - - @Override - public double[] getNoiseDerivativeRaw(long seed, double x, double y) { - throw new UnsupportedOperationException("Implementation failed to check or set isDifferentiable correctly"); - } - - @Override - public double[] getNoiseDerivativeRaw(long seed, double x, double y, double z) { - throw new UnsupportedOperationException("Implementation failed to check or set isDifferentiable correctly"); - } -} 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 deleted file mode 100644 index 9c4206bb1..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.fractal; - -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.MathUtil; - - -public class PingPongSampler extends FractalNoiseFunction { - private double pingPongStrength = 2.0; - - public PingPongSampler(NoiseSampler input) { - super(input); - } - - - private static double pingPong(double t) { - t -= (int) (t * 0.5f) << 1; - return t < 1 ? t : 2 - t; - } - - public void setPingPongStrength(double strength) { - this.pingPongStrength = strength; - } - - @Override - public double getNoiseRaw(long seed, double x, double y) { - double sum = 0; - double amp = fractalBounding; - - for(int i = 0; i < octaves; i++) { - double noise = pingPong((input.noise(seed++, x, y) + 1) * pingPongStrength); - sum += (noise - 0.5) * 2 * amp; - amp *= MathUtil.lerp(weightedStrength, 1.0, noise); - - x *= lacunarity; - y *= lacunarity; - amp *= gain; - } - - return sum; - } - - @Override - public double getNoiseRaw(long seed, double x, double y, double z) { - double sum = 0; - double amp = fractalBounding; - - for(int i = 0; i < octaves; i++) { - double noise = pingPong((input.noise(seed++, x, y, z) + 1) * pingPongStrength); - sum += (noise - 0.5) * 2 * amp; - amp *= MathUtil.lerp(weightedStrength, 1.0, noise); - - x *= lacunarity; - y *= lacunarity; - z *= lacunarity; - amp *= gain; - } - - return sum; - } -} 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 deleted file mode 100644 index fb42b2edc..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.fractal; - -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.MathUtil; - - -public class RidgedFractalSampler extends FractalNoiseFunction { - - public RidgedFractalSampler(NoiseSampler input) { - super(input); - } - - @Override - public double getNoiseRaw(long seed, double x, double y) { - double sum = 0; - double amp = fractalBounding; - - for(int i = 0; i < octaves; i++) { - double noise = Math.abs(input.noise(seed++, x, y)); - sum += (noise * -2 + 1) * amp; - amp *= MathUtil.lerp(weightedStrength, 1.0, 1 - noise); - - x *= lacunarity; - y *= lacunarity; - amp *= gain; - } - - return sum; - } - - @Override - public double getNoiseRaw(long seed, double x, double y, double z) { - double sum = 0; - double amp = fractalBounding; - - for(int i = 0; i < octaves; i++) { - double noise = Math.abs(input.noise(seed++, x, y, z)); - sum += (noise * -2 + 1) * amp; - amp *= MathUtil.lerp(weightedStrength, 1.0, 1 - noise); - - x *= lacunarity; - y *= lacunarity; - z *= lacunarity; - amp *= gain; - } - - return sum; - } -} 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 deleted file mode 100644 index bdc7ce8b9..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.random; - -import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; - - -/** - * NoiseSampler implementation to provide random, normally distributed (Gaussian) noise. - */ -public class GaussianNoiseSampler extends NoiseFunction { - private final WhiteNoiseSampler whiteNoiseSampler; // Back with a white noise sampler. - - public GaussianNoiseSampler() { - whiteNoiseSampler = new WhiteNoiseSampler(); - } - - @Override - public double getNoiseRaw(long seed, double x, double y) { - double v1, v2, s; - do { - v1 = whiteNoiseSampler.noise(seed++, x, y); - v2 = whiteNoiseSampler.noise(seed++, x, y); - s = v1 * v1 + v2 * v2; - } while(s >= 1 || s == 0); - double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s) / s); - return v1 * multiplier; - } - - @Override - public double getNoiseRaw(long seed, double x, double y, double z) { - double v1, v2, s; - do { - v1 = whiteNoiseSampler.noise(seed++, x, y, z); - v2 = whiteNoiseSampler.noise(seed++, x, y, z); - s = v1 * v1 + v2 * v2; - } while(s >= 1 || s == 0); - double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s) / s); - return v1 * multiplier; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/PositiveWhiteNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/PositiveWhiteNoiseSampler.java deleted file mode 100644 index dc35b0031..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/PositiveWhiteNoiseSampler.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.random; - -import com.dfsek.terra.api.util.MathUtil; - - -/** - * NoiseSampler implementation to produce random, uniformly distributed (white) noise. - */ -public class PositiveWhiteNoiseSampler extends WhiteNoiseSampler { - 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 double getNoiseRaw(long seed) { - return (Double.longBitsToDouble((MathUtil.murmur64(seed) & 0x000fffffffffffffL) | POSITIVE_POW1) - 1.5) * 2; - } - - @Override - public double getNoiseRaw(long seed, double x, double y) { - return (getNoiseUnmapped(seed, x, y) - 1); - } - - @Override - public double getNoiseRaw(long seed, double x, double y, double z) { - return (getNoiseUnmapped(seed, x, y, z) - 1); - } -} 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 deleted file mode 100644 index 06351c91a..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.random; - -import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; -import com.dfsek.terra.api.util.MathUtil; - - -/** - * NoiseSampler implementation to produce random, uniformly distributed (white) noise. - */ -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() { - } - - 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 MathUtil.murmur64(hash); - } - - 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; - return MathUtil.murmur64(hash); - } - - public double getNoiseRaw(long seed) { - return (Double.longBitsToDouble((MathUtil.murmur64(seed) & 0x000fffffffffffffL) | POSITIVE_POW1) - 1.5) * 2; - } - - @Override - public double getNoiseRaw(long seed, double x, double y) { - return (getNoiseUnmapped(seed, x, y) - 1.5) * 2; - } - - @Override - public double getNoiseRaw(long seed, double x, double y, double z) { - return (getNoiseUnmapped(seed, x, y, z) - 1.5) * 2; - } - - 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(long seed, double x, double y) { - long base = (randomBits(seed, x, y) & 0x000fffffffffffffL) | POSITIVE_POW1; // Sign and exponent - return Double.longBitsToDouble(base); - } -} 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 deleted file mode 100644 index 94ef01287..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java +++ /dev/null @@ -1,699 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.simplex; - -/** - * NoiseSampler implementation to provide OpenSimplex2 (Smooth Variant) noise. - */ -public class OpenSimplex2SSampler extends SimplexStyleSampler { - @Override - @SuppressWarnings("NumericOverflow") - 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; - final double G2 = (3 - SQRT3) / 6; - - final double F2 = 0.5f * (SQRT3 - 1); - double s = (x + y) * F2; - x += s; - y += s; - - - int i = (int) Math.floor(x); - int j = (int) Math.floor(y); - double xi = x - i; - double yi = y - j; - - i *= PRIME_X; - j *= PRIME_Y; - int i1 = i + PRIME_X; - int j1 = j + PRIME_Y; - - double t = (xi + yi) * G2; - double x0 = xi - t; - double y0 = yi - t; - - double a0 = (2.0 / 3.0) - x0 * x0 - y0 * y0; - double value = (a0 * a0) * (a0 * a0) * gradCoord(seed, i, j, x0, y0); - - double a1 = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a0); - double x1 = x0 - (1 - 2 * G2); - double y1 = y0 - (1 - 2 * G2); - value += (a1 * a1) * (a1 * a1) * gradCoord(seed, i1, j1, x1, y1); - - // Nested conditionals were faster than compact bit logic/arithmetic. - double xmyi = xi - yi; - if(t > G2) { - if(xi + xmyi > 1) { - double x2 = x0 + (3 * G2 - 2); - double y2 = y0 + (3 * G2 - 1); - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i + (PRIME_X << 1), j + PRIME_Y, x2, y2); - } - } else { - double x2 = x0 + G2; - double y2 = y0 + (G2 - 1); - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i, j + PRIME_Y, x2, y2); - } - } - - if(yi - xmyi > 1) { - double x3 = x0 + (3 * G2 - 1); - double y3 = y0 + (3 * G2 - 2); - double a3 = (2.0 / 3.0) - x3 * x3 - y3 * y3; - if(a3 > 0) { - value += (a3 * a3) * (a3 * a3) * gradCoord(seed, i + PRIME_X, j + (PRIME_Y << 1), x3, y3); - } - } else { - double x3 = x0 + (G2 - 1); - double y3 = y0 + G2; - double a3 = (2.0 / 3.0) - x3 * x3 - y3 * y3; - if(a3 > 0) { - value += (a3 * a3) * (a3 * a3) * gradCoord(seed, i + PRIME_X, j, x3, y3); - } - } - } else { - if(xi + xmyi < 0) { - double x2 = x0 + (1 - G2); - double y2 = y0 - G2; - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i - PRIME_X, j, x2, y2); - } - } else { - double x2 = x0 + (G2 - 1); - double y2 = y0 + G2; - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i + PRIME_X, j, x2, y2); - } - } - - if(yi < xmyi) { - double x2 = x0 - G2; - double y2 = y0 - (G2 - 1); - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i, j - PRIME_Y, x2, y2); - } - } else { - double x2 = x0 + G2; - double y2 = y0 + (G2 - 1); - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i, j + PRIME_Y, x2, y2); - } - } - } - - return value * 18.24196194486065; - } - - @Override - @SuppressWarnings("NumericOverflow") - 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 - x = r - x; - y = r - y; - z = r - z; - - - int i = (int) Math.floor(x); - int j = (int) Math.floor(y); - int k = (int) Math.floor(z); - double xi = x - i; - double yi = y - j; - double zi = z - k; - - i *= PRIME_X; - j *= PRIME_Y; - k *= PRIME_Z; - int seed2 = seed + 1293373; - - int xNMask = (int) (-0.5 - xi); - int yNMask = (int) (-0.5 - yi); - int zNMask = (int) (-0.5 - zi); - - double x0 = xi + xNMask; - double y0 = yi + yNMask; - double z0 = zi + zNMask; - double a0 = 0.75 - x0 * x0 - y0 * y0 - z0 * z0; - double value = (a0 * a0) * (a0 * a0) * gradCoord(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x0, - y0, - z0); - - double x1 = xi - 0.5; - double y1 = yi - 0.5; - double z1 = zi - 0.5; - double a1 = 0.75 - x1 * x1 - y1 * y1 - z1 * z1; - value += (a1 * a1) * (a1 * a1) * gradCoord(seed2, i + PRIME_X, j + PRIME_Y, k + PRIME_Z, x1, y1, z1); - - double xAFlipMask0 = ((xNMask | 1) << 1) * x1; - double yAFlipMask0 = ((yNMask | 1) << 1) * y1; - double zAFlipMask0 = ((zNMask | 1) << 1) * z1; - double xAFlipMask1 = (-2 - (xNMask << 2)) * x1 - 1.0; - double yAFlipMask1 = (-2 - (yNMask << 2)) * y1 - 1.0; - double zAFlipMask1 = (-2 - (zNMask << 2)) * z1 - 1.0; - - boolean skip5 = false; - double a2 = xAFlipMask0 + a0; - if(a2 > 0) { - double x2 = x0 - (xNMask | 1); - value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x2, - y0, - z0); - } else { - double a3 = yAFlipMask0 + zAFlipMask0 + a0; - if(a3 > 0) { - double y3 = y0 - (yNMask | 1); - double z3 = z0 - (zNMask | 1); - value += (a3 * a3) * (a3 * a3) * gradCoord(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), - x0, - y3, z3); - } - - double a4 = xAFlipMask1 + a1; - if(a4 > 0) { - double x4 = (xNMask | 1) + x1; - value += (a4 * a4) * (a4 * a4) * gradCoord(seed2, i + (xNMask & (PRIME_X << 1)), j + PRIME_Y, k + PRIME_Z, x4, y1, z1); - skip5 = true; - } - } - - boolean skip9 = false; - double a6 = yAFlipMask0 + a0; - if(a6 > 0) { - double y6 = y0 - (yNMask | 1); - value += (a6 * a6) * (a6 * a6) * gradCoord(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x0, - y6, - z0); - } else { - double a7 = xAFlipMask0 + zAFlipMask0 + a0; - if(a7 > 0) { - double x7 = x0 - (xNMask | 1); - double z7 = z0 - (zNMask | 1); - value += (a7 * a7) * (a7 * a7) * gradCoord(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), - x7, - y0, z7); - } - - double a8 = yAFlipMask1 + a1; - if(a8 > 0) { - double y8 = (yNMask | 1) + y1; - value += (a8 * a8) * (a8 * a8) * gradCoord(seed2, i + PRIME_X, j + (yNMask & (PRIME_Y << 1)), k + PRIME_Z, x1, y8, z1); - skip9 = true; - } - } - - boolean skipD = false; - double aA = zAFlipMask0 + a0; - if(aA > 0) { - double zA = z0 - (zNMask | 1); - value += (aA * aA) * (aA * aA) * gradCoord(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), x0, - y0, - zA); - } else { - double aB = xAFlipMask0 + yAFlipMask0 + a0; - if(aB > 0) { - double xB = x0 - (xNMask | 1); - double yB = y0 - (yNMask | 1); - value += (aB * aB) * (aB * aB) * gradCoord(seed, i + (~xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z), - xB, - yB, z0); - } - - double aC = zAFlipMask1 + a1; - if(aC > 0) { - double zC = (zNMask | 1) + z1; - value += (aC * aC) * (aC * aC) * gradCoord(seed2, i + PRIME_X, j + PRIME_Y, k + (zNMask & (PRIME_Z << 1)), x1, y1, zC); - skipD = true; - } - } - - if(!skip5) { - double a5 = yAFlipMask1 + zAFlipMask1 + a1; - if(a5 > 0) { - double y5 = (yNMask | 1) + y1; - double z5 = (zNMask | 1) + z1; - value += (a5 * a5) * (a5 * a5) * gradCoord(seed2, i + PRIME_X, j + (yNMask & (PRIME_Y << 1)), k + (zNMask & (PRIME_Z << 1)), - x1, y5, z5); - } - } - - if(!skip9) { - double a9 = xAFlipMask1 + zAFlipMask1 + a1; - if(a9 > 0) { - double x9 = (xNMask | 1) + x1; - double z9 = (zNMask | 1) + z1; - value += (a9 * a9) * (a9 * a9) * gradCoord(seed2, i + (xNMask & (PRIME_X << 1)), j + PRIME_Y, k + (zNMask & (PRIME_Z << 1)), - x9, - y1, z9); - } - } - - if(!skipD) { - double aD = xAFlipMask1 + yAFlipMask1 + a1; - if(aD > 0) { - double xD = (xNMask | 1) + x1; - double yD = (yNMask | 1) + y1; - value += (aD * aD) * (aD * aD) * gradCoord(seed2, i + (xNMask & (PRIME_X << 1)), j + (yNMask & (PRIME_Y << 1)), k + PRIME_Z, - xD, yD, z1); - } - } - - return value * 9.046026385208288; - } - - @Override - public boolean isDifferentiable() { - return true; - } - - @Override - public double[] getNoiseDerivativeRaw(long sl, double x, double y) { - int seed = (int) sl; - // 2D OpenSimplex2S case is a modified 2D simplex noise. - - final double SQRT3 = 1.7320508075688772935274463415059; - final double G2 = (3 - SQRT3) / 6; - - final double F2 = 0.5f * (SQRT3 - 1); - double s = (x + y) * F2; - x += s; - y += s; - - - int i = (int) Math.floor(x); - int j = (int) Math.floor(y); - double xi = x - i; - double yi = y - j; - - i *= PRIME_X; - j *= PRIME_Y; - int i1 = i + PRIME_X; - int j1 = j + PRIME_Y; - - double t = (xi + yi) * G2; - double x0 = xi - t; - double y0 = yi - t; - - double[] out = { 0.0f, 0.0f, 0.0f }; - - double a0 = (2.0 / 3.0) - x0 * x0 - y0 * y0; - double aa0 = a0 * a0, aaa0 = aa0 * a0, aaaa0 = aa0 * aa0; - int gi0 = gradCoordIndex(seed, i, j); - double gx0 = GRADIENTS_2_D[gi0], gy0 = GRADIENTS_2_D[gi0 | 1]; - double rampValue0 = gx0 * x0 + gy0 * y0; - out[0] = aaaa0 * rampValue0; - out[1] = gx0 * aaaa0 - 8 * rampValue0 * aaa0 * x0; - out[2] = gy0 * aaaa0 - 8 * rampValue0 * aaa0 * y0; - - - double a1 = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a0); - double x1 = x0 - (1 - 2 * G2); - double y1 = y0 - (1 - 2 * G2); - double aa1 = a1 * a1, aaa1 = aa1 * a1, aaaa1 = aa1 * aa1; - int gi1 = gradCoordIndex(seed, i1, j1); - double gx1 = GRADIENTS_2_D[gi1], gy1 = GRADIENTS_2_D[gi1 | 1]; - double rampValue1 = gx1 * x1 + gy1 * y1; - out[0] += aaaa1 * rampValue1; - out[1] += gx1 * aaaa1 - 8 * rampValue1 * aaa1 * x1; - out[2] += gy1 * aaaa1 - 8 * rampValue1 * aaa1 * y1; - - // Nested conditionals were faster than compact bit logic/arithmetic. - double xmyi = xi - yi; - if(t > G2) { - if(xi + xmyi > 1) { - double x2 = x0 + (3 * G2 - 2); - double y2 = y0 + (3 * G2 - 1); - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; - int gi2 = gradCoordIndex(seed, i + (PRIME_X << 1), j + PRIME_Y); - double gx2 = GRADIENTS_2_D[gi2 | 0], gy2 = GRADIENTS_2_D[gi2 | 1]; - double rampValue2 = gx2 * x2 + gy2 * y2; - out[0] += aaaa2 * rampValue2; - out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; - out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; - } - } else { - double x2 = x0 + G2; - double y2 = y0 + (G2 - 1); - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; - int gi2 = gradCoordIndex(seed, i, j + PRIME_Y); - double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; - double rampValue2 = gx2 * x2 + gy2 * y2; - out[0] += aaaa2 * rampValue2; - out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; - out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; - } - } - - if(yi - xmyi > 1) { - double x3 = x0 + (3 * G2 - 1); - double y3 = y0 + (3 * G2 - 2); - double a3 = (2.0 / 3.0) - x3 * x3 - y3 * y3; - if(a3 > 0) { - double aa3 = a3 * a3, aaa3 = aa3 * a3, aaaa3 = aa3 * aa3; - int gi3 = gradCoordIndex(seed, i + PRIME_X, j + (PRIME_Y << 1)); - double gx3 = GRADIENTS_2_D[gi3], gy3 = GRADIENTS_2_D[gi3 | 1]; - double rampValue3 = gx3 * x3 + gy3 * y3; - out[0] += aaaa3 * rampValue3; - out[1] += gx3 * aaaa3 - 8 * rampValue3 * aaa3 * x3; - out[2] += gy3 * aaaa3 - 8 * rampValue3 * aaa3 * y3; - } - } else { - double x3 = x0 + (G2 - 1); - double y3 = y0 + G2; - double a3 = (2.0 / 3.0) - x3 * x3 - y3 * y3; - if(a3 > 0) { - double aa3 = a3 * a3, aaa3 = aa3 * a3, aaaa3 = aa3 * aa3; - int gi3 = gradCoordIndex(seed, i + PRIME_X, j); - double gx3 = GRADIENTS_2_D[gi3], gy3 = GRADIENTS_2_D[gi3 | 1]; - double rampValue3 = gx3 * x3 + gy3 * y3; - out[0] += aaaa3 * rampValue3; - out[1] += gx3 * aaaa3 - 8 * rampValue3 * aaa3 * x3; - out[2] += gy3 * aaaa3 - 8 * rampValue3 * aaa3 * y3; - } - } - } else { - if(xi + xmyi < 0) { - double x2 = x0 + (1 - G2); - double y2 = y0 - G2; - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; - int gi2 = gradCoordIndex(seed, i - PRIME_X, j); - double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; - double rampValue2 = gx2 * x2 + gy2 * y2; - out[0] += aaaa2 * rampValue2; - out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; - out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; - } - } else { - double x2 = x0 + (G2 - 1); - double y2 = y0 + G2; - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; - int gi2 = gradCoordIndex(seed, i + PRIME_X, j); - double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; - double rampValue2 = gx2 * x2 + gy2 * y2; - out[0] += aaaa2 * rampValue2; - out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; - out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; - } - } - - if(yi < xmyi) { - double x2 = x0 - G2; - double y2 = y0 - (G2 - 1); - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; - int gi2 = gradCoordIndex(seed, i, j - PRIME_Y); - double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; - double rampValue2 = gx2 * x2 + gy2 * y2; - out[0] += aaaa2 * rampValue2; - out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; - out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; - } - } else { - double x2 = x0 + G2; - double y2 = y0 + (G2 - 1); - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; - int gi2 = gradCoordIndex(seed, i, j + PRIME_Y); - double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; - double rampValue2 = gx2 * x2 + gy2 * y2; - out[0] += aaaa2 * rampValue2; - out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; - out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; - } - } - } - out[0] *= 18.24196194486065; - out[1] *= 18.24196194486065; - out[2] *= 18.24196194486065; - return out; - } - - @Override - public double[] getNoiseDerivativeRaw(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 - x = r - x; - y = r - y; - z = r - z; - - - int i = (int) Math.floor(x); - int j = (int) Math.floor(y); - int k = (int) Math.floor(z); - double xi = x - i; - double yi = y - j; - double zi = z - k; - - i *= PRIME_X; - j *= PRIME_Y; - k *= PRIME_Z; - int seed2 = seed + 1293373; - - int xNMask = (int) (-0.5 - xi); - int yNMask = (int) (-0.5 - yi); - int zNMask = (int) (-0.5 - zi); - - double[] out = { 0.0f, 0.0f, 0.0f, 0.0f }; - - double x0 = xi + xNMask; - double y0 = yi + yNMask; - double z0 = zi + zNMask; - double a0 = 0.75 - x0 * x0 - y0 * y0 - z0 * z0; - double aa0 = a0 * a0, aaa0 = aa0 * a0, aaaa0 = aa0 * aa0; - int gi0 = gradCoordIndex(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z)); - double gx0 = GRADIENTS_3D[gi0], gy0 = GRADIENTS_3D[gi0 | 1], gz0 = GRADIENTS_3D[gi0 | 2]; - double rampValue0 = gx0 * x0 + gy0 * y0 + gz0 * z0; - out[0] = aaaa0 * rampValue0; - out[1] = gx0 * aaaa0 - 8 * rampValue0 * aaa0 * x0; - out[2] = gy0 * aaaa0 - 8 * rampValue0 * aaa0 * y0; - out[3] = gz0 * aaaa0 - 8 * rampValue0 * aaa0 * z0; - - double x1 = xi - 0.5; - double y1 = yi - 0.5; - double z1 = zi - 0.5; - double a1 = 0.75 - x1 * x1 - y1 * y1 - z1 * z1; - double aa1 = a1 * a1, aaa1 = aa1 * a1, aaaa1 = aa1 * aa1; - int gi1 = gradCoordIndex(seed2, i + PRIME_X, j + PRIME_Y, k + PRIME_Z); - double gx1 = GRADIENTS_3D[gi1], gy1 = GRADIENTS_3D[gi1 | 1], gz1 = GRADIENTS_3D[gi1 | 2]; - double rampValue1 = gx1 * x1 + gy1 * y1 + gz1 * z1; - out[0] += aaaa1 * rampValue1; - out[1] += gx1 * aaaa1 - 8 * rampValue1 * aaa1 * x1; - out[2] += gy1 * aaaa1 - 8 * rampValue1 * aaa1 * y1; - out[3] += gz1 * aaaa1 - 8 * rampValue1 * aaa1 * z1; - - double xAFlipMask0 = ((xNMask | 1) << 1) * x1; - double yAFlipMask0 = ((yNMask | 1) << 1) * y1; - double zAFlipMask0 = ((zNMask | 1) << 1) * z1; - double xAFlipMask1 = (-2 - (xNMask << 2)) * x1 - 1.0; - double yAFlipMask1 = (-2 - (yNMask << 2)) * y1 - 1.0; - double zAFlipMask1 = (-2 - (zNMask << 2)) * z1 - 1.0; - - boolean skip5 = false; - double a2 = xAFlipMask0 + a0; - if(a2 > 0) { - double x2 = x0 - (xNMask | 1); - double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; - int gi2 = gradCoordIndex(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z)); - double gx2 = GRADIENTS_3D[gi2], gy2 = GRADIENTS_3D[gi2 | 1], gz2 = GRADIENTS_3D[gi2 | 2]; - double rampValue2 = gx2 * x2 + gy2 * y0 + gz2 * z0; - out[0] += aaaa2 * rampValue2; - out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; - out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y0; - out[3] += gz2 * aaaa2 - 8 * rampValue2 * aaa2 * z0; - } else { - double a3 = yAFlipMask0 + zAFlipMask0 + a0; - if(a3 > 0) { - double y3 = y0 - (yNMask | 1); - double z3 = z0 - (zNMask | 1); - double aa3 = a3 * a3, aaa3 = aa3 * a3, aaaa3 = aa3 * aa3; - int gi3 = gradCoordIndex(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (~zNMask & PRIME_Z)); - double gx3 = GRADIENTS_3D[gi3], gy3 = GRADIENTS_3D[gi3 | 1], gz3 = GRADIENTS_3D[gi3 | 2]; - double rampValue3 = gx3 * x0 + gy3 * y3 + gz3 * z3; - out[0] += aaaa3 * rampValue3; - out[1] += gx3 * aaaa3 - 8 * rampValue3 * aaa3 * x0; - out[2] += gy3 * aaaa3 - 8 * rampValue3 * aaa3 * y3; - out[3] += gz3 * aaaa3 - 8 * rampValue3 * aaa3 * z3; - } - - double a4 = xAFlipMask1 + a1; - if(a4 > 0) { - double x4 = (xNMask | 1) + x1; - double aa4 = a4 * a4, aaa4 = aa4 * a4, aaaa4 = aa4 * aa4; - int gi4 = gradCoordIndex(seed2, i + (xNMask & (PRIME_X << 1)), j + PRIME_Y, k + PRIME_Z); - double gx4 = GRADIENTS_3D[gi4], gy4 = GRADIENTS_3D[gi4 | 1], gz4 = GRADIENTS_3D[gi4 | 2]; - double rampValue4 = gx4 * x4 + gy4 * y1 + gz4 * z1; - out[0] += aaaa4 * rampValue4; - out[1] += gx4 * aaaa4 - 8 * rampValue4 * aaa4 * x4; - out[2] += gy4 * aaaa4 - 8 * rampValue4 * aaa4 * y1; - out[3] += gz4 * aaaa4 - 8 * rampValue4 * aaa4 * z1; - skip5 = true; - } - } - - boolean skip9 = false; - double a6 = yAFlipMask0 + a0; - if(a6 > 0) { - double y6 = y0 - (yNMask | 1); - double aa6 = a6 * a6, aaa6 = aa6 * a6, aaaa6 = aa6 * aa6; - int gi6 = gradCoordIndex(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z)); - double gx6 = GRADIENTS_3D[gi6], gy6 = GRADIENTS_3D[gi6 | 1], gz6 = GRADIENTS_3D[gi6 | 2]; - double rampValue6 = gx6 * x0 + gy6 * y6 + gz6 * z0; - out[0] += aaaa6 * rampValue6; - out[1] += gx6 * aaaa6 - 8 * rampValue6 * aaa6 * x0; - out[2] += gy6 * aaaa6 - 8 * rampValue6 * aaa6 * y6; - out[3] += gz6 * aaaa6 - 8 * rampValue6 * aaa6 * z0; - } else { - double a7 = xAFlipMask0 + zAFlipMask0 + a0; - if(a7 > 0) { - double x7 = x0 - (xNMask | 1); - double z7 = z0 - (zNMask | 1); - double aa7 = a7 * a7, aaa7 = aa7 * a7, aaaa7 = aa7 * aa7; - int gi7 = gradCoordIndex(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z)); - double gx7 = GRADIENTS_3D[gi7], gy7 = GRADIENTS_3D[gi7 | 1], gz7 = GRADIENTS_3D[gi7 | 2]; - double rampValue7 = gx7 * x7 + gy7 * y0 + gz7 * z7; - out[0] += aaaa7 * rampValue7; - out[1] += gx7 * aaaa7 - 8 * rampValue7 * aaa7 * x7; - out[2] += gy7 * aaaa7 - 8 * rampValue7 * aaa7 * y0; - out[3] += gz7 * aaaa7 - 8 * rampValue7 * aaa7 * z7; - } - - double a8 = yAFlipMask1 + a1; - if(a8 > 0) { - double y8 = (yNMask | 1) + y1; - double aa8 = a8 * a8, aaa8 = aa8 * a8, aaaa8 = aa8 * aa8; - int gi8 = gradCoordIndex(seed2, i + PRIME_X, j + (yNMask & (PRIME_Y << 1)), k + PRIME_Z); - double gx8 = GRADIENTS_3D[gi8], gy8 = GRADIENTS_3D[gi8 | 1], gz8 = GRADIENTS_3D[gi8 | 2]; - double rampValue8 = gx8 * x1 + gy8 * y8 + gz8 * z1; - out[0] += aaaa8 * rampValue8; - out[1] += gx8 * aaaa8 - 8 * rampValue8 * aaa8 * x1; - out[2] += gy8 * aaaa8 - 8 * rampValue8 * aaa8 * y8; - out[3] += gz8 * aaaa8 - 8 * rampValue8 * aaa8 * z1; - skip9 = true; - } - } - - boolean skipD = false; - double aA = zAFlipMask0 + a0; - if(aA > 0) { - double zA = z0 - (zNMask | 1); - double aaA = aA * aA, aaaA = aaA * aA, aaaaA = aaA * aaA; - int giA = gradCoordIndex(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z)); - double gxA = GRADIENTS_3D[giA], gyA = GRADIENTS_3D[giA | 1], gzA = GRADIENTS_3D[giA | 2]; - double rampValueA = gxA * x0 + gyA * y0 + gzA * zA; - out[0] += aaaaA * rampValueA; - out[1] += gxA * aaaaA - 8 * rampValueA * aaaA * x0; - out[2] += gyA * aaaaA - 8 * rampValueA * aaaA * y0; - out[3] += gzA * aaaaA - 8 * rampValueA * aaaA * zA; - } else { - double aB = xAFlipMask0 + yAFlipMask0 + a0; - if(aB > 0) { - double xB = x0 - (xNMask | 1); - double yB = y0 - (yNMask | 1); - double aaB = aB * aB, aaaB = aaB * aB, aaaaB = aaB * aaB; - int giB = gradCoordIndex(seed, i + (~xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z)); - double gxB = GRADIENTS_3D[giB], gyB = GRADIENTS_3D[giB | 1], gzB = GRADIENTS_3D[giB | 2]; - double rampValueB = gxB * xB + gyB * yB + gzB * z0; - out[0] += aaaaB * rampValueB; - out[1] += gxB * aaaaB - 8 * rampValueB * aaaB * xB; - out[2] += gyB * aaaaB - 8 * rampValueB * aaaB * yB; - out[3] += gzB * aaaaB - 8 * rampValueB * aaaB * z0; - } - - double aC = zAFlipMask1 + a1; - if(aC > 0) { - double zC = (zNMask | 1) + z1; - double aaC = aC * aC, aaaC = aaC * aC, aaaaC = aaC * aaC; - int giC = gradCoordIndex(seed2, i + PRIME_X, j + PRIME_Y, k + (zNMask & (PRIME_Z << 1))); - double gxC = GRADIENTS_3D[giC], gyC = GRADIENTS_3D[giC | 1], gzC = GRADIENTS_3D[giC | 2]; - double rampValueC = gxC * x1 + gyC * y1 + gzC * zC; - out[0] += aaaaC * rampValueC; - out[1] += gxC * aaaaC - 8 * rampValueC * aaaC * x1; - out[2] += gyC * aaaaC - 8 * rampValueC * aaaC * y1; - out[3] += gzC * aaaaC - 8 * rampValueC * aaaC * zC; - skipD = true; - } - } - - if(!skip5) { - double a5 = yAFlipMask1 + zAFlipMask1 + a1; - if(a5 > 0) { - double y5 = (yNMask | 1) + y1; - double z5 = (zNMask | 1) + z1; - double aa5 = a5 * a5, aaa5 = aa5 * a5, aaaa5 = aa5 * aa5; - int gi5 = gradCoordIndex(seed2, i + PRIME_X, j + (yNMask & (PRIME_Y << 1)), k + (zNMask & (PRIME_Z << 1))); - double gx5 = GRADIENTS_3D[gi5], gy5 = GRADIENTS_3D[gi5 | 1], gz5 = GRADIENTS_3D[gi5 | 2]; - double rampValue5 = gx5 * x1 + gy5 * y5 + gz5 * z5; - out[0] += aaaa5 * rampValue5; - out[1] += gx5 * aaaa5 - 8 * rampValue5 * aaa5 * x1; - out[2] += gy5 * aaaa5 - 8 * rampValue5 * aaa5 * y5; - out[3] += gz5 * aaaa5 - 8 * rampValue5 * aaa5 * z5; - } - } - - if(!skip9) { - double a9 = xAFlipMask1 + zAFlipMask1 + a1; - if(a9 > 0) { - double x9 = (xNMask | 1) + x1; - double z9 = (zNMask | 1) + z1; - double aa9 = a9 * a9, aaa9 = aa9 * a9, aaaa9 = aa9 * aa9; - int gi9 = gradCoordIndex(seed2, i + (xNMask & (PRIME_X << 1)), j + PRIME_Y, k + (zNMask & (PRIME_Z << 1))); - double gx9 = GRADIENTS_3D[gi9], gy9 = GRADIENTS_3D[gi9 | 1], gz9 = GRADIENTS_3D[gi9 | 2]; - double rampValue9 = gx9 * x9 + gy9 * y1 + gz9 * z9; - out[0] += aaaa9 * rampValue9; - out[1] += gx9 * aaaa9 - 8 * rampValue9 * aaa9 * x9; - out[2] += gy9 * aaaa9 - 8 * rampValue9 * aaa9 * y1; - out[3] += gz9 * aaaa9 - 8 * rampValue9 * aaa9 * z9; - } - } - - if(!skipD) { - double aD = xAFlipMask1 + yAFlipMask1 + a1; - if(aD > 0) { - double xD = (xNMask | 1) + x1; - double yD = (yNMask | 1) + y1; - double aaD = aD * aD, aaaD = aaD * aD, aaaaD = aaD * aaD; - int giD = gradCoordIndex(seed2, i + (xNMask & (PRIME_X << 1)), j + (yNMask & (PRIME_Y << 1)), k + PRIME_Z); - double gxD = GRADIENTS_3D[giD], gyD = GRADIENTS_3D[giD | 1], gzD = GRADIENTS_3D[giD | 2]; - double rampValueD = gxD * xD + gyD * yD + gzD * z1; - out[0] += aaaaD * rampValueD; - out[1] += gxD * aaaaD - 8 * rampValueD * aaaD * xD; - out[2] += gyD * aaaaD - 8 * rampValueD * aaaD * yD; - out[3] += gzD * aaaaD - 8 * rampValueD * aaaD * z1; - } - } - - out[0] *= 9.046026385208288; - out[1] *= 9.046026385208288; - out[2] *= 9.046026385208288; - out[3] *= 9.046026385208288; - return out; - } -} 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 deleted file mode 100644 index 566c99867..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.simplex; - -/** - * NoiseSampler implementation to provide OpenSimplex2 noise. - */ -public class OpenSimplex2Sampler extends SimplexStyleSampler { - private static final double SQRT3 = 1.7320508075688772935274463415059; - - @Override - 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; - - final double F2 = 0.5f * (SQRT3 - 1); - double s = (x + y) * F2; - x += s; - y += s; - - - int i = (int) Math.floor(x); - int j = (int) Math.floor(y); - double xi = x - i; - double yi = y - j; - - double t = (xi + yi) * G2; - double x0 = xi - t; - double y0 = yi - t; - - i *= PRIME_X; - j *= PRIME_Y; - - double value = 0; - - double a = 0.5 - x0 * x0 - y0 * y0; - if(a > 0) { - value = (a * a) * (a * a) * gradCoord(seed, i, j, x0, y0); - } - - double c = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); - if(c > 0) { - double x2 = x0 + (2 * G2 - 1); - double y2 = y0 + (2 * G2 - 1); - value += (c * c) * (c * c) * gradCoord(seed, i + PRIME_X, j + PRIME_Y, x2, y2); - } - - if(y0 > x0) { - double x1 = x0 + G2; - double y1 = y0 + (G2 - 1); - double b = 0.5 - x1 * x1 - y1 * y1; - if(b > 0) { - value += (b * b) * (b * b) * gradCoord(seed, i, j + PRIME_Y, x1, y1); - } - } else { - double x1 = x0 + (G2 - 1); - double y1 = y0 + G2; - double b = 0.5 - x1 * x1 - y1 * y1; - if(b > 0) { - value += (b * b) * (b * b) * gradCoord(seed, i + PRIME_X, j, x1, y1); - } - } - - return value * 99.83685446303647f; - } - - @Override - 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 - x = r - x; - y = r - y; - z = r - z; - - - int i = (int) Math.round(x); - int j = (int) Math.round(y); - int k = (int) Math.round(z); - double x0 = x - i; - double y0 = y - j; - double z0 = z - k; - - int xNSign = (int) (-1.0 - x0) | 1; - int yNSign = (int) (-1.0 - y0) | 1; - int zNSign = (int) (-1.0 - z0) | 1; - - double ax0 = xNSign * -x0; - double ay0 = yNSign * -y0; - double az0 = zNSign * -z0; - - i *= PRIME_X; - j *= PRIME_Y; - k *= PRIME_Z; - - double value = 0; - double a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); - - for(int l = 0; ; l++) { - if(a > 0) { - value += (a * a) * (a * a) * gradCoord(seed, i, j, k, x0, y0, z0); - } - - if(ax0 >= ay0 && ax0 >= az0) { - double b = a + ax0 + ax0; - if(b > 1) { - b -= 1; - value += (b * b) * (b * b) * gradCoord(seed, i - xNSign * PRIME_X, j, k, x0 + xNSign, y0, z0); - } - } else if(ay0 > ax0 && ay0 >= az0) { - double b = a + ay0 + ay0; - if(b > 1) { - b -= 1; - value += (b * b) * (b * b) * gradCoord(seed, i, j - yNSign * PRIME_Y, k, x0, y0 + yNSign, z0); - } - } else { - double b = a + az0 + az0; - if(b > 1) { - b -= 1; - value += (b * b) * (b * b) * gradCoord(seed, i, j, k - zNSign * PRIME_Z, x0, y0, z0 + zNSign); - } - } - - if(l == 1) break; - - ax0 = 0.5 - ax0; - ay0 = 0.5 - ay0; - az0 = 0.5 - az0; - - x0 = xNSign * ax0; - y0 = yNSign * ay0; - z0 = zNSign * az0; - - a += (0.75 - ax0) - (ay0 + az0); - - i += (xNSign >> 1) & PRIME_X; - j += (yNSign >> 1) & PRIME_Y; - k += (zNSign >> 1) & PRIME_Z; - - xNSign = -xNSign; - yNSign = -yNSign; - zNSign = -zNSign; - - seed = ~seed; - } - - return value * 32.69428253173828125; - } - - @Override - public boolean isDifferentiable() { - return true; - } - - @Override - public double[] getNoiseDerivativeRaw(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; - - final double F2 = 0.5f * (SQRT3 - 1); - double s = (x + y) * F2; - x += s; - y += s; - - - int i = (int) Math.floor(x); - int j = (int) Math.floor(y); - double xi = x - i; - double yi = y - j; - - double t = (xi + yi) * G2; - double x0 = xi - t; - double y0 = yi - t; - - i *= PRIME_X; - j *= PRIME_Y; - - double[] out = { 0.0f, 0.0f, 0.0f }; - - double a = 0.5 - x0 * x0 - y0 * y0; - if(a > 0) { - double aa = a * a, aaa = aa * a, aaaa = aa * aa; - int gi = gradCoordIndex(seed, i, j); - double gx = GRADIENTS_2_D[gi], gy = GRADIENTS_2_D[gi | 1]; - double rampValue = gx * x0 + gy * y0; - out[0] += aaaa * rampValue; - out[1] += gx * aaaa - 8 * rampValue * aaa * x0; - out[2] += gy * aaaa - 8 * rampValue * aaa * y0; - } - - double c = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); - if(c > 0) { - double x2 = x0 + (2 * G2 - 1); - double y2 = y0 + (2 * G2 - 1); - double cc = c * c, ccc = cc * c, cccc = cc * cc; - int gi = gradCoordIndex(seed, i + PRIME_X, j + PRIME_Y); - double gx = GRADIENTS_2_D[gi], gy = GRADIENTS_2_D[gi | 1]; - double rampValue = gx * x2 + gy * y2; - out[0] += cccc * rampValue; - out[1] += gx * cccc - 8 * rampValue * ccc * x2; - out[2] += gy * cccc - 8 * rampValue * ccc * y2; - } - - if(y0 > x0) { - double x1 = x0 + G2; - double y1 = y0 + (G2 - 1); - double b = 0.5 - x1 * x1 - y1 * y1; - if(b > 0) { - double bb = b * b, bbb = bb * b, bbbb = bb * bb; - int gi = gradCoordIndex(seed, i, j + PRIME_Y); - double gx = GRADIENTS_2_D[gi], gy = GRADIENTS_2_D[gi | 1]; - double rampValue = gx * x1 + gy * y1; - out[0] += bbbb * rampValue; - out[1] += gx * bbbb - 8 * rampValue * bbb * x1; - out[2] += gy * bbbb - 8 * rampValue * bbb * y1; - } - } else { - double x1 = x0 + (G2 - 1); - double y1 = y0 + G2; - double b = 0.5 - x1 * x1 - y1 * y1; - if(b > 0) { - double bb = b * b, bbb = bb * b, bbbb = bb * bb; - int gi = gradCoordIndex(seed, i + PRIME_X, j); - double gx = GRADIENTS_2_D[gi], gy = GRADIENTS_2_D[gi | 1]; - double rampValue = gx * x1 + gy * y1; - out[0] += bbbb * rampValue; - out[1] += gx * bbbb - 8 * rampValue * bbb * x1; - out[2] += gy * bbbb - 8 * rampValue * bbb * y1; - } - } - - out[0] *= 99.83685446303647f; - out[1] *= 99.83685446303647f; - out[2] *= 99.83685446303647f; - return out; - } - - @Override - public double[] getNoiseDerivativeRaw(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 - x = r - x; - y = r - y; - z = r - z; - - - int i = (int) Math.round(x); - int j = (int) Math.round(y); - int k = (int) Math.round(z); - double x0 = x - i; - double y0 = y - j; - double z0 = z - k; - - int xNSign = (int) (-1.0 - x0) | 1; - int yNSign = (int) (-1.0 - y0) | 1; - int zNSign = (int) (-1.0 - z0) | 1; - - double ax0 = xNSign * -x0; - double ay0 = yNSign * -y0; - double az0 = zNSign * -z0; - - i *= PRIME_X; - j *= PRIME_Y; - k *= PRIME_Z; - - double[] out = { 0.0f, 0.0f, 0.0f, 0.0f }; - double a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); - - for(int l = 0; ; l++) { - if(a > 0) { - double aa = a * a, aaa = aa * a, aaaa = aa * aa; - int gi = gradCoordIndex(seed, i, j, k); - double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; - double rampValue = gx * x0 + gy * y0 + gz * z0; - out[0] += aaaa * rampValue; - out[1] += gx * aaaa - 8 * rampValue * aaa * x0; - out[1] += gy * aaaa - 8 * rampValue * aaa * y0; - out[2] += gz * aaaa - 8 * rampValue * aaa * z0; - } - - if(ax0 >= ay0 && ax0 >= az0) { - double b = a + ax0 + ax0; - if(b > 1) { - b -= 1; - double bb = b * b, bbb = bb * b, bbbb = bb * bb; - int gi = gradCoordIndex(seed, i - xNSign * PRIME_X, j, k); - double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; - double rampValue = gx * (x0 + xNSign) + gy * y0 + gz * z0; - out[0] += bbbb * rampValue; - out[1] += gx * bbbb - 8 * rampValue * bbb * (x0 + xNSign); - out[1] += gy * bbbb - 8 * rampValue * bbb * y0; - out[2] += gz * bbbb - 8 * rampValue * bbb * z0; - } - } else if(ay0 > ax0 && ay0 >= az0) { - double b = a + ay0 + ay0; - if(b > 1) { - b -= 1; - double bb = b * b, bbb = bb * b, bbbb = bb * bb; - int gi = gradCoordIndex(seed, i, j - yNSign * PRIME_Y, k); - double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; - double rampValue = gx * x0 + gy * (y0 + yNSign) + gz * z0; - out[0] += bbbb * rampValue; - out[1] += gx * bbbb - 8 * rampValue * bbb * x0; - out[1] += gy * bbbb - 8 * rampValue * bbb * (y0 + yNSign); - out[2] += gz * bbbb - 8 * rampValue * bbb * z0; - } - } else { - double b = a + az0 + az0; - if(b > 1) { - b -= 1; - double bb = b * b, bbb = bb * b, bbbb = bb * bb; - int gi = gradCoordIndex(seed, i, j, k - zNSign * PRIME_Z); - double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; - double rampValue = gx * x0 + gy * y0 + gz * (z0 + zNSign); - out[0] += bbbb * rampValue; - out[1] += gx * bbbb - 8 * rampValue * bbb * x0; - out[1] += gy * bbbb - 8 * rampValue * bbb * y0; - out[2] += gz * bbbb - 8 * rampValue * bbb * (z0 + zNSign); - } - } - - if(l == 1) break; - - ax0 = 0.5 - ax0; - ay0 = 0.5 - ay0; - az0 = 0.5 - az0; - - x0 = xNSign * ax0; - y0 = yNSign * ay0; - z0 = zNSign * az0; - - a += (0.75 - ax0) - (ay0 + az0); - - i += (xNSign >> 1) & PRIME_X; - j += (yNSign >> 1) & PRIME_Y; - k += (zNSign >> 1) & PRIME_Z; - - xNSign = -xNSign; - yNSign = -yNSign; - zNSign = -zNSign; - - seed = ~seed; - } - out[0] *= 32.69428253173828125; - out[1] *= 32.69428253173828125; - out[2] *= 32.69428253173828125; - out[3] *= 32.69428253173828125; - return out; - } -} 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 deleted file mode 100644 index c7b8573bb..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.simplex; - -import com.dfsek.terra.api.util.MathUtil; - - -/** - * NoiseSampler implementation to provide Perlin Noise. - */ -public class PerlinSampler extends SimplexStyleSampler { - @Override - public double getNoiseRaw(long sl, double x, double y) { - int seed = (int) sl; - int x0 = (int) Math.floor(x); - int y0 = (int) Math.floor(y); - - double xd0 = x - x0; - double yd0 = y - y0; - double xd1 = xd0 - 1; - double yd1 = yd0 - 1; - - double xs = MathUtil.interpQuintic(xd0); - double ys = MathUtil.interpQuintic(yd0); - - x0 *= PRIME_X; - y0 *= PRIME_Y; - int x1 = x0 + PRIME_X; - int y1 = y0 + PRIME_Y; - - double xf0 = MathUtil.lerp(xs, gradCoord(seed, x0, y0, xd0, yd0), gradCoord(seed, x1, y0, xd1, yd0)); - double xf1 = MathUtil.lerp(xs, gradCoord(seed, x0, y1, xd0, yd1), gradCoord(seed, x1, y1, xd1, yd1)); - - return MathUtil.lerp(ys, xf0, xf1) * 1.4247691104677813; - } - - @Override - public double getNoiseRaw(long sl, double x, double y, double z) { - int seed = (int) sl; - int x0 = (int) Math.floor(x); - int y0 = (int) Math.floor(y); - int z0 = (int) Math.floor(z); - - double xd0 = x - x0; - double yd0 = y - y0; - double zd0 = z - z0; - double xd1 = xd0 - 1; - double yd1 = yd0 - 1; - double zd1 = zd0 - 1; - - double xs = MathUtil.interpQuintic(xd0); - double ys = MathUtil.interpQuintic(yd0); - double zs = MathUtil.interpQuintic(zd0); - - x0 *= PRIME_X; - y0 *= PRIME_Y; - z0 *= PRIME_Z; - int x1 = x0 + PRIME_X; - int y1 = y0 + PRIME_Y; - int z1 = z0 + PRIME_Z; - - double xf00 = MathUtil.lerp(xs, gradCoord(seed, x0, y0, z0, xd0, yd0, zd0), gradCoord(seed, x1, y0, z0, xd1, yd0, zd0)); - double xf10 = MathUtil.lerp(xs, gradCoord(seed, x0, y1, z0, xd0, yd1, zd0), gradCoord(seed, x1, y1, z0, xd1, yd1, zd0)); - double xf01 = MathUtil.lerp(xs, gradCoord(seed, x0, y0, z1, xd0, yd0, zd1), gradCoord(seed, x1, y0, z1, xd1, yd0, zd1)); - double xf11 = MathUtil.lerp(xs, gradCoord(seed, x0, y1, z1, xd0, yd1, zd1), gradCoord(seed, x1, y1, z1, xd1, yd1, zd1)); - - double yf0 = MathUtil.lerp(ys, xf00, xf10); - double yf1 = MathUtil.lerp(ys, xf01, xf11); - - return MathUtil.lerp(zs, yf0, yf1) * 0.964921414852142333984375; - } -} 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 deleted file mode 100644 index cb2a492c5..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.simplex; - -public class SimplexSampler extends SimplexStyleSampler { - private static final Double2[] GRAD_2D = { - new Double2(-1, -1), new Double2(1, -1), new Double2(-1, 1), new Double2(1, 1), - new Double2(0, -1), new Double2(-1, 0), new Double2(0, 1), new Double2(1, 0), - }; - private static final Double3[] GRAD_3D = { - new Double3(1, 1, 0), new Double3(-1, 1, 0), new Double3(1, -1, 0), new Double3(-1, -1, 0), - new Double3(1, 0, 1), new Double3(-1, 0, 1), new Double3(1, 0, -1), new Double3(-1, 0, -1), - new Double3(0, 1, 1), new Double3(0, -1, 1), new Double3(0, 1, -1), new Double3(0, -1, -1), - new Double3(1, 1, 0), new Double3(0, -1, 1), new Double3(-1, 1, 0), new Double3(0, -1, -1), - }; - - private static final double F2 = 1.0 / 2.0; - private static final double F3 = (1.0 / 3.0); - private static final double G2 = 1.0 / 4.0; - private static final double G3 = (1.0 / 6.0); - private static final double G33 = G3 * 3 - 1; - - private static final int X_PRIME = 1619; - private static final int Y_PRIME = 31337; - private static final int Z_PRIME = 6971; - - - 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; - hash ^= Y_PRIME * y; - hash ^= Z_PRIME * z; - - hash = hash * hash * hash * 60493; - hash = (hash >> 13) ^ hash; - - Double3 g = GRAD_3D[hash & 15]; - - return xd * g.x + yd * g.y + zd * g.z; - } - - private static double gradCoord2D(int seed, int x, int y, double xd, double yd) { - int hash = seed; - hash ^= X_PRIME * x; - hash ^= Y_PRIME * y; - - hash = hash * hash * hash * 60493; - hash = (hash >> 13) ^ hash; - - Double2 g = GRAD_2D[hash & 7]; - - return xd * g.x + yd * g.y; - } - - @Override - public double getNoiseRaw(long sl, double x, double y) { - int seed = (int) sl; - double t = (x + y) * F2; - int i = (int) Math.floor(x + t); - int j = (int) Math.floor(y + t); - - t = (i + j) * G2; - double X0 = i - t; - double Y0 = j - t; - - double x0 = x - X0; - double y0 = y - Y0; - - int i1, j1; - if(x0 > y0) { - i1 = 1; - j1 = 0; - } else { - i1 = 0; - j1 = 1; - } - - double x1 = x0 - i1 + G2; - double y1 = y0 - j1 + G2; - double x2 = x0 - 1 + F2; - double y2 = y0 - 1 + F2; - - double n0, n1, n2; - - t = 0.5 - x0 * x0 - y0 * y0; - if(t < 0) { - n0 = 0; - } else { - t *= t; - n0 = t * t * gradCoord2D(seed, i, j, x0, y0); - } - - t = 0.5 - x1 * x1 - y1 * y1; - if(t < 0) { - n1 = 0; - } else { - t *= t; - n1 = t * t * gradCoord2D(seed, i + i1, j + j1, x1, y1); - } - - t = 0.5 - x2 * x2 - y2 * y2; - if(t < 0) { - n2 = 0; - } else { - t *= t; - n2 = t * t * gradCoord2D(seed, i + 1, j + 1, x2, y2); - } - - return 50 * (n0 + n1 + n2); - } - - @Override - public double getNoiseRaw(long sl, double x, double y, double z) { - int seed = (int) sl; - double t = (x + y + z) * F3; - int i = (int) Math.floor(x + t); - int j = (int) Math.floor(y + t); - int k = (int) Math.floor(z + t); - - t = (i + j + k) * G3; - double x0 = x - (i - t); - double y0 = y - (j - t); - double z0 = z - (k - t); - - int i1, j1, k1; - int i2, j2, k2; - - if(x0 >= y0) { - if(y0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 1; - k2 = 0; - } else if(x0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 0; - k2 = 1; - } else // x0 < z0 - { - i1 = 0; - j1 = 0; - k1 = 1; - i2 = 1; - j2 = 0; - k2 = 1; - } - } else // x0 < y0 - { - if(y0 < z0) { - i1 = 0; - j1 = 0; - k1 = 1; - i2 = 0; - j2 = 1; - k2 = 1; - } else if(x0 < z0) { - i1 = 0; - j1 = 1; - k1 = 0; - i2 = 0; - j2 = 1; - k2 = 1; - } else // x0 >= z0 - { - i1 = 0; - j1 = 1; - k1 = 0; - i2 = 1; - j2 = 1; - k2 = 0; - } - } - - double x1 = x0 - i1 + G3; - double y1 = y0 - j1 + G3; - double z1 = z0 - k1 + G3; - double x2 = x0 - i2 + F3; - double y2 = y0 - j2 + F3; - double z2 = z0 - k2 + F3; - double x3 = x0 + G33; - double y3 = y0 + G33; - double z3 = z0 + G33; - - double n0, n1, n2, n3; - - t = 0.6 - x0 * x0 - y0 * y0 - z0 * z0; - if(t < 0) n0 = 0; - else { - t *= t; - n0 = t * t * gradCoord3D(seed, i, j, k, x0, y0, z0); - } - - t = 0.6 - x1 * x1 - y1 * y1 - z1 * z1; - if(t < 0) { - n1 = 0; - } else { - t *= t; - n1 = t * t * gradCoord3D(seed, i + i1, j + j1, k + k1, x1, y1, z1); - } - - t = 0.6 - x2 * x2 - y2 * y2 - z2 * z2; - if(t < 0) { - n2 = 0; - } else { - t *= t; - n2 = t * t * gradCoord3D(seed, i + i2, j + j2, k + k2, x2, y2, z2); - } - - t = 0.6 - x3 * x3 - y3 * y3 - z3 * z3; - if(t < 0) { - n3 = 0; - } else { - t *= t; - n3 = t * t * gradCoord3D(seed, i + 1, j + 1, k + 1, x3, y3, z3); - } - - return 32 * (n0 + n1 + n2 + n3); - } - - private static class Double2 { - public final double x, y; - - public Double2(double x, double y) { - this.x = x; - this.y = y; - } - } - - - private static class Double3 { - public final double x, y, z; - - public Double3(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - } - } -} 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 deleted file mode 100644 index 291654327..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.simplex; - -import com.dfsek.terra.addons.noise.samplers.noise.DerivativeNoiseFunction; - - -/** - * Abstract NoiseSampler implementation for simplex-style noise functions. - */ -public abstract class SimplexStyleSampler extends DerivativeNoiseFunction { - protected static final double[] GRADIENTS_2_D = { - 0.130526192220052d, 0.99144486137381d, 0.38268343236509d, 0.923879532511287d, 0.608761429008721d, 0.793353340291235d, - 0.793353340291235d, 0.608761429008721d, 0.923879532511287d, 0.38268343236509d, 0.99144486137381d, 0.130526192220051d, - 0.99144486137381d, -0.130526192220051d, 0.923879532511287d, -0.38268343236509d, 0.793353340291235d, -0.60876142900872d, - 0.608761429008721d, -0.793353340291235d, 0.38268343236509d, -0.923879532511287d, 0.130526192220052d, -0.99144486137381d, - -0.130526192220052d, -0.99144486137381d, -0.38268343236509d, -0.923879532511287d, -0.608761429008721d, -0.793353340291235d, - -0.793353340291235d, -0.608761429008721d, -0.923879532511287d, -0.38268343236509d, -0.99144486137381d, -0.130526192220052d, - -0.99144486137381d, 0.130526192220051d, -0.923879532511287d, 0.38268343236509d, -0.793353340291235d, 0.608761429008721d, - -0.608761429008721d, 0.793353340291235d, -0.38268343236509d, 0.923879532511287d, -0.130526192220052d, 0.99144486137381d, - 0.130526192220052d, 0.99144486137381d, 0.38268343236509d, 0.923879532511287d, 0.608761429008721d, 0.793353340291235d, - 0.793353340291235d, 0.608761429008721d, 0.923879532511287d, 0.38268343236509d, 0.99144486137381d, 0.130526192220051d, - 0.99144486137381d, -0.130526192220051d, 0.923879532511287d, -0.38268343236509d, 0.793353340291235d, -0.60876142900872d, - 0.608761429008721d, -0.793353340291235d, 0.38268343236509d, -0.923879532511287d, 0.130526192220052d, -0.99144486137381d, - -0.130526192220052d, -0.99144486137381d, -0.38268343236509d, -0.923879532511287d, -0.608761429008721d, -0.793353340291235d, - -0.793353340291235d, -0.608761429008721d, -0.923879532511287d, -0.38268343236509d, -0.99144486137381d, -0.130526192220052d, - -0.99144486137381d, 0.130526192220051d, -0.923879532511287d, 0.38268343236509d, -0.793353340291235d, 0.608761429008721d, - -0.608761429008721d, 0.793353340291235d, -0.38268343236509d, 0.923879532511287d, -0.130526192220052d, 0.99144486137381d, - 0.130526192220052d, 0.99144486137381d, 0.38268343236509d, 0.923879532511287d, 0.608761429008721d, 0.793353340291235d, - 0.793353340291235d, 0.608761429008721d, 0.923879532511287d, 0.38268343236509d, 0.99144486137381d, 0.130526192220051d, - 0.99144486137381d, -0.130526192220051d, 0.923879532511287d, -0.38268343236509d, 0.793353340291235d, -0.60876142900872d, - 0.608761429008721d, -0.793353340291235d, 0.38268343236509d, -0.923879532511287d, 0.130526192220052d, -0.99144486137381d, - -0.130526192220052d, -0.99144486137381d, -0.38268343236509d, -0.923879532511287d, -0.608761429008721d, -0.793353340291235d, - -0.793353340291235d, -0.608761429008721d, -0.923879532511287d, -0.38268343236509d, -0.99144486137381d, -0.130526192220052d, - -0.99144486137381d, 0.130526192220051d, -0.923879532511287d, 0.38268343236509d, -0.793353340291235d, 0.608761429008721d, - -0.608761429008721d, 0.793353340291235d, -0.38268343236509d, 0.923879532511287d, -0.130526192220052d, 0.99144486137381d, - 0.130526192220052d, 0.99144486137381d, 0.38268343236509d, 0.923879532511287d, 0.608761429008721d, 0.793353340291235d, - 0.793353340291235d, 0.608761429008721d, 0.923879532511287d, 0.38268343236509d, 0.99144486137381d, 0.130526192220051d, - 0.99144486137381d, -0.130526192220051d, 0.923879532511287d, -0.38268343236509d, 0.793353340291235d, -0.60876142900872d, - 0.608761429008721d, -0.793353340291235d, 0.38268343236509d, -0.923879532511287d, 0.130526192220052d, -0.99144486137381d, - -0.130526192220052d, -0.99144486137381d, -0.38268343236509d, -0.923879532511287d, -0.608761429008721d, -0.793353340291235d, - -0.793353340291235d, -0.608761429008721d, -0.923879532511287d, -0.38268343236509d, -0.99144486137381d, -0.130526192220052d, - -0.99144486137381d, 0.130526192220051d, -0.923879532511287d, 0.38268343236509d, -0.793353340291235d, 0.608761429008721d, - -0.608761429008721d, 0.793353340291235d, -0.38268343236509d, 0.923879532511287d, -0.130526192220052d, 0.99144486137381d, - 0.130526192220052d, 0.99144486137381d, 0.38268343236509d, 0.923879532511287d, 0.608761429008721d, 0.793353340291235d, - 0.793353340291235d, 0.608761429008721d, 0.923879532511287d, 0.38268343236509d, 0.99144486137381d, 0.130526192220051d, - 0.99144486137381d, -0.130526192220051d, 0.923879532511287d, -0.38268343236509d, 0.793353340291235d, -0.60876142900872d, - 0.608761429008721d, -0.793353340291235d, 0.38268343236509d, -0.923879532511287d, 0.130526192220052d, -0.99144486137381d, - -0.130526192220052d, -0.99144486137381d, -0.38268343236509d, -0.923879532511287d, -0.608761429008721d, -0.793353340291235d, - -0.793353340291235d, -0.608761429008721d, -0.923879532511287d, -0.38268343236509d, -0.99144486137381d, -0.130526192220052d, - -0.99144486137381d, 0.130526192220051d, -0.923879532511287d, 0.38268343236509d, -0.793353340291235d, 0.608761429008721d, - -0.608761429008721d, 0.793353340291235d, -0.38268343236509d, 0.923879532511287d, -0.130526192220052d, 0.99144486137381d, - 0.38268343236509d, 0.923879532511287d, 0.923879532511287d, 0.38268343236509d, 0.923879532511287d, -0.38268343236509d, - 0.38268343236509d, -0.923879532511287d, -0.38268343236509d, -0.923879532511287d, -0.923879532511287d, -0.38268343236509d, - -0.923879532511287d, 0.38268343236509d, -0.38268343236509d, 0.923879532511287d, - }; - - protected static final double[] GRADIENTS_3D = { - 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, - 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, - 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, - 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, - 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, - 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, - 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, - 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, - 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, - 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, - 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, - 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, - 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, - 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, - 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, - 1, 1, 0, 0, 0, -1, 1, 0, -1, 1, 0, 0, 0, -1, -1, 0 - }; - - protected static int gradCoordIndex(int seed, int xPrimed, int yPrimed) { - int hash = hash(seed, xPrimed, yPrimed); - hash ^= hash >> 15; - hash &= 127 << 1; - - return hash; - } - - protected static double gradCoord(int seed, int xPrimed, int yPrimed, double xd, double yd) { - int index = gradCoordIndex(seed, xPrimed, yPrimed); - - double xg = GRADIENTS_2_D[index]; - double yg = GRADIENTS_2_D[index | 1]; - - return xd * xg + yd * yg; - } - - protected static int gradCoordIndex(int seed, int xPrimed, int yPrimed, int zPrimed) { - int hash = hash(seed, xPrimed, yPrimed, zPrimed); - hash ^= hash >> 15; - hash &= 63 << 2; - - return hash; - } - - protected static double gradCoord(int seed, int xPrimed, int yPrimed, int zPrimed, double xd, double yd, double zd) { - int index = gradCoordIndex(seed, xPrimed, yPrimed, zPrimed); - - double xg = GRADIENTS_3D[index]; - double yg = GRADIENTS_3D[index | 1]; - double zg = GRADIENTS_3D[index | 2]; - - return xd * xg + yd * yg + zd * zg; - } - - @Override - public double[] getNoiseDerivativeRaw(long seed, double x, double y) { - throw new UnsupportedOperationException("Implementation failed to check or set isDifferentiable correctly"); - } - - @Override - public double[] getNoiseDerivativeRaw(long seed, double x, double y, double z) { - throw new UnsupportedOperationException("Implementation failed to check or set isDifferentiable correctly"); - } - - @Override - public boolean isDifferentiable() { - return false; - } -} 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 deleted file mode 100644 index f4960fa5b..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.value; - -import com.dfsek.terra.api.util.MathUtil; - - -public class ValueCubicSampler extends ValueStyleNoise { - @Override - public double getNoiseRaw(long sl, double x, double y) { - int seed = (int) sl; - int x1 = (int) Math.floor(x); - int y1 = (int) Math.floor(y); - - double xs = x - x1; - double ys = y - y1; - - x1 *= PRIME_X; - y1 *= PRIME_Y; - int x0 = x1 - PRIME_X; - int y0 = y1 - PRIME_Y; - int x2 = x1 + PRIME_X; - int y2 = y1 + PRIME_Y; - int x3 = x1 + (PRIME_X << 1); - int y3 = y1 + (PRIME_Y << 1); - - return MathUtil.cubicLerp( - MathUtil.cubicLerp(valCoord(seed, x0, y0), valCoord(seed, x1, y0), valCoord(seed, x2, y0), valCoord(seed, x3, y0), - xs), - MathUtil.cubicLerp(valCoord(seed, x0, y1), valCoord(seed, x1, y1), valCoord(seed, x2, y1), valCoord(seed, x3, y1), - xs), - MathUtil.cubicLerp(valCoord(seed, x0, y2), valCoord(seed, x1, y2), valCoord(seed, x2, y2), valCoord(seed, x3, y2), - xs), - MathUtil.cubicLerp(valCoord(seed, x0, y3), valCoord(seed, x1, y3), valCoord(seed, x2, y3), valCoord(seed, x3, y3), - xs), - ys) * (1 / (1.5 * 1.5)); - } - - @Override - public double getNoiseRaw(long sl, double x, double y, double z) { - int seed = (int) sl; - int x1 = (int) Math.floor(x); - int y1 = (int) Math.floor(y); - int z1 = (int) Math.floor(z); - - double xs = x - x1; - double ys = y - y1; - double zs = z - z1; - - x1 *= PRIME_X; - y1 *= PRIME_Y; - z1 *= PRIME_Z; - - int x0 = x1 - PRIME_X; - int y0 = y1 - PRIME_Y; - int z0 = z1 - PRIME_Z; - int x2 = x1 + PRIME_X; - int y2 = y1 + PRIME_Y; - int z2 = z1 + PRIME_Z; - int x3 = x1 + (PRIME_X << 1); - int y3 = y1 + (PRIME_Y << 1); - int z3 = z1 + (PRIME_Z << 1); - - return MathUtil.cubicLerp( - MathUtil.cubicLerp( - MathUtil.cubicLerp(valCoord(seed, x0, y0, z0), valCoord(seed, x1, y0, z0), valCoord(seed, x2, y0, z0), - valCoord(seed, x3, y0, z0), xs), - MathUtil.cubicLerp(valCoord(seed, x0, y1, z0), valCoord(seed, x1, y1, z0), valCoord(seed, x2, y1, z0), - valCoord(seed, x3, y1, z0), xs), - MathUtil.cubicLerp(valCoord(seed, x0, y2, z0), valCoord(seed, x1, y2, z0), valCoord(seed, x2, y2, z0), - valCoord(seed, x3, y2, z0), xs), - MathUtil.cubicLerp(valCoord(seed, x0, y3, z0), valCoord(seed, x1, y3, z0), valCoord(seed, x2, y3, z0), - valCoord(seed, x3, y3, z0), xs), - ys), - MathUtil.cubicLerp( - MathUtil.cubicLerp(valCoord(seed, x0, y0, z1), valCoord(seed, x1, y0, z1), valCoord(seed, x2, y0, z1), - valCoord(seed, x3, y0, z1), xs), - MathUtil.cubicLerp(valCoord(seed, x0, y1, z1), valCoord(seed, x1, y1, z1), valCoord(seed, x2, y1, z1), - valCoord(seed, x3, y1, z1), xs), - MathUtil.cubicLerp(valCoord(seed, x0, y2, z1), valCoord(seed, x1, y2, z1), valCoord(seed, x2, y2, z1), - valCoord(seed, x3, y2, z1), xs), - MathUtil.cubicLerp(valCoord(seed, x0, y3, z1), valCoord(seed, x1, y3, z1), valCoord(seed, x2, y3, z1), - valCoord(seed, x3, y3, z1), xs), - ys), - MathUtil.cubicLerp( - MathUtil.cubicLerp(valCoord(seed, x0, y0, z2), valCoord(seed, x1, y0, z2), valCoord(seed, x2, y0, z2), - valCoord(seed, x3, y0, z2), xs), - MathUtil.cubicLerp(valCoord(seed, x0, y1, z2), valCoord(seed, x1, y1, z2), valCoord(seed, x2, y1, z2), - valCoord(seed, x3, y1, z2), xs), - MathUtil.cubicLerp(valCoord(seed, x0, y2, z2), valCoord(seed, x1, y2, z2), valCoord(seed, x2, y2, z2), - valCoord(seed, x3, y2, z2), xs), - MathUtil.cubicLerp(valCoord(seed, x0, y3, z2), valCoord(seed, x1, y3, z2), valCoord(seed, x2, y3, z2), - valCoord(seed, x3, y3, z2), xs), - ys), - MathUtil.cubicLerp( - MathUtil.cubicLerp(valCoord(seed, x0, y0, z3), valCoord(seed, x1, y0, z3), valCoord(seed, x2, y0, z3), - valCoord(seed, x3, y0, z3), xs), - MathUtil.cubicLerp(valCoord(seed, x0, y1, z3), valCoord(seed, x1, y1, z3), valCoord(seed, x2, y1, z3), - valCoord(seed, x3, y1, z3), xs), - MathUtil.cubicLerp(valCoord(seed, x0, y2, z3), valCoord(seed, x1, y2, z3), valCoord(seed, x2, y2, z3), - valCoord(seed, x3, y2, z3), xs), - MathUtil.cubicLerp(valCoord(seed, x0, y3, z3), valCoord(seed, x1, y3, z3), valCoord(seed, x2, y3, z3), - valCoord(seed, x3, y3, z3), xs), - ys), - zs) * (1 / (1.5 * 1.5 * 1.5)); - } -} 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 deleted file mode 100644 index 9aec32e5a..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.value; - -import com.dfsek.terra.api.util.MathUtil; - - -public class ValueSampler extends ValueStyleNoise { - @Override - public double getNoiseRaw(long sl, double x, double y) { - int seed = (int) sl; - int x0 = (int) Math.floor(x); - int y0 = (int) Math.floor(y); - - double xs = MathUtil.interpHermite(x - x0); - double ys = MathUtil.interpHermite(y - y0); - - x0 *= PRIME_X; - y0 *= PRIME_Y; - int x1 = x0 + PRIME_X; - int y1 = y0 + PRIME_Y; - - double xf0 = MathUtil.lerp(xs, valCoord(seed, x0, y0), valCoord(seed, x1, y0)); - double xf1 = MathUtil.lerp(xs, valCoord(seed, x0, y1), valCoord(seed, x1, y1)); - - return MathUtil.lerp(ys, xf0, xf1); - } - - @Override - public double getNoiseRaw(long sl, double x, double y, double z) { - int seed = (int) sl; - int x0 = (int) Math.floor(x); - int y0 = (int) Math.floor(y); - int z0 = (int) Math.floor(z); - - double xs = MathUtil.interpHermite(x - x0); - double ys = MathUtil.interpHermite(y - y0); - double zs = MathUtil.interpHermite(z - z0); - - x0 *= PRIME_X; - y0 *= PRIME_Y; - z0 *= PRIME_Z; - int x1 = x0 + PRIME_X; - int y1 = y0 + PRIME_Y; - int z1 = z0 + PRIME_Z; - - double xf00 = MathUtil.lerp(xs, valCoord(seed, x0, y0, z0), valCoord(seed, x1, y0, z0)); - double xf10 = MathUtil.lerp(xs, valCoord(seed, x0, y1, z0), valCoord(seed, x1, y1, z0)); - double xf01 = MathUtil.lerp(xs, valCoord(seed, x0, y0, z1), valCoord(seed, x1, y0, z1)); - double xf11 = MathUtil.lerp(xs, valCoord(seed, x0, y1, z1), valCoord(seed, x1, y1, z1)); - - double yf0 = MathUtil.lerp(ys, xf00, xf10); - double yf1 = MathUtil.lerp(ys, xf01, xf11); - - return MathUtil.lerp(zs, yf0, yf1); - } -} 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 deleted file mode 100644 index a380e5226..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueStyleNoise.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.noise.samplers.noise.value; - -import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; - - -public abstract class ValueStyleNoise extends NoiseFunction { - - protected static double valCoord(int seed, int xPrimed, int yPrimed) { - int hash = hash(seed, xPrimed, yPrimed); - - hash *= hash; - hash ^= hash << 19; - return hash * (1 / 2147483648.0); - } - - protected static double valCoord(int seed, int xPrimed, int yPrimed, int zPrimed) { - int hash = hash(seed, xPrimed, yPrimed, zPrimed); - - hash *= hash; - hash ^= hash << 19; - return hash * (1 / 2147483648.0); - } -} diff --git a/common/addons/config-number-predicate/build.gradle.kts b/common/addons/config-number-predicate/build.gradle.kts index b76b64160..3f69abb4a 100644 --- a/common/addons/config-number-predicate/build.gradle.kts +++ b/common/addons/config-number-predicate/build.gradle.kts @@ -1,5 +1,3 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar - version = version("1.0.0") dependencies { diff --git a/common/addons/config-number-predicate/src/main/java/com/dfsek/terra/addons/numberpredicate/NumberPredicateAddon.java b/common/addons/config-number-predicate/src/main/java/com/dfsek/terra/addons/numberpredicate/NumberPredicateAddon.java index fa8d84575..66594e7bd 100644 --- a/common/addons/config-number-predicate/src/main/java/com/dfsek/terra/addons/numberpredicate/NumberPredicateAddon.java +++ b/common/addons/config-number-predicate/src/main/java/com/dfsek/terra/addons/numberpredicate/NumberPredicateAddon.java @@ -30,7 +30,8 @@ public class NumberPredicateAddon implements AddonInitializer { plugin.getEventManager() .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) - .then(event -> event.getPack().applyLoader(DoublePredicate.class, new DoublePredicateLoader(event.getPack().getExpressionParseOptions()))) + .then(event -> event.getPack() + .applyLoader(DoublePredicate.class, new DoublePredicateLoader(event.getPack().getExpressionParseOptions()))) .priority(50) .failThrough(); } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java index ab876c2a6..a3f5b8d00 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java @@ -7,17 +7,20 @@ package com.dfsek.terra.addons.ore.ores; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions; +import com.dfsek.seismic.math.trigonometry.TrigonometryFunctions; +import com.dfsek.seismic.type.Rotation; +import com.dfsek.seismic.type.vector.Vector3Int; + import java.util.BitSet; import java.util.Map; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.MathUtil; -import com.dfsek.terra.api.util.Rotation; import com.dfsek.terra.api.util.collection.MaterialSet; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.WritableWorld; import static com.dfsek.terra.addons.ore.utils.VanillaOreUtils.shouldPlace; @@ -44,16 +47,16 @@ public class VanillaOre implements Structure { } @Override - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation) { float randomRadian = random.nextFloat() * (float) Math.PI; double eighthSize = size / 8.0F; // Place points to form a line segment - double startX = (double) location.getX() + MathUtil.sin(randomRadian) * eighthSize; - double endX = (double) location.getX() - MathUtil.sin(randomRadian) * eighthSize; + double startX = (double) location.getX() + TrigonometryFunctions.sin(randomRadian) * eighthSize; + double endX = (double) location.getX() - TrigonometryFunctions.sin(randomRadian) * eighthSize; - double startZ = (double) location.getZ() + MathUtil.cos(randomRadian) * eighthSize; - double endZ = (double) location.getZ() - MathUtil.cos(randomRadian) * eighthSize; + double startZ = (double) location.getZ() + TrigonometryFunctions.cos(randomRadian) * eighthSize; + double endZ = (double) location.getZ() - TrigonometryFunctions.cos(randomRadian) * eighthSize; double startY = location.getY() + random.nextInt(3) - 2; double endY = location.getY() + random.nextInt(3) - 2; @@ -64,12 +67,12 @@ public class VanillaOre implements Structure { // Compute initial point positions and radius for(int i = 0; i < sizeInt; ++i) { float t = (float) i / (float) sizeInt; - double xt = MathUtil.lerp(t, startX, endX); - double yt = MathUtil.lerp(t, startY, endY); - double zt = MathUtil.lerp(t, startZ, endZ); + double xt = InterpolationFunctions.lerp(startX, endX, t); + double yt = InterpolationFunctions.lerp(startY, endY, t); + double zt = InterpolationFunctions.lerp(startZ, endZ, t); double roll = random.nextDouble() * size / 16.0; // Taper radius closer to line ends - double radius = ((MathUtil.sin((float) Math.PI * t) + 1.0F) * roll + 1.0) / 2.0; + double radius = ((TrigonometryFunctions.sin((float) Math.PI * t) + 1.0F) * roll + 1.0) / 2.0; points[i * 4] = xt; points[i * 4 + 1] = yt; points[i * 4 + 2] = zt; @@ -102,7 +105,7 @@ public class VanillaOre implements Structure { } } - int outset = (int) Math.ceil((size / 16.0F * 2.0F + 1.0F) / 2.0F); + int outset = FloatingPointFunctions.ceil((size / 16.0F * 2.0F + 1.0F) / 2.0F); int x = (int) (location.getX() - Math.ceil(eighthSize) - outset); int y = location.getY() - 2 - outset; int z = (int) (location.getZ() - Math.ceil(eighthSize) - outset); diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaScatteredOre.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaScatteredOre.java index b7b699490..708450a35 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaScatteredOre.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaScatteredOre.java @@ -1,13 +1,14 @@ package com.dfsek.terra.addons.ore.ores; +import com.dfsek.seismic.type.Rotation; +import com.dfsek.seismic.type.vector.Vector3Int; + import java.util.Map; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.util.Rotation; import com.dfsek.terra.api.util.collection.MaterialSet; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.WritableWorld; import static com.dfsek.terra.addons.ore.utils.VanillaOreUtils.shouldPlace; @@ -24,7 +25,7 @@ public class VanillaScatteredOre extends VanillaOre { } @Override - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation) { int i = random.nextInt((int) (size + 1)); Vector3Int.Mutable mutable = Vector3Int.zero().mutable(); @@ -39,7 +40,7 @@ public class VanillaScatteredOre extends VanillaOre { return true; } - private void setPos(Vector3Int.Mutable mutable, Random random, Vector3Int location, int spread) { + private void setPos(Vector3Int.Mutable mutable, RandomGenerator random, Vector3Int location, int spread) { int x = this.getSpread(random, spread); int y = this.getSpread(random, spread); int z = this.getSpread(random, spread); @@ -48,7 +49,7 @@ public class VanillaScatteredOre extends VanillaOre { mutable.setZ(location.getZ() + z); } - private int getSpread(Random random, int spread) { + private int getSpread(RandomGenerator random, int spread) { return Math.round((random.nextFloat() - random.nextFloat()) * (float) spread); } } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java index f8ede8680..4f892db37 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java @@ -1,6 +1,6 @@ package com.dfsek.terra.addons.ore.utils; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.util.collection.MaterialSet; @@ -8,13 +8,14 @@ import com.dfsek.terra.api.world.WritableWorld; public class VanillaOreUtils { - private static boolean shouldExpose(Random random, double exposedChance) { + private static boolean shouldExpose(RandomGenerator random, double exposedChance) { if(exposedChance >= 1.0F) return true; if(exposedChance <= 0.0F) return false; return random.nextFloat() < exposedChance; } - public static boolean shouldPlace(MaterialSet replaceable, BlockType type, Double exposedChance, Random random, WritableWorld world, + public static boolean shouldPlace(MaterialSet replaceable, BlockType type, Double exposedChance, RandomGenerator random, + WritableWorld world, int x, int y, int z) { if(!replaceable.contains(type)) return false; 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 406b30e95..72cdc4d24 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 @@ -7,6 +7,7 @@ package com.dfsek.terra.addons.palette; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Final; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -16,14 +17,13 @@ import java.util.List; import com.dfsek.terra.addons.palette.palette.PaletteLayerHolder; import com.dfsek.terra.api.config.AbstractableTemplate; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; @SuppressWarnings({ "FieldMayBeFinal", "unused" }) public class PaletteTemplate implements AbstractableTemplate { @Value("sampler") @Default - private @Meta NoiseSampler defaultSampler = NoiseSampler.zero(); + private @Meta Sampler defaultSampler = Sampler.zero(); @Value("id") @Final @@ -40,7 +40,7 @@ public class PaletteTemplate implements AbstractableTemplate { return palette; } - public NoiseSampler getDefaultSampler() { + public Sampler getDefaultSampler() { return defaultSampler; } } 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 448923d32..6b5364ad5 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 @@ -7,14 +7,16 @@ package com.dfsek.terra.addons.palette.palette; +import com.dfsek.seismic.type.sampler.Sampler; + import java.util.ArrayList; import java.util.List; 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.world.chunk.generation.util.Palette; + /** * 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. @@ -22,15 +24,15 @@ import com.dfsek.terra.api.world.chunk.generation.util.Palette; public class PaletteImpl implements Palette { private final PaletteLayer[] layers; - public PaletteImpl(List layers, NoiseSampler defaultSampler) { + public PaletteImpl(List layers, Sampler defaultSampler) { List layerArray = new ArrayList<>(); - for (PaletteLayerHolder holder : layers) { + for(PaletteLayerHolder holder : layers) { PaletteLayer layer; ProbabilityCollection materials = holder.getLayer(); - NoiseSampler sampler = holder.getSampler() == null ? defaultSampler : holder.getSampler(); + Sampler sampler = holder.getSampler() == null ? defaultSampler : holder.getSampler(); layer = new PaletteLayer(materials, sampler); - for (int i = 0; i < holder.getSize(); i++) + for(int i = 0; i < holder.getSize(); i++) layerArray.add(layer); } @@ -44,10 +46,10 @@ public class PaletteImpl implements Palette { } static class PaletteLayer { - private final NoiseSampler sampler; + private final Sampler sampler; private final ProbabilityCollection collection; - public PaletteLayer(ProbabilityCollection type, NoiseSampler sampler) { + public PaletteLayer(ProbabilityCollection type, Sampler sampler) { this.sampler = sampler; this.collection = type; } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerHolder.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerHolder.java index 29f31269b..02f4b01e4 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerHolder.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerHolder.java @@ -7,19 +7,19 @@ package com.dfsek.terra.addons.palette.palette; +import com.dfsek.seismic.type.sampler.Sampler; import org.jetbrains.annotations.NotNull; import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; public class PaletteLayerHolder { private final ProbabilityCollection layer; - private final NoiseSampler sampler; + private final Sampler sampler; private final int size; - public PaletteLayerHolder(@NotNull ProbabilityCollection layer, NoiseSampler sampler, int size) { + public PaletteLayerHolder(@NotNull ProbabilityCollection layer, Sampler sampler, int size) { this.layer = layer; this.sampler = sampler; this.size = size; @@ -34,7 +34,7 @@ public class PaletteLayerHolder { return size; } - public NoiseSampler getSampler() { + public Sampler getSampler() { return sampler; } } 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 e305bf6a9..be3a2f875 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 @@ -7,13 +7,13 @@ package com.dfsek.terra.addons.palette.palette; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; @@ -23,7 +23,7 @@ public class PaletteLayerLoader implements ObjectTemplate { @Value("sampler") @Default - private @Meta NoiseSampler sampler = null; + private @Meta Sampler sampler = null; @Value("layers") private @Meta int layers; diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureTemplate.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureTemplate.java index 03d2c9953..2e8680d5e 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureTemplate.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureTemplate.java @@ -14,8 +14,8 @@ import com.dfsek.terra.api.config.AbstractableTemplate; import com.dfsek.terra.api.config.meta.Meta; 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; +import com.dfsek.terra.api.util.range.Range; @SuppressWarnings({ "unused", "FieldMayBeFinal" }) 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 4cb7fd56c..741583cf4 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 @@ -10,8 +10,8 @@ package com.dfsek.terra.addons.structure; import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.StructureSpawn; import com.dfsek.terra.api.structure.configured.ConfiguredStructure; -import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.ProbabilityCollection; +import com.dfsek.terra.api.util.range.Range; public class TerraStructure implements ConfiguredStructure { diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Entry.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Entry.java index 935353b7e..0b019ed58 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Entry.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Entry.java @@ -12,7 +12,7 @@ import org.json.simple.JSONObject; import java.util.ArrayList; import java.util.List; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.addons.structure.structures.loot.functions.AmountFunction; import com.dfsek.terra.addons.structure.structures.loot.functions.DamageFunction; @@ -85,11 +85,11 @@ public class Entry { /** * Fetches a single ItemStack from the Entry, applying all functions to it. * - * @param r The Random instance to apply functions with + * @param r The RandomGenerator instance to apply functions with * * @return ItemStack - The ItemStack with all functions applied. */ - public ItemStack getItem(Random r) { + public ItemStack getItem(RandomGenerator r) { ItemStack item = this.item.newItemStack(1); for(LootFunction f : functions) { item = f.apply(item, r); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/LootTableImpl.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/LootTableImpl.java index 2f69cddfe..a76a74393 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/LootTableImpl.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/LootTableImpl.java @@ -14,7 +14,7 @@ import org.json.simple.parser.ParseException; import java.util.ArrayList; import java.util.List; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.inventory.Inventory; @@ -44,7 +44,7 @@ public class LootTableImpl implements com.dfsek.terra.api.structure.LootTable { } @Override - public void fillInventory(Inventory i, Random r) { + public void fillInventory(Inventory i, RandomGenerator r) { List loot = getLoot(r); for(ItemStack stack : loot) { int attempts = 0; @@ -70,7 +70,7 @@ public class LootTableImpl implements com.dfsek.terra.api.structure.LootTable { } @Override - public List getLoot(Random r) { + public List getLoot(RandomGenerator r) { List itemList = new ArrayList<>(); for(Pool pool : pools) { itemList.addAll(pool.getItems(r)); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Pool.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Pool.java index d0907f908..c6b5b379b 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Pool.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Pool.java @@ -12,7 +12,7 @@ import org.json.simple.JSONObject; import java.util.ArrayList; import java.util.List; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.inventory.ItemStack; @@ -50,13 +50,13 @@ public class Pool { } /** - * Fetches a list of items from the pool using the provided Random instance. + * Fetches a list of items from the pool using the provided RandomGenerator instance. * - * @param r The Random instance to use. + * @param r The RandomGenerator instance to use. * * @return List<ItemStack> - The list of items fetched. */ - public List getItems(Random r) { + public List getItems(RandomGenerator r) { int rolls = r.nextInt(max - min + 1) + min; List items = new ArrayList<>(); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/AmountFunction.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/AmountFunction.java index e85c813e3..eeb1e61c0 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/AmountFunction.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/AmountFunction.java @@ -8,7 +8,7 @@ package com.dfsek.terra.addons.structure.structures.loot.functions; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.inventory.ItemStack; @@ -35,12 +35,12 @@ public class AmountFunction implements LootFunction { * Applies the function to an ItemStack. * * @param original The ItemStack on which to apply the function. - * @param r The Random instance to use. + * @param r The RandomGenerator instance to use. * * @return - ItemStack - The mutated ItemStack. */ @Override - public ItemStack apply(ItemStack original, Random r) { + public ItemStack apply(ItemStack original, RandomGenerator r) { original.setAmount(r.nextInt(max - min + 1) + min); return original; } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/DamageFunction.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/DamageFunction.java index 38727c41e..804fc75b9 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/DamageFunction.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/DamageFunction.java @@ -7,7 +7,7 @@ package com.dfsek.terra.addons.structure.structures.loot.functions; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.inventory.ItemStack; import com.dfsek.terra.api.inventory.item.Damageable; @@ -36,12 +36,12 @@ public class DamageFunction implements LootFunction { * Applies the function to an ItemStack. * * @param original The ItemStack on which to apply the function. - * @param r The Random instance to use. + * @param r The RandomGenerator instance to use. * * @return - ItemStack - The mutated ItemStack. */ @Override - public ItemStack apply(ItemStack original, Random r) { + public ItemStack apply(ItemStack original, RandomGenerator r) { if(original == null) return null; if(!original.isDamageable()) return original; ItemMeta meta = original.getItemMeta(); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/EnchantFunction.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/EnchantFunction.java index 861765b9a..81717073e 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/EnchantFunction.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/EnchantFunction.java @@ -14,7 +14,7 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.inventory.ItemStack; @@ -41,12 +41,12 @@ public class EnchantFunction implements LootFunction { * Applies the function to an ItemStack. * * @param original The ItemStack on which to apply the function. - * @param r The Random instance to use. + * @param r The RandomGenerator instance to use. * * @return - ItemStack - The mutated ItemStack. */ @Override - public ItemStack apply(ItemStack original, Random r) { + public ItemStack apply(ItemStack original, RandomGenerator r) { if(original.getItemMeta() == null) return original; double enchant = (r.nextDouble() * (max - min)) + min; diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/LootFunction.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/LootFunction.java index 24068d268..e90724914 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/LootFunction.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/LootFunction.java @@ -8,7 +8,7 @@ package com.dfsek.terra.addons.structure.structures.loot.functions; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.inventory.ItemStack; @@ -21,9 +21,9 @@ public interface LootFunction { * Applies the function to an ItemStack. * * @param original The ItemStack on which to apply the function. - * @param r The Random instance to use. + * @param r The RandomGenerator instance to use. * * @return - ItemStack - The mutated ItemStack. */ - ItemStack apply(ItemStack original, Random r); + ItemStack apply(ItemStack original, RandomGenerator r); } 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 index 833a3fcc3..d1f8746e3 100644 --- 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 @@ -11,6 +11,13 @@ import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate; import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + import com.dfsek.terra.addons.generation.feature.config.BiomeFeatures; import com.dfsek.terra.addons.generation.feature.config.FeatureStageTemplate; import com.dfsek.terra.addons.manifest.api.AddonInitializer; @@ -28,9 +35,6 @@ import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; -import java.util.*; -import java.util.function.Supplier; - public class FeatureGenerationAddon implements AddonInitializer { public static final TypeKey>> STAGE_TYPE_KEY = new TypeKey<>() { 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 index eaa8341ef..38880e351 100644 --- 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 @@ -7,21 +7,23 @@ package com.dfsek.terra.addons.generation.feature; +import com.dfsek.seismic.type.Rotation; +import com.dfsek.seismic.type.sampler.Sampler; +import com.dfsek.seismic.type.vector.Vector3Int; + +import java.util.Collections; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; + import com.dfsek.terra.addons.generation.feature.config.BiomeFeatures; import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.properties.PropertyKey; import com.dfsek.terra.api.registry.key.StringIdentifiable; -import com.dfsek.terra.api.util.Rotation; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.WritableWorld; import com.dfsek.terra.api.world.chunk.generation.ProtoWorld; import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; import com.dfsek.terra.api.world.chunk.generation.util.Column; -import java.util.Collections; -import java.util.Random; - public class FeatureGenerationStage implements GenerationStage, StringIdentifiable { private final Platform platform; @@ -32,12 +34,12 @@ public class FeatureGenerationStage implements GenerationStage, StringIdentifiab private final int resolution; private final PropertyKey biomeFeaturesKey; - private final NoiseSampler blendSampler; + private final Sampler blendSampler; private final boolean doBlending; private final double blendAmplitude; public FeatureGenerationStage(Platform platform, String id, int resolution, PropertyKey biomeFeaturesKey, - NoiseSampler blendSampler, double blendAmplitude) { + Sampler blendSampler, double blendAmplitude) { this.platform = platform; this.id = id; this.profile = "feature_stage:" + id; @@ -61,8 +63,8 @@ public class FeatureGenerationStage implements GenerationStage, StringIdentifiab int tz = cz + chunkZ; world.getBiomeProvider() .getColumn( - tx + (doBlending ? (int) (blendSampler.noise(seed, tx, tz) * blendAmplitude) : 0), - tz + (doBlending ? (int) (blendSampler.noise(seed + 1, tx, tz) * blendAmplitude) : 0), + tx + (doBlending ? (int) (blendSampler.getSample(seed, tx, tz) * blendAmplitude) : 0), + tz + (doBlending ? (int) (blendSampler.getSample(seed + 1, tx, tz) * blendAmplitude) : 0), world) .forRanges(resolution, (min, max, biome) -> { for(int subChunkX = 0; subChunkX < resolution; subChunkX++) { @@ -83,7 +85,9 @@ public class FeatureGenerationStage implements GenerationStage, StringIdentifiab .forEach(y -> feature.getStructure(world, x, y, z) .generate(Vector3Int.of(x, y, z), world, - new Random(coordinateSeed * 31 + y), + RandomGeneratorFactory.of( + "Xoroshiro128PlusPlus") + .create(coordinateSeed * 31 + y), Rotation.NONE) ); } diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/FeatureStageTemplate.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/FeatureStageTemplate.java index d0fae0e1f..bb8cb4854 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/FeatureStageTemplate.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/FeatureStageTemplate.java @@ -1,5 +1,6 @@ package com.dfsek.terra.addons.generation.feature.config; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -8,7 +9,6 @@ import com.dfsek.tectonic.api.exception.ValidationException; import com.dfsek.terra.addons.generation.feature.FeatureGenerationStage; import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.properties.PropertyKey; import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; @@ -25,14 +25,14 @@ public class FeatureStageTemplate implements ObjectTemplate, Va @Value("blend.sampler") @Default - private NoiseSampler blendSampler = new NoiseSampler() { + private Sampler blendSampler = new Sampler() { @Override - public double noise(long seed, double x, double y) { + public double getSample(long seed, double x, double y) { return 0; } @Override - public double noise(long seed, double x, double y, double z) { + public double getSample(long seed, double x, double y, double z) { return 0; } }; diff --git a/common/addons/language-yaml/src/main/java/com/dfsek/terra/addons/yaml/YamlAddon.java b/common/addons/language-yaml/src/main/java/com/dfsek/terra/addons/yaml/YamlAddon.java index d47619eb5..e31962b7b 100644 --- a/common/addons/language-yaml/src/main/java/com/dfsek/terra/addons/yaml/YamlAddon.java +++ b/common/addons/language-yaml/src/main/java/com/dfsek/terra/addons/yaml/YamlAddon.java @@ -11,12 +11,16 @@ import com.dfsek.tectonic.yaml.YamlConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; +import java.nio.file.Files; + import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.ConfigurationDiscoveryEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.inject.annotations.Inject; +import com.dfsek.terra.api.util.FileUtil; public class YamlAddon implements AddonInitializer { @@ -33,10 +37,21 @@ public class YamlAddon implements AddonInitializer { platform.getEventManager() .getHandler(FunctionalEventHandler.class) .register(addon, ConfigurationDiscoveryEvent.class) - .then(event -> event.getLoader().open("", ".yml").thenEntries(entries -> entries.forEach(entry -> { - LOGGER.debug("Discovered config {}", entry.getKey()); - event.register(entry.getKey(), new YamlConfiguration(entry.getValue(), entry.getKey())); - })).close()) + .then(event -> { + try { + FileUtil.filesWithExtension(event.getPack().getRootPath(), ".yml") + .forEach((key, value) -> { + LOGGER.debug("Discovered config {}", key); + try { + event.register(key, new YamlConfiguration(Files.newInputStream(value), key)); + } catch(IOException e) { + throw new RuntimeException("Failed to load config " + key, e); + } + }); + } catch(IOException e) { + throw new RuntimeException("Error occurred while reading config pack files", e); + } + }) .failThrough(); } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java index b383c4ca7..25888e086 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java @@ -1,5 +1,6 @@ package com.dfsek.terra.addons.image; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.function.Supplier; @@ -15,8 +16,8 @@ import com.dfsek.terra.addons.image.config.colorsampler.mutate.RotateColorSample import com.dfsek.terra.addons.image.config.colorsampler.mutate.TranslateColorSamplerTemplate; import com.dfsek.terra.addons.image.config.image.ImageTemplate; import com.dfsek.terra.addons.image.config.image.StitchedImageTemplate; -import com.dfsek.terra.addons.image.config.noisesampler.ChannelNoiseSamplerTemplate; -import com.dfsek.terra.addons.image.config.noisesampler.DistanceTransformNoiseSamplerTemplate; +import com.dfsek.terra.addons.image.config.sampler.ChannelSamplerTemplate; +import com.dfsek.terra.addons.image.config.sampler.DistanceTransformSamplerTemplate; import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.operator.DistanceTransform; import com.dfsek.terra.addons.manifest.api.AddonInitializer; @@ -26,7 +27,6 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.inject.annotations.Inject; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; @@ -39,7 +39,7 @@ public class ImageLibraryAddon implements AddonInitializer { public static final TypeKey>> COLOR_PICKER_REGISTRY_KEY = new TypeKey<>() { }; - public static final TypeKey>> NOISE_SAMPLER_TOKEN = new TypeKey<>() { + public static final TypeKey>> NOISE_SAMPLER_TOKEN = new TypeKey<>() { }; @Inject private Platform platform; @@ -60,8 +60,8 @@ public class ImageLibraryAddon implements AddonInitializer { .then(event -> { ConfigPack pack = event.getPack(); CheckedRegistry>> imageRegistry = pack.getOrCreateRegistry(IMAGE_REGISTRY_KEY); - imageRegistry.register(addon.key("BITMAP"), () -> new ImageTemplate(pack.getLoader(), pack)); - imageRegistry.register(addon.key("STITCHED_BITMAP"), () -> new StitchedImageTemplate(pack.getLoader(), pack)); + imageRegistry.register(addon.key("BITMAP"), () -> new ImageTemplate(pack)); + imageRegistry.register(addon.key("STITCHED_BITMAP"), () -> new StitchedImageTemplate(pack)); }) .then(event -> { event.getPack() @@ -71,10 +71,10 @@ public class ImageLibraryAddon implements AddonInitializer { (type, o, loader, depthTracker) -> DistanceTransform.Normalization.valueOf((String) o)) .applyLoader(ColorString.class, new ColorLoader()); - CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry( + CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry( NOISE_SAMPLER_TOKEN); - noiseRegistry.register(addon.key("DISTANCE_TRANSFORM"), DistanceTransformNoiseSamplerTemplate::new); - noiseRegistry.register(addon.key("CHANNEL"), ChannelNoiseSamplerTemplate::new); + noiseRegistry.register(addon.key("DISTANCE_TRANSFORM"), DistanceTransformSamplerTemplate::new); + noiseRegistry.register(addon.key("CHANNEL"), ChannelSamplerTemplate::new); }) .then(event -> { CheckedRegistry>> colorSamplerRegistry = event.getPack().getOrCreateRegistry( diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/RotateColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/RotateColorSampler.java index a356a0787..b813fa841 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/RotateColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/RotateColorSampler.java @@ -1,7 +1,8 @@ package com.dfsek.terra.addons.image.colorsampler.mutate; +import com.dfsek.seismic.math.trigonometry.TrigonometryFunctions; + import com.dfsek.terra.addons.image.colorsampler.ColorSampler; -import com.dfsek.terra.api.util.MathUtil; public class RotateColorSampler implements ColorSampler { @@ -39,14 +40,14 @@ public class RotateColorSampler implements ColorSampler { case DEG_90 -> -z; case DEG_180 -> -x; case DEG_270 -> z; - case RAD_ANY -> (int) (x * MathUtil.cos(radians) - z * MathUtil.sin(radians)); + case RAD_ANY -> (int) (x * TrigonometryFunctions.cos(radians) - z * TrigonometryFunctions.sin(radians)); }; int rz = switch(rotationMethod) { case DEG_0 -> z; case DEG_90 -> x; case DEG_180 -> -z; case DEG_270 -> -x; - case RAD_ANY -> (int) (z * MathUtil.cos(radians) + x * MathUtil.sin(radians)); + case RAD_ANY -> (int) (z * TrigonometryFunctions.cos(radians) + x * TrigonometryFunctions.sin(radians)); }; return sampler.apply(rx, rz); } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java index 88240b7ce..7ad72a009 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java @@ -2,10 +2,13 @@ package com.dfsek.terra.addons.image.config.image; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; +import com.github.benmanes.caffeine.cache.Scheduler; import javax.imageio.ImageIO; -import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.concurrent.TimeUnit; import com.dfsek.terra.addons.image.config.ImageLibraryPackConfigTemplate; @@ -13,12 +16,9 @@ import com.dfsek.terra.addons.image.image.BufferedImageWrapper; import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.image.SuppliedImage; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.config.Loader; import com.dfsek.terra.api.properties.Properties; import com.dfsek.terra.api.util.generic.Lazy; -import com.github.benmanes.caffeine.cache.Scheduler; - import static com.dfsek.terra.api.util.cache.CacheUtils.CACHE_EXECUTOR; @@ -26,13 +26,13 @@ import static com.dfsek.terra.api.util.cache.CacheUtils.CACHE_EXECUTOR; * Cache prevents configs from loading the same image multiple times into memory */ record ImageCache(LoadingCache cache) implements Properties { - public static Image load(String path, ConfigPack pack, Loader files) throws IOException { + public static Image load(String path, ConfigPack pack) throws IOException { ImageLibraryPackConfigTemplate config = pack.getContext().get(ImageLibraryPackConfigTemplate.class); ImageCache images; if(!pack.getContext().has(ImageCache.class)) { var cacheBuilder = Caffeine.newBuilder().executor(CACHE_EXECUTOR).scheduler(Scheduler.systemScheduler()); if(config.unloadOnTimeout()) cacheBuilder.expireAfterAccess(config.getCacheTimeout(), TimeUnit.SECONDS); - images = new ImageCache(cacheBuilder.build(s -> loadImage(s, files))); + images = new ImageCache(cacheBuilder.build(s -> loadImage(s, pack.getRootPath()))); pack.getContext().put(images); } else images = pack.getContext().get(ImageCache.class); @@ -49,17 +49,8 @@ record ImageCache(LoadingCache cache) implements Properties { return images.cache.get(path); } - private static Image loadImage(String path, Loader files) throws IOException { - try { - return new BufferedImageWrapper(ImageIO.read(files.get(path))); - } catch(IllegalArgumentException e) { - throw new IllegalArgumentException("Unable to load image (image might be too large?)", e); - } catch(IOException e) { - if(e instanceof FileNotFoundException) { - // Rethrow using nicer message - throw new IOException("Unable to load image: No such file or directory: " + path, e); - } - throw new IOException("Unable to load image", e); - } + private static Image loadImage(String path, Path directory) throws IOException { + InputStream is = Files.newInputStream(directory.resolve(path)); + return new BufferedImageWrapper(ImageIO.read(is)); } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageTemplate.java index dc33bf13c..0ef7ee751 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageTemplate.java @@ -7,25 +7,22 @@ import java.io.IOException; import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.config.Loader; public class ImageTemplate implements ObjectTemplate { - private final Loader files; private final ConfigPack pack; @Value("path") private String path; - public ImageTemplate(Loader files, ConfigPack pack) { - this.files = files; + public ImageTemplate(ConfigPack pack) { this.pack = pack; } @Override public Image get() { try { - return ImageCache.load(path, pack, files); + return ImageCache.load(path, pack); } catch(IOException e) { throw new RuntimeException(e); } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/StitchedImageTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/StitchedImageTemplate.java index 3a834a218..f7f7fb7e4 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/StitchedImageTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/StitchedImageTemplate.java @@ -11,12 +11,10 @@ import java.io.IOException; import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.image.StitchedImage; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.config.Loader; public class StitchedImageTemplate implements ObjectTemplate, ValidatedConfigTemplate { - private final Loader files; private final ConfigPack pack; @Value("path-format") private String path; @@ -28,8 +26,7 @@ public class StitchedImageTemplate implements ObjectTemplate, ValidatedCo @Default private boolean zeroIndexed = false; - public StitchedImageTemplate(Loader files, ConfigPack pack) { - this.files = files; + public StitchedImageTemplate(ConfigPack pack) { this.pack = pack; } @@ -39,7 +36,7 @@ public class StitchedImageTemplate implements ObjectTemplate, ValidatedCo for(int i = 0; i < rows; i++) { for(int j = 0; j < cols; j++) { try { - grid[i][j] = ImageCache.load(getFormattedPath(i, j), pack, files); + grid[i][j] = ImageCache.load(getFormattedPath(i, j), pack); } catch(IOException e) { throw new RuntimeException(e); } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/noisesampler/ChannelNoiseSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ChannelSamplerTemplate.java similarity index 70% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/noisesampler/ChannelNoiseSamplerTemplate.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ChannelSamplerTemplate.java index b6631a149..594c609ef 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/noisesampler/ChannelNoiseSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ChannelSamplerTemplate.java @@ -1,16 +1,16 @@ -package com.dfsek.terra.addons.image.config.noisesampler; +package com.dfsek.terra.addons.image.config.sampler; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.image.colorsampler.ColorSampler; -import com.dfsek.terra.addons.image.noisesampler.ChannelNoiseSampler; +import com.dfsek.terra.addons.image.sampler.ChannelSampler; import com.dfsek.terra.addons.image.util.ColorUtil.Channel; -import com.dfsek.terra.api.noise.NoiseSampler; -public class ChannelNoiseSamplerTemplate implements ObjectTemplate { +public class ChannelSamplerTemplate implements ObjectTemplate { @Value("color-sampler") private ColorSampler colorSampler; @@ -35,7 +35,7 @@ public class ChannelNoiseSamplerTemplate implements ObjectTemplate private boolean premultiply = false; @Override - public NoiseSampler get() { - return new ChannelNoiseSampler(colorSampler, channel, normalize, premultiply); + public Sampler get() { + return new ChannelSampler(colorSampler, channel, normalize, premultiply); } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/noisesampler/DistanceTransformNoiseSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/DistanceTransformSamplerTemplate.java similarity index 91% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/noisesampler/DistanceTransformNoiseSamplerTemplate.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/DistanceTransformSamplerTemplate.java index 222ff48fd..49e9fa35f 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/noisesampler/DistanceTransformNoiseSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/DistanceTransformSamplerTemplate.java @@ -1,5 +1,6 @@ -package com.dfsek.terra.addons.image.config.noisesampler; +package com.dfsek.terra.addons.image.config.sampler; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; @@ -9,10 +10,9 @@ import com.dfsek.terra.addons.image.operator.DistanceTransform; import com.dfsek.terra.addons.image.operator.DistanceTransform.CostFunction; import com.dfsek.terra.addons.image.operator.DistanceTransform.Normalization; import com.dfsek.terra.addons.image.util.ColorUtil.Channel; -import com.dfsek.terra.api.noise.NoiseSampler; -public class DistanceTransformNoiseSamplerTemplate implements ObjectTemplate { +public class DistanceTransformSamplerTemplate implements ObjectTemplate { @Value("image") private Image image; @@ -68,7 +68,7 @@ public class DistanceTransformNoiseSamplerTemplate implements ObjectTemplate= transform.width || y >= transform.height) return transform.minDistance; - return transform.distances[(int) Math.floor(x)][(int) Math.floor(y)]; + return transform.distances[FloatingPointFunctions.floor(x)][FloatingPointFunctions.floor(y)]; } @Override - public double noise(long seed, double x, double y, double z) { - return noise(seed, x, z); + public double getSample(long seed, double x, double y, double z) { + return getSample(seed, x, z); } } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/noisesampler/ChannelNoiseSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/ChannelSampler.java similarity index 67% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/noisesampler/ChannelNoiseSampler.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/ChannelSampler.java index 43410d714..e0e020dc8 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/noisesampler/ChannelNoiseSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/ChannelSampler.java @@ -1,14 +1,15 @@ -package com.dfsek.terra.addons.image.noisesampler; +package com.dfsek.terra.addons.image.sampler; + +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import com.dfsek.terra.addons.image.util.ColorUtil; import com.dfsek.terra.addons.image.util.ColorUtil.Channel; -import com.dfsek.terra.api.noise.NoiseSampler; import static com.dfsek.terra.addons.image.util.MathUtil.lerp; -public class ChannelNoiseSampler implements NoiseSampler { +public class ChannelSampler implements Sampler { private final ColorSampler colorSampler; @@ -18,7 +19,7 @@ public class ChannelNoiseSampler implements NoiseSampler { private final boolean premultiply; - public ChannelNoiseSampler(ColorSampler colorSampler, Channel channel, boolean normalize, boolean premultiply) { + public ChannelSampler(ColorSampler colorSampler, Channel channel, boolean normalize, boolean premultiply) { this.colorSampler = colorSampler; this.channel = channel; this.normalize = normalize; @@ -26,7 +27,7 @@ public class ChannelNoiseSampler implements NoiseSampler { } @Override - public double noise(long seed, double x, double y) { + public double getSample(long seed, double x, double y) { int sample = colorSampler.apply((int) x, (int) y); int premultiplied = premultiply ? ColorUtil.premultiply(sample) : sample; double channelValue = channel.from(premultiplied); @@ -34,7 +35,7 @@ public class ChannelNoiseSampler implements NoiseSampler { } @Override - public double noise(long seed, double x, double y, double z) { - return noise(seed, x, z); + public double getSample(long seed, double x, double y, double z) { + return getSample(seed, x, z); } } diff --git a/common/addons/pipeline-image/build.gradle.kts b/common/addons/pipeline-image/build.gradle.kts index 1befb4b44..81b010d74 100644 --- a/common/addons/pipeline-image/build.gradle.kts +++ b/common/addons/pipeline-image/build.gradle.kts @@ -2,6 +2,6 @@ version = version("1.0.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) - compileOnlyApi(project(":common:addons:biome-provider-pipeline-v2")) + compileOnlyApi(project(":common:addons:biome-provider-pipeline")) compileOnlyApi(project(":common:addons:library-image")) } diff --git a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/ImageSource.java b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/ImageSource.java index 1d54dec89..b629dd35d 100644 --- a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/ImageSource.java +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/ImageSource.java @@ -1,7 +1,7 @@ package com.dfsek.terra.addons.biome.pipeline.image; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.api.Source; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import com.dfsek.terra.addons.image.converter.ColorConverter; diff --git a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/PipelineImageAddon.java b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/PipelineImageAddon.java index 34de699af..aa0757093 100644 --- a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/PipelineImageAddon.java +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/PipelineImageAddon.java @@ -4,14 +4,14 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.function.Supplier; +import com.dfsek.terra.addons.biome.pipeline.BiomePipelineAddon; +import com.dfsek.terra.addons.biome.pipeline.api.Source; +import com.dfsek.terra.addons.biome.pipeline.api.biome.DelegatedPipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.addons.biome.pipeline.image.config.ImageSourceTemplate; import com.dfsek.terra.addons.biome.pipeline.image.config.converter.ClosestPipelineBiomeColorConverterTemplate; import com.dfsek.terra.addons.biome.pipeline.image.config.converter.ExactPipelineBiomeColorConverterTemplate; import com.dfsek.terra.addons.biome.pipeline.image.config.converter.mapping.DefinedPipelineBiomeColorMappingTemplate; -import com.dfsek.terra.addons.biome.pipeline.v2.BiomePipelineAddon; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.DelegatedPipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; import com.dfsek.terra.addons.image.converter.ColorConverter; import com.dfsek.terra.addons.image.converter.mapping.BiomeDefinedColorMapping; import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; diff --git a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/ImageSourceTemplate.java b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/ImageSourceTemplate.java index 8814d195b..0154d80e8 100644 --- a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/ImageSourceTemplate.java +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/ImageSourceTemplate.java @@ -3,9 +3,9 @@ package com.dfsek.terra.addons.biome.pipeline.image.config; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import com.dfsek.terra.addons.biome.pipeline.api.Source; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.addons.biome.pipeline.image.ImageSource; -import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import com.dfsek.terra.addons.image.converter.ColorConverter; diff --git a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ClosestPipelineBiomeColorConverterTemplate.java b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ClosestPipelineBiomeColorConverterTemplate.java index 4c98bfee7..499d7c0aa 100644 --- a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ClosestPipelineBiomeColorConverterTemplate.java +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ClosestPipelineBiomeColorConverterTemplate.java @@ -2,7 +2,7 @@ package com.dfsek.terra.addons.biome.pipeline.image.config.converter; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.addons.image.config.converter.ClosestColorConverterTemplate; import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; diff --git a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ExactPipelineBiomeColorConverterTemplate.java b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ExactPipelineBiomeColorConverterTemplate.java index 4f2724008..5499fdb7b 100644 --- a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ExactPipelineBiomeColorConverterTemplate.java +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ExactPipelineBiomeColorConverterTemplate.java @@ -3,7 +3,7 @@ package com.dfsek.terra.addons.biome.pipeline.image.config.converter; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.addons.image.config.converter.ExactColorConverterTemplate; import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; diff --git a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/mapping/DefinedPipelineBiomeColorMappingTemplate.java b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/mapping/DefinedPipelineBiomeColorMappingTemplate.java index 1406d8383..b13150586 100644 --- a/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/mapping/DefinedPipelineBiomeColorMappingTemplate.java +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/mapping/DefinedPipelineBiomeColorMappingTemplate.java @@ -3,13 +3,13 @@ package com.dfsek.terra.addons.biome.pipeline.image.config.converter.mapping; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import java.util.Map; - -import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.addons.image.config.ColorLoader.ColorString; import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; import com.dfsek.terra.addons.image.util.MapUtil; +import java.util.Map; + public class DefinedPipelineBiomeColorMappingTemplate implements ObjectTemplate> { diff --git a/common/addons/pipeline-image/src/main/resources/terra.addon.yml b/common/addons/pipeline-image/src/main/resources/terra.addon.yml index 2ae877a14..750434fba 100644 --- a/common/addons/pipeline-image/src/main/resources/terra.addon.yml +++ b/common/addons/pipeline-image/src/main/resources/terra.addon.yml @@ -12,4 +12,4 @@ website: license: MIT License depends: library-image: "1.+" - biome-provider-pipeline-v2: "1.+" + biome-provider-pipeline: "2.+" diff --git a/common/addons/structure-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonStructure.java b/common/addons/structure-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonStructure.java index bac5f4373..cd371ea55 100644 --- a/common/addons/structure-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonStructure.java +++ b/common/addons/structure-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonStructure.java @@ -1,11 +1,12 @@ package com.dfsek.terra.addons.palette.shortcut.block; -import java.util.Random; +import com.dfsek.seismic.type.Rotation; +import com.dfsek.seismic.type.vector.Vector3Int; + +import java.util.random.RandomGenerator; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.Rotation; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.WritableWorld; @@ -17,7 +18,7 @@ public class SingletonStructure implements Structure { } @Override - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation) { world.setBlockState(location, blockState); return true; } diff --git a/common/addons/structure-mutator/src/main/java/com/dfsek/terra/addons/structure/mutator/MutatedStructure.java b/common/addons/structure-mutator/src/main/java/com/dfsek/terra/addons/structure/mutator/MutatedStructure.java index 5b18dd063..eb8657a2f 100644 --- a/common/addons/structure-mutator/src/main/java/com/dfsek/terra/addons/structure/mutator/MutatedStructure.java +++ b/common/addons/structure-mutator/src/main/java/com/dfsek/terra/addons/structure/mutator/MutatedStructure.java @@ -1,16 +1,17 @@ package com.dfsek.terra.addons.structure.mutator; +import com.dfsek.seismic.type.Rotation; +import com.dfsek.seismic.type.vector.Vector3Int; + +import java.util.random.RandomGenerator; + import com.dfsek.terra.api.registry.key.Keyed; import com.dfsek.terra.api.registry.key.RegistryKey; import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.Rotation; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.WritableWorld; import com.dfsek.terra.api.world.util.ReadInterceptor; import com.dfsek.terra.api.world.util.WriteInterceptor; -import java.util.Random; - public class MutatedStructure implements Structure, Keyed { private final RegistryKey key; @@ -32,7 +33,7 @@ public class MutatedStructure implements Structure, Keyed { } @Override - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation) { return base.generate(location, world .buffer() diff --git a/common/addons/structure-sponge-loader/build.gradle.kts b/common/addons/structure-sponge-loader/build.gradle.kts index 20c002866..31e74764b 100644 --- a/common/addons/structure-sponge-loader/build.gradle.kts +++ b/common/addons/structure-sponge-loader/build.gradle.kts @@ -1,5 +1,3 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar - version = version("1.0.0") dependencies { diff --git a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java index 41e5c01bd..a5fe2d98b 100644 --- a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java +++ b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java @@ -7,6 +7,7 @@ package com.dfsek.terra.addons.sponge; +import com.dfsek.seismic.type.vector.Vector3Int; import net.querz.nbt.io.NBTDeserializer; import net.querz.nbt.tag.ByteArrayTag; import net.querz.nbt.tag.CompoundTag; @@ -16,6 +17,7 @@ import net.querz.nbt.tag.Tag; import java.io.IOException; import java.io.InputStream; import java.io.PushbackInputStream; +import java.nio.file.Files; import java.util.HashMap; import java.util.Map; import java.util.zip.GZIPInputStream; @@ -29,8 +31,7 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.StringUtil; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.terra.api.util.FileUtil; public class SpongeSchematicAddon implements AddonInitializer { @@ -58,13 +59,21 @@ public class SpongeSchematicAddon implements AddonInitializer { .register(addon, ConfigPackPreLoadEvent.class) .then(event -> { CheckedRegistry structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); - event.getPack() - .getLoader() - .open("", ".schem") - .thenEntries(entries -> entries + try { + FileUtil.filesWithExtension(event.getPack().getRootPath(), ".schem") + .entrySet() .stream() - .map(entry -> convert(entry.getValue(), StringUtil.fileName(entry.getKey()))) - .forEach(structureRegistry::register)).close(); + .map(entry -> { + try { + return convert(Files.newInputStream(entry.getValue()), FileUtil.fileName(entry.getKey())); + } catch(IOException e) { + throw new RuntimeException("Failed to load config " + entry.getKey(), e); + } + }) + .forEach(structureRegistry::register); + } catch(IOException e) { + throw new RuntimeException("Error occurred while reading config pack files", e); + } }) .failThrough(); } diff --git a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeStructure.java b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeStructure.java index 56e986e42..4a4b7b2b0 100644 --- a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeStructure.java +++ b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeStructure.java @@ -7,15 +7,16 @@ package com.dfsek.terra.addons.sponge; -import java.util.Random; +import com.dfsek.seismic.type.Rotation; +import com.dfsek.seismic.type.vector.Vector2Int; +import com.dfsek.seismic.type.vector.Vector3Int; + +import java.util.random.RandomGenerator; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.registry.key.Keyed; import com.dfsek.terra.api.registry.key.RegistryKey; import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.Rotation; -import com.dfsek.terra.api.util.vector.Vector2Int; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.WritableWorld; @@ -36,7 +37,7 @@ public class SpongeStructure implements Structure, Keyed { } @Override - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation) { int bX = location.getX(); int bY = location.getY(); int bZ = location.getZ(); @@ -44,7 +45,7 @@ public class SpongeStructure implements Structure, Keyed { for(int z = 0; z < blocks[x].length; z++) { int oX = x + offsetX; int oZ = z + offsetZ; - Vector2Int r = Vector2Int.of(oX, oZ).rotate(rotation); + Vector2Int r = Vector2Int.Mutable.of(oX, oZ).rotate(rotation); int rX = r.getX(); int rZ = r.getZ(); for(int y = 0; y < blocks[x][z].length; y++) { diff --git a/common/addons/structure-terrascript-loader/build.gradle.kts b/common/addons/structure-terrascript-loader/build.gradle.kts index 24e3a20e9..265114f64 100644 --- a/common/addons/structure-terrascript-loader/build.gradle.kts +++ b/common/addons/structure-terrascript-loader/build.gradle.kts @@ -1,5 +1,3 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar - version = version("1.2.0") dependencies { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java index a32d90e92..25c4e3ca8 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java @@ -7,6 +7,9 @@ package com.dfsek.terra.addons.terrascript; +import java.io.IOException; +import java.nio.file.Files; + import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; @@ -19,7 +22,7 @@ import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.structure.LootTable; import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.StringUtil; +import com.dfsek.terra.api.util.FileUtil; public class TerraScriptAddon implements AddonInitializer { @@ -37,26 +40,28 @@ public class TerraScriptAddon implements AddonInitializer { .then(event -> { CheckedRegistry structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); CheckedRegistry lootRegistry = event.getPack().getOrCreateRegistry(LootTable.class); - event.getPack().getLoader().open("", ".tesf").thenEntries( - entries -> - entries.stream() - .parallel() - .map(entry -> { - try { - String id = StringUtil.fileName(entry.getKey()); - return new StructureScript(entry.getValue(), - addon.key(id), - platform, - structureRegistry, - lootRegistry, - event.getPack().getOrCreateRegistry(FunctionBuilder.class)); - } catch(ParseException e) { - throw new RuntimeException("Failed to load script \"" + entry.getKey() + "\"", e); - } - }) - .toList() - .forEach(structureRegistry::register)) - .close(); + try { + FileUtil.filesWithExtension(event.getPack().getRootPath(), ".tesf") + .entrySet() + .stream() + .parallel() + .map(entry -> { + try { + String id = FileUtil.fileName(entry.getKey()); + return new StructureScript(Files.newInputStream(entry.getValue()), + addon.key(id), + platform, + structureRegistry, + lootRegistry, + event.getPack().getOrCreateRegistry(FunctionBuilder.class)); + } catch(ParseException | IOException e) { + throw new RuntimeException("Failed to load script \"" + entry.getKey() + "\"", e); + } + }) + .forEach(structureRegistry::register); + } catch(IOException e) { + throw new RuntimeException("Error occurred while reading config pack files", e); + } }) .priority(100) .failThrough(); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/EqualsStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/EqualsStatement.java index 2ad62d028..aee9251d1 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/EqualsStatement.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/EqualsStatement.java @@ -13,7 +13,7 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import static com.dfsek.terra.api.util.MathUtil.EPSILON; +import static com.dfsek.seismic.math.floatingpoint.FloatingPointConstants.EPSILON; public class EqualsStatement extends BinaryOperation { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/NotEqualsStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/NotEqualsStatement.java index 4e96e2872..f162a4720 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/NotEqualsStatement.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/NotEqualsStatement.java @@ -13,7 +13,7 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import static com.dfsek.terra.api.util.MathUtil.EPSILON; +import static com.dfsek.seismic.math.floatingpoint.FloatingPointConstants.EPSILON; public class NotEqualsStatement extends BinaryOperation { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java index f85f4db36..faf55f4b8 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java @@ -7,6 +7,10 @@ package com.dfsek.terra.addons.terrascript.script; +import com.dfsek.seismic.math.algebra.AlgebraFunctions; +import com.dfsek.seismic.math.trigonometry.TrigonometryFunctions; +import com.dfsek.seismic.type.Rotation; +import com.dfsek.seismic.type.vector.Vector3Int; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,7 +18,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.addons.terrascript.parser.Parser; import com.dfsek.terra.addons.terrascript.parser.lang.Executable; @@ -43,9 +47,6 @@ import com.dfsek.terra.api.registry.key.Keyed; import com.dfsek.terra.api.registry.key.RegistryKey; import com.dfsek.terra.api.structure.LootTable; import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.MathUtil; -import com.dfsek.terra.api.util.Rotation; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.WritableWorld; @@ -105,14 +106,14 @@ public class StructureScript implements Structure, Keyed { .registerFunction("pow", new BinaryNumberFunctionBuilder( (number, number2) -> Math.pow(number.doubleValue(), number2.doubleValue()))) .registerFunction("sqrt", new UnaryNumberFunctionBuilder(number -> Math.sqrt(number.doubleValue()))) - .registerFunction("rsqrt", new UnaryNumberFunctionBuilder(number -> MathUtil.invSqrt(number.doubleValue()))) + .registerFunction("rsqrt", new UnaryNumberFunctionBuilder(number -> AlgebraFunctions.invSqrt(number.doubleValue()))) .registerFunction("floor", new UnaryNumberFunctionBuilder(number -> Math.floor(number.doubleValue()))) .registerFunction("ceil", new UnaryNumberFunctionBuilder(number -> Math.ceil(number.doubleValue()))) .registerFunction("log", new UnaryNumberFunctionBuilder(number -> Math.log(number.doubleValue()))) .registerFunction("round", new UnaryNumberFunctionBuilder(number -> Math.round(number.doubleValue()))) - .registerFunction("sin", new UnaryNumberFunctionBuilder(number -> MathUtil.sin(number.doubleValue()))) - .registerFunction("cos", new UnaryNumberFunctionBuilder(number -> MathUtil.cos(number.doubleValue()))) - .registerFunction("tan", new UnaryNumberFunctionBuilder(number -> MathUtil.tan(number.doubleValue()))) + .registerFunction("sin", new UnaryNumberFunctionBuilder(number -> TrigonometryFunctions.sin(number.doubleValue()))) + .registerFunction("cos", new UnaryNumberFunctionBuilder(number -> TrigonometryFunctions.cos(number.doubleValue()))) + .registerFunction("tan", new UnaryNumberFunctionBuilder(number -> TrigonometryFunctions.tan(number.doubleValue()))) .registerFunction("asin", new UnaryNumberFunctionBuilder(number -> Math.asin(number.doubleValue()))) .registerFunction("acos", new UnaryNumberFunctionBuilder(number -> Math.acos(number.doubleValue()))) .registerFunction("atan", new UnaryNumberFunctionBuilder(number -> Math.atan(number.doubleValue()))) @@ -131,14 +132,14 @@ public class StructureScript implements Structure, Keyed { @Override @SuppressWarnings("try") - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation) { platform.getProfiler().push(profile); boolean result = applyBlock(new TerraImplementationArguments(location, rotation, random, world, 0)); platform.getProfiler().pop(profile); return result; } - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation, int recursions) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation, int recursions) { platform.getProfiler().push(profile); boolean result = applyBlock(new TerraImplementationArguments(location, rotation, random, world, recursions)); platform.getProfiler().pop(profile); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java index 515879bb8..70181222f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java @@ -7,27 +7,28 @@ package com.dfsek.terra.addons.terrascript.script; +import com.dfsek.seismic.type.Rotation; +import com.dfsek.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3Int; + import java.util.HashMap; import java.util.Map; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; -import com.dfsek.terra.api.util.Rotation; -import com.dfsek.terra.api.util.vector.Vector3; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.WritableWorld; public class TerraImplementationArguments implements ImplementationArguments { private final Rotation rotation; - private final Random random; + private final RandomGenerator random; private final WritableWorld world; private final Map marks = new HashMap<>(); private final int recursions; private final Vector3Int origin; private boolean waterlog = false; - public TerraImplementationArguments(Vector3Int origin, Rotation rotation, Random random, WritableWorld world, int recursions) { + public TerraImplementationArguments(Vector3Int origin, Rotation rotation, RandomGenerator random, WritableWorld world, int recursions) { this.rotation = rotation; this.random = random; this.world = world; @@ -39,7 +40,7 @@ public class TerraImplementationArguments implements ImplementationArguments { return recursions; } - public Random getRandom() { + public RandomGenerator getRandom() { return random; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java index 42eb0b70f..6a2adebbd 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java @@ -7,13 +7,13 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.script.functions.CheckBlockFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.List; - public class CheckBlockFunctionBuilder implements FunctionBuilder { @SuppressWarnings("unchecked") 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 0ec4fb8c6..2fbd47654 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 @@ -7,15 +7,16 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import com.dfsek.terra.api.util.RotationUtil; -import com.dfsek.terra.api.util.vector.Vector2; -import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; @@ -36,19 +37,17 @@ public class BiomeFunction implements Function { public String apply(ImplementationArguments implementationArguments, Scope scope) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), - z.apply(implementationArguments, scope).doubleValue()), - arguments.getRotation()); + Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), + z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); BiomeProvider grid = arguments.getWorld().getBiomeProvider(); - return grid.getBiome(arguments.getOrigin() - .toVector3() + return grid.getBiome(arguments.getOrigin().toFloat() .mutable() - .add(Vector3.of((int) Math.round(xz.getX()), + .add(Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), - (int) Math.round(xz.getZ()))).immutable(), arguments.getWorld().getSeed()).getID(); + FloatingPointFunctions.round(xz.getZ()))).immutable(), arguments.getWorld().getSeed()).getID(); } @Override diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java index 35cf15cf6..128647bd3 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java @@ -7,6 +7,9 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,9 +25,6 @@ import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.util.RotationUtil; -import com.dfsek.terra.api.util.vector.Vector2; -import com.dfsek.terra.api.util.vector.Vector3; public class BlockFunction implements Function { @@ -69,12 +69,12 @@ public class BlockFunction implements Function { void setBlock(ImplementationArguments implementationArguments, Scope scope, TerraImplementationArguments arguments, BlockState rot) { - Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), - z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); + Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), + z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); try { - Vector3.Mutable set = Vector3.of((int) Math.round(xz.getX()), + Vector3.Mutable set = Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).doubleValue(), - (int) Math.round(xz.getZ())).mutable().add(arguments.getOrigin()); + FloatingPointFunctions.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()); BlockState current = arguments.getWorld().getBlockState(set); if(overwrite.apply(implementationArguments, scope) || current.isAir()) { arguments.getWorld().setBlockState(set, rot, physics.apply(implementationArguments, scope)); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java index b005b68b8..66f2e30c5 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java @@ -7,15 +7,16 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import com.dfsek.terra.api.util.RotationUtil; -import com.dfsek.terra.api.util.vector.Vector2; -import com.dfsek.terra.api.util.vector.Vector3; public class CheckBlockFunction implements Function { @@ -34,18 +35,16 @@ public class CheckBlockFunction implements Function { public String apply(ImplementationArguments implementationArguments, Scope scope) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), - z.apply(implementationArguments, scope).doubleValue()), - arguments.getRotation()); + Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), + z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); String data = arguments.getWorld() - .getBlockState(arguments.getOrigin() - .toVector3() + .getBlockState(arguments.getOrigin().toFloat() .mutable() - .add(Vector3.of((int) Math.round(xz.getX()), + .add(Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope) - .doubleValue(), (int) Math.round(xz.getZ())))) + .doubleValue(), FloatingPointFunctions.round(xz.getZ())))) .getAsString(); if(data.contains("[")) return data.substring(0, data.indexOf('[')); // Strip properties else return data; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java index 913a9e370..1eee2ad48 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java @@ -7,6 +7,9 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; @@ -19,9 +22,6 @@ import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.EntityType; import com.dfsek.terra.api.event.events.world.generation.EntitySpawnEvent; -import com.dfsek.terra.api.util.RotationUtil; -import com.dfsek.terra.api.util.vector.Vector2; -import com.dfsek.terra.api.util.vector.Vector3; public class EntityFunction implements Function { @@ -45,13 +45,13 @@ public class EntityFunction implements Function { @Override public Void apply(ImplementationArguments implementationArguments, Scope scope) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), - z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); + Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), + z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); Entity entity = arguments.getWorld().spawnEntity(Vector3.of(xz.getX(), y.apply(implementationArguments, scope).doubleValue(), xz.getZ()) .mutable() - .add(arguments.getOrigin()) + .add(arguments.getOrigin().toFloat()) .add(0.5, 0, 0.5) .immutable(), data); platform.getEventManager().callEvent(new EntitySpawnEvent(entity.world().getPack(), entity)); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java index 4ec80ebf8..f60c6aba9 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java @@ -7,15 +7,16 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import com.dfsek.terra.api.util.RotationUtil; -import com.dfsek.terra.api.util.vector.Vector2; -import com.dfsek.terra.api.util.vector.Vector3; public class GetMarkFunction implements Function { @@ -32,14 +33,14 @@ public class GetMarkFunction implements Function { @Override public String apply(ImplementationArguments implementationArguments, Scope scope) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), - z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); + Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), + z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); - String mark = arguments.getMark(Vector3.of((int) Math.floor(xz.getX()), (int) Math.floor( + String mark = arguments.getMark(Vector3.of(FloatingPointFunctions.floor(xz.getX()), FloatingPointFunctions.floor( y.apply(implementationArguments, scope).doubleValue()), - (int) Math.floor(xz.getZ())) + FloatingPointFunctions.floor(xz.getZ())) .mutable() - .add(arguments.getOrigin()) + .add(arguments.getOrigin().toFloat()) .immutable()); return mark == null ? "" : mark; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java index c9ae96166..5176116f8 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java @@ -7,10 +7,14 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Random; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; @@ -26,9 +30,6 @@ import com.dfsek.terra.api.event.events.world.generation.LootPopulateEvent; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.key.RegistryKey; import com.dfsek.terra.api.structure.LootTable; -import com.dfsek.terra.api.util.RotationUtil; -import com.dfsek.terra.api.util.vector.Vector2; -import com.dfsek.terra.api.util.vector.Vector3; public class LootFunction implements Function { @@ -55,9 +56,8 @@ public class LootFunction implements Function { @Override public Void apply(ImplementationArguments implementationArguments, Scope scope) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), - z.apply(implementationArguments, scope).doubleValue()), - arguments.getRotation()); + Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), + z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); String id = data.apply(implementationArguments, scope); @@ -65,10 +65,10 @@ public class LootFunction implements Function { registry.get(RegistryKey.parse(id)) .ifPresentOrElse(table -> { - Vector3 apply = Vector3.of((int) Math.round(xz.getX()), + Vector3 apply = Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope) .intValue(), - (int) Math.round(xz.getZ())).mutable().add(arguments.getOrigin()).immutable(); + FloatingPointFunctions.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()).immutable(); try { BlockEntity data = arguments.getWorld().getBlockEntity(apply); @@ -84,7 +84,8 @@ public class LootFunction implements Function { if(event.isCancelled()) return; event.getTable().fillInventory(container.getInventory(), - new Random(apply.hashCode())); + RandomGeneratorFactory.of( + "Xoroshiro128PlusPlus").create(apply.hashCode())); data.update(false); } catch(Exception e) { LOGGER.error("Could not apply loot at {}", apply, e); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java index 4fad5cc57..49141a658 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java @@ -7,6 +7,10 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; @@ -17,9 +21,6 @@ import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.util.RotationUtil; -import com.dfsek.terra.api.util.vector.Vector2; -import com.dfsek.terra.api.util.vector.Vector3; public class PullFunction implements Function { @@ -41,17 +42,17 @@ public class PullFunction implements Function { @Override public Void apply(ImplementationArguments implementationArguments, Scope scope) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), - z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); + Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), + z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); - Vector3.Mutable mutable = Vector3.of((int) Math.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), - (int) Math.round(xz.getZ())).mutable().add(arguments.getOrigin()); + Vector3.Mutable mutable = Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), + FloatingPointFunctions.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()); while(mutable.getY() > arguments.getWorld().getMinHeight()) { if(!arguments.getWorld().getBlockState(mutable).isAir()) { arguments.getWorld().setBlockState(mutable, data); break; } - mutable.subtract(0, 1, 0); + mutable.sub(0, 1, 0); } return null; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java index 50ff0677c..0a7f9a38f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java @@ -7,15 +7,16 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import com.dfsek.terra.api.util.RotationUtil; -import com.dfsek.terra.api.util.vector.Vector2; -import com.dfsek.terra.api.util.vector.Vector3; public class SetMarkFunction implements Function { @@ -34,14 +35,14 @@ public class SetMarkFunction implements Function { @Override public Void apply(ImplementationArguments implementationArguments, Scope scope) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), - z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); + Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), + z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); - arguments.setMark(Vector3.of((int) Math.floor(xz.getX()), - (int) Math.floor( + arguments.setMark(Vector3.of(FloatingPointFunctions.floor(xz.getX()), + FloatingPointFunctions.floor( y.apply(implementationArguments, scope).doubleValue()), - (int) Math.floor(xz.getZ())).mutable().add(arguments.getOrigin()).immutable(), + FloatingPointFunctions.floor(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()).immutable(), mark.apply(implementationArguments, scope)); return null; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java index 6e7756685..a69a6036c 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java @@ -7,6 +7,9 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,9 +20,6 @@ import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.block.entity.BlockEntity; -import com.dfsek.terra.api.util.RotationUtil; -import com.dfsek.terra.api.util.vector.Vector2; -import com.dfsek.terra.api.util.vector.Vector3; public class StateFunction implements Function { @@ -40,12 +40,12 @@ public class StateFunction implements Function { @Override public Void apply(ImplementationArguments implementationArguments, Scope scope) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), - z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); + Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), + z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); - Vector3 origin = Vector3.of((int) Math.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), - (int) Math.round(xz.getZ())).mutable().add(arguments.getOrigin()).immutable(); + Vector3 origin = Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), + FloatingPointFunctions.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()).immutable(); try { BlockEntity state = arguments.getWorld().getBlockEntity(origin); state.applyState(data.apply(implementationArguments, scope)); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java index 9b2523086..4fe8b45af 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java @@ -7,6 +7,9 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.type.Rotation; +import com.dfsek.seismic.type.vector.Vector2; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,9 +25,6 @@ import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.Rotation; -import com.dfsek.terra.api.util.RotationUtil; -import com.dfsek.terra.api.util.vector.Vector2; public class StructureFunction implements Function { @@ -60,8 +60,8 @@ public class StructureFunction implements Function { if(arguments.getRecursions() > platform.getTerraConfig().getMaxRecursion()) throw new RuntimeException("Structure recursion too deep: " + arguments.getRecursions()); - Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), - z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); + Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), + z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); String app = id.apply(implementationArguments, scope); @@ -78,17 +78,17 @@ public class StructureFunction implements Function { if(script instanceof StructureScript structureScript) { return structureScript.generate(arguments.getOrigin(), arguments.getWorld() - .buffer((int) Math.round(xz.getX()), + .buffer(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), - (int) Math.round(xz.getZ())), + FloatingPointFunctions.round(xz.getZ())), arguments.getRandom(), arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1); } return script.generate(arguments.getOrigin(), arguments.getWorld() - .buffer((int) Math.round(xz.getX()), + .buffer(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), - (int) Math.round(xz.getZ())), + FloatingPointFunctions.round(xz.getZ())), arguments.getRandom(), arguments.getRotation().rotate(rotation1)); }).orElseGet(() -> { diff --git a/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunction.java b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunction.java index 64d24b3d8..8cdbebe65 100644 --- a/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunction.java +++ b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunction.java @@ -7,6 +7,10 @@ package com.dfsek.terra.addon.terrascript.check; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; + import com.dfsek.terra.addons.chunkgenerator.generation.NoiseChunkGenerator3D; import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.SamplerProvider; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; @@ -15,9 +19,6 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import com.dfsek.terra.api.util.RotationUtil; -import com.dfsek.terra.api.util.vector.Vector2; -import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.WritableWorld; @@ -41,14 +42,12 @@ public class CheckFunction implements Function { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = Vector2.of(x.apply(implementationArguments, scope).doubleValue(), - z.apply(implementationArguments, scope).doubleValue()); + Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), + z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); - RotationUtil.rotateVector(xz, arguments.getRotation()); - - Vector3 location = arguments.getOrigin().toVector3Mutable().add( - Vector3.of((int) Math.round(xz.getX()), y.apply(implementationArguments, scope).doubleValue(), - (int) Math.round(xz.getZ()))).immutable(); + Vector3 location = arguments.getOrigin().toFloat().mutable().add( + Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).doubleValue(), + FloatingPointFunctions.round(xz.getZ()))).immutable(); return apply(location, arguments.getWorld()); } @@ -64,7 +63,7 @@ public class CheckFunction implements Function { } private String apply(Vector3 vector, WritableWorld world) { - int y = vector.getBlockY(); + int y = vector.getFloorY(); if(y >= world.getMaxHeight() || y < 0) return "AIR"; SamplerProvider cache = ((NoiseChunkGenerator3D) world.getGenerator()).samplerProvider(); double comp = sample(vector.getX(), vector.getY(), vector.getZ(), cache, world); @@ -72,7 +71,7 @@ public class CheckFunction implements Function { if(comp > 0) return "LAND"; // If noise val is greater than zero, location will always be land. //BiomeProvider provider = tw.getBiomeProvider(); - //TerraBiome b = provider.getBiome(vector.getBlockX(), vector.getBlockZ()); + //TerraBiome b = provider.getBiome(vector.getFloorX(), vector.getFloorZ()); /*if(vector.getY() > c.getSeaLevel())*/ return "AIR"; // Above sea level diff --git a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/ConstantSamplerFunction.java b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/ConstantSamplerFunction.java index 7b887bafe..a25cf6d0b 100644 --- a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/ConstantSamplerFunction.java +++ b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/ConstantSamplerFunction.java @@ -1,23 +1,24 @@ package com.dfsek.terra.addons.terrascript.sampler; +import com.dfsek.seismic.type.sampler.Sampler; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import com.dfsek.terra.api.noise.NoiseSampler; public class ConstantSamplerFunction implements Function { private final Returnable x, y, z; - private final NoiseSampler sampler; + private final Sampler sampler; private final boolean twoD; private final Position position; - public ConstantSamplerFunction(NoiseSampler sampler, + public ConstantSamplerFunction(Sampler sampler, Returnable x, Returnable y, Returnable z, @@ -39,10 +40,10 @@ public class ConstantSamplerFunction implements Function { double z = this.z.apply(implementationArguments, scope).doubleValue(); if(twoD) { - return sampler.noise(arguments.getWorld().getSeed(), x, z); + return sampler.getSample(arguments.getWorld().getSeed(), x, z); } else { double y = this.y.apply(implementationArguments, scope).doubleValue(); - return sampler.noise(arguments.getWorld().getSeed(), x, y, z); + return sampler.getSample(arguments.getWorld().getSeed(), x, y, z); } } diff --git a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunction.java b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunction.java index ac342fc38..4f52962eb 100644 --- a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunction.java +++ b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunction.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.terrascript.sampler; +import com.dfsek.seismic.type.sampler.Sampler; + import java.util.function.Supplier; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; @@ -8,14 +10,13 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import com.dfsek.terra.api.noise.NoiseSampler; public class SamplerFunction implements Function { private final Returnable x, y, z; private final Returnable function; - private final java.util.function.Function, NoiseSampler> samplerFunction; + private final java.util.function.Function, Sampler> samplerFunction; private final boolean twoD; private final Position position; @@ -24,7 +25,7 @@ public class SamplerFunction implements Function { Returnable x, Returnable y, Returnable z, - java.util.function.Function, NoiseSampler> samplerFunction, + java.util.function.Function, Sampler> samplerFunction, boolean twoD, Position position) { this.x = x; @@ -43,12 +44,12 @@ public class SamplerFunction implements Function { double z = this.z.apply(implementationArguments, scope).doubleValue(); - NoiseSampler sampler = samplerFunction.apply(() -> function.apply(implementationArguments, scope)); + Sampler sampler = samplerFunction.apply(() -> function.apply(implementationArguments, scope)); if(twoD) { - return sampler.noise(arguments.getWorld().getSeed(), x, z); + return sampler.getSample(arguments.getWorld().getSeed(), x, z); } else { double y = this.y.apply(implementationArguments, scope).doubleValue(); - return sampler.noise(arguments.getWorld().getSeed(), x, y, z); + return sampler.getSample(arguments.getWorld().getSeed(), x, y, z); } } diff --git a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunctionBuilder.java b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunctionBuilder.java index 604e205b6..d48cfeaea 100644 --- a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunctionBuilder.java +++ b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunctionBuilder.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; +import com.dfsek.terra.addons.noise.config.DimensionApplicableSampler; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable.ReturnType; import com.dfsek.terra.addons.terrascript.parser.lang.constants.NumericConstant; @@ -15,10 +15,10 @@ import com.dfsek.terra.addons.terrascript.tokenizer.Position; public class SamplerFunctionBuilder implements FunctionBuilder> { - private final Map samplers2d; - private final Map samplers3d; + private final Map samplers2d; + private final Map samplers3d; - public SamplerFunctionBuilder(Map samplers) { + public SamplerFunctionBuilder(Map samplers) { this.samplers2d = new HashMap<>(); this.samplers3d = new HashMap<>(); diff --git a/common/api/build.gradle.kts b/common/api/build.gradle.kts index 6fb1bc9e7..e432b1660 100644 --- a/common/api/build.gradle.kts +++ b/common/api/build.gradle.kts @@ -1,13 +1,16 @@ dependencies { - api("ca.solo-studios", "strata", Versions.Libraries.strata) + compileOnlyApi("org.slf4j", "slf4j-api", Versions.Libraries.slf4j) testImplementation("org.slf4j", "slf4j-api", Versions.Libraries.slf4j) api("org.incendo", "cloud-core", Versions.Libraries.cloud) - api("com.dfsek.tectonic", "common", Versions.Libraries.tectonic) + api("com.github.ben-manes.caffeine", "caffeine", Versions.Libraries.caffeine) + api("com.dfsek.tectonic", "common", Versions.Libraries.tectonic) + api("ca.solo-studios", "strata", Versions.Libraries.strata) api("com.dfsek", "paralithic", Versions.Libraries.paralithic) + api("com.dfsek", "seismic", Versions.Libraries.seismic) } \ No newline at end of file diff --git a/common/api/src/main/java/com/dfsek/terra/api/Platform.java b/common/api/src/main/java/com/dfsek/terra/api/Platform.java index 491102f9f..217b4dd69 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/Platform.java +++ b/common/api/src/main/java/com/dfsek/terra/api/Platform.java @@ -14,6 +14,7 @@ import java.io.File; import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.config.MetaPack; import com.dfsek.terra.api.config.PluginConfig; import com.dfsek.terra.api.event.EventManager; import com.dfsek.terra.api.handle.ItemHandle; @@ -61,6 +62,10 @@ public interface Platform extends LoaderRegistrar { @Contract(pure = true) CheckedRegistry getConfigRegistry(); + @NotNull + @Contract(pure = true) + CheckedRegistry getMetaConfigRegistry(); + @NotNull @Contract(pure = true) Registry getAddons(); diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/entity/BlockEntity.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/BlockEntity.java index 55aa4ad83..b8b40eabd 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/entity/BlockEntity.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/entity/BlockEntity.java @@ -7,9 +7,10 @@ package com.dfsek.terra.api.block.entity; +import com.dfsek.seismic.type.vector.Vector3; + import com.dfsek.terra.api.Handle; import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.util.vector.Vector3; public interface BlockEntity extends Handle { diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java index d102af7ed..258f46242 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java @@ -7,7 +7,8 @@ package com.dfsek.terra.api.block.state.properties.enums; -import com.dfsek.terra.api.util.Rotation; +import com.dfsek.seismic.type.Rotation; + import com.dfsek.terra.api.util.generic.Construct; 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 a20aa215b..a9fd6982b 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 @@ -9,12 +9,12 @@ package com.dfsek.terra.api.config; import ca.solostudios.strata.version.Version; import ca.solostudios.strata.version.VersionRange; +import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; +import java.nio.file.Path; import java.util.List; import java.util.Map; -import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; - import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.properties.PropertyHolder; import com.dfsek.terra.api.registry.key.Keyed; @@ -45,7 +45,7 @@ public interface ConfigPack extends LoaderRegistrar, List getStages(); - Loader getLoader(); + Path getRootPath(); String getAuthor(); 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 deleted file mode 100644 index 5ad5dcaae..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra API is licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in the common/api directory. - */ - -package com.dfsek.terra.api.config; - -import com.dfsek.tectonic.api.exception.ConfigException; - -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(Consumer> consumer) throws ConfigException; - - Loader thenEntries(Consumer>> consumer) throws ConfigException; - - /** - * Get a single file from this Loader. - * - * @param singleFile File to get - * - * @return InputStream from file. - */ - InputStream get(String singleFile) throws IOException; - - /** - * Open a subdirectory. - * - * @param directory Directory to open - * @param extension File extension - */ - Loader open(String directory, String extension); - - /** - * Close all InputStreams opened. - */ - Loader close(); -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/MetaPack.java b/common/api/src/main/java/com/dfsek/terra/api/config/MetaPack.java new file mode 100644 index 000000000..ae3c06ec4 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/config/MetaPack.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.api.config; + +import ca.solostudios.strata.version.Version; + +import java.util.Map; + +import com.dfsek.terra.api.properties.PropertyHolder; +import com.dfsek.terra.api.registry.key.Keyed; +import com.dfsek.terra.api.registry.meta.CheckedRegistryHolder; +import com.dfsek.terra.api.registry.meta.RegistryProvider; +import com.dfsek.terra.api.tectonic.ConfigLoadingDelegate; +import com.dfsek.terra.api.tectonic.LoaderRegistrar; + + +public interface MetaPack extends LoaderRegistrar, + ConfigLoadingDelegate, + CheckedRegistryHolder, + RegistryProvider, + Keyed, + PropertyHolder { + + Map packs(); + + String getAuthor(); + + Version getVersion(); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java b/common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java index 95fbf296b..ff7d97a63 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java @@ -7,14 +7,14 @@ package com.dfsek.terra.api.config; +import java.util.List; + import com.dfsek.terra.api.Platform; public interface PluginConfig { void load(Platform platform); - boolean dumpDefaultConfig(); - boolean isDebugCommands(); boolean isDebugProfiler(); @@ -31,5 +31,7 @@ public interface PluginConfig { int getMaxRecursion(); + List getIgnoredResources(); + int getProviderCache(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java b/common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java index 0ab360389..1489856d1 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java +++ b/common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java @@ -7,8 +7,9 @@ package com.dfsek.terra.api.entity; +import com.dfsek.seismic.type.vector.Vector3; + import com.dfsek.terra.api.Handle; -import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java index fbe1c8a28..10d58e2cb 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java @@ -12,7 +12,6 @@ import com.dfsek.tectonic.api.config.Configuration; import java.util.function.BiConsumer; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.config.Loader; import com.dfsek.terra.api.event.events.FailThroughEvent; import com.dfsek.terra.api.event.events.PackEvent; @@ -25,13 +24,11 @@ import com.dfsek.terra.api.event.events.PackEvent; */ public class ConfigurationDiscoveryEvent implements PackEvent, FailThroughEvent { private final ConfigPack pack; - private final Loader loader; private final BiConsumer consumer; - public ConfigurationDiscoveryEvent(ConfigPack pack, Loader loader, BiConsumer consumer) { + public ConfigurationDiscoveryEvent(ConfigPack pack, BiConsumer consumer) { this.pack = pack; - this.loader = loader; this.consumer = consumer; } @@ -43,8 +40,4 @@ public class ConfigurationDiscoveryEvent implements PackEvent, FailThroughEvent public ConfigPack getPack() { return pack; } - - public Loader getLoader() { - return loader; - } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java index 3ad041c9b..80088ff6d 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java @@ -1,10 +1,10 @@ package com.dfsek.terra.api.event.events.platform; +import org.incendo.cloud.CommandManager; + import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.event.events.Event; -import org.incendo.cloud.CommandManager; - public class CommandRegistrationEvent implements Event { private final CommandManager commandManager; diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/LootPopulateEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/LootPopulateEvent.java index a97a0833a..43f2cf582 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/LootPopulateEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/LootPopulateEvent.java @@ -7,6 +7,7 @@ package com.dfsek.terra.api.event.events.world.generation; +import com.dfsek.seismic.type.vector.Vector3; import org.jetbrains.annotations.NotNull; import com.dfsek.terra.api.block.entity.Container; @@ -15,7 +16,6 @@ import com.dfsek.terra.api.event.events.AbstractCancellable; import com.dfsek.terra.api.event.events.PackEvent; import com.dfsek.terra.api.structure.LootTable; import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.vector.Vector3; /** diff --git a/common/api/src/main/java/com/dfsek/terra/api/inventory/BlockInventoryHolder.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/BlockInventoryHolder.java index 42604da86..50110782f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/inventory/BlockInventoryHolder.java +++ b/common/api/src/main/java/com/dfsek/terra/api/inventory/BlockInventoryHolder.java @@ -7,7 +7,8 @@ package com.dfsek.terra.api.inventory; -import com.dfsek.terra.api.util.vector.Vector3; + +import com.dfsek.seismic.type.vector.Vector3; public interface BlockInventoryHolder extends InventoryHolder { diff --git a/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java b/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java deleted file mode 100644 index 07fa70da3..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dfsek.terra.api.noise; - -/** - * A NoiseSampler which additionally may provide a 1st directional derivative - */ -public interface DerivativeNoiseSampler extends NoiseSampler { - - static boolean isDifferentiable(NoiseSampler sampler) { - return sampler instanceof DerivativeNoiseSampler dSampler && dSampler.isDifferentiable(); - } - - /** - * Samplers may or may not be able to provide a derivative depending on what - * inputs they take, this method signals whether this is the case. - * - * @return If the noise sampler provides a derivative or not - */ - boolean isDifferentiable(); - - /** - * Derivative return version of standard 2D noise evaluation - * - * @param seed - * @param x - * @param y - * - * @return 3 element array, in index order: noise value, partial x derivative, partial y derivative - */ - double[] noised(long seed, double x, double y); - - /** - * Derivative return version of standard 3D noise evaluation - * - * @param seed - * @param x - * @param y - * @param z - * - * @return 4 element array, in index order: noise value, partial x derivative, partial y derivative, partial z derivative - */ - double[] noised(long seed, double x, double y, double z); -} 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 deleted file mode 100644 index 35e6bea9b..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra API is licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in the common/api directory. - */ - -package com.dfsek.terra.api.noise; - - -import com.dfsek.terra.api.util.vector.Vector2; -import com.dfsek.terra.api.util.vector.Vector2Int; -import com.dfsek.terra.api.util.vector.Vector3; -import com.dfsek.terra.api.util.vector.Vector3Int; - - -public interface NoiseSampler { - static NoiseSampler zero() { - return new NoiseSampler() { - @Override - public double noise(long seed, double x, double y) { - return 0; - } - - @Override - public double noise(long seed, double x, double y, double z) { - return 0; - } - }; - } - - default double noise(Vector3 vector3, long seed) { - return noise(seed, vector3.getX(), vector3.getY(), vector3.getZ()); - } - - default double noise(Vector3Int vector3, long seed) { - return noise(seed, vector3.getX(), vector3.getY(), vector3.getZ()); - } - - - default double noise(Vector2 vector2, long seed) { - return noise(seed, vector2.getX(), vector2.getZ()); - } - - default double noise(Vector2Int vector2, long seed) { - return noise(seed, vector2.getX(), vector2.getZ()); - } - - double noise(long seed, double x, double y); - - default double noise(long seed, int x, int y) { - return noise(seed, (double) x, y); - } - - double noise(long seed, double x, double y, double z); - - default double noise(long seed, int x, int y, int z) { - return noise(seed, (double) x, y, z); - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/properties/Context.java b/common/api/src/main/java/com/dfsek/terra/api/properties/Context.java index b840711f0..c8f5d807f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/properties/Context.java +++ b/common/api/src/main/java/com/dfsek/terra/api/properties/Context.java @@ -10,14 +10,13 @@ package com.dfsek.terra.api.properties; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReference; public class Context { private static final AtomicInteger size = new AtomicInteger(0); private static final Map, PropertyKey> properties = new HashMap<>(); private final Map, Properties> map = new HashMap<>(); - private final AtomicReference list = new AtomicReference<>(new Properties[size.get()]); + private Properties[] list = new Properties[size.get()]; @SuppressWarnings("unchecked") public static PropertyKey create(Class clazz) { @@ -38,19 +37,19 @@ public class Context { return this; } - public Context put(PropertyKey key, T properties) { - list.updateAndGet(p -> { - if(p.length == size.get()) return p; + public synchronized Context put(PropertyKey key, T properties) { + if(list.length != size.get()) { Properties[] p2 = new Properties[size.get()]; - System.arraycopy(p, 0, p2, 0, p.length); - return p2; - })[key.key] = properties; + System.arraycopy(list, 0, p2, 0, list.length); + list = p2; + } + list[key.key] = properties; return this; } @SuppressWarnings("unchecked") public T get(PropertyKey key) { - return (T) list.get()[key.key]; + return (T) list[key.key]; } public boolean has(Class test) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/LootTable.java b/common/api/src/main/java/com/dfsek/terra/api/structure/LootTable.java index a78f0e212..4d9325f05 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/LootTable.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/LootTable.java @@ -10,7 +10,7 @@ package com.dfsek.terra.api.structure; import org.jetbrains.annotations.ApiStatus.Experimental; import java.util.List; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.inventory.Inventory; import com.dfsek.terra.api.inventory.ItemStack; @@ -22,16 +22,16 @@ public interface LootTable { * Fills an Inventory with loot. * * @param i The Inventory to fill. - * @param r The The Random instance to use. + * @param r The The RandomGenerator instance to use. */ - void fillInventory(Inventory i, Random r); + void fillInventory(Inventory i, RandomGenerator r); /** - * Fetches a list of ItemStacks from the loot table using the given Random instance. + * Fetches a list of ItemStacks from the loot table using the given RandomGenerator instance. * - * @param r The Random instance to use. + * @param r The RandomGenerator instance to use. * * @return List<ItemStack> - The list of loot fetched. */ - List getLoot(Random r); + List getLoot(RandomGenerator r); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/Structure.java b/common/api/src/main/java/com/dfsek/terra/api/structure/Structure.java index 1412b28bb..699db6c54 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/Structure.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/Structure.java @@ -7,13 +7,14 @@ package com.dfsek.terra.api.structure; -import java.util.Random; +import com.dfsek.seismic.type.Rotation; +import com.dfsek.seismic.type.vector.Vector3Int; + +import java.util.random.RandomGenerator; -import com.dfsek.terra.api.util.Rotation; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.WritableWorld; public interface Structure { - boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation); + boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/StructureSpawn.java b/common/api/src/main/java/com/dfsek/terra/api/structure/StructureSpawn.java index a55212433..939957d4e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/StructureSpawn.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/StructureSpawn.java @@ -7,10 +7,9 @@ package com.dfsek.terra.api.structure; +import com.dfsek.seismic.type.vector.Vector3; import org.jetbrains.annotations.ApiStatus.Experimental; -import com.dfsek.terra.api.util.vector.Vector3; - @Experimental public interface StructureSpawn { diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/configured/ConfiguredStructure.java b/common/api/src/main/java/com/dfsek/terra/api/structure/configured/ConfiguredStructure.java index 93f6d2ad9..74b840624 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/configured/ConfiguredStructure.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/configured/ConfiguredStructure.java @@ -7,13 +7,13 @@ package com.dfsek.terra.api.structure.configured; -import org.jetbrains.annotations.ApiStatus.Experimental; - import com.dfsek.terra.api.registry.key.StringIdentifiable; 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; +import com.dfsek.terra.api.util.range.Range; + +import org.jetbrains.annotations.ApiStatus.Experimental; @Experimental diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java index 393dcf7d1..535dce508 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java @@ -10,9 +10,9 @@ package com.dfsek.terra.api.structure.feature; import java.util.function.BooleanSupplier; import java.util.function.IntConsumer; -import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.function.IntToBooleanFunction; import com.dfsek.terra.api.util.generic.Lazy; +import com.dfsek.terra.api.util.range.Range; /** diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/FileUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/FileUtil.java new file mode 100644 index 000000000..a36a73711 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/FileUtil.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.api.util; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static java.util.function.Function.identity; + + +public class FileUtil { + public static Map filesWithExtension(Path start, String... extensions) throws IOException { + if(Files.notExists(start) || !Files.isDirectory(start)) return Collections.emptyMap(); + try(Stream paths = Files.walk(start)) { + return paths + .filter(Files::isRegularFile) + .filter(p -> Arrays.stream(extensions).anyMatch(e -> p.getFileName().toString().endsWith(e))) + .collect(Collectors.toMap(p -> start.relativize(p).toString(), identity())); + } + } + + public static String fileName(String path) { + if(path.contains(File.separator)) { + return path.substring(path.lastIndexOf(File.separatorChar) + 1, path.lastIndexOf('.')); + } else if(path.contains("/")) { + return path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf('.')); + } else if(path.contains(".")) { + return path.substring(0, path.lastIndexOf('.')); + } else { + return path; + } + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/GeometryUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/GeometryUtil.java deleted file mode 100644 index 3cecfbfbc..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/GeometryUtil.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dfsek.terra.api.util; - -import java.util.function.Consumer; - -import com.dfsek.terra.api.util.vector.Vector3Int; - - -public final class GeometryUtil { - private GeometryUtil() { - - } - - public static void sphere(Vector3Int origin, int radius, Consumer action) { - for(int x = -radius; x <= radius; x++) { - for(int y = -radius; y <= radius; y++) { - for(int z = -radius; z <= radius; z++) { - if(x * x + y * y + z * z <= radius * radius) { - action.accept(Vector3Int.of(origin, x, y, z)); - } - } - } - } - } - - public static void cube(Vector3Int origin, int radius, Consumer action) { - for(int x = -radius; x <= radius; x++) { - for(int y = -radius; y <= radius; y++) { - for(int z = -radius; z <= radius; z++) { - action.accept(Vector3Int.of(origin, x, y, z)); - } - } - } - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java deleted file mode 100644 index cd0f37ce8..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra API is licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in the common/api directory. - */ - -package com.dfsek.terra.api.util; - -import java.util.List; - - -/** - * Utility class for mathematical functions. - */ -public final class MathUtil { - /** - * Epsilon for fuzzy floating point comparisons. - */ - public static final double EPSILON = 1.0E-5; - private static final int SIN_BITS, SIN_MASK, SIN_COUNT; - private static final double radFull, radToIndex; - private static final double degFull, degToIndex; - private static final double[] sin, cos; - static { - SIN_BITS = 12; - SIN_MASK = ~(-1 << SIN_BITS); - SIN_COUNT = SIN_MASK + 1; - - radFull = Math.PI * 2.0; - degFull = 360.0; - radToIndex = SIN_COUNT / radFull; - degToIndex = SIN_COUNT / degFull; - - sin = new double[SIN_COUNT]; - cos = new double[SIN_COUNT]; - - for(int i = 0; i < SIN_COUNT; i++) { - sin[i] = Math.sin((i + 0.5f) / SIN_COUNT * radFull); - cos[i] = Math.cos((i + 0.5f) / SIN_COUNT * radFull); - } - - // Four cardinal directions (credits: Nate) - for(int i = 0; i < 360; i += 90) { - sin[(int) (i * degToIndex) & SIN_MASK] = Math.sin(i * Math.PI / 180.0); - cos[(int) (i * degToIndex) & SIN_MASK] = Math.cos(i * Math.PI / 180.0); - } - } - - public static double sin(double rad) { - return sin[(int) (rad * radToIndex) & SIN_MASK]; - } - - public static double cos(double rad) { - return cos[(int) (rad * radToIndex) & SIN_MASK]; - } - - public static double tan(double rad) { - return sin(rad) / cos(rad); - } - - public static double invSqrt(double x) { - double halfX = 0.5d * x; - long i = Double.doubleToLongBits(x); // evil floating point bit level hacking - i = 0x5FE6EC85E7DE30DAL - (i >> 1); // what the fuck? - double y = Double.longBitsToDouble(i); - y *= (1.5d - halfX * y * y); // 1st newtonian iteration - // y *= (1.5d - halfX * y * y); // 2nd newtonian iteration, this can be removed - - return y; - } - - /** - * Gets the standard deviation of an array of doubles. - * - * @param numArray The array of numbers to calculate the standard deviation of. - * - * @return double - The standard deviation. - */ - public static double standardDeviation(List numArray) { - double sum = 0.0, standardDeviation = 0.0; - int length = numArray.size(); - - for(Number num : numArray) { - sum += num.doubleValue(); - } - - double mean = sum / length; - - for(Number num : numArray) { - standardDeviation += Math.pow(num.doubleValue() - mean, 2); - } - - return Math.sqrt(standardDeviation / length); - } - - public static long hashToLong(String s) { - if(s == null) { - return 0; - } - long hash = 0; - for(char c : s.toCharArray()) { - hash = 31L * hash + c; - } - return hash; - } - - /** - * Compare 2 floating-point values with epsilon to account for rounding errors - * - * @param a Value 1 - * @param b Value 2 - * - * @return Whether these values are equal - */ - public static boolean equals(double a, double b) { - return a == b || Math.abs(a - b) < EPSILON; - } - - public static int normalizeIndex(double val, int size) { - return Math.max(Math.min((int) Math.floor(((val + 1D) / 2D) * size), size - 1), 0); - } - - public static long squash(int first, int last) { - return (((long) first) << 32) | (last & 0xffffffffL); - } - - /** - * Clamp value to range of [-1, 1] - * - * @param in Value to clamp - * - * @return Clamped value - */ - public static double clamp(double in) { - return Math.min(Math.max(in, -1), 1); - } - - public static int clamp(int min, int i, int max) { - return Math.max(Math.min(i, max), min); - } - - /** - * Compute the value in a normally distributed data set that has probability p. - * - * @param p Probability of value - * @param mu Mean of data - * @param sigma Standard deviation of data - * - * @return Value corresponding to input probability - */ - public static double normalInverse(double p, double mu, double sigma) { - if(p < 0 || p > 1) - throw new IllegalArgumentException("Probability must be in range [0, 1]"); - if(sigma < 0) - throw new IllegalArgumentException("Standard deviation must be positive."); - if(p == 0) - return Double.NEGATIVE_INFINITY; - if(p == 1) - return Double.POSITIVE_INFINITY; - if(sigma == 0) - return mu; - double q, r, val; - - q = p - 0.5; - - if(Math.abs(q) <= .425) { - r = .180625 - q * q; - val = - q * (((((((r * 2509.0809287301226727 + - 33430.575583588128105) * r + 67265.770927008700853) * r + - 45921.953931549871457) * r + 13731.693765509461125) * r + - 1971.5909503065514427) * r + 133.14166789178437745) * r + - 3.387132872796366608) - / (((((((r * 5226.495278852854561 + - 28729.085735721942674) * r + 39307.89580009271061) * r + - 21213.794301586595867) * r + 5394.1960214247511077) * r + - 687.1870074920579083) * r + 42.313330701600911252) * r + 1); - } else { - if(q > 0) { - r = 1 - p; - } else { - r = p; - } - - r = Math.sqrt(-Math.log(r)); - - if(r <= 5) { - r -= 1.6; - val = (((((((r * 7.7454501427834140764e-4 + - .0227238449892691845833) * r + .24178072517745061177) * - r + 1.27045825245236838258) * r + - 3.64784832476320460504) * r + 5.7694972214606914055) * - r + 4.6303378461565452959) * r + - 1.42343711074968357734) - / (((((((r * - 1.05075007164441684324e-9 + 5.475938084995344946e-4) * - r + .0151986665636164571966) * r + - .14810397642748007459) * r + .68976733498510000455) * - r + 1.6763848301838038494) * r + - 2.05319162663775882187) * r + 1); - } else { - r -= 5; - val = (((((((r * 2.01033439929228813265e-7 + - 2.71155556874348757815e-5) * r + - .0012426609473880784386) * r + .026532189526576123093) * - r + .29656057182850489123) * r + - 1.7848265399172913358) * r + 5.4637849111641143699) * - r + 6.6579046435011037772) - / (((((((r * - 2.04426310338993978564e-15 + 1.4215117583164458887e-7) * - r + 1.8463183175100546818e-5) * r + - 7.868691311456132591e-4) * r + .0148753612908506148525) - * r + .13692988092273580531) * r + - .59983220655588793769) * r + 1); - } - - if(q < 0.0) { - val = -val; - } - } - - return mu + sigma * val; - } - - /** - * Murmur64 hashing function - * - * @param h Input value - * - * @return Hashed value - */ - public static long murmur64(long h) { - h ^= h >>> 33; - h *= 0xff51afd7ed558ccdL; - h ^= h >>> 33; - h *= 0xc4ceb9fe1a85ec53L; - h ^= h >>> 33; - return h; - } - - /** - * 1D Linear interpolation between 2 points 1 unit apart. - * - * @param t - Distance from v0. Total distance between v0 and v1 is 1 unit. - * @param v0 - Value at v0. - * @param v1 - Value at v1. - * - * @return double - The interpolated value. - */ - public static double lerp(double t, double v0, double v1) { - return v0 + t * (v1 - v0); - } - - public static double cubicLerp(double a, double b, double c, double d, double t) { - double p = (d - c) - (a - b); - return t * t * t * p + t * t * ((a - b) - p) + t * (c - a) + b; - } - - public static double interpHermite(double t) { - return t * t * (3 - 2 * t); - } - - public static double interpQuintic(double t) { - return t * t * t * (t * (t * 6 - 15) + 10); - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/PopulationUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/PopulationUtil.java deleted file mode 100644 index 7d51993dc..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/PopulationUtil.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra API is licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in the common/api directory. - */ - -package com.dfsek.terra.api.util; - -import java.util.Random; - -import com.dfsek.terra.api.world.chunk.Chunk; - - -public final class PopulationUtil { - public static Random getRandom(Chunk c) { - return getRandom(c, 0); - } - - public static Random getRandom(Chunk c, long salt) { - return new Random(getCarverChunkSeed(c.getX(), c.getZ(), c.getWorld().getSeed() + salt)); - } - - /** - * Gets the carver seed for a chunk. - * - * @param chunkX Chunk's X coordinate - * @param chunkZ Chunk's Z coordinate - * @param seed World seed - * - * @return long - The carver seed. - */ - public static long getCarverChunkSeed(int chunkX, int chunkZ, long seed) { - Random r = new Random(seed); - return chunkX * r.nextLong() ^ chunkZ * r.nextLong() ^ seed; - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/Rotation.java b/common/api/src/main/java/com/dfsek/terra/api/util/Rotation.java deleted file mode 100644 index a172928ff..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/Rotation.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra API is licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in the common/api directory. - */ - -package com.dfsek.terra.api.util; - -public enum Rotation { - - CW_90(90), - CW_180(180), - CCW_90(270), - NONE(0); - private final int degrees; - - Rotation(int degrees) { - this.degrees = degrees; - } - - public static Rotation fromDegrees(int deg) { - return switch(Math.floorMod(deg, 360)) { - case 0 -> Rotation.NONE; - case 90 -> Rotation.CW_90; - case 180 -> Rotation.CW_180; - case 270 -> Rotation.CCW_90; - default -> throw new IllegalArgumentException(); - }; - } - - public Rotation inverse() { - return switch(this) { - case NONE -> NONE; - case CCW_90 -> CW_90; - case CW_90 -> CCW_90; - case CW_180 -> CW_180; - }; - } - - public Rotation rotate(Rotation rotation) { - return fromDegrees(this.getDegrees() + rotation.getDegrees()); - } - - public int getDegrees() { - return degrees; - } - - public enum Axis { - X, - Y, - Z - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/RotationUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/RotationUtil.java deleted file mode 100644 index 2673cd2bf..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/RotationUtil.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra API is licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in the common/api directory. - */ - -package com.dfsek.terra.api.util; - -import com.dfsek.terra.api.util.vector.Vector2; -import com.dfsek.terra.api.util.vector.Vector2.Mutable; - - -public final class RotationUtil { - /** - * Rotate and mirror a coordinate pair. - * - * @param orig Vector to rotate. - * @param r Rotation - * - * @return Rotated vector - */ - public static Vector2 rotateVector(Vector2 orig, Rotation r) { - Mutable copy = orig.mutable(); - switch(r) { - case CW_90 -> copy.setX(orig.getZ()).setZ(-orig.getX()); - case CCW_90 -> copy.setX(-orig.getZ()).setZ(orig.getX()); - case CW_180 -> copy.multiply(-1); - } - return copy.immutable(); - } - - -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/StringUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/StringUtil.java deleted file mode 100644 index e8973db31..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/StringUtil.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra API is licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in the common/api directory. - */ - -package com.dfsek.terra.api.util; - -import java.io.File; - - -public class StringUtil { - public static String fileName(String path) { - if(path.contains(File.separator)) { - return path.substring(path.lastIndexOf(File.separatorChar) + 1, path.lastIndexOf('.')); - } else if(path.contains("/")) { - return path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf('.')); - } else if(path.contains(".")) { - return path.substring(0, path.lastIndexOf('.')); - } else { - return path; - } - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/cache/SeededVector2Key.java b/common/api/src/main/java/com/dfsek/terra/api/util/cache/SeededVector2Key.java index 2023867a6..3c674554b 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/cache/SeededVector2Key.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/cache/SeededVector2Key.java @@ -1,37 +1,35 @@ package com.dfsek.terra.api.util.cache; - - public class SeededVector2Key { - public int x; - public int z; - public long seed; + public int x; + public int z; + public long seed; - public SeededVector2Key(int x, int z, long seed) { - this.x = x; - this.z = z; - this.seed = seed; - } - - public void set(int x, int z, long seed) { - this.x = x; - this.z = z; - this.seed = seed; - } - - @Override - public boolean equals(Object obj) { - if(obj instanceof SeededVector2Key that) { - return this.z == that.z && this.x == that.x && this.seed == that.seed; - } - return false; - } - - @Override - public int hashCode() { - int code = x; - code = 31 * code + z; - return 31 * code + (Long.hashCode(seed)); - } + public SeededVector2Key(int x, int z, long seed) { + this.x = x; + this.z = z; + this.seed = seed; } + + public void set(int x, int z, long seed) { + this.x = x; + this.z = z; + this.seed = seed; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof SeededVector2Key that) { + return this.z == that.z && this.x == that.x && this.seed == that.seed; + } + return false; + } + + @Override + public int hashCode() { + int code = x; + code = 31 * code + z; + return 31 * code + (Long.hashCode(seed)); + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/cache/SeededVector3Key.java b/common/api/src/main/java/com/dfsek/terra/api/util/cache/SeededVector3Key.java index 90af87b32..8286413f0 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/cache/SeededVector3Key.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/cache/SeededVector3Key.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.util.cache; - public class SeededVector3Key { public int x; public int y; 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 b2368e789..4e71247b4 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 @@ -7,6 +7,10 @@ package com.dfsek.terra.api.util.collection; +import com.dfsek.seismic.math.normalization.NormalizationFunctions; +import com.dfsek.seismic.type.sampler.Sampler; +import com.dfsek.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3Int; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -15,15 +19,11 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; -import java.util.Random; import java.util.Set; import java.util.function.Function; +import java.util.random.RandomGenerator; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.MathUtil; import com.dfsek.terra.api.util.mutable.MutableInteger; -import com.dfsek.terra.api.util.vector.Vector3; -import com.dfsek.terra.api.util.vector.Vector3Int; public class ProbabilityCollection implements Collection { @@ -43,35 +43,37 @@ public class ProbabilityCollection implements Collection { } @SuppressWarnings("unchecked") - public E get(Random r) { + public E get(RandomGenerator r) { if(array.length == 0) return null; return (E) array[r.nextInt(array.length)]; } @SuppressWarnings("unchecked") - public E get(NoiseSampler n, double x, double y, double z, long seed) { + public E get(Sampler n, double x, double y, double z, long seed) { if(array.length == 0) return null; - return (E) array[(int) MathUtil.normalizeIndex(n.noise(seed, x, y, z), array.length)]; + return (E) array[NormalizationFunctions.normalizeIndex(n.getSample(seed, x, y, z), array.length)]; } @SuppressWarnings("unchecked") - public E get(NoiseSampler n, Vector3Int vector3Int, long seed) { + public E get(Sampler n, Vector3Int vector3Int, long seed) { if(array.length == 0) return null; - return (E) array[(int) MathUtil.normalizeIndex(n.noise(seed, vector3Int.getX(), vector3Int.getY(), vector3Int.getZ()), + return (E) array[(int) NormalizationFunctions.normalizeIndex( + n.getSample(seed, vector3Int.getX(), vector3Int.getY(), vector3Int.getZ()), array.length)]; } @SuppressWarnings("unchecked") - public E get(NoiseSampler n, Vector3 vector3Int, long seed) { + public E get(Sampler n, Vector3 vector3Int, long seed) { if(array.length == 0) return null; - return (E) array[(int) MathUtil.normalizeIndex(n.noise(seed, vector3Int.getX(), vector3Int.getY(), vector3Int.getZ()), + return (E) array[(int) NormalizationFunctions.normalizeIndex( + n.getSample(seed, vector3Int.getX(), vector3Int.getY(), vector3Int.getZ()), array.length)]; } @SuppressWarnings("unchecked") - public E get(NoiseSampler n, double x, double z, long seed) { + public E get(Sampler n, double x, double z, long seed) { if(array.length == 0) return null; - return (E) array[(int) MathUtil.normalizeIndex(n.noise(seed, x, z), array.length)]; + return (E) array[(int) NormalizationFunctions.normalizeIndex(n.getSample(seed, x, z), array.length)]; } @SuppressWarnings("unchecked") @@ -197,17 +199,17 @@ public class ProbabilityCollection implements Collection { } @Override - public T get(Random r) { + public T get(RandomGenerator r) { return single; } @Override - public T get(NoiseSampler n, double x, double y, double z, long seed) { + public T get(Sampler n, double x, double y, double z, long seed) { return single; } @Override - public T get(NoiseSampler n, double x, double z, long seed) { + public T get(Sampler n, double x, double z, long seed) { return single; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/ConstantRange.java b/common/api/src/main/java/com/dfsek/terra/api/util/range/ConstantRange.java similarity index 92% rename from common/api/src/main/java/com/dfsek/terra/api/util/ConstantRange.java rename to common/api/src/main/java/com/dfsek/terra/api/util/range/ConstantRange.java index 19ae50001..1df043153 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/ConstantRange.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/range/ConstantRange.java @@ -5,12 +5,12 @@ * reference the LICENSE file in the common/api directory. */ -package com.dfsek.terra.api.util; +package com.dfsek.terra.api.util.range; import org.jetbrains.annotations.NotNull; import java.util.Iterator; -import java.util.Random; +import java.util.random.RandomGenerator; public class ConstantRange implements Range { @@ -18,7 +18,7 @@ public class ConstantRange implements Range { private int max; public ConstantRange(int min, int max) { - if(min >= max) throw new IllegalArgumentException("Minimum must not be greater than or equal to maximum!"); + if(min > max) throw new IllegalArgumentException("Minimum must not be greater than maximum!"); this.max = max; this.min = min; } @@ -36,7 +36,7 @@ public class ConstantRange implements Range { } @Override - public int get(Random r) { + public int get(RandomGenerator r) { return r.nextInt(min, max); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/Range.java b/common/api/src/main/java/com/dfsek/terra/api/util/range/Range.java similarity index 92% rename from common/api/src/main/java/com/dfsek/terra/api/util/Range.java rename to common/api/src/main/java/com/dfsek/terra/api/util/range/Range.java index fff28521c..449ae7336 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/Range.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/range/Range.java @@ -5,13 +5,13 @@ * reference the LICENSE file in the common/api directory. */ -package com.dfsek.terra.api.util; +package com.dfsek.terra.api.util.range; import org.jetbrains.annotations.NotNull; import java.util.Iterator; -import java.util.Random; import java.util.function.Supplier; +import java.util.random.RandomGenerator; public interface Range extends Iterable { @@ -19,7 +19,7 @@ public interface Range extends Iterable { Range reflect(int pt); - int get(Random r); + int get(RandomGenerator r); Range intersects(Range other); diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector2.java b/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector2.java deleted file mode 100644 index a96377c11..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector2.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra API is licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in the common/api directory. - */ - -package com.dfsek.terra.api.util.vector; - -import com.dfsek.terra.api.util.MathUtil; - - -/** - * oh yeah - */ -public class Vector2 { - private static final Vector2 ZERO = new Vector2(0, 0); - private static final Vector2 UNIT = new Vector2(0, 1); - protected double x, z; - - /** - * Create a vector with a given X and Z component - * - * @param x X component - * @param z Z component - */ - private Vector2(double x, double z) { - this.x = x; - this.z = z; - } - - public static Vector2 zero() { - return ZERO; - } - - public static Vector2 unit() { - return UNIT; - } - - public static Vector2 of(double x, double z) { - return new Vector2(x, z); - } - - - /** - * Get the length of this Vector - * - * @return length - */ - public double length() { - return Math.sqrt(lengthSquared()); - } - - /** - * Get the squared length of this Vector - * - * @return squared length - */ - public double lengthSquared() { - return x * x + z * z; - } - - /** - * Get the distance from this vector to another. - * - * @param other Another vector - * - * @return Distance between vectors - */ - public double distance(Vector2 other) { - return Math.sqrt(distanceSquared(other)); - } - - /** - * Get the squared distance between 2 vectors. - * - * @param other Another vector - * - * @return Squared distance - */ - public double distanceSquared(Vector2 other) { - double dx = other.getX() - x; - double dz = other.getZ() - z; - return dx * dx + dz * dz; - } - - public Vector3 extrude(double y) { - return Vector3.of(this.x, y, this.z); - } - - /** - * Get X component - * - * @return X component - */ - public double getX() { - return x; - } - - - /** - * Get Z component - * - * @return Z component - */ - public double getZ() { - return z; - } - - - public int getBlockX() { - return (int) Math.floor(x); - } - - public int getBlockZ() { - return (int) Math.floor(z); - } - - @Override - public int hashCode() { - int hash = 17; - hash = 31 * hash + Double.hashCode(x); - hash = 31 * hash + Double.hashCode(z); - return hash; - } - - public boolean equals(Object obj) { - if(!(obj instanceof Vector2 other)) return false; - return MathUtil.equals(this.x, other.x) && MathUtil.equals(this.z, other.z); - } - - public Mutable mutable() { - return new Mutable(x, z); - } - - @Override - public String toString() { - return "(" + x + ", " + z + ")"; - } - - - public static class Mutable extends Vector2 { - - private Mutable(double x, double z) { - super(x, z); - } - - public double getX() { - return x; - } - - public Mutable setX(double x) { - this.x = x; - return this; - } - - public double getZ() { - return z; - } - - public Mutable setZ(double z) { - this.z = z; - return this; - } - - public Vector2 immutable() { - return Vector2.of(x, z); - } - - /** - * Get the length of this Vector - * - * @return length - */ - public double length() { - return Math.sqrt(lengthSquared()); - } - - /** - * Get the squared length of this Vector - * - * @return squared length - */ - public double lengthSquared() { - return x * x + z * z; - } - - public Mutable add(double x, double z) { - this.x += x; - this.z += z; - return this; - } - - /** - * Multiply X and Z components by a value. - * - * @param m Value to multiply - * - * @return Mutated vector, for chaining. - */ - public Mutable multiply(double m) { - x *= m; - z *= m; - return this; - } - - /** - * Add this vector to another. - * - * @param other Vector to add - * - * @return Mutated vector, for chaining. - */ - public Mutable add(Vector2 other) { - x += other.getX(); - z += other.getZ(); - return this; - } - - /** - * Subtract a vector from this vector, - * - * @param other Vector to subtract - * - * @return Mutated vector, for chaining. - */ - public Mutable subtract(Vector2 other) { - x -= other.getX(); - z -= other.getZ(); - return this; - } - - /** - * Normalize this vector to length 1 - * - * @return Mutated vector, for chaining. - */ - public Mutable normalize() { - divide(length()); - return this; - } - - /** - * Divide X and Z components by a value. - * - * @param d Divisor - * - * @return Mutated vector, for chaining. - */ - public Mutable divide(double d) { - x /= d; - z /= d; - return this; - } - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector2Int.java b/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector2Int.java deleted file mode 100644 index 8f904dfcb..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector2Int.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.dfsek.terra.api.util.vector; - -import com.dfsek.terra.api.util.Rotation; - - -/** - * oh yeah - */ -public class Vector2Int { - private static final Vector2Int ZERO = new Vector2Int(0, 0); - private static final Vector2Int UNIT = new Vector2Int(0, 1); - protected int x, z; - - protected Vector2Int(int x, int z) { - this.x = x; - this.z = z; - } - - public static Vector2Int zero() { - return ZERO; - } - - public static Vector2Int unit() { - return UNIT; - } - - public static Vector2Int of(int x, int z) { - return new Vector2Int(x, z); - } - - public int getX() { - return x; - } - - public int getZ() { - return z; - } - - public Vector3Int toVector3(int y) { - return new Vector3Int(x, y, z); - } - - public Mutable mutable() { - return new Mutable(x, z); - } - - public Vector2Int rotate(Rotation rotation) { - return switch(rotation) { - case CW_90 -> of(z, -x); - case CCW_90 -> of(-z, x); - case CW_180 -> of(-x, -z); - default -> this; - }; - } - - @Override - public int hashCode() { - return (31 * x) + z; - } - - @Override - public boolean equals(Object obj) { - if(obj instanceof Vector2Int that) { - return this.x == that.x && this.z == that.z; - } - return false; - } - - - public static class Mutable extends Vector2Int { - - protected Mutable(int x, int z) { - super(x, z); - } - - public int getZ() { - return z; - } - - public void setZ(int z) { - this.z = z; - } - - public int getX() { - return x; - } - - public void setX(int x) { - this.x = x; - } - - public Vector2Int immutable() { - return new Vector2Int(x, z); - } - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector3.java b/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector3.java deleted file mode 100644 index 1d1ab6097..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector3.java +++ /dev/null @@ -1,441 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra API is licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in the common/api directory. - */ - -package com.dfsek.terra.api.util.vector; - -import org.jetbrains.annotations.NotNull; - -import com.dfsek.terra.api.util.MathUtil; - - -public class Vector3 { - private static final Vector3 ZERO = new Vector3(0, 0, 0); - private static final Vector3 UNIT = new Vector3(0, 1, 0); - protected double x, y, z; - - private Vector3(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - } - - public static Vector3 zero() { - return ZERO; - } - - public static Vector3 unit() { - return UNIT; - } - - public static Vector3 of(double x, double y, double z) { - return new Vector3(x, y, z); - } - - public double lengthSquared() { - return x * x + y * y + z * z; - } - - public double length() { - return Math.sqrt(lengthSquared()); - } - - public double inverseLength() { - return MathUtil.invSqrt(lengthSquared()); - } - - /** - * Get the distance between this vector and another. The value of this - * method is not cached and uses a costly square-root function, so do not - * repeatedly call this method to get the vector's magnitude. NaN will be - * returned if the inner result of the sqrt() function overflows, which - * will be caused if the distance is too long. - * - * @param o The other vector - * - * @return the distance - */ - public double distance(@NotNull Vector3 o) { - return Math.sqrt(Math.pow(x - o.getX(), 2) + Math.pow(y - o.getY(), 2) + Math.pow(z - o.getZ(), 2)); - } - - /** - * Get the squared distance between this vector and another. - * - * @param o The other vector - * - * @return the distance - */ - public double distanceSquared(@NotNull Vector3 o) { - return Math.pow(x - o.getX(), 2) + Math.pow(y - o.getY(), 2) + Math.pow(z - o.getZ(), 2); - } - - /** - * Calculates the dot product of this vector with another. The dot product - * is defined as x1*x2+y1*y2+z1*z2. The returned value is a scalar. - * - * @param other The other vector - * - * @return dot product - */ - public double dot(@NotNull Vector3 other) { - return x * other.getX() + y * other.getY() + z * other.getZ(); - } - - public double getZ() { - return z; - } - - - public double getX() { - return x; - } - - - public double getY() { - return y; - } - - - public int getBlockX() { - return (int) Math.floor(x); - } - - public int getBlockY() { - return (int) Math.floor(y); - } - - public int getBlockZ() { - return (int) Math.floor(z); - } - - /** - * Returns if a vector is normalized - * - * @return whether the vector is normalised - */ - public boolean isNormalized() { - return MathUtil.equals(this.lengthSquared(), 1); - } - - /** - * Returns a hash code for this vector - * - * @return hash code - */ - @Override - public int hashCode() { - int hash = 7; - - hash = 79 * hash + (int) (Double.doubleToLongBits(this.x) ^ (Double.doubleToLongBits(this.x) >>> 32)); - hash = 79 * hash + (int) (Double.doubleToLongBits(this.y) ^ (Double.doubleToLongBits(this.y) >>> 32)); - hash = 79 * hash + (int) (Double.doubleToLongBits(this.z) ^ (Double.doubleToLongBits(this.z) >>> 32)); - return hash; - } - - /** - * Checks to see if two objects are equal. - *

- * Only two Vectors can ever return true. This method uses a fuzzy match - * to account for floating point errors. The epsilon can be retrieved - * with epsilon. - */ - @Override - public boolean equals(Object obj) { - if(!(obj instanceof Vector3 other)) return false; - return MathUtil.equals(x, other.getX()) && MathUtil.equals(y, other.getY()) && MathUtil.equals(z, other.getZ()); - } - - public Vector3Int toInt() { - return Vector3Int.of(getBlockX(), getBlockY(), getBlockZ()); - } - - public Mutable mutable() { - return new Mutable(x, y, z); - } - - @Override - public String toString() { - return "(" + getX() + ", " + getY() + ", " + getZ() + ")"; - } - - - public static class Mutable extends Vector3 { - private Mutable(double x, double y, double z) { - super(x, y, z); - } - - public static Mutable of(double x, double y, double z) { - return new Mutable(x, y, z); - } - - public Vector3 immutable() { - return Vector3.of(x, y, z); - } - - public double getZ() { - return z; - } - - public Mutable setZ(double z) { - this.z = z; - return this; - } - - public double getX() { - return x; - } - - public Mutable setX(double x) { - this.x = x; - return this; - } - - public double getY() { - return y; - } - - public Mutable setY(double y) { - this.y = y; - return this; - } - - public double lengthSquared() { - return x * x + y * y + z * z; - } - - public double length() { - return Math.sqrt(lengthSquared()); - } - - public double inverseLength() { - return MathUtil.invSqrt(lengthSquared()); - } - - public Mutable normalize() { - return this.multiply(this.inverseLength()); - } - - public Mutable subtract(int x, int y, int z) { - this.x -= x; - this.y -= y; - this.z -= z; - return this; - } - - /** - * Calculates the dot product of this vector with another. The dot product - * is defined as x1*x2+y1*y2+z1*z2. The returned value is a scalar. - * - * @param other The other vector - * - * @return dot product - */ - public double dot(@NotNull Vector3 other) { - return x * other.getX() + y * other.getY() + z * other.getZ(); - } - - public Mutable subtract(Vector3 end) { - x -= end.getX(); - y -= end.getY(); - z -= end.getZ(); - return this; - } - - public Mutable multiply(double m) { - x *= m; - y *= m; - z *= m; - return this; - } - - public Mutable add(double x, double y, double z) { - this.x += x; - this.y += y; - this.z += z; - return this; - } - - public Mutable add(Vector3 other) { - this.x += other.getX(); - this.y += other.getY(); - this.z += other.getZ(); - return this; - } - - public Mutable add(Vector3Int other) { - this.x += other.getX(); - this.y += other.getY(); - this.z += other.getZ(); - return this; - } - - public Mutable add(Vector2 other) { - this.x += other.getX(); - this.z += other.getZ(); - return this; - } - - /** - * Rotates the vector around a given arbitrary axis in 3 dimensional space. - * - *

- * Rotation will follow the general Right-Hand-Rule, which means rotation - * will be counterclockwise when the axis is pointing towards the observer. - *

- * This method will always make sure the provided axis is a unit vector, to - * not modify the length of the vector when rotating. - * - * @param axis the axis to rotate the vector around. If the passed vector is - * not of length 1, it gets copied and normalized before using it for the - * rotation. Please use {@link Mutable#normalize()} on the instance before - * passing it to this method - * @param angle the angle to rotate the vector around the axis - * - * @return the same vector - * - * @throws IllegalArgumentException if the provided axis vector instance is - * null - */ - @NotNull - public Mutable rotateAroundAxis(@NotNull Vector3 axis, double angle) throws IllegalArgumentException { - return rotateAroundNonUnitAxis(axis.isNormalized() ? axis : axis.mutable().normalize().immutable(), angle); - } - - /** - * Rotates the vector around a given arbitrary axis in 3 dimensional space. - * - *

- * Rotation will follow the general Right-Hand-Rule, which means rotation - * will be counterclockwise when the axis is pointing towards the observer. - *

- * Note that the vector length will change accordingly to the axis vector - * length. If the provided axis is not a unit vector, the rotated vector - * will not have its previous length. The scaled length of the resulting - * vector will be related to the axis vector. - * - * @param axis the axis to rotate the vector around. - * @param angle the angle to rotate the vector around the axis - * - * @return the same vector - * - * @throws IllegalArgumentException if the provided axis vector instance is - * null - */ - @NotNull - public Mutable rotateAroundNonUnitAxis(@NotNull Vector3 axis, double angle) throws IllegalArgumentException { - double x = getX(), y = getY(), z = getZ(); - double x2 = axis.getX(), y2 = axis.getY(), z2 = axis.getZ(); - - double cosTheta = MathUtil.cos(angle); - double sinTheta = MathUtil.sin(angle); - double dotProduct = this.dot(axis); - - double xPrime = x2 * dotProduct * (1d - cosTheta) - + x * cosTheta - + (-z2 * y + y2 * z) * sinTheta; - double yPrime = y2 * dotProduct * (1d - cosTheta) - + y * cosTheta - + (z2 * x - x2 * z) * sinTheta; - double zPrime = z2 * dotProduct * (1d - cosTheta) - + z * cosTheta - + (-y2 * x + x2 * y) * sinTheta; - - return setX(xPrime).setY(yPrime).setZ(zPrime); - } - - /** - * Rotates the vector around the x axis. - *

- * This piece of math is based on the standard rotation matrix for vectors - * in three dimensional space. This matrix can be found here: - * Rotation - * Matrix. - * - * @param angle the angle to rotate the vector about. This angle is passed - * in radians - * - * @return the same vector - */ - @NotNull - public Mutable rotateAroundX(double angle) { - double angleCos = MathUtil.cos(angle); - double angleSin = MathUtil.sin(angle); - - double y = angleCos * getY() - angleSin * getZ(); - double z = angleSin * getY() + angleCos * getZ(); - return setY(y).setZ(z); - } - - /** - * Rotates the vector around the y axis. - *

- * This piece of math is based on the standard rotation matrix for vectors - * in three dimensional space. This matrix can be found here: - * Rotation - * Matrix. - * - * @param angle the angle to rotate the vector about. This angle is passed - * in radians - * - * @return the same vector - */ - @NotNull - public Mutable rotateAroundY(double angle) { - double angleCos = MathUtil.cos(angle); - double angleSin = MathUtil.sin(angle); - - double x = angleCos * getX() + angleSin * getZ(); - double z = -angleSin * getX() + angleCos * getZ(); - return setX(x).setZ(z); - } - - /** - * Rotates the vector around the z axis - *

- * This piece of math is based on the standard rotation matrix for vectors - * in three dimensional space. This matrix can be found here: - * Rotation - * Matrix. - * - * @param angle the angle to rotate the vector about. This angle is passed - * in radians - * - * @return the same vector - */ - @NotNull - public Mutable rotateAroundZ(double angle) { - double angleCos = MathUtil.cos(angle); - double angleSin = MathUtil.sin(angle); - - double x = angleCos * getX() - angleSin * getY(); - double y = angleSin * getX() + angleCos * getY(); - return setX(x).setY(y); - } - - @Override - public int hashCode() { - int hash = 13; - - hash = 79 * hash + (int) (Double.doubleToLongBits(this.x) ^ (Double.doubleToLongBits(this.x) >>> 32)); - hash = 79 * hash + (int) (Double.doubleToLongBits(this.y) ^ (Double.doubleToLongBits(this.y) >>> 32)); - hash = 79 * hash + (int) (Double.doubleToLongBits(this.z) ^ (Double.doubleToLongBits(this.z) >>> 32)); - return hash; - } - - public int getBlockX() { - return (int) Math.floor(x); - } - - public int getBlockY() { - return (int) Math.floor(y); - } - - public int getBlockZ() { - return (int) Math.floor(z); - } - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector3Int.java b/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector3Int.java deleted file mode 100644 index ff9e3fc0f..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector3Int.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.dfsek.terra.api.util.vector; - - -public class Vector3Int { - private static final Vector3Int ZERO = new Vector3Int(0, 0, 0); - private static final Vector3Int UNIT = new Vector3Int(0, 1, 0); - protected int x, y, z; - - protected Vector3Int(int x, int y, int z) { - this.x = x; - this.y = y; - this.z = z; - } - - public static Vector3Int unit() { - return UNIT; - } - - public static Vector3Int zero() { - return ZERO; - } - - public static Vector3Int of(int x, int y, int z) { - return new Vector3Int(x, y, z); - } - - public static Vector3Int of(Vector3Int origin, int x, int y, int z) { - return new Vector3Int(origin.x + x, origin.y + y, origin.z + z); - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public int getZ() { - return z; - } - - public Mutable mutable() { - return new Mutable(x, y, z); - } - - public Vector3 toVector3() { - return Vector3.of(x, y, z); - } - - public Vector3.Mutable toVector3Mutable() { - return Vector3.Mutable.of(x, y, z); - } - - public static class Mutable extends Vector3Int { - protected Mutable(int x, int y, int z) { - super(x, y, z); - } - - public int getX() { - return x; - } - - public void setX(int x) { - this.x = x; - } - - public int getY() { - return y; - } - - public void setY(int y) { - this.y = y; - } - - public int getZ() { - return z; - } - - public void setZ(int z) { - this.z = z; - } - - public Vector3Int immutable() { - return Vector3Int.of(x, y, z); - } - - public Mutable add(int x, int y, int z) { - this.x += x; - this.y += y; - this.z += z; - return this; - } - - public Vector3 toVector3() { - return Vector3.of(x, y, z); - } - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/BufferedWorld.java b/common/api/src/main/java/com/dfsek/terra/api/world/BufferedWorld.java index 086feed7a..7d98af75f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/BufferedWorld.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/BufferedWorld.java @@ -1,5 +1,7 @@ package com.dfsek.terra.api.world; +import com.dfsek.seismic.type.vector.Vector3Int; + import java.util.Objects; import com.dfsek.terra.api.block.entity.BlockEntity; @@ -7,7 +9,6 @@ import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.EntityType; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; import com.dfsek.terra.api.world.util.Interceptors; diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/ReadableWorld.java b/common/api/src/main/java/com/dfsek/terra/api/world/ReadableWorld.java index 4ea52661d..b22f6bfa8 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/ReadableWorld.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/ReadableWorld.java @@ -1,9 +1,10 @@ package com.dfsek.terra.api.world; +import com.dfsek.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3Int; + import com.dfsek.terra.api.block.entity.BlockEntity; import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.util.vector.Vector3; -import com.dfsek.terra.api.util.vector.Vector3Int; /** @@ -29,7 +30,7 @@ public interface ReadableWorld extends World { * @return {@link BlockState} at coordinates. */ default BlockState getBlockState(Vector3 position) { - return getBlockState(position.getBlockX(), position.getBlockY(), position.getBlockZ()); + return getBlockState(position.getFloorX(), position.getFloorY(), position.getFloorZ()); } /** @@ -46,7 +47,7 @@ public interface ReadableWorld extends World { BlockEntity getBlockEntity(int x, int y, int z); default BlockEntity getBlockEntity(Vector3 position) { - return getBlockEntity(position.getBlockX(), position.getBlockY(), position.getBlockZ()); + return getBlockEntity(position.getFloorX(), position.getFloorY(), position.getFloorZ()); } default BlockEntity getBlockEntity(Vector3Int position) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/ServerWorld.java b/common/api/src/main/java/com/dfsek/terra/api/world/ServerWorld.java index 722c94b21..4d0c100c4 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/ServerWorld.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/ServerWorld.java @@ -7,7 +7,8 @@ package com.dfsek.terra.api.world; -import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3; + import com.dfsek.terra.api.world.chunk.Chunk; @@ -15,6 +16,6 @@ public interface ServerWorld extends WritableWorld { Chunk getChunkAt(int x, int z); default Chunk getChunkAt(Vector3 location) { - return getChunkAt(location.getBlockX() >> 4, location.getBlockZ() >> 4); + return getChunkAt(location.getFloorX() >> 4, location.getFloorZ() >> 4); } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/WritableWorld.java b/common/api/src/main/java/com/dfsek/terra/api/world/WritableWorld.java index 6b528a040..ce83d7ac0 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/WritableWorld.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/WritableWorld.java @@ -1,20 +1,21 @@ package com.dfsek.terra.api.world; +import com.dfsek.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3Int; + import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.EntityType; -import com.dfsek.terra.api.util.vector.Vector3; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.chunk.generation.util.Column; public interface WritableWorld extends ReadableWorld { default void setBlockState(Vector3 position, BlockState data, boolean physics) { - setBlockState(position.getBlockX(), position.getBlockY(), position.getBlockZ(), data, physics); + setBlockState(position.getFloorX(), position.getFloorY(), position.getFloorZ(), data, physics); } default void setBlockState(Vector3.Mutable position, BlockState data, boolean physics) { - setBlockState(position.getBlockX(), position.getBlockY(), position.getBlockZ(), data, physics); + setBlockState(position.getFloorX(), position.getFloorY(), position.getFloorZ(), data, physics); } default void setBlockState(Vector3Int position, BlockState data, boolean physics) { 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 6d94d7edb..eedaaa491 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 @@ -7,17 +7,16 @@ package com.dfsek.terra.api.world.biome.generation; -import com.dfsek.terra.api.Platform; - +import com.dfsek.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3Int; import org.jetbrains.annotations.Contract; import java.util.Optional; import java.util.stream.Stream; import java.util.stream.StreamSupport; +import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.util.Column; -import com.dfsek.terra.api.util.vector.Vector3; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.info.WorldProperties; @@ -49,7 +48,7 @@ public interface BiomeProvider { */ @Contract(pure = true) default Biome getBiome(Vector3 vector3, long seed) { - return getBiome(vector3.getBlockX(), vector3.getBlockY(), vector3.getBlockZ(), seed); + return getBiome(vector3.getFloorX(), vector3.getFloorY(), vector3.getFloorZ(), seed); } /** diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java index 3e42ff1d1..c11775fab 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java @@ -1,11 +1,5 @@ package com.dfsek.terra.api.world.biome.generation; -import com.dfsek.terra.api.util.cache.SeededVector2Key; -import com.dfsek.terra.api.util.cache.SeededVector3Key; -import com.dfsek.terra.api.util.generic.pair.Pair; - -import com.dfsek.terra.api.util.generic.pair.Pair.Mutable; - import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; import com.github.benmanes.caffeine.cache.Scheduler; @@ -13,6 +7,10 @@ import com.github.benmanes.caffeine.cache.Scheduler; import java.util.Optional; import com.dfsek.terra.api.Handle; +import com.dfsek.terra.api.util.cache.SeededVector2Key; +import com.dfsek.terra.api.util.cache.SeededVector3Key; +import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.pair.Pair.Mutable; import com.dfsek.terra.api.world.biome.Biome; import static com.dfsek.terra.api.util.cache.CacheUtils.CACHE_EXECUTOR; @@ -56,7 +54,6 @@ public class CachingBiomeProvider implements BiomeProvider, Handle { }); - } private Optional sampleBiome(SeededVector2Key vec) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ChunkGenerator.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ChunkGenerator.java index e7be3e525..b86ffd5fe 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ChunkGenerator.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ChunkGenerator.java @@ -7,11 +7,11 @@ package com.dfsek.terra.api.world.chunk.generation; +import com.dfsek.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3Int; import org.jetbrains.annotations.NotNull; import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.util.vector.Vector3; -import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.util.Palette; import com.dfsek.terra.api.world.info.WorldProperties; @@ -24,7 +24,7 @@ public interface ChunkGenerator { BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProvider biomeProvider); default BlockState getBlock(WorldProperties world, Vector3 vector3, BiomeProvider biomeProvider) { - return getBlock(world, vector3.getBlockX(), vector3.getBlockY(), vector3.getBlockZ(), biomeProvider); + return getBlock(world, vector3.getFloorX(), vector3.getFloorY(), vector3.getFloorZ(), biomeProvider); } default BlockState getBlock(WorldProperties world, Vector3Int vector3, BiomeProvider biomeProvider) { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java index 4f26728ab..aae1bc3ad 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java @@ -53,6 +53,7 @@ import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.bootstrap.BootstrapAddonClassLoader; import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.config.MetaPack; import com.dfsek.terra.api.config.PluginConfig; import com.dfsek.terra.api.event.EventManager; import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; @@ -74,6 +75,8 @@ import com.dfsek.terra.registry.CheckedRegistryImpl; import com.dfsek.terra.registry.LockedRegistryImpl; import com.dfsek.terra.registry.OpenRegistryImpl; import com.dfsek.terra.registry.master.ConfigRegistry; +import com.dfsek.terra.registry.master.ConfigRegistry.PackLoadFailuresException; +import com.dfsek.terra.registry.master.MetaConfigRegistry; /** @@ -85,25 +88,65 @@ public abstract class AbstractPlatform implements Platform { private static final Logger logger = LoggerFactory.getLogger(AbstractPlatform.class); private static final MutableBoolean LOADED = new MutableBoolean(false); + private static final String moonrise = "Moonrise"; private final EventManager eventManager = new EventManagerImpl(); private final ConfigRegistry configRegistry = new ConfigRegistry(); - + private final MetaConfigRegistry metaConfigRegistry = new MetaConfigRegistry(); private final CheckedRegistry checkedConfigRegistry = new CheckedRegistryImpl<>(configRegistry); - + private final CheckedRegistry checkedMetaConfigRegistry = new CheckedRegistryImpl<>(metaConfigRegistry); private final Profiler profiler = new ProfilerImpl(); - private final GenericLoaders loaders = new GenericLoaders(this); - private final PluginConfigImpl config = new PluginConfigImpl(); - private final CheckedRegistry addonRegistry = new CheckedRegistryImpl<>(new OpenRegistryImpl<>(TypeKey.of(BaseAddon.class))); - private final Registry lockedAddonRegistry = new LockedRegistryImpl<>(addonRegistry); + public static int getGenerationThreadsWithReflection(String className, String fieldName, String project) { + try { + Class aClass = Class.forName(className); + int threads = aClass.getField(fieldName).getInt(null); + logger.info("{} found, setting {} generation threads.", project, threads); + return threads; + } catch(ClassNotFoundException e) { + logger.info("{} not found.", project); + } catch(NoSuchFieldException e) { + logger.warn("{} found, but {} field not found this probably means {0} has changed its code and " + + "Terra has not updated to reflect that.", project, fieldName); + } catch(IllegalAccessException e) { + logger.error("Failed to access {} field in {}, assuming 1 generation thread.", fieldName, project, e); + } + return 0; + + } + + public static int getMoonriseGenerationThreadsWithReflection() { + try { + Class prioritisedThreadPoolClazz = Class.forName("ca.spottedleaf.concurrentutil.executor.thread.PrioritisedThreadPool"); + Method getCoreThreadsMethod = prioritisedThreadPoolClazz.getDeclaredMethod("getCoreThreads"); + getCoreThreadsMethod.setAccessible(true); + Class moonriseCommonClazz = Class.forName("ca.spottedleaf.moonrise.common.util.MoonriseCommon"); + Object pool = moonriseCommonClazz.getDeclaredField("WORKER_POOL").get(null); + int threads = ((Thread[]) getCoreThreadsMethod.invoke(pool)).length; + logger.info("{} found, setting {} generation threads.", moonrise, threads); + return threads; + } catch(ClassNotFoundException e) { + logger.info("{} not found.", moonrise); + } catch(NoSuchMethodException | NoSuchFieldException e) { + logger.warn("{} found, but field/method not found this probably means {0} has changed its code and " + + "Terra has not updated to reflect that.", moonrise); + } catch(IllegalAccessException | InvocationTargetException e) { + logger.error("Failed to access thread values in {}, assuming 1 generation thread.", moonrise, e); + } + return 0; + } + public ConfigRegistry getRawConfigRegistry() { return configRegistry; } + public MetaConfigRegistry getRawMetaConfigRegistry() { + return metaConfigRegistry; + } + protected Iterable platformAddon() { return Collections.emptySet(); } @@ -135,11 +178,8 @@ public abstract class AbstractPlatform implements Platform { config.load(this); // load config.yml - if(config.dumpDefaultConfig()) { - dumpResources(); - } else { - logger.info("Skipping resource dumping."); - } + + dumpResources(config.getIgnoredResources()); if(config.isDebugProfiler()) { // if debug.profiler is enabled, start profiling profiler.start(); @@ -149,11 +189,12 @@ public abstract class AbstractPlatform implements Platform { eventManager.getHandler(FunctionalEventHandler.class) .register(internalAddon, PlatformInitializationEvent.class) - .then(event -> { - logger.info("Loading config packs..."); - configRegistry.loadAll(this); - logger.info("Loaded packs."); - }) + .then(event -> loadConfigPacks()) + .global(); + + eventManager.getHandler(FunctionalEventHandler.class) + .register(internalAddon, PlatformInitializationEvent.class) + .then(event -> loadMetaConfigPacks()) .global(); @@ -163,6 +204,38 @@ public abstract class AbstractPlatform implements Platform { return internalAddon; } + protected boolean loadConfigPacks() { + logger.info("Loading config packs..."); + ConfigRegistry configRegistry = getRawConfigRegistry(); + configRegistry.clear(); + try { + configRegistry.loadAll(this); + } catch(IOException e) { + logger.error("Failed to load config packs", e); + return false; + } catch(PackLoadFailuresException e) { + e.getExceptions().forEach(ex -> logger.error("Failed to load config pack", ex)); + return false; + } + return true; + } + + protected boolean loadMetaConfigPacks() { + logger.info("Loading meta config packs..."); + MetaConfigRegistry metaConfigRegistry = getRawMetaConfigRegistry(); + metaConfigRegistry.clear(); + try { + metaConfigRegistry.loadAll(this, configRegistry); + } catch(IOException e) { + logger.error("Failed to load meta config packs", e); + return false; + } catch(PackLoadFailuresException e) { + e.getExceptions().forEach(ex -> logger.error("Failed to meta load config pack", ex)); + return false; + } + return true; + } + protected InternalAddon loadAddons() { List addonList = new ArrayList<>(); @@ -220,7 +293,7 @@ public abstract class AbstractPlatform implements Platform { return internalAddon; } - protected void dumpResources() { + protected void dumpResources(List ignoredResources) { try(InputStream resourcesConfig = getClass().getResourceAsStream("/resources.yml")) { if(resourcesConfig == null) { logger.info("No resources config found. Skipping resource dumping."); @@ -262,51 +335,55 @@ public abstract class AbstractPlatform implements Platform { Map> resources = new Yaml().load(resourceYaml); resources.forEach((dir, entries) -> entries.forEach(entry -> { String resourceClassPath = dir + "/" + entry; - String resourcePath = resourceClassPath.replace('/', File.separatorChar); - File resource = new File(getDataFolder(), resourcePath); - if(resource.exists()) - return; // dont overwrite + if(ignoredResources.contains(dir) || ignoredResources.contains(entry) || ignoredResources.contains(resourceClassPath)) { + logger.info("Not dumping resource {} because it is ignored.", resourceClassPath); + } else { + String resourcePath = resourceClassPath.replace('/', File.separatorChar); + File resource = new File(getDataFolder(), resourcePath); + if(resource.exists()) + return; // dont overwrite - try(InputStream is = getClass().getResourceAsStream("/" + resourceClassPath)) { - if(is == null) { - logger.error("Resource {} doesn't exist on the classpath!", resourcePath); - return; + try(InputStream is = getClass().getResourceAsStream("/" + resourceClassPath)) { + if(is == null) { + logger.error("Resource {} doesn't exist on the classpath!", resourcePath); + return; + } + + paths + .stream() + .filter(Pair.testRight(resourcePath::startsWith)) + .forEach(Pair.consumeLeft(path -> { + logger.info("Removing outdated resource {}, replacing with {}", path, resourcePath); + try { + Files.delete(path); + } catch(IOException e) { + throw new UncheckedIOException(e); + } + })); + + if(pathsNoMajor + .stream() + .anyMatch(resourcePath::startsWith) && // if any share name + paths + .stream() + .map(Pair.unwrapRight()) + .noneMatch(resourcePath::startsWith)) { // but dont share major version + logger.warn( + "Addon {} has a new major version available. It will not be automatically updated; you will need to " + + "ensure " + + "compatibility and update manually.", + resourcePath); + } + + logger.info("Dumping resource {}.", resource.getAbsolutePath()); + resource.getParentFile().mkdirs(); + resource.createNewFile(); + try(OutputStream os = new FileOutputStream(resource)) { + IOUtils.copy(is, os); + } + } catch(IOException e) { + throw new UncheckedIOException(e); } - - paths - .stream() - .filter(Pair.testRight(resourcePath::startsWith)) - .forEach(Pair.consumeLeft(path -> { - logger.info("Removing outdated resource {}, replacing with {}", path, resourcePath); - try { - Files.delete(path); - } catch(IOException e) { - throw new UncheckedIOException(e); - } - })); - - if(pathsNoMajor - .stream() - .anyMatch(resourcePath::startsWith) && // if any share name - paths - .stream() - .map(Pair.unwrapRight()) - .noneMatch(resourcePath::startsWith)) { // but dont share major version - logger.warn( - "Addon {} has a new major version available. It will not be automatically updated; you will need to " + - "ensure " + - "compatibility and update manually.", - resourcePath); - } - - logger.info("Dumping resource {}...", resource.getAbsolutePath()); - resource.getParentFile().mkdirs(); - resource.createNewFile(); - try(OutputStream os = new FileOutputStream(resource)) { - IOUtils.copy(is, os); - } - } catch(IOException e) { - throw new UncheckedIOException(e); } })); } catch(IOException e) { @@ -314,46 +391,6 @@ public abstract class AbstractPlatform implements Platform { } } - public static int getGenerationThreadsWithReflection(String className, String fieldName, String project) { - try { - Class aClass = Class.forName(className); - int threads = aClass.getField(fieldName).getInt(null); - logger.info("{} found, setting {} generation threads.", project, threads); - return threads; - } catch(ClassNotFoundException e) { - logger.info("{} not found.", project); - } catch(NoSuchFieldException e) { - logger.warn("{} found, but {} field not found this probably means {0} has changed its code and " + - "Terra has not updated to reflect that.", project, fieldName); - } catch(IllegalAccessException e) { - logger.error("Failed to access {} field in {}, assuming 1 generation thread.", fieldName, project, e); - } - return 0; - - } - - private static final String moonrise = "Moonrise"; - public static int getMoonriseGenerationThreadsWithReflection() { - try { - Class prioritisedThreadPoolClazz = Class.forName("ca.spottedleaf.concurrentutil.executor.thread.PrioritisedThreadPool"); - Method getCoreThreadsMethod = prioritisedThreadPoolClazz.getDeclaredMethod("getCoreThreads"); - getCoreThreadsMethod.setAccessible(true); - Class moonriseCommonClazz = Class.forName("ca.spottedleaf.moonrise.common.util.MoonriseCommon"); - Object pool = moonriseCommonClazz.getDeclaredField("WORKER_POOL").get(null); - int threads = ((Thread[]) getCoreThreadsMethod.invoke(pool)).length; - logger.info("{} found, setting {} generation threads.", moonrise, threads); - return threads; - } catch (ClassNotFoundException e) { - logger.info("{} not found.", moonrise); - } catch (NoSuchMethodException | NoSuchFieldException e) { - logger.warn("{} found, but field/method not found this probably means {0} has changed its code and " + - "Terra has not updated to reflect that.", moonrise); - } catch (IllegalAccessException | InvocationTargetException e) { - logger.error("Failed to access thread values in {}, assuming 1 generation thread.", moonrise, e); - } - return 0; - } - @Override public void register(TypeRegistry registry) { loaders.register(registry); @@ -369,6 +406,12 @@ public abstract class AbstractPlatform implements Platform { return checkedConfigRegistry; } + @Override + public @NotNull CheckedRegistry getMetaConfigRegistry() { + return checkedMetaConfigRegistry; + } + + @Override public @NotNull Registry getAddons() { return lockedAddonRegistry; diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java index 25ddf62ec..bdb243e71 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -29,9 +29,9 @@ import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.tectonic.LoaderRegistrar; -import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.MaterialSet; import com.dfsek.terra.api.util.collection.ProbabilityCollection; +import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.config.loaders.ExpressionParserOptionsTemplate; import com.dfsek.terra.config.loaders.LinkedHashMapLoader; import com.dfsek.terra.config.loaders.MaterialSetLoader; diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java index d22c2945f..b63b09eef 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java @@ -30,6 +30,8 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.UncheckedIOException; +import java.util.Collections; +import java.util.List; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.config.PluginConfig; @@ -71,9 +73,9 @@ public class PluginConfigImpl implements ConfigTemplate, PluginConfig { @Default private int providerCache = 32; - @Value("dump-default") + @Value("ignored-resources") @Default - private boolean dumpDefaultData = true; + private List ignoredResources = Collections.emptyList(); @Value("script.max-recursion") @Default @@ -99,11 +101,6 @@ public class PluginConfigImpl implements ConfigTemplate, PluginConfig { logger.info("Debug logging enabled."); } - @Override - public boolean dumpDefaultConfig() { - return dumpDefaultData; - } - @Override public boolean isDebugCommands() { return debugCommands; @@ -139,6 +136,11 @@ public class PluginConfigImpl implements ConfigTemplate, PluginConfig { return samplerCache; } + @Override + public List getIgnoredResources() { + return ignoredResources; + } + @Override public int getMaxRecursion() { return maxRecursion; diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/fileloaders/FolderLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/fileloaders/FolderLoader.java deleted file mode 100644 index fb236f6d7..000000000 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/fileloaders/FolderLoader.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is part of Terra. - * - * Terra is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Terra is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Terra. If not, see . - */ - -package com.dfsek.terra.config.fileloaders; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.stream.Stream; - - -/** - * Load all {@code *.yml} files from a {@link java.nio.file.Path}. - */ -public class FolderLoader extends LoaderImpl { - private static final Logger logger = LoggerFactory.getLogger(FolderLoader.class); - - private final Path path; - - public FolderLoader(Path path) { - this.path = path; - } - - @Override - public InputStream get(String singleFile) throws IOException { - return new FileInputStream(new File(path.toFile(), singleFile)); - } - - protected void load(String directory, String extension) { - File newPath = new File(path.toFile(), directory); - newPath.mkdirs(); - try(Stream paths = Files.walk(newPath.toPath())) { - paths.filter(Files::isRegularFile).filter(file -> file.toString().toLowerCase().endsWith(extension)).forEach(file -> { - try { - String rel = newPath.toPath().relativize(file).toString(); - streams.put(rel, new FileInputStream(file.toFile())); - } catch(FileNotFoundException e) { - logger.error("Could not find file to load", e); - } - }); - } catch(IOException e) { - logger.error("Error while loading files", e); - } - } -} diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/fileloaders/LoaderImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/fileloaders/LoaderImpl.java deleted file mode 100644 index b1cfe97c6..000000000 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/fileloaders/LoaderImpl.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * This file is part of Terra. - * - * Terra is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Terra is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Terra. If not, see . - */ - -package com.dfsek.terra.config.fileloaders; - -import com.dfsek.tectonic.api.exception.ConfigException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Consumer; - -import com.dfsek.terra.api.config.Loader; - - -public abstract class LoaderImpl implements Loader { - private static final Logger logger = LoggerFactory.getLogger(LoaderImpl.class); - - protected final Map streams = new HashMap<>(); - - @Override - public Loader thenNames(Consumer> consumer) throws ConfigException { - consumer.accept(new ArrayList<>(streams.keySet())); - return this; - } - - @Override - public Loader thenEntries(Consumer>> consumer) throws ConfigException { - consumer.accept(streams.entrySet()); - return this; - } - - /** - * Open a subdirectory. - * - * @param directory Directory to open - * @param extension File extension - */ - @Override - public LoaderImpl open(String directory, String extension) { - if(!streams.isEmpty()) throw new IllegalStateException("Attempted to load new directory before closing existing InputStreams"); - load(directory, extension); - return this; - } - - /** - * Close all InputStreams opened. - */ - @Override - public Loader close() { - streams.forEach((name, input) -> { - try { - input.close(); - } catch(IOException e) { - logger.error("Error occurred while loading", e); - } - }); - streams.clear(); - return this; - } - - protected abstract void load(String directory, String extension); -} diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java deleted file mode 100644 index 9bcd5962c..000000000 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This file is part of Terra. - * - * Terra is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Terra is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Terra. If not, see . - */ - -package com.dfsek.terra.config.fileloaders; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Enumeration; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - - -public class ZIPLoader extends LoaderImpl { - private static final Logger logger = LoggerFactory.getLogger(ZIPLoader.class); - - private final ZipFile file; - - public ZIPLoader(ZipFile file) { - this.file = file; - } - - @Override - public InputStream get(String singleFile) throws IOException { - Enumeration entries = file.entries(); - while(entries.hasMoreElements()) { - ZipEntry entry = entries.nextElement(); - if(!entry.isDirectory() && entry.getName().equals(singleFile)) return file.getInputStream(entry); - } - throw new IllegalArgumentException("No such file: " + singleFile); - } - - protected void load(String directory, String extension) { - Enumeration entries = file.entries(); - while(entries.hasMoreElements()) { - ZipEntry entry = entries.nextElement(); - if(!entry.isDirectory() && entry.getName().startsWith(directory) && entry.getName().endsWith(extension)) { - try { - String rel = entry.getName().substring(directory.length()); - streams.put(rel, file.getInputStream(entry)); - } catch(IOException e) { - logger.error("Error while loading file from zip", e); - } - } - } - } -} diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/ExpressionParserOptionsTemplate.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/ExpressionParserOptionsTemplate.java index caa74e402..0f81383e3 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/ExpressionParserOptionsTemplate.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/ExpressionParserOptionsTemplate.java @@ -13,7 +13,7 @@ public class ExpressionParserOptionsTemplate implements ObjectTemplate map = (Map) o; - if (map.size() == 1) { + if(map.size() == 1) { Object onlyKey = map.keySet().iterator().next(); return new ProbabilityCollection.Singleton<>(configLoader.loadType(generic, onlyKey, depthTracker)); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java index 77ce3af2a..33e27fd6f 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java @@ -30,8 +30,8 @@ import java.lang.reflect.AnnotatedType; import java.util.Map; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.ConstantRange; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.ConstantRange; +import com.dfsek.terra.api.util.range.Range; public class RangeLoader implements TypeLoader { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java index 078e62e87..eb7087884 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java @@ -27,10 +27,10 @@ import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; import java.lang.reflect.AnnotatedType; +import java.nio.file.Files; import java.util.concurrent.ConcurrentHashMap; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.config.Loader; import com.dfsek.terra.api.properties.Properties; @@ -39,12 +39,10 @@ import com.dfsek.terra.api.properties.Properties; */ @Deprecated public class BufferedImageLoader implements TypeLoader { - private final Loader files; private final ConfigPack pack; - public BufferedImageLoader(Loader files, ConfigPack pack) { - this.files = files; + public BufferedImageLoader(ConfigPack pack) { this.pack = pack; if(!pack.getContext().has(ImageCache.class)) pack.getContext().put(new ImageCache(new ConcurrentHashMap<>())); @@ -55,7 +53,7 @@ public class BufferedImageLoader implements TypeLoader { throws LoadException { return pack.getContext().get(ImageCache.class).map.computeIfAbsent((String) c, s -> { try { - return ImageIO.read(files.get(s)); + return ImageIO.read(Files.newInputStream(pack.getRootPath().resolve(s))); } catch(IOException e) { throw new LoadException("Unable to load image", e, depthTracker); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java index 8aa12c790..c4cc03417 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java @@ -34,15 +34,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; -import java.io.UncheckedIOException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; -import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -52,15 +52,12 @@ import java.util.Set; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; 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.config.Loader; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.event.events.config.ConfigurationDiscoveryEvent; import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; @@ -73,15 +70,12 @@ import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.key.RegistryKey; import com.dfsek.terra.api.tectonic.ShortcutLoader; -import com.dfsek.terra.api.util.generic.Construct; import com.dfsek.terra.api.util.generic.pair.Pair; import com.dfsek.terra.api.util.reflection.ReflectionUtil; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider; -import com.dfsek.terra.config.fileloaders.FolderLoader; -import com.dfsek.terra.config.fileloaders.ZIPLoader; import com.dfsek.terra.config.loaders.GenericTemplateSupplierLoader; import com.dfsek.terra.config.loaders.config.BufferedImageLoader; import com.dfsek.terra.config.preprocessor.MetaListLikePreprocessor; @@ -108,7 +102,7 @@ public class ConfigPackImpl implements ConfigPack { private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); private final ConfigLoader selfLoader = new ConfigLoader(); private final Platform platform; - private final Loader loader; + private final Path rootPath; private final Map addons; @@ -124,40 +118,29 @@ public class ConfigPackImpl implements ConfigPack { private final ParseOptions parseOptions; - public ConfigPackImpl(File folder, Platform platform) { - this(new FolderLoader(folder.toPath()), Construct.construct(() -> { - try { - return new YamlConfiguration(new FileInputStream(new File(folder, "pack.yml")), "pack.yml"); - } catch(FileNotFoundException e) { - throw new UncheckedIOException("No pack.yml file found in " + folder.getAbsolutePath(), e); - } - }), platform); - } - - public ConfigPackImpl(ZipFile file, Platform platform) { - this(new ZIPLoader(file), Construct.construct(() -> { - ZipEntry pack = null; - Enumeration entries = file.entries(); - while(entries.hasMoreElements()) { - ZipEntry entry = entries.nextElement(); - if(entry.getName().equals("pack.yml")) pack = entry; - } - - if(pack == null) throw new IllegalArgumentException("No pack.yml file found in " + file.getName()); - - try { - return new YamlConfiguration(file.getInputStream(pack), "pack.yml"); - } catch(IOException e) { - throw new UncheckedIOException("Unable to load pack.yml from ZIP file", e); - } - }), platform); - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - private ConfigPackImpl(Loader loader, Configuration packManifest, Platform platform) { + @SuppressWarnings({ "rawtypes" }) + public ConfigPackImpl(Path path, Platform platform) throws IOException { long start = System.nanoTime(); - this.loader = loader; + if(Files.notExists(path)) throw new FileNotFoundException("Could not load config pack, " + path + " does not exist"); + + if(Files.isDirectory(path)) { + this.rootPath = path; + } else if(Files.isRegularFile(path)) { + if(!path.getFileName().toString().endsWith(".zip")) { + throw new IOException("Could not load config pack, file " + path + " is not a zip"); + } + FileSystem zipfs = FileSystems.newFileSystem(path); + this.rootPath = zipfs.getPath("/"); + } else { + throw new IOException("Could not load config pack from " + path); + } + + Path packManifestPath = rootPath.resolve("pack.yml"); + if(Files.notExists(packManifestPath)) throw new IOException("No pack.yml found in " + path); + Configuration packManifest = new YamlConfiguration(Files.newInputStream(packManifestPath), + packManifestPath.getFileName().toString()); + this.platform = platform; this.configTypeRegistry = createConfigRegistry(); @@ -246,7 +229,7 @@ public class ConfigPackImpl implements ConfigPack { private Map discoverConfigurations() { Map configurations = new HashMap<>(); - platform.getEventManager().callEvent(new ConfigurationDiscoveryEvent(this, loader, + platform.getEventManager().callEvent(new ConfigurationDiscoveryEvent(this, (s, c) -> configurations.put(s.replace("\\", "/"), c))); // Create all the configs. return configurations; @@ -291,7 +274,7 @@ public class ConfigPackImpl implements ConfigPack { @Override public void register(TypeRegistry registry) { registry.registerLoader(ConfigType.class, configTypeRegistry) - .registerLoader(BufferedImage.class, new BufferedImageLoader(loader, this)); + .registerLoader(BufferedImage.class, new BufferedImageLoader(this)); registryMap.forEach(registry::registerLoader); shortcuts.forEach(registry::registerLoader); // overwrite with delegated shortcuts if present } @@ -317,7 +300,6 @@ public class ConfigPackImpl implements ConfigPack { return seededBiomeProvider; } - @SuppressWarnings("unchecked") @Override public CheckedRegistry getOrCreateRegistry(TypeKey typeKey) { return (CheckedRegistry) registryMap.computeIfAbsent(typeKey.getType(), c -> { @@ -356,8 +338,8 @@ public class ConfigPackImpl implements ConfigPack { } @Override - public Loader getLoader() { - return loader; + public Path getRootPath() { + return rootPath; } @Override @@ -375,7 +357,7 @@ public class ConfigPackImpl implements ConfigPack { return parseOptions; } - @SuppressWarnings("unchecked,rawtypes") + @SuppressWarnings("rawtypes") @Override public ConfigPack registerShortcut(TypeKey clazz, String shortcut, ShortcutLoader loader) { ShortcutHolder holder = shortcuts @@ -419,12 +401,10 @@ public class ConfigPackImpl implements ConfigPack { } @Override - @SuppressWarnings("unchecked") public CheckedRegistry getRegistry(Type type) { return (CheckedRegistry) registryMap.get(type); } - @SuppressWarnings("unchecked") @Override public CheckedRegistry getCheckedRegistry(Type type) throws IllegalStateException { return (CheckedRegistry) registryMap.get(type); diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java new file mode 100644 index 000000000..8ae68c8e8 --- /dev/null +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java @@ -0,0 +1,215 @@ +package com.dfsek.terra.config.pack; + +import ca.solostudios.strata.version.Version; +import com.dfsek.tectonic.api.TypeRegistry; +import com.dfsek.tectonic.api.config.Configuration; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import com.dfsek.tectonic.api.loader.AbstractConfigLoader; +import com.dfsek.tectonic.api.loader.ConfigLoader; +import com.dfsek.tectonic.api.loader.type.TypeLoader; +import com.dfsek.tectonic.yaml.YamlConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.function.Supplier; +import java.util.regex.Pattern; + +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.config.MetaPack; +import com.dfsek.terra.api.properties.Context; +import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.OpenRegistry; +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.registry.key.RegistryKey; +import com.dfsek.terra.api.util.reflection.ReflectionUtil; +import com.dfsek.terra.api.util.reflection.TypeKey; +import com.dfsek.terra.config.loaders.GenericTemplateSupplierLoader; +import com.dfsek.terra.registry.CheckedRegistryImpl; +import com.dfsek.terra.registry.OpenRegistryImpl; +import com.dfsek.terra.registry.master.ConfigRegistry; + + +public class MetaPackImpl implements MetaPack { + + private static final Pattern PATTERN = Pattern.compile(", "); + private static final Logger logger = LoggerFactory.getLogger(MetaPackImpl.class); + private final MetaPackTemplate template = new MetaPackTemplate(); + private final Platform platform; + private final Path rootPath; + private final Map packs = new HashMap<>(); + private final ConfigLoader selfLoader = new ConfigLoader(); + private final Context context = new Context(); + private final RegistryKey key; + private final Map> registryMap = new HashMap<>(); + private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); + private final String author; + + public MetaPackImpl(Path path, Platform platform, ConfigRegistry configRegistry) throws IOException { + long start = System.nanoTime(); + + if(Files.notExists(path)) throw new FileNotFoundException("Could not load metapack, " + path + " does not exist"); + + if(Files.isDirectory(path)) { + this.rootPath = path; + } else if(Files.isRegularFile(path)) { + if(!path.getFileName().toString().endsWith(".zip")) { + throw new IOException("Could not load metapack, file " + path + " is not a zip"); + } + FileSystem zipfs = FileSystems.newFileSystem(path); + this.rootPath = zipfs.getPath("/"); + } else { + throw new IOException("Could not load metapack from " + path); + } + + Path packManifestPath = rootPath.resolve("metapack.yml"); + if(Files.notExists(packManifestPath)) throw new IOException("No metapack.yml found in " + path); + Configuration packManifest = new YamlConfiguration(Files.newInputStream(packManifestPath), + packManifestPath.getFileName().toString()); + + this.platform = platform; + + register(selfLoader); + platform.register(selfLoader); + + register(abstractConfigLoader); + platform.register(abstractConfigLoader); + + selfLoader.load(template, packManifest); + + String namespace; + String id; + if(template.getID().contains(":")) { + namespace = template.getID().substring(0, template.getID().indexOf(":")); + id = template.getID().substring(template.getID().indexOf(":") + 1); + } else { + id = template.getID(); + namespace = template.getID(); + } + + this.key = RegistryKey.of(namespace, id); + + logger.info("Loading metapack \"{}:{}\"", id, namespace); + + template.getPacks().forEach((k, v) -> { + RegistryKey registryKey = RegistryKey.parse(v); + if(configRegistry.contains(registryKey)) { + packs.put(k, configRegistry.get(registryKey).get()); + logger.info("Linked config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id); + } else { + logger.warn("Failed to link config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id); + } + }); + + HashSet authors = new HashSet<>(); + packs.forEach((k, v) -> { + authors.addAll(Arrays.asList(PATTERN.split(v.getAuthor()))); + }); + authors.addAll(Arrays.asList(PATTERN.split(template.getAuthor()))); + + this.author = String.join(", ", authors); + + logger.info("Loaded metapack \"{}:{}\" v{} by {} in {}ms.", + namespace, id, getVersion().getFormatted(), author, (System.nanoTime() - start) / 1000000.0D); + } + + + @Override + public String getAuthor() { + return author; + } + + @Override + public Version getVersion() { + return template.getVersion(); + } + + @Override + public Map packs() { + return packs; + } + + @Override + public Context getContext() { + return context; + } + + @Override + public RegistryKey getRegistryKey() { + return key; + } + + @Override + public CheckedRegistry getRegistry(Type type) { + return (CheckedRegistry) registryMap.get(type); + } + + @Override + public CheckedRegistry getCheckedRegistry(Type type) throws IllegalStateException { + return (CheckedRegistry) registryMap.get(type); + } + + @Override + public CheckedRegistry getOrCreateRegistry(TypeKey typeKey) { + return (CheckedRegistry) registryMap.computeIfAbsent(typeKey.getType(), c -> { + OpenRegistry registry = new OpenRegistryImpl<>(typeKey); + selfLoader.registerLoader(c, registry); + abstractConfigLoader.registerLoader(c, registry); + logger.debug("Registered loader for registry of class {}", ReflectionUtil.typeToString(c)); + + if(typeKey.getType() instanceof ParameterizedType param) { + Type base = param.getRawType(); + if(base instanceof Class // should always be true but we'll check anyways + && Supplier.class.isAssignableFrom((Class) base)) { // If it's a supplier + Type supplied = param.getActualTypeArguments()[0]; // Grab the supplied type + if(supplied instanceof ParameterizedType suppliedParam) { + Type suppliedBase = suppliedParam.getRawType(); + if(suppliedBase instanceof Class // should always be true but we'll check anyways + && ObjectTemplate.class.isAssignableFrom((Class) suppliedBase)) { + Type templateType = suppliedParam.getActualTypeArguments()[0]; + GenericTemplateSupplierLoader loader = new GenericTemplateSupplierLoader<>( + (Registry>>>>) registry); + selfLoader.registerLoader(templateType, loader); + abstractConfigLoader.registerLoader(templateType, loader); + logger.debug("Registered template loader for registry of class {}", ReflectionUtil.typeToString(templateType)); + } + } + } + } + + return new CheckedRegistryImpl<>(registry); + }); + } + + @Override + public MetaPackImpl applyLoader(Type type, TypeLoader loader) { + abstractConfigLoader.registerLoader(type, loader); + selfLoader.registerLoader(type, loader); + return this; + } + + @Override + public MetaPackImpl applyLoader(Type type, Supplier> loader) { + abstractConfigLoader.registerLoader(type, loader); + selfLoader.registerLoader(type, loader); + return this; + } + + @Override + public void register(TypeRegistry registry) { + registryMap.forEach(registry::registerLoader); + } + +} diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackTemplate.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackTemplate.java new file mode 100644 index 000000000..fdabc98ac --- /dev/null +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackTemplate.java @@ -0,0 +1,41 @@ +package com.dfsek.terra.config.pack; + +import ca.solostudios.strata.version.Version; +import com.dfsek.tectonic.api.config.template.ConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import java.util.Map; + + +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) +public class MetaPackTemplate implements ConfigTemplate { + @Value("id") + private String id; + + @Value("author") + @Default + private String author = "Anon Y. Mous"; + + @Value("version") + private Version version; + + @Value("packs") + private Map packs; + + public String getID() { + return id; + } + + public String getAuthor() { + return author; + } + + public Version getVersion() { + return version; + } + + public Map getPacks() { + return packs; + } +} diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaNumberPreprocessor.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaNumberPreprocessor.java index 6a7c94763..857689d18 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaNumberPreprocessor.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaNumberPreprocessor.java @@ -25,15 +25,14 @@ import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.ConfigLoader; import com.dfsek.tectonic.api.preprocessor.Result; - -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.reflection.TypeKey; - import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; import java.util.Map; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.util.reflection.TypeKey; + public class MetaNumberPreprocessor extends MetaPreprocessor { public static final TypeKey META_STRING_KEY = new TypeKey<@Meta String>() { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java index 2b592ba47..25e1ee279 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java @@ -17,14 +17,13 @@ package com.dfsek.terra.registry.master; -import com.dfsek.tectonic.api.exception.ConfigException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; import java.io.IOException; -import java.util.Objects; -import java.util.zip.ZipFile; +import java.io.Serial; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.config.ConfigPack; @@ -37,44 +36,42 @@ import com.dfsek.terra.registry.OpenRegistryImpl; * Class to hold config packs */ public class ConfigRegistry extends OpenRegistryImpl { - private static final Logger logger = LoggerFactory.getLogger(ConfigRegistry.class); public ConfigRegistry() { super(TypeKey.of(ConfigPack.class)); } - public void load(File folder, Platform platform) throws ConfigException { - ConfigPack pack = new ConfigPackImpl(folder, platform); - registerChecked(pack.getRegistryKey(), pack); + public void loadAll(Platform platform) throws IOException, PackLoadFailuresException { + Path packsDirectory = platform.getDataFolder().toPath().resolve("packs"); + Files.createDirectories(packsDirectory); + List failedLoads = new ArrayList<>(); + try(Stream packs = Files.list(packsDirectory)) { + packs.forEach(path -> { + try { + ConfigPack pack = new ConfigPackImpl(path, platform); + registerChecked(pack.getRegistryKey(), pack); + } catch(IOException | RuntimeException e) { + failedLoads.add(e); + } + }); + } + if(!failedLoads.isEmpty()) { + throw new PackLoadFailuresException(failedLoads); + } } - public boolean loadAll(Platform platform) { - boolean valid = true; - File packsFolder = new File(platform.getDataFolder(), "packs"); - packsFolder.mkdirs(); - for(File dir : Objects.requireNonNull(packsFolder.listFiles(File::isDirectory))) { - try { - load(dir, platform); - } catch(RuntimeException e) { - logger.error("Error loading config pack {}", dir.getName(), e); - valid = false; - } - } - for(File zip : Objects.requireNonNull( - packsFolder.listFiles(file -> file.getName().endsWith(".zip") || file.getName().endsWith(".terra")))) { - try { - logger.info("Loading ZIP archive: {}", zip.getName()); - load(new ZipFile(zip), platform); - } catch(IOException | RuntimeException e) { - logger.error("Error loading config pack {}", zip.getName(), e); - valid = false; - } - } - return valid; - } + public static class PackLoadFailuresException extends Exception { + @Serial + private static final long serialVersionUID = 538998844645186306L; - public void load(ZipFile file, Platform platform) throws ConfigException { - ConfigPackImpl pack = new ConfigPackImpl(file, platform); - registerChecked(pack.getRegistryKey(), pack); + private final List exceptions; + + public PackLoadFailuresException(List exceptions) { + this.exceptions = (List) exceptions; + } + + public List getExceptions() { + return exceptions; + } } } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/MetaConfigRegistry.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/MetaConfigRegistry.java new file mode 100644 index 000000000..05539475e --- /dev/null +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/MetaConfigRegistry.java @@ -0,0 +1,62 @@ +/* + * This file is part of Terra. + * + * Terra is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Terra is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Terra. If not, see . + */ + +package com.dfsek.terra.registry.master; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.config.MetaPack; +import com.dfsek.terra.api.util.reflection.TypeKey; +import com.dfsek.terra.config.pack.MetaPackImpl; +import com.dfsek.terra.registry.OpenRegistryImpl; +import com.dfsek.terra.registry.master.ConfigRegistry.PackLoadFailuresException; + + +/** + * Class to hold config packs + */ +public class MetaConfigRegistry extends OpenRegistryImpl { + + public MetaConfigRegistry() { + super(TypeKey.of(MetaPack.class)); + } + + public void loadAll(Platform platform, ConfigRegistry configRegistry) throws IOException, PackLoadFailuresException { + Path packsDirectory = platform.getDataFolder().toPath().resolve("metapacks"); + Files.createDirectories(packsDirectory); + List failedLoads = new ArrayList<>(); + try(Stream packs = Files.list(packsDirectory)) { + packs.forEach(path -> { + try { + MetaPack pack = new MetaPackImpl(path, platform, configRegistry); + registerChecked(pack.getRegistryKey(), pack); + } catch(IOException e) { + failedLoads.add(e); + } + }); + } + if(!failedLoads.isEmpty()) { + throw new PackLoadFailuresException(failedLoads); + } + } +} diff --git a/common/implementation/base/src/main/resources/config.yml b/common/implementation/base/src/main/resources/config.yml index 72dd67061..95c36755b 100644 --- a/common/implementation/base/src/main/resources/config.yml +++ b/common/implementation/base/src/main/resources/config.yml @@ -10,11 +10,14 @@ debug: log: false profiler: false script: false -dump-default: true biome-search-resolution: 4 cache: structure: 32 sampler: 128 biome-provider: 32 script: - max-recursion: 1000 \ No newline at end of file + max-recursion: 1000 +ignored-resources: +# - "addons" +# - "packs" +# - "metapacks" \ No newline at end of file diff --git a/platforms/allay/build.gradle.kts b/platforms/allay/build.gradle.kts.disabled similarity index 100% rename from platforms/allay/build.gradle.kts rename to platforms/allay/build.gradle.kts.disabled diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/AllayPlatform.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/AllayPlatform.java index c58cd02db..cd8353efc 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/AllayPlatform.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/AllayPlatform.java @@ -21,6 +21,7 @@ import com.dfsek.terra.api.handle.ItemHandle; import com.dfsek.terra.api.handle.WorldHandle; import com.dfsek.terra.api.world.biome.PlatformBiome; + /** * @author daoge_cmd */ @@ -38,8 +39,7 @@ public class AllayPlatform extends AbstractPlatform { @Override public boolean reload() { getTerraConfig().load(this); - getRawConfigRegistry().clear(); - boolean succeed = getRawConfigRegistry().loadAll(this); + boolean succeed = loadConfigPacks(); GENERATOR_WRAPPERS.forEach(wrapper -> { getConfigRegistry().get(wrapper.getConfigPack().getRegistryKey()).ifPresent(pack -> { @@ -51,6 +51,7 @@ public class AllayPlatform extends AbstractPlatform { ); }); }); + return succeed; } diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/JeBlockState.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/JeBlockState.java index 7b9f3055b..89495bb03 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/JeBlockState.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/JeBlockState.java @@ -14,20 +14,12 @@ public class JeBlockState { protected final TreeMap properties; protected int hash = Integer.MAX_VALUE; - public static JeBlockState fromString(String data) { - return new JeBlockState(data); - } - - public static JeBlockState create(String identifier, TreeMap properties) { - return new JeBlockState(identifier, properties); - } - private JeBlockState(String data) { String[] strings = data.replace("[", ",").replace("]", ",").replace(" ", "").split(","); this.identifier = strings[0]; this.properties = new TreeMap<>(); - if (strings.length > 1) { - for (int i = 1; i < strings.length; i++) { + if(strings.length > 1) { + for(int i = 1; i < strings.length; i++) { final String tmp = strings[i]; final int index = tmp.indexOf("="); properties.put(tmp.substring(0, index), tmp.substring(index + 1)); @@ -36,6 +28,19 @@ public class JeBlockState { completeMissingProperties(); } + private JeBlockState(String identifier, TreeMap properties) { + this.identifier = identifier; + this.properties = properties; + } + + public static JeBlockState fromString(String data) { + return new JeBlockState(data); + } + + public static JeBlockState create(String identifier, TreeMap properties) { + return new JeBlockState(identifier, properties); + } + public String getPropertyValue(String key) { return properties.get(key); } @@ -49,24 +54,19 @@ public class JeBlockState { entry -> properties.put(entry.getKey(), entry.getValue())); } - private JeBlockState(String identifier, TreeMap properties) { - this.identifier = identifier; - this.properties = properties; - } - public String toString(boolean includeProperties) { if(!includeProperties) return identifier; StringBuilder builder = new StringBuilder(identifier).append(";"); properties.forEach((k, v) -> builder.append(k).append("=").append(v).append(";")); String str = builder.toString(); - if (hash == Integer.MAX_VALUE) { + if(hash == Integer.MAX_VALUE) { hash = HashUtils.fnv1a_32(str.getBytes()); } return str; } public int getHash() { - if (hash == Integer.MAX_VALUE) { + if(hash == Integer.MAX_VALUE) { hash = HashUtils.fnv1a_32(toString(true).getBytes()); } return hash; diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/TerraAllayPlugin.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/TerraAllayPlugin.java index d6f5f1d14..d2e5a16a6 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/TerraAllayPlugin.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/TerraAllayPlugin.java @@ -70,6 +70,7 @@ public class TerraAllayPlugin extends Plugin { @EventHandler private void onWorldUnload(WorldUnloadEvent event) { - AllayPlatform.GENERATOR_WRAPPERS.removeIf(wrapper -> wrapper.getAllayWorldGenerator().getDimension().getWorld() == event.getWorld()); + AllayPlatform.GENERATOR_WRAPPERS.removeIf( + wrapper -> wrapper.getAllayWorldGenerator().getDimension().getWorld() == event.getWorld()); } } diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBiome.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBiome.java index d9607fcb7..84be41ce5 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBiome.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBiome.java @@ -4,6 +4,7 @@ import org.allaymc.api.world.biome.BiomeType; import com.dfsek.terra.api.world.biome.PlatformBiome; + /** * @author daoge_cmd */ diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockState.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockState.java index be8988400..29f0c3825 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockState.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockState.java @@ -7,6 +7,7 @@ import com.dfsek.terra.allay.JeBlockState; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.properties.Property; + /** * @author daoge_cmd */ @@ -68,7 +69,7 @@ public final class AllayBlockState implements com.dfsek.terra.api.block.state.Bl public BlockState allayBlockState() { return allayBlockState; } - public boolean containsWater() { return containsWater; } + public boolean containsWater() { return containsWater; } public JeBlockState jeBlockState() { return jeBlockState; } } diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockType.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockType.java index 7dec2f8b1..1585be956 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockType.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockType.java @@ -6,6 +6,7 @@ import org.allaymc.api.block.type.BlockType; import com.dfsek.terra.allay.Mapping; import com.dfsek.terra.api.block.state.BlockState; + /** * @author daoge_cmd */ diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayChunk.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayChunk.java index b5821144c..0ffc1766b 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayChunk.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayChunk.java @@ -10,18 +10,20 @@ import com.dfsek.terra.allay.Mapping; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.world.ServerWorld; + /** * @author daoge_cmd */ public record AllayChunk(ServerWorld world, Chunk allayChunk) implements com.dfsek.terra.api.world.chunk.Chunk { - private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState(BlockPropertyTypes.LIQUID_DEPTH.createValue(0)); + private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState( + BlockPropertyTypes.LIQUID_DEPTH.createValue(0)); @Override public void setBlock(int x, int y, int z, BlockState data, boolean physics) { AllayBlockState allayBlockState = (AllayBlockState) data; allayChunk.setBlockState(x, y, z, allayBlockState.allayBlockState()); - if (allayBlockState.containsWater() || allayChunk.getBlockState(x, y, z).getBlockType().hasBlockTag(BlockTags.WATER)) { + if(allayBlockState.containsWater() || allayChunk.getBlockState(x, y, z).getBlockType().hasBlockTag(BlockTags.WATER)) { allayChunk.setBlockState(x, y, z, WATER, 1); } } diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayEnchantment.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayEnchantment.java index b41fa7b75..0bae9a9a1 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayEnchantment.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayEnchantment.java @@ -6,18 +6,19 @@ import com.dfsek.terra.allay.Mapping; import com.dfsek.terra.api.inventory.ItemStack; import com.dfsek.terra.api.inventory.item.Enchantment; + /** * @author daoge_cmd */ public record AllayEnchantment(EnchantmentType allayEnchantment) implements Enchantment { @Override public boolean canEnchantItem(ItemStack itemStack) { - return ((AllayItemStack)itemStack).allayItemStack().checkEnchantmentCompatibility(allayEnchantment); + return ((AllayItemStack) itemStack).allayItemStack().checkEnchantmentCompatibility(allayEnchantment); } @Override public boolean conflictsWith(Enchantment other) { - return ((AllayEnchantment)other).allayEnchantment.isIncompatibleWith(allayEnchantment); + return ((AllayEnchantment) other).allayEnchantment.isIncompatibleWith(allayEnchantment); } @Override diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayFakeEntity.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayFakeEntity.java index 912b4d00e..7ac5cc113 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayFakeEntity.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayFakeEntity.java @@ -1,9 +1,11 @@ package com.dfsek.terra.allay.delegate; +import com.dfsek.seismic.type.vector.Vector3; + import com.dfsek.terra.api.entity.Entity; -import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; + /** * NOTICE: Entity is not supported currently, and this is a fake implementation. * diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayItemMeta.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayItemMeta.java index 857f0af6d..38a2257c7 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayItemMeta.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayItemMeta.java @@ -10,6 +10,7 @@ import java.util.Map; import com.dfsek.terra.api.inventory.item.Enchantment; import com.dfsek.terra.api.inventory.item.ItemMeta; + /** * @author daoge_cmd */ @@ -23,7 +24,7 @@ public record AllayItemMeta(ItemStack allayItemStack) implements ItemMeta { @Override public Map getEnchantments() { Map results = new HashMap<>(); - for (EnchantmentInstance allayEnchantmentInstance : allayItemStack.getEnchantments()) { + for(EnchantmentInstance allayEnchantmentInstance : allayItemStack.getEnchantments()) { results.put(new AllayEnchantment(allayEnchantmentInstance.getType()), allayEnchantmentInstance.getLevel()); } return results; diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayItemStack.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayItemStack.java index bf7e59479..18df86224 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayItemStack.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayItemStack.java @@ -6,10 +6,11 @@ import org.allaymc.api.item.enchantment.EnchantmentInstance; import com.dfsek.terra.api.inventory.Item; import com.dfsek.terra.api.inventory.item.ItemMeta; + /** * @author daoge_cmd */ -public record AllayItemStack(ItemStack allayItemStack) implements com.dfsek.terra.api.inventory.ItemStack{ +public record AllayItemStack(ItemStack allayItemStack) implements com.dfsek.terra.api.inventory.ItemStack { @Override public int getAmount() { return allayItemStack.getCount(); @@ -34,7 +35,7 @@ public record AllayItemStack(ItemStack allayItemStack) implements com.dfsek.terr public void setItemMeta(ItemMeta meta) { ItemStack targetItem = ((AllayItemMeta) meta).allayItemStack(); allayItemStack.removeAllEnchantments(); - for (EnchantmentInstance enchantment : targetItem.getEnchantments()) { + for(EnchantmentInstance enchantment : targetItem.getEnchantments()) { allayItemStack.addEnchantment(enchantment.getType(), enchantment.getLevel()); } allayItemStack.setLore(targetItem.getLore()); diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayProtoChunk.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayProtoChunk.java index 73405dc65..517957678 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayProtoChunk.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayProtoChunk.java @@ -10,12 +10,14 @@ import com.dfsek.terra.allay.Mapping; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.world.chunk.generation.ProtoChunk; + /** * @author daoge_cmd */ public record AllayProtoChunk(UnsafeChunk allayChunk) implements ProtoChunk { - private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState(BlockPropertyTypes.LIQUID_DEPTH.createValue(0)); + private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState( + BlockPropertyTypes.LIQUID_DEPTH.createValue(0)); @Override public int getMaxHeight() { diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayProtoWorld.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayProtoWorld.java index 7596dafd8..de50c171e 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayProtoWorld.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayProtoWorld.java @@ -1,5 +1,6 @@ package com.dfsek.terra.allay.delegate; +import com.dfsek.seismic.type.vector.Vector3; import org.allaymc.api.block.property.type.BlockPropertyTypes; import org.allaymc.api.block.data.BlockTags; import org.allaymc.api.block.type.BlockTypes; @@ -11,18 +12,19 @@ import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.EntityType; -import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; import com.dfsek.terra.api.world.chunk.generation.ProtoWorld; + /** * @author daoge_cmd */ public record AllayProtoWorld(AllayServerWorld allayServerWorld, OtherChunkAccessibleContext context) implements ProtoWorld { - private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState(BlockPropertyTypes.LIQUID_DEPTH.createValue(0)); + private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState( + BlockPropertyTypes.LIQUID_DEPTH.createValue(0)); @Override public int centerChunkX() { diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayServerWorld.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayServerWorld.java index 7759920c1..70404a59f 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayServerWorld.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayServerWorld.java @@ -1,5 +1,6 @@ package com.dfsek.terra.allay.delegate; +import com.dfsek.seismic.type.vector.Vector3; import org.allaymc.api.world.Dimension; import com.dfsek.terra.allay.Mapping; @@ -9,12 +10,12 @@ import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.EntityType; -import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.Chunk; import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; + /** * @author daoge_cmd */ diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/generator/AllayGeneratorWrapper.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/generator/AllayGeneratorWrapper.java index fd40727c7..af27fee32 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/generator/AllayGeneratorWrapper.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/generator/AllayGeneratorWrapper.java @@ -24,6 +24,7 @@ import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; import com.dfsek.terra.api.world.chunk.generation.util.GeneratorWrapper; import com.dfsek.terra.api.world.info.WorldProperties; + /** * @author daoge_cmd */ @@ -86,6 +87,18 @@ public class AllayGeneratorWrapper implements GeneratorWrapper { .build(); } + protected static ConfigPack getConfigPack(String packName) { + Optional byId = TerraAllayPlugin.PLATFORM.getConfigRegistry().getByID(packName); + return byId.orElseGet( + () -> TerraAllayPlugin.PLATFORM.getConfigRegistry().getByID(packName.toUpperCase(Locale.ENGLISH)) + .orElseThrow(() -> new IllegalArgumentException("Cant find terra config pack named " + packName)) + ); + } + + protected static ChunkGenerator createGenerator(ConfigPack configPack) { + return configPack.getGeneratorProvider().newInstance(configPack); + } + @Override public ChunkGenerator getHandle() { return chunkGenerator; @@ -112,6 +125,7 @@ public class AllayGeneratorWrapper implements GeneratorWrapper { return this.allayWorldGenerator; } + protected class AllayNoiser implements Noiser { @Override @@ -140,6 +154,7 @@ public class AllayGeneratorWrapper implements GeneratorWrapper { } } + protected class AllayPopulator implements Populator { @Override @@ -155,16 +170,4 @@ public class AllayGeneratorWrapper implements GeneratorWrapper { return true; } } - - protected static ConfigPack getConfigPack(String packName) { - Optional byId = TerraAllayPlugin.PLATFORM.getConfigRegistry().getByID(packName); - return byId.orElseGet( - () -> TerraAllayPlugin.PLATFORM.getConfigRegistry().getByID(packName.toUpperCase(Locale.ENGLISH)) - .orElseThrow(() -> new IllegalArgumentException("Cant find terra config pack named " + packName)) - ); - } - - protected static ChunkGenerator createGenerator(ConfigPack configPack) { - return configPack.getGeneratorProvider().newInstance(configPack); - } } diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/handle/AllayWorldHandle.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/handle/AllayWorldHandle.java index 37e84425f..fd4d643bc 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/handle/AllayWorldHandle.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/handle/AllayWorldHandle.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.entity.EntityType; import com.dfsek.terra.api.handle.WorldHandle; + /** * @author daoge_cmd */ @@ -29,6 +30,7 @@ public class AllayWorldHandle implements WorldHandle { public @NotNull EntityType getEntity(@NotNull String id) { return new EntityType() { private final Object fakeEntityType = new Object(); + @Override public Object getHandle() { return fakeEntityType; diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 7abb48183..bfbae612f 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -8,7 +8,7 @@ dependencies { paperweight.paperDevBundle(Versions.Bukkit.paperDevBundle) shaded(project(":platforms:bukkit:common")) - shaded(project(":platforms:bukkit:nms:v1_21_8")) + shaded(project(":platforms:bukkit:nms:v1_21_9")) shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } @@ -27,7 +27,7 @@ tasks { } runServer { - minecraftVersion(Versions.Bukkit.minecraft) + minecraftVersion(Versions.Bukkit.runPaperMinecraft) dependsOn(shadowJar) pluginJars(shadowJar.get().archiveFile) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java deleted file mode 100644 index 3f7cfd696..000000000 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This file is part of Terra. - * - * Terra is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Terra is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Terra. If not, see . - */ - -package com.dfsek.terra.bukkit; - -import org.bukkit.ChatColor; - -import java.util.Optional; - -import com.dfsek.terra.api.command.CommandSender; -import com.dfsek.terra.api.entity.Entity; -import com.dfsek.terra.api.entity.Player; -import com.dfsek.terra.bukkit.world.BukkitAdapter; - - -public class BukkitCommandSender implements CommandSender { - private final org.bukkit.command.CommandSender delegate; - - public BukkitCommandSender(org.bukkit.command.CommandSender delegate) { - this.delegate = delegate; - } - - @Override - public void sendMessage(String message) { - delegate.sendMessage(ChatColor.translateAlternateColorCodes('&', message)); - } - - @Override - public Optional getEntity() { - if(delegate instanceof org.bukkit.entity.Entity entity) { - return Optional.of(BukkitAdapter.adapt(entity)); - } - return Optional.empty(); - } - - @Override - public Optional getPlayer() { - if(delegate instanceof org.bukkit.entity.Player player) { - return Optional.of(BukkitAdapter.adapt(player)); - } - return Optional.empty(); - } - - @Override - public org.bukkit.command.CommandSender getHandle() { - return delegate; - } -} diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java index 6df268180..7303e09fc 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java @@ -17,11 +17,11 @@ package com.dfsek.terra.bukkit; +import com.dfsek.seismic.type.vector.Vector3; import io.papermc.lib.PaperLib; import org.bukkit.Location; import com.dfsek.terra.api.entity.Entity; -import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.bukkit.world.BukkitAdapter; diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java index 5bccd678b..cdcd1efd7 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java @@ -17,11 +17,11 @@ package com.dfsek.terra.bukkit; +import com.dfsek.seismic.type.vector.Vector3; import io.papermc.lib.PaperLib; import org.bukkit.Location; import com.dfsek.terra.api.entity.Player; -import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.bukkit.world.BukkitAdapter; diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java new file mode 100644 index 000000000..0160180a9 --- /dev/null +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java @@ -0,0 +1,46 @@ +package com.dfsek.terra.bukkit; + +import io.papermc.paper.command.brigadier.CommandSourceStack; +import org.bukkit.ChatColor; + +import java.util.Optional; + +import com.dfsek.terra.api.command.CommandSender; +import com.dfsek.terra.api.entity.Entity; +import com.dfsek.terra.api.entity.Player; +import com.dfsek.terra.bukkit.world.BukkitAdapter; + + +public class CloudCommandSender implements CommandSender { + private final CommandSourceStack delegate; + + public CloudCommandSender(CommandSourceStack delegate) { + this.delegate = delegate; + } + + @Override + public void sendMessage(String message) { + delegate.getSender().sendMessage(ChatColor.translateAlternateColorCodes('&', message)); + } + + @Override + public Optional getEntity() { + if(delegate instanceof org.bukkit.entity.Entity entity) { + return Optional.of(BukkitAdapter.adapt(entity)); + } + return Optional.empty(); + } + + @Override + public Optional getPlayer() { + if(delegate instanceof org.bukkit.entity.Player player) { + return Optional.of(BukkitAdapter.adapt(player)); + } + return Optional.empty(); + } + + @Override + public CommandSourceStack getHandle() { + return delegate; + } +} diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java index 9fc0b3ee3..84efbc0cf 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java @@ -20,7 +20,6 @@ package com.dfsek.terra.bukkit; import com.dfsek.tectonic.api.TypeRegistry; import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; - import io.papermc.paper.registry.RegistryAccess; import io.papermc.paper.registry.RegistryKey; import org.bukkit.Bukkit; @@ -56,7 +55,7 @@ public class PlatformImpl extends AbstractPlatform { public PlatformImpl(TerraBukkitPlugin plugin) { generationThreads = getMoonriseGenerationThreadsWithReflection(); - if (generationThreads == 0) { + if(generationThreads == 0) { generationThreads = 1; } this.plugin = plugin; @@ -70,8 +69,7 @@ public class PlatformImpl extends AbstractPlatform { @Override public boolean reload() { getTerraConfig().load(this); - getRawConfigRegistry().clear(); - boolean succeed = getRawConfigRegistry().loadAll(this); + boolean succeed = loadConfigPacks(); Bukkit.getWorlds().forEach(world -> { if(world.getGenerator() instanceof BukkitChunkGeneratorWrapper wrapper) { diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 0a046651d..7caa71cda 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -23,10 +23,8 @@ import org.bukkit.Bukkit; import org.bukkit.generator.ChunkGenerator; import org.bukkit.plugin.java.JavaPlugin; import org.incendo.cloud.SenderMapper; -import org.incendo.cloud.brigadier.CloudBrigadierManager; -import org.incendo.cloud.bukkit.CloudBukkitCapabilities; import org.incendo.cloud.execution.ExecutionCoordinator; -import org.incendo.cloud.paper.LegacyPaperCommandManager; +import org.incendo.cloud.paper.PaperCommandManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @@ -50,10 +48,8 @@ import com.dfsek.terra.bukkit.world.BukkitAdapter; public class TerraBukkitPlugin extends JavaPlugin { private static final Logger logger = LoggerFactory.getLogger(TerraBukkitPlugin.class); - - private PlatformImpl platform; private final Map generatorMap = new HashMap<>(); - + private PlatformImpl platform; private AsyncScheduler asyncScheduler = this.getServer().getAsyncScheduler(); private GlobalRegionScheduler globalRegionScheduler = this.getServer().getGlobalRegionScheduler(); @@ -73,7 +69,7 @@ public class TerraBukkitPlugin extends JavaPlugin { platform.getEventManager().callEvent(new PlatformInitializationEvent()); try { - LegacyPaperCommandManager commandManager = getCommandSenderPaperCommandManager(); + PaperCommandManager commandManager = getCommandSenderPaperCommandManager(); platform.getEventManager().callEvent(new CommandRegistrationEvent(commandManager)); @@ -93,25 +89,15 @@ public class TerraBukkitPlugin extends JavaPlugin { } @NotNull - private LegacyPaperCommandManager getCommandSenderPaperCommandManager() throws Exception { - // TODO: Update to PaperCommandManager - LegacyPaperCommandManager commandManager = new LegacyPaperCommandManager<>( - this, - ExecutionCoordinator.simpleCoordinator(), - SenderMapper.create( + private PaperCommandManager getCommandSenderPaperCommandManager() throws Exception { + PaperCommandManager commandManager = PaperCommandManager.builder(SenderMapper.create( BukkitAdapter::adapt, BukkitAdapter::adapt - )); + )) + .executionCoordinator(ExecutionCoordinator.simpleCoordinator()) + .buildOnEnable(this); - if(commandManager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { - commandManager.registerBrigadier(); - final CloudBrigadierManager brigManager = commandManager.brigadierManager(); - if(brigManager != null) { - brigManager.setNativeNumberSuggestions(false); - } - } else if(commandManager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) { - commandManager.registerAsynchronousCompletions(); - } + commandManager.brigadierManager().setNativeNumberSuggestions(false); return commandManager; } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java index 35922cab5..0136d4389 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java @@ -40,13 +40,6 @@ public class BukkitWorldHandle implements WorldHandle { @Override public synchronized @NotNull BlockState createBlockState(@NotNull String data) { - if(data.equals("minecraft:grass")) { //TODO: remove in 7.0 - data = "minecraft:short_grass"; - logger.warn( - "Translating minecraft:grass to minecraft:short_grass. In 1.20.3 minecraft:grass was renamed to minecraft:short_grass" + - ". You are advised to perform this rename in your config backs as this translation will be removed in the next major " + - "version of Terra."); - } org.bukkit.block.data.BlockData bukkitData = Bukkit.createBlockData( data); // somehow bukkit managed to make this not thread safe! :) return BukkitBlockState.newInstance(bukkitData); diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/hooks/MultiverseGeneratorPluginHook.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/hooks/MultiverseGeneratorPluginHook.java index 1d59c967f..10be0f8ff 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/hooks/MultiverseGeneratorPluginHook.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/hooks/MultiverseGeneratorPluginHook.java @@ -1,8 +1,5 @@ package com.dfsek.terra.bukkit.hooks; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.registry.key.Keyed; - import org.mvplugins.multiverse.core.MultiverseCoreApi; import org.mvplugins.multiverse.core.world.generators.GeneratorPlugin; import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; @@ -10,6 +7,10 @@ import org.mvplugins.multiverse.external.jetbrains.annotations.Nullable; import java.util.Collection; +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.registry.key.Keyed; + + public final class MultiverseGeneratorPluginHook implements GeneratorPlugin { private final Platform platform; @@ -18,6 +19,11 @@ public final class MultiverseGeneratorPluginHook implements GeneratorPlugin { this.platform = platform; } + public static void register(Platform platform) { + MultiverseCoreApi.get().getGeneratorProvider() + .registerGeneratorPlugin(new MultiverseGeneratorPluginHook(platform)); + } + @Override public @NotNull Collection suggestIds(@Nullable String s) { return platform.getConfigRegistry().entries().stream() @@ -45,9 +51,4 @@ public final class MultiverseGeneratorPluginHook implements GeneratorPlugin { public @NotNull String getPluginName() { return "Terra"; } - - public static void register(Platform platform) { - MultiverseCoreApi.get().getGeneratorProvider() - .registerGeneratorPlugin(new MultiverseGeneratorPluginHook(platform)); - } } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java index faa69b70b..5cb6ab4e6 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java @@ -17,14 +17,6 @@ package com.dfsek.terra.bukkit.listeners; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; -import com.dfsek.terra.bukkit.hooks.MultiverseGeneratorPluginHook; - -import com.dfsek.terra.bukkit.world.BukkitBiomeInfo; -import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; - import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.entity.Entity; @@ -41,6 +33,13 @@ import org.slf4j.LoggerFactory; import java.util.List; +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; +import com.dfsek.terra.bukkit.hooks.MultiverseGeneratorPluginHook; +import com.dfsek.terra.bukkit.world.BukkitBiomeInfo; +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; + /** * Listener for events on all implementations. @@ -72,17 +71,17 @@ public class CommonListener implements Listener { private void applyWolfVariant(Wolf wolf) { // Doesn't apply if variant has already been applied - if (wolf.getVariant() != Variant.PALE) { + if(wolf.getVariant() != Variant.PALE) { return; } World world = wolf.getWorld(); - if (!(world.getGenerator() instanceof BukkitChunkGeneratorWrapper wrapper)) { + if(!(world.getGenerator() instanceof BukkitChunkGeneratorWrapper wrapper)) { return; } ConfigPack pack = platform.getConfigRegistry().get(wrapper.getPack().getRegistryKey()).orElse(null); - if (pack == null) { + if(pack == null) { return; } @@ -109,11 +108,11 @@ public class CommonListener implements Listener { @EventHandler public void onWolfSpawn(CreatureSpawnEvent event) { - if (!(event.getEntity() instanceof Wolf wolf)) { + if(!(event.getEntity() instanceof Wolf wolf)) { return; } - if (!WOLF_VARIANT_SPAWN_REASONS.contains(event.getSpawnReason())) { + if(!WOLF_VARIANT_SPAWN_REASONS.contains(event.getSpawnReason())) { logger.debug("Ignoring wolf spawned with reason: " + event.getSpawnReason()); return; } @@ -123,12 +122,12 @@ public class CommonListener implements Listener { @EventHandler public void onChunkGenerate(ChunkLoadEvent event) { - if (!event.isNewChunk()) { + if(!event.isNewChunk()) { return; } - for (Entity entity : event.getChunk().getEntities()) { - if (entity instanceof Wolf wolf) { + for(Entity entity : event.getChunk().getEntities()) { + if(entity instanceof Wolf wolf) { applyWolfVariant(wolf); } } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java index a6062a528..66cd42543 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java @@ -1,11 +1,10 @@ package com.dfsek.terra.bukkit.nms; -import com.dfsek.terra.bukkit.TerraBukkitPlugin; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.dfsek.terra.bukkit.PlatformImpl; +import com.dfsek.terra.bukkit.TerraBukkitPlugin; import com.dfsek.terra.bukkit.util.VersionUtil; @@ -17,7 +16,7 @@ public interface Initializer { Logger logger = LoggerFactory.getLogger(Initializer.class); PlatformImpl platform = constructPlatform(plugin); - if (platform == null) { + if(platform == null) { logger.error("NMS bindings for version {} do not exist. Support for this version is limited.", NMS); logger.error("This is usually due to running Terra on an unsupported Minecraft version."); String bypassKey = "IKnowThereAreNoNMSBindingsFor" + NMS + "ButIWillProceedAnyway"; @@ -46,12 +45,7 @@ public interface Initializer { private static PlatformImpl constructPlatform(TerraBukkitPlugin plugin) { try { - String packageVersion = NMS; - if (NMS.equals("v1_21_5") || NMS.equals("v1_21_6") || NMS.equals("v1_21_7")) { - packageVersion = "v1_21_8"; - } - - Class platformClass = Class.forName(TERRA_PACKAGE + "." + packageVersion + ".NMSPlatform"); + Class platformClass = Class.forName(TERRA_PACKAGE + "." + NMS + ".NMSPlatform"); try { return (PlatformImpl) platformClass .getConstructor(TerraBukkitPlugin.class) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/BukkitUtils.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/BukkitUtils.java index 6c0a9c7f4..eb5d62270 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/BukkitUtils.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/BukkitUtils.java @@ -20,14 +20,6 @@ public class BukkitUtils { } public static EntityType getEntityType(String id) { - if(!id.contains(":")) { //TODO: remove in 7.0 - String newid = "minecraft:" + id.toLowerCase(); - ; - logger.warn( - "Translating " + id + " to " + newid + ". In 1.20.3 entity parsing was reworked" + - ". You are advised to perform this rename in your config backs as this translation will be removed in the next major " + - "version of Terra."); - } if(!id.startsWith("minecraft:")) throw new IllegalArgumentException("Invalid entity identifier " + id); String entityID = id.toUpperCase(Locale.ROOT).substring(10); diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java index 408265821..3add6347f 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java @@ -18,6 +18,8 @@ package com.dfsek.terra.bukkit.world; +import com.dfsek.seismic.type.vector.Vector3; +import io.papermc.paper.command.brigadier.CommandSourceStack; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -34,13 +36,12 @@ import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.inventory.ItemStack; import com.dfsek.terra.api.inventory.item.Enchantment; -import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.api.world.chunk.Chunk; import com.dfsek.terra.api.world.info.WorldProperties; -import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitEntity; import com.dfsek.terra.bukkit.BukkitPlayer; +import com.dfsek.terra.bukkit.CloudCommandSender; import com.dfsek.terra.bukkit.world.block.BukkitBlockTypeAndItem; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; import com.dfsek.terra.bukkit.world.inventory.BukkitItemStack; @@ -157,16 +158,16 @@ public final class BukkitAdapter { return Vector3.of(vector.getX(), vector.getY(), vector.getZ()); } - public static CommandSender adapt(org.bukkit.command.CommandSender sender) { - return new BukkitCommandSender(sender); + public static CommandSender adapt(CommandSourceStack sender) { + return new CloudCommandSender(sender); } public static Entity adapt(org.bukkit.entity.Entity entity) { return new BukkitEntity(entity); } - public static org.bukkit.command.CommandSender adapt(CommandSender sender) { - return ((BukkitCommandSender) sender).getHandle(); + public static CommandSourceStack adapt(CommandSender sender) { + return ((CloudCommandSender) sender).getHandle(); } public static ServerWorld adapt(org.bukkit.World world) { diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeInfo.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeInfo.java index 7e0499c0c..9079005e9 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeInfo.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeInfo.java @@ -1,8 +1,9 @@ package com.dfsek.terra.bukkit.world; -import com.dfsek.terra.api.properties.Properties; - import org.bukkit.NamespacedKey; +import com.dfsek.terra.api.properties.Properties; -public record BukkitBiomeInfo(NamespacedKey biomeKey) implements Properties {} + +public record BukkitBiomeInfo(NamespacedKey biomeKey) implements Properties { +} diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorldProperties.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorldProperties.java index 7ece9ac7b..f9763df90 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorldProperties.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorldProperties.java @@ -1,9 +1,9 @@ package com.dfsek.terra.bukkit.world; -import com.dfsek.terra.api.world.info.WorldProperties; - import org.bukkit.generator.WorldInfo; +import com.dfsek.terra.api.world.info.WorldProperties; + public class BukkitWorldProperties implements WorldProperties { private final WorldInfo delegate; diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockEntity.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockEntity.java index 0b0f0410c..56bd045fc 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockEntity.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockEntity.java @@ -17,13 +17,13 @@ package com.dfsek.terra.bukkit.world.block.state; +import com.dfsek.seismic.type.vector.Vector3; import org.bukkit.block.Container; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Sign; import com.dfsek.terra.api.block.entity.BlockEntity; import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; diff --git a/platforms/bukkit/nms/v1_21_8/build.gradle.kts b/platforms/bukkit/nms/v1_21_9/build.gradle.kts similarity index 100% rename from platforms/bukkit/nms/v1_21_8/build.gradle.kts rename to platforms/bukkit/nms/v1_21_9/build.gradle.kts diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/AwfulBukkitHacks.java similarity index 82% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/AwfulBukkitHacks.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/AwfulBukkitHacks.java index ee206e34d..3c7e9355f 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/AwfulBukkitHacks.java @@ -1,8 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8; - -import com.dfsek.terra.bukkit.nms.v1_21_8.config.VanillaBiomeProperties; - -import com.dfsek.terra.bukkit.world.BukkitBiomeInfo; +package com.dfsek.terra.bukkit.nms.v1_21_9; import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; @@ -29,6 +25,8 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.VanillaBiomeProperties; +import com.dfsek.terra.bukkit.world.BukkitBiomeInfo; import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; import com.dfsek.terra.registry.master.ConfigRegistry; @@ -57,9 +55,11 @@ public class AwfulBukkitHacks { VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); - Biome platform = NMSBiomeInjector.createBiome(biomeRegistry.get(vanillaMinecraftKey).orElseThrow().value(), vanillaBiomeProperties); + Biome platform = NMSBiomeInjector.createBiome(biomeRegistry.get(vanillaMinecraftKey).orElseThrow().value(), + vanillaBiomeProperties); - ResourceLocation delegateMinecraftKey = ResourceLocation.fromNamespaceAndPath("terra", NMSBiomeInjector.createBiomeID(pack, key)); + ResourceLocation delegateMinecraftKey = ResourceLocation.fromNamespaceAndPath("terra", + NMSBiomeInjector.createBiomeID(pack, key)); NamespacedKey delegateBukkitKey = NamespacedKey.fromString(delegateMinecraftKey.toString()); ResourceKey delegateKey = ResourceKey.create(Registries.BIOME, delegateMinecraftKey); @@ -123,39 +123,42 @@ public class AwfulBukkitHacks { Map, List>> map = new IdentityHashMap<>(); Reflection.MAPPED_REGISTRY.getByKey(registry).values().forEach(entry -> map.put(entry, new ArrayList<>())); tagEntries.forEach((tag, entries) -> { - for (Holder holder : entries) { -// if (!holder.canSerializeIn(registry.asLookup())) { -// throw new IllegalStateException("Can't create named set " + tag + " containing value " + holder + " from outside registry " + this); -// } + for(Holder holder : entries) { + // if (!holder.canSerializeIn(registry.asLookup())) { + // throw new IllegalStateException("Can't create named set " + tag + " containing value " + holder + " + // from outside registry " + this); + // } - if (!(holder instanceof Holder.Reference reference)) { + if(!(holder instanceof Holder.Reference reference)) { throw new IllegalStateException("Found direct holder " + holder + " value in tag " + tag); } map.get(reference).add(tag); } }); -// Set> set = Sets.difference(registry.tags.keySet(), tagEntries.keySet()); -// if (!set.isEmpty()) { -// LOGGER.warn( -// "Not all defined tags for registry {} are present in data pack: {}", -// registry.key(), -// set.stream().map(tag -> tag.location().toString()).sorted().collect(Collectors.joining(", ")) -// ); -// } + // Set> set = Sets.difference(registry.tags.keySet(), tagEntries.keySet()); + // if (!set.isEmpty()) { + // LOGGER.warn( + // "Not all defined tags for registry {} are present in data pack: {}", + // registry.key(), + // set.stream().map(tag -> tag.location().toString()).sorted().collect(Collectors.joining(", ")) + // ); + // } Map, HolderSet.Named> map2 = new IdentityHashMap<>(registry.getTags().collect(Collectors.toMap( Named::key, (named) -> named ))); - tagEntries.forEach((tag, entries) -> Reflection.HOLDER_SET.invokeBind(map2.computeIfAbsent(tag, key -> Reflection.MAPPED_REGISTRY.invokeCreateTag(registry, key)), entries)); + tagEntries.forEach((tag, entries) -> Reflection.HOLDER_SET.invokeBind( + map2.computeIfAbsent(tag, key -> Reflection.MAPPED_REGISTRY.invokeCreateTag(registry, key)), entries)); map.forEach(Reflection.HOLDER_REFERENCE::invokeBindTags); Reflection.MAPPED_REGISTRY.setAllTags(registry, Reflection.MAPPED_REGISTRY_TAG_SET.invokeFromMap(map2)); } private static void resetTags(MappedRegistry registry) { registry.getTags().forEach(entryList -> Reflection.HOLDER_SET.invokeBind(entryList, List.of())); - Reflection.MAPPED_REGISTRY.getByKey(registry).values().forEach(entry -> Reflection.HOLDER_REFERENCE.invokeBindTags(entry, Set.of())); + Reflection.MAPPED_REGISTRY.getByKey(registry).values().forEach( + entry -> Reflection.HOLDER_REFERENCE.invokeBindTags(entry, Set.of())); } } diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSAddon.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSAddon.java similarity index 89% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSAddon.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSAddon.java index 8d1a1ecf9..a0ad31948 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSAddon.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSAddon.java @@ -1,11 +1,11 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8; +package com.dfsek.terra.bukkit.nms.v1_21_9; import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.bukkit.BukkitAddon; import com.dfsek.terra.bukkit.PlatformImpl; -import com.dfsek.terra.bukkit.nms.v1_21_8.config.VanillaBiomeProperties; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.VanillaBiomeProperties; public class NMSAddon extends BukkitAddon { diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSBiomeInfo.java similarity index 83% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSBiomeInfo.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSBiomeInfo.java index 8626f2cd4..d7d468cca 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSBiomeInfo.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSBiomeInfo.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8; +package com.dfsek.terra.bukkit.nms.v1_21_9; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSBiomeInjector.java similarity index 92% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSBiomeInjector.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSBiomeInjector.java index 8f61ca024..a8ca54c39 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSBiomeInjector.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8; +package com.dfsek.terra.bukkit.nms.v1_21_9; import net.minecraft.core.Holder; import net.minecraft.core.Registry; @@ -12,7 +12,7 @@ import java.util.Objects; import java.util.Optional; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.bukkit.nms.v1_21_8.config.VanillaBiomeProperties; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.VanillaBiomeProperties; public class NMSBiomeInjector { @@ -33,7 +33,8 @@ public class NMSBiomeInjector { .waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor())) .waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor())) .skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor())) - .grassColorModifier(Objects.requireNonNullElse(vanillaBiomeProperties.getGrassColorModifier(), vanilla.getSpecialEffects().getGrassColorModifier())) + .grassColorModifier(Objects.requireNonNullElse(vanillaBiomeProperties.getGrassColorModifier(), + vanilla.getSpecialEffects().getGrassColorModifier())) .backgroundMusicVolume(Objects.requireNonNullElse(vanillaBiomeProperties.getMusicVolume(), vanilla.getBackgroundMusicVolume())); if(vanillaBiomeProperties.getGrassColor() == null) { @@ -84,7 +85,8 @@ public class NMSBiomeInjector { builder.downfall(Objects.requireNonNullElse(vanillaBiomeProperties.getDownfall(), vanilla.climateSettings.downfall())); - builder.temperatureAdjustment(Objects.requireNonNullElse(vanillaBiomeProperties.getTemperatureModifier(), vanilla.climateSettings.temperatureModifier())); + builder.temperatureAdjustment( + Objects.requireNonNullElse(vanillaBiomeProperties.getTemperatureModifier(), vanilla.climateSettings.temperatureModifier())); builder.mobSpawnSettings(Objects.requireNonNullElse(vanillaBiomeProperties.getSpawnSettings(), vanilla.getMobSettings())); diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSBiomeProvider.java similarity index 97% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSBiomeProvider.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSBiomeProvider.java index 2bf071eb0..ac70c0127 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSBiomeProvider.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSBiomeProvider.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8; +package com.dfsek.terra.bukkit.nms.v1_21_9; import com.mojang.serialization.MapCodec; import net.minecraft.core.Holder; diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSChunkGeneratorDelegate.java similarity index 99% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSChunkGeneratorDelegate.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSChunkGeneratorDelegate.java index ebc3797fd..4356b88bc 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSChunkGeneratorDelegate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8; +package com.dfsek.terra.bukkit.nms.v1_21_9; import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSInjectListener.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSInjectListener.java similarity index 98% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSInjectListener.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSInjectListener.java index 809435c8b..1c656c3cc 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSInjectListener.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8; +package com.dfsek.terra.bukkit.nms.v1_21_9; import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ServerLevel; diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSPlatform.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSPlatform.java similarity index 83% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSPlatform.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSPlatform.java index a94691844..216665385 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSPlatform.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSPlatform.java @@ -1,34 +1,7 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8; +package com.dfsek.terra.bukkit.nms.v1_21_9; import com.dfsek.tectonic.api.TypeRegistry; - import com.dfsek.tectonic.api.exception.LoadException; - -import com.dfsek.terra.addon.InternalAddon; -import com.dfsek.terra.api.addon.BaseAddon; -import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; -import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.world.biome.PlatformBiome; -import com.dfsek.terra.bukkit.PlatformImpl; -import com.dfsek.terra.bukkit.TerraBukkitPlugin; - -import com.dfsek.terra.bukkit.nms.v1_21_8.config.BiomeAdditionsSoundTemplate; -import com.dfsek.terra.bukkit.nms.v1_21_8.config.BiomeMoodSoundTemplate; -import com.dfsek.terra.bukkit.nms.v1_21_8.config.BiomeParticleConfigTemplate; -import com.dfsek.terra.bukkit.nms.v1_21_8.config.EntityTypeTemplate; - -import com.dfsek.terra.bukkit.nms.v1_21_8.config.MusicSoundTemplate; - -import com.dfsek.terra.bukkit.nms.v1_21_8.config.SoundEventTemplate; - -import com.dfsek.terra.bukkit.nms.v1_21_8.config.SpawnCostConfig; - -import com.dfsek.terra.bukkit.nms.v1_21_8.config.SpawnEntryConfig; -import com.dfsek.terra.bukkit.nms.v1_21_8.config.SpawnSettingsTemplate; -import com.dfsek.terra.bukkit.nms.v1_21_8.config.SpawnTypeConfig; - -import com.dfsek.terra.bukkit.nms.v1_21_8.config.VillagerTypeTemplate; - import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.Music; import net.minecraft.sounds.SoundEvent; @@ -47,6 +20,25 @@ import org.bukkit.Bukkit; import java.util.List; import java.util.Locale; +import com.dfsek.terra.addon.InternalAddon; +import com.dfsek.terra.api.addon.BaseAddon; +import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; +import com.dfsek.terra.api.event.functional.FunctionalEventHandler; +import com.dfsek.terra.api.world.biome.PlatformBiome; +import com.dfsek.terra.bukkit.PlatformImpl; +import com.dfsek.terra.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.BiomeAdditionsSoundTemplate; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.BiomeMoodSoundTemplate; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.BiomeParticleConfigTemplate; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.EntityTypeTemplate; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.MusicSoundTemplate; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.SoundEventTemplate; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.SpawnCostConfig; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.SpawnEntryConfig; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.SpawnSettingsTemplate; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.SpawnTypeConfig; +import com.dfsek.terra.bukkit.nms.v1_21_9.config.VillagerTypeTemplate; + public class NMSPlatform extends PlatformImpl { @@ -74,7 +66,7 @@ public class NMSPlatform extends PlatformImpl { .registerLoader(GrassColorModifier.class, (type, o, loader, depthTracker) -> TemperatureModifier.valueOf(((String) o).toUpperCase( Locale.ROOT))) - .registerLoader(MobCategory.class, (type, o, loader, depthTracker) -> MobCategory.valueOf((String) o)) + .registerLoader(MobCategory.class, (type, o, loader, depthTracker) -> MobCategory.valueOf((String) o)) .registerLoader(AmbientParticleSettings.class, BiomeParticleConfigTemplate::new) .registerLoader(SoundEvent.class, SoundEventTemplate::new) .registerLoader(AmbientMoodSettings.class, BiomeMoodSoundTemplate::new) diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSWorldProperties.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSWorldProperties.java similarity index 94% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSWorldProperties.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSWorldProperties.java index 1f8deecfa..da602a85a 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/NMSWorldProperties.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/NMSWorldProperties.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8; +package com.dfsek.terra.bukkit.nms.v1_21_9; import net.minecraft.world.level.LevelHeightAccessor; diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/Reflection.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/Reflection.java similarity index 99% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/Reflection.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/Reflection.java index 728b635c6..69f6b8a3d 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/Reflection.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/Reflection.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8; +package com.dfsek.terra.bukkit.nms.v1_21_9; import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; @@ -71,6 +71,7 @@ public class Reflection { HolderSet.Named invokeCreateTag(MappedRegistry instance, TagKey tag); } + @Proxies(className = "net.minecraft.core.MappedRegistry$TagSet") public interface MappedRegistryTagSetProxy { @MethodName("fromMap") @@ -95,6 +96,7 @@ public class Reflection { void invokeBindTags(Reference instance, Collection> tags); } + @Proxies(ChunkMap.class) public interface ChunkMapProxy { @FieldGetter("worldGenContext") @@ -104,12 +106,14 @@ public class Reflection { void setWorldGenContext(ChunkMap instance, WorldGenContext worldGenContext); } + @Proxies(Holder.Reference.class) public interface HolderReferenceProxy { @MethodName("bindTags") void invokeBindTags(Holder.Reference instance, Collection> tags); } + @Proxies(HolderSet.Named.class) public interface HolderSetNamedProxy { @MethodName("bind") @@ -119,12 +123,14 @@ public class Reflection { List> invokeContents(HolderSet.Named instance); } + @Proxies(Biome.class) public interface BiomeProxy { @MethodName("getGrassColorFromTexture") int invokeGrassColorFromTexture(Biome instance); } + @Proxies(VillagerType.class) public interface VillagerTypeProxy { @Static diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/RegistryFetcher.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/RegistryFetcher.java similarity index 94% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/RegistryFetcher.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/RegistryFetcher.java index bb24f315f..5541ee786 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/RegistryFetcher.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/RegistryFetcher.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8; +package com.dfsek.terra.bukkit.nms.v1_21_9; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/BiomeAdditionsSoundTemplate.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/BiomeAdditionsSoundTemplate.java similarity index 93% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/BiomeAdditionsSoundTemplate.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/BiomeAdditionsSoundTemplate.java index a0f1d8e8b..197fda792 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/BiomeAdditionsSoundTemplate.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/BiomeAdditionsSoundTemplate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8.config; +package com.dfsek.terra.bukkit.nms.v1_21_9.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -12,11 +12,11 @@ public class BiomeAdditionsSoundTemplate implements ObjectTemplate> { @Value("id") @Default private ResourceLocation id = null; - + @Override public EntityType get() { return BuiltInRegistries.ENTITY_TYPE.get(id).orElseThrow().value(); diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/MusicSoundTemplate.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/MusicSoundTemplate.java similarity index 93% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/MusicSoundTemplate.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/MusicSoundTemplate.java index ae8663936..2adfbb393 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/MusicSoundTemplate.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/MusicSoundTemplate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8.config; +package com.dfsek.terra.bukkit.nms.v1_21_9.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -12,19 +12,19 @@ public class MusicSoundTemplate implements ObjectTemplate { @Value("sound") @Default private SoundEvent sound = null; - + @Value("min-delay") @Default private Integer minDelay = null; - + @Value("max-delay") @Default private Integer maxDelay = null; - + @Value("replace-current-music") @Default private Boolean replaceCurrentMusic = null; - + @Override public Music get() { if(sound == null || minDelay == null || maxDelay == null || replaceCurrentMusic == null) { diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SoundEventTemplate.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SoundEventTemplate.java similarity index 93% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SoundEventTemplate.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SoundEventTemplate.java index 7f79e22d1..213da76cf 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SoundEventTemplate.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SoundEventTemplate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8.config; +package com.dfsek.terra.bukkit.nms.v1_21_9.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -11,11 +11,11 @@ public class SoundEventTemplate implements ObjectTemplate { @Value("id") @Default private ResourceLocation id = null; - + @Value("distance-to-travel") @Default private Float distanceToTravel = null; - + @Override public SoundEvent get() { if(id == null) { diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SpawnCostConfig.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SpawnCostConfig.java similarity index 90% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SpawnCostConfig.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SpawnCostConfig.java index a83e380ec..9023c339d 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SpawnCostConfig.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SpawnCostConfig.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8.config; +package com.dfsek.terra.bukkit.nms.v1_21_9.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -10,27 +10,27 @@ public class SpawnCostConfig implements ObjectTemplate { @Value("type") @Default private EntityType type = null; - + @Value("mass") @Default private Double mass = null; - + @Value("gravity") @Default private Double gravity = null; - + public EntityType getType() { return type; } - + public Double getMass() { return mass; } - + public Double getGravity() { return gravity; } - + @Override public SpawnCostConfig get() { return this; diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SpawnEntryConfig.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SpawnEntryConfig.java similarity index 71% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SpawnEntryConfig.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SpawnEntryConfig.java index b0902cd9a..fa7658556 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SpawnEntryConfig.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SpawnEntryConfig.java @@ -1,8 +1,11 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8.config; +package com.dfsek.terra.bukkit.nms.v1_21_9.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.api.util.range.Range; + import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; @@ -11,27 +14,23 @@ public class SpawnEntryConfig implements ObjectTemplate { @Value("type") @Default private EntityType type = null; - + @Value("weight") @Default private Integer weight = null; - - @Value("min-group-size") + + @Value("group-size") @Default - private Integer minGroupSize = null; - - @Value("max-group-size") - @Default - private Integer maxGroupSize = null; + private Range groupSize = null; public Integer getWeight() { return weight; } public SpawnerData getSpawnEntry() { - return new SpawnerData(type, minGroupSize, maxGroupSize); + return new SpawnerData(type, groupSize.getMin(), groupSize.getMax()); } - + @Override public SpawnEntryConfig get() { return this; diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SpawnSettingsTemplate.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SpawnSettingsTemplate.java similarity index 95% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SpawnSettingsTemplate.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SpawnSettingsTemplate.java index 1ccf76a35..ddc140afa 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SpawnSettingsTemplate.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SpawnSettingsTemplate.java @@ -1,14 +1,15 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8.config; +package com.dfsek.terra.bukkit.nms.v1_21_9.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import java.util.List; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.biome.MobSpawnSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; + public class SpawnSettingsTemplate implements ObjectTemplate { @@ -18,15 +19,15 @@ public class SpawnSettingsTemplate implements ObjectTemplate { @Value("spawns") @Default private List spawns = null; - + @Value("costs") @Default private List costs = null; - + @Value("probability") @Default private Float probability = null; - + @Override public MobSpawnSettings get() { MobSpawnSettings.Builder builder = new MobSpawnSettings.Builder(); @@ -42,7 +43,7 @@ public class SpawnSettingsTemplate implements ObjectTemplate { if(probability != null) { builder.creatureGenerationProbability(probability); } - + return builder.build(); } } diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SpawnTypeConfig.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SpawnTypeConfig.java similarity index 93% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SpawnTypeConfig.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SpawnTypeConfig.java index f7d2f4722..9a6d0f854 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/SpawnTypeConfig.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/SpawnTypeConfig.java @@ -1,11 +1,12 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8.config; +package com.dfsek.terra.bukkit.nms.v1_21_9.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import java.util.List; import net.minecraft.world.entity.MobCategory; +import java.util.List; + public class SpawnTypeConfig implements ObjectTemplate { @Value("group") diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/VanillaBiomeProperties.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/VanillaBiomeProperties.java similarity index 98% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/VanillaBiomeProperties.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/VanillaBiomeProperties.java index c227ae835..d690f79e3 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/VanillaBiomeProperties.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/VanillaBiomeProperties.java @@ -1,11 +1,8 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8.config; +package com.dfsek.terra.bukkit.nms.v1_21_9.config; import com.dfsek.tectonic.api.config.template.ConfigTemplate; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; - -import com.dfsek.terra.api.properties.Properties; - import net.minecraft.resources.ResourceKey; import net.minecraft.sounds.Music; import net.minecraft.sounds.SoundEvent; @@ -17,6 +14,8 @@ import net.minecraft.world.level.biome.Biome.TemperatureModifier; import net.minecraft.world.level.biome.BiomeSpecialEffects.GrassColorModifier; import net.minecraft.world.level.biome.MobSpawnSettings; +import com.dfsek.terra.api.properties.Properties; + public class VanillaBiomeProperties implements ConfigTemplate, Properties { @Value("colors.grass") diff --git a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/VillagerTypeTemplate.java b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/VillagerTypeTemplate.java similarity index 92% rename from platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/VillagerTypeTemplate.java rename to platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/VillagerTypeTemplate.java index 7550f6f6f..c754c17f5 100644 --- a/platforms/bukkit/nms/v1_21_8/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_8/config/VillagerTypeTemplate.java +++ b/platforms/bukkit/nms/v1_21_9/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_9/config/VillagerTypeTemplate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21_8.config; +package com.dfsek.terra.bukkit.nms.v1_21_9.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -13,7 +13,7 @@ public class VillagerTypeTemplate implements ObjectTemplate get() { return ResourceKey.create(BuiltInRegistries.VILLAGER_TYPE.key(), id); diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java index 5fa0e7514..c271f98cf 100644 --- a/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java @@ -1,44 +1,48 @@ package com.dfsek.terra.cli; +import com.dfsek.seismic.type.vector.Vector2Int; import net.querz.mca.MCAUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import picocli.CommandLine; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; import java.io.IOException; import java.util.concurrent.Callable; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; -import com.dfsek.terra.api.util.vector.Vector2Int; import com.dfsek.terra.cli.world.CLIWorld; -import picocli.CommandLine; -import picocli.CommandLine.Command; -import picocli.CommandLine.Option; - //TODO auto pull in version @Command(name = "TerraCLI", mixinStandardHelpOptions = true, version = "6.6.0", description = "Generates a Terra World and saves it in minecraft region format.") public final class TerraCLI implements Callable { - @Option(names = { "-s", "--size"}, description = "Number of regions to generate.") + @Option(names = { "-s", "--size" }, description = "Number of regions to generate.") private int size = 2; - @Option(names = { "-p", "--pack"}, description = "Config pack to use.") + @Option(names = { "-p", "--pack" }, description = "Config pack to use.") private String pack = "OVERWORLD"; - @Option(names = { "--seed"}, description = "Seed for world generation.") + @Option(names = { "--seed" }, description = "Seed for world generation.") private long seed = 0; - @Option(names = { "--max-height"}, description = "Maximum height of the world.") + @Option(names = { "--max-height" }, description = "Maximum height of the world.") private int maxHeight = 320; - @Option(names = { "--min-height"}, description = "Minimum height of the world.") + @Option(names = { "--min-height" }, description = "Minimum height of the world.") private int minHeight = -64; - @Option(names = { "--no-save"}, description = "Don't save the world to disk.") + @Option(names = { "--no-save" }, description = "Don't save the world to disk.") private boolean noSave = false; + public static void main(String... args) { + int exitCode = new CommandLine(new TerraCLI()).execute(args); + System.exit(exitCode); + } + @Override public Integer call() { Logger LOGGER = LoggerFactory.getLogger(TerraCLI.class); @@ -70,9 +74,4 @@ public final class TerraCLI implements Callable { LOGGER.info("Done."); return 0; } - - public static void main(String... args) { - int exitCode = new CommandLine(new TerraCLI()).execute(args); - System.exit(exitCode); - } } diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/world/CLIWorld.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/world/CLIWorld.java index cb22ac666..5fdf266ad 100644 --- a/platforms/cli/src/main/java/com/dfsek/terra/cli/world/CLIWorld.java +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/world/CLIWorld.java @@ -1,5 +1,7 @@ package com.dfsek.terra.cli.world; +import com.dfsek.seismic.type.vector.Vector2Int; +import com.dfsek.seismic.type.vector.Vector3; import com.google.common.collect.Streams; import net.querz.mca.MCAFile; import org.slf4j.Logger; @@ -22,8 +24,6 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.EntityType; import com.dfsek.terra.api.util.generic.pair.Pair; -import com.dfsek.terra.api.util.vector.Vector2Int; -import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; @@ -87,7 +87,7 @@ public class CLIWorld implements ServerWorld, NBTSerializable=0.16.10", "java": ">=21", - "minecraft": "1.21.7", + "minecraft": "1.21.9", "fabric": "*" } } \ No newline at end of file diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgePlatform.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgePlatform.java index c07bde6f3..eff0d924e 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgePlatform.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgePlatform.java @@ -20,6 +20,9 @@ package com.dfsek.terra.forge; import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import ca.solostudios.strata.version.Version; + +import com.dfsek.terra.registry.master.ConfigRegistry.PackLoadFailuresException; + import net.minecraft.MinecraftVersion; import net.minecraft.registry.Registry; import net.minecraft.server.MinecraftServer; @@ -34,6 +37,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -62,8 +66,7 @@ public class ForgePlatform extends ModPlatform { @Override public boolean reload() { getTerraConfig().load(this); - getRawConfigRegistry().clear(); - boolean succeed = getRawConfigRegistry().loadAll(this); + boolean succeed = loadConfigPacks(); MinecraftServer server = getServer(); diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/NoiseConfigMixin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/NoiseConfigMixin.java index 4b1b0ad78..c61ff8b24 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/NoiseConfigMixin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/NoiseConfigMixin.java @@ -1,8 +1,8 @@ package com.dfsek.terra.forge.mixin.lifecycle; import net.minecraft.registry.RegistryEntryLookup; -import net.minecraft.util.math.noise.DoublePerlinNoiseSampler.NoiseParameters; -import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; +import net.minecraft.util.math.noise.DoublePerlinSampler.NoiseParameters; +import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiSampler; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.noise.NoiseConfig; import org.spongepowered.asm.mixin.Final; @@ -22,13 +22,13 @@ import com.dfsek.terra.mod.util.SeedHack; public class NoiseConfigMixin { @Shadow @Final - private MultiNoiseSampler multiNoiseSampler; + private MultiSampler multiSampler; @Inject(method = "(Lnet/minecraft/world/gen/chunk/ChunkGeneratorSettings;Lnet/minecraft/registry/RegistryEntryLookup;J)V", at = @At("TAIL")) private void mapMultiNoise(ChunkGeneratorSettings chunkGeneratorSettings, RegistryEntryLookup noiseParametersLookup, long seed, CallbackInfo ci) { - SeedHack.register(multiNoiseSampler, seed); + SeedHack.register(multiSampler, seed); } } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/util/BiomeUtil.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/util/BiomeUtil.java index 57046330b..ed99d22ed 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/util/BiomeUtil.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/util/BiomeUtil.java @@ -83,7 +83,8 @@ public final class BiomeUtil { Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), villagerMap.getOrDefault(vanilla.getKey().orElseThrow(), VillagerType.PLAINS))); - com.dfsek.terra.mod.util.BiomeUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getKey().orElseThrow().getValue(), i -> new ArrayList<>()).add( + com.dfsek.terra.mod.util.BiomeUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getKey().orElseThrow().getValue(), + i -> new ArrayList<>()).add( identifier); } } diff --git a/platforms/minestom/example/src/main/java/com/dfsek/terra/minestom/TerraMinestomExample.java b/platforms/minestom/example/src/main/java/com/dfsek/terra/minestom/TerraMinestomExample.java index 1cf95a226..ccf7ddd9f 100644 --- a/platforms/minestom/example/src/main/java/com/dfsek/terra/minestom/TerraMinestomExample.java +++ b/platforms/minestom/example/src/main/java/com/dfsek/terra/minestom/TerraMinestomExample.java @@ -16,22 +16,33 @@ import java.time.Duration; import java.util.concurrent.atomic.AtomicInteger; import com.dfsek.terra.minestom.world.TerraMinestomWorld; -import com.dfsek.terra.minestom.world.TerraMinestomWorldBuilder; public class TerraMinestomExample { private static final Logger logger = LoggerFactory.getLogger(TerraMinestomExample.class); private final MinecraftServer server = MinecraftServer.init(); + private final TerraMinestomPlatform platform = new TerraMinestomPlatform(); private Instance instance; private TerraMinestomWorld world; + public static void main(String[] args) { + TerraMinestomExample example = new TerraMinestomExample(); + example.createNewInstance(); + example.attachTerra(); + example.preloadWorldAndMeasure(); + example.addScheduler(); + example.addListeners(); + example.addCommands(); + example.bind(); + } + public void createNewInstance() { instance = MinecraftServer.getInstanceManager().createInstanceContainer(); instance.setChunkSupplier(LightingChunk::new); } public void attachTerra() { - world = TerraMinestomWorldBuilder.from(instance) + world = platform.worldBuilder(instance) .defaultPack() .attach(); } @@ -102,16 +113,6 @@ public class TerraMinestomExample { server.start("localhost", 25565); } - public static void main(String[] args) { - TerraMinestomExample example = new TerraMinestomExample(); - example.createNewInstance(); - example.attachTerra(); - example.preloadWorldAndMeasure(); - example.addScheduler(); - example.addListeners(); - example.addCommands(); - example.bind(); - } public class RegenerateCommand extends Command { public RegenerateCommand() { @@ -121,12 +122,16 @@ public class TerraMinestomExample { private void regenerate() { instance.sendMessage(Component.text("Regenerating world")); + Instance oldInstance = instance; + platform.reload(); createNewInstance(); attachTerra(); preloadWorldAndMeasure(); MinecraftServer.getConnectionManager().getOnlinePlayers().forEach(player -> player.setInstance(instance, new Pos(0, 100, 0)) ); + + MinecraftServer.getInstanceManager().unregisterInstance(oldInstance); } } } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/MinestomAdapter.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/MinestomAdapter.java index 697997c0b..54d74ec10 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/MinestomAdapter.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/MinestomAdapter.java @@ -1,7 +1,6 @@ package com.dfsek.terra.minestom; -import com.dfsek.terra.api.util.vector.Vector3; - +import com.dfsek.seismic.type.vector.Vector3; import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Pos; diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/MinestomPlatform.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/MinestomPlatform.java deleted file mode 100644 index 4a77649fc..000000000 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/MinestomPlatform.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.dfsek.terra.minestom; - -import com.dfsek.tectonic.api.TypeRegistry; -import com.dfsek.tectonic.api.loader.type.TypeLoader; -import com.dfsek.terra.AbstractPlatform; -import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.entity.EntityType; -import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; -import com.dfsek.terra.api.handle.ItemHandle; -import com.dfsek.terra.api.handle.WorldHandle; -import com.dfsek.terra.api.world.biome.PlatformBiome; -import com.dfsek.terra.minestom.biome.MinestomBiomeLoader; -import com.dfsek.terra.minestom.entity.MinestomEntityType; -import com.dfsek.terra.minestom.item.MinestomItemHandle; -import com.dfsek.terra.minestom.world.MinestomChunkGeneratorWrapper; -import com.dfsek.terra.minestom.world.MinestomWorldHandle; -import net.minestom.server.MinecraftServer; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; - - -public final class MinestomPlatform extends AbstractPlatform { - private static final Logger LOGGER = LoggerFactory.getLogger(MinestomPlatform.class); - private static MinestomPlatform INSTANCE = null; - private final MinestomWorldHandle worldHandle = new MinestomWorldHandle(); - private final MinestomItemHandle itemHandle = new MinestomItemHandle(); - - private MinestomPlatform() { - load(); - getEventManager().callEvent(new PlatformInitializationEvent()); - } - - @Override - public void register(TypeRegistry registry) { - super.register(registry); - registry - .registerLoader(PlatformBiome.class, new MinestomBiomeLoader()) - .registerLoader(EntityType.class, (TypeLoader) (annotatedType, o, configLoader, depthTracker) -> new MinestomEntityType((String) o)) - .registerLoader(BlockState.class, (TypeLoader) (annotatedType, o, configLoader, depthTracker) -> worldHandle.createBlockState((String) o)); - } - - @Override - public boolean reload() { - getTerraConfig().load(this); - getRawConfigRegistry().clear(); - boolean succeed = getRawConfigRegistry().loadAll(this); - - MinecraftServer.getInstanceManager().getInstances().forEach(world -> { - if(world.generator() instanceof MinestomChunkGeneratorWrapper wrapper) { - getConfigRegistry().get(wrapper.getPack().getRegistryKey()).ifPresent(pack -> { - wrapper.setPack(pack); - LOGGER.info("Replaced pack in chunk generator for instance {}", world.getUuid()); - }); - } - }); - - return succeed; - } - - @Override - public @NotNull WorldHandle getWorldHandle() { - return worldHandle; - } - - @Override - public @NotNull ItemHandle getItemHandle() { - return itemHandle; - } - - @Override - public @NotNull String platformName() { - return "Minestom"; - } - - @Override - public @NotNull File getDataFolder() { - String pathName = System.getProperty("terra.datafolder"); - if (pathName == null) pathName = "./terra/"; - File file = new File(pathName); - if(!file.exists()) file.mkdirs(); - return file; - } - - - public static MinestomPlatform getInstance() { - if(INSTANCE == null) { - INSTANCE = new MinestomPlatform(); - } - return INSTANCE; - } -} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java new file mode 100644 index 000000000..c1c59076c --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java @@ -0,0 +1,134 @@ +package com.dfsek.terra.minestom; + +import com.dfsek.tectonic.api.TypeRegistry; +import com.dfsek.tectonic.api.loader.type.TypeLoader; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.util.RGBLike; +import net.minestom.server.MinecraftServer; +import net.minestom.server.instance.Instance; +import net.minestom.server.sound.SoundEvent; +import net.minestom.server.world.biome.BiomeEffects; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import com.dfsek.terra.AbstractPlatform; +import com.dfsek.terra.api.addon.BaseAddon; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.entity.EntityType; +import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; +import com.dfsek.terra.api.handle.ItemHandle; +import com.dfsek.terra.api.handle.WorldHandle; +import com.dfsek.terra.api.world.biome.PlatformBiome; +import com.dfsek.terra.minestom.addon.MinestomAddon; +import com.dfsek.terra.minestom.api.TerraMinestomWorldBuilder; +import com.dfsek.terra.minestom.biome.MinestomBiomeLoader; +import com.dfsek.terra.minestom.config.BiomeAdditionsSoundTemplate; +import com.dfsek.terra.minestom.config.BiomeMoodSoundTemplate; +import com.dfsek.terra.minestom.config.BiomeParticleConfigTemplate; +import com.dfsek.terra.minestom.config.KeyLoader; +import com.dfsek.terra.minestom.config.RGBLikeLoader; +import com.dfsek.terra.minestom.config.SoundEventTemplate; +import com.dfsek.terra.minestom.entity.MinestomEntityType; +import com.dfsek.terra.minestom.item.MinestomItemHandle; +import com.dfsek.terra.minestom.world.MinestomChunkGeneratorWrapper; +import com.dfsek.terra.minestom.world.MinestomWorldHandle; + + +public final class TerraMinestomPlatform extends AbstractPlatform { + private static final Logger LOGGER = LoggerFactory.getLogger(TerraMinestomPlatform.class); + private final WorldHandle worldHandle; + private final ItemHandle itemHandle; + private final TypeLoader biomeTypeLoader; + private final ArrayList platformAddons = new ArrayList<>(List.of(new MinestomAddon(this))); + + public TerraMinestomPlatform(WorldHandle worldHandle, ItemHandle itemHandle, TypeLoader biomeTypeLoader, + BaseAddon... extraAddons) { + this.worldHandle = worldHandle; + this.itemHandle = itemHandle; + this.biomeTypeLoader = biomeTypeLoader; + this.platformAddons.addAll(List.of(extraAddons)); + load(); + getEventManager().callEvent(new PlatformInitializationEvent()); + } + + public TerraMinestomPlatform() { + this(new MinestomWorldHandle(), new MinestomItemHandle(), new MinestomBiomeLoader()); + } + + @Override + public void register(TypeRegistry registry) { + super.register(registry); + registry + .registerLoader(PlatformBiome.class, biomeTypeLoader) + .registerLoader(RGBLike.class, new RGBLikeLoader()) + .registerLoader(Key.class, new KeyLoader()) + .registerLoader(EntityType.class, + (TypeLoader) (annotatedType, o, configLoader, depthTracker) -> new MinestomEntityType((String) o)) + .registerLoader(BlockState.class, + (TypeLoader) (annotatedType, o, configLoader, depthTracker) -> worldHandle.createBlockState((String) o)) + .registerLoader(BiomeEffects.Particle.class, BiomeParticleConfigTemplate::new) + .registerLoader(BiomeEffects.MoodSound.class, BiomeMoodSoundTemplate::new) + .registerLoader(BiomeEffects.AdditionsSound.class, BiomeAdditionsSoundTemplate::new) + .registerLoader(SoundEvent.class, SoundEventTemplate::new); + } + + @Override + public boolean reload() { + getTerraConfig().load(this); + boolean succeed = loadConfigPacks(); + + MinecraftServer.getInstanceManager().getInstances().forEach(world -> { + if(world.generator() instanceof MinestomChunkGeneratorWrapper wrapper) { + getConfigRegistry().get(wrapper.getPack().getRegistryKey()).ifPresent(pack -> { + wrapper.setPack(pack); + LOGGER.info("Replaced pack in chunk generator for instance {}", world.getUuid()); + }); + } + }); + + return succeed; + } + + + @Override + public @NotNull WorldHandle getWorldHandle() { + return worldHandle; + } + + @Override + public @NotNull ItemHandle getItemHandle() { + return itemHandle; + } + + @Override + public @NotNull String platformName() { + return "Minestom"; + } + + @Override + public @NotNull File getDataFolder() { + String pathName = System.getProperty("terra.datafolder"); + if(pathName == null) pathName = "./terra/"; + File file = new File(pathName); + if(!file.exists()) file.mkdirs(); + return file; + } + + @Override + protected Iterable platformAddon() { + return platformAddons; + } + + public TerraMinestomWorldBuilder worldBuilder(Instance instance) { + return new TerraMinestomWorldBuilder(this, instance); + } + + public TerraMinestomWorldBuilder worldBuilder() { + return new TerraMinestomWorldBuilder(this, MinecraftServer.getInstanceManager().createInstanceContainer()); + } +} \ No newline at end of file diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/addon/MinestomAddon.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/addon/MinestomAddon.java new file mode 100644 index 000000000..8c08fb1ba --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/addon/MinestomAddon.java @@ -0,0 +1,44 @@ +package com.dfsek.terra.minestom.addon; + +import ca.solostudios.strata.Versions; +import ca.solostudios.strata.version.Version; + +import com.dfsek.terra.api.addon.BaseAddon; +import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; +import com.dfsek.terra.api.event.functional.FunctionalEventHandler; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.minestom.TerraMinestomPlatform; +import com.dfsek.terra.minestom.config.VanillaBiomeProperties; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class MinestomAddon implements BaseAddon { + private static final Version VERSION = Versions.getVersion(1, 0, 0); + private static final Logger logger = LoggerFactory.getLogger(MinestomAddon.class); + private final TerraMinestomPlatform minestomPlatform; + + public MinestomAddon(TerraMinestomPlatform minestomPlatform) { + this.minestomPlatform = minestomPlatform; + } + + @Override + public void initialize() { + minestomPlatform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigurationLoadEvent.class) + .then(event -> { + if(event.is(Biome.class)) { + event.getLoadedObject(Biome.class).getContext().put(event.load(new VanillaBiomeProperties())); + } + }) + .global(); + } + + @Override + public Version getVersion() { return VERSION; } + + @Override + public String getID() { return "terra-minestom"; } +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/BiomeFactory.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/BiomeFactory.java new file mode 100644 index 000000000..ee59f29d5 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/BiomeFactory.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.minestom.api; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.minestom.biome.UserDefinedBiome; + + +/** + * BiomeFactory serves as a contract for creating custom user-defined biomes in Terra. + * Implementations of this interface are responsible for defining the logic to convert + * configured biomes and source biome data into instances of UserDefinedBiome. + */ +public interface BiomeFactory { + UserDefinedBiome create(ConfigPack pack, Biome source); +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/BlockEntityFactory.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/BlockEntityFactory.java index c5fd33ca1..83746ff55 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/BlockEntityFactory.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/BlockEntityFactory.java @@ -1,15 +1,15 @@ package com.dfsek.terra.minestom.api; -import com.dfsek.terra.api.block.entity.BlockEntity; - import net.minestom.server.coordinate.BlockVec; import org.jetbrains.annotations.Nullable; +import com.dfsek.terra.api.block.entity.BlockEntity; + /** * Represents a factory interface for creating instances of BlockEntity - * at a specified BlockVec position. This is not implemented directly because - * Minestom does not define a way to build block entities out of the box. + * at a specified BlockVec position. For more fine-grained control, users + * may supply their own version of this interface. */ public interface BlockEntityFactory { @Nullable BlockEntity createBlockEntity(BlockVec position); diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorldBuilder.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java similarity index 65% rename from platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorldBuilder.java rename to platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java index d73e7ba54..d70a32bdd 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorldBuilder.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java @@ -1,55 +1,47 @@ -package com.dfsek.terra.minestom.world; +package com.dfsek.terra.minestom.api; -import com.dfsek.terra.api.config.ConfigPack; - -import com.dfsek.terra.api.registry.CheckedRegistry; - -import com.dfsek.terra.minestom.MinestomPlatform; -import com.dfsek.terra.minestom.api.BlockEntityFactory; -import com.dfsek.terra.minestom.api.EntityFactory; -import com.dfsek.terra.minestom.block.DefaultBlockEntityFactory; -import com.dfsek.terra.minestom.entity.DefaultEntityFactory; - -import net.minestom.server.MinecraftServer; import net.minestom.server.instance.Instance; import java.util.Random; import java.util.function.Function; +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.minestom.TerraMinestomPlatform; +import com.dfsek.terra.minestom.biome.MinestomUserDefinedBiomeFactory; +import com.dfsek.terra.minestom.block.DefaultBlockEntityFactory; +import com.dfsek.terra.minestom.entity.DefaultEntityFactory; +import com.dfsek.terra.minestom.world.TerraMinestomWorld; + public class TerraMinestomWorldBuilder { + private final TerraMinestomPlatform platform; private final Instance instance; private ConfigPack pack; private long seed = new Random().nextLong(); private EntityFactory entityFactory = new DefaultEntityFactory(); private BlockEntityFactory blockEntityFactory; + private BiomeFactory biomeFactory = new MinestomUserDefinedBiomeFactory(); - private TerraMinestomWorldBuilder(Instance instance) { + public TerraMinestomWorldBuilder(TerraMinestomPlatform platform, Instance instance) { + this.platform = platform; this.instance = instance; this.blockEntityFactory = new DefaultBlockEntityFactory(instance); } - public static TerraMinestomWorldBuilder from(Instance instance) { - return new TerraMinestomWorldBuilder(instance); - } - - public static TerraMinestomWorldBuilder builder() { - return new TerraMinestomWorldBuilder(MinecraftServer.getInstanceManager().createInstanceContainer()); - } - public TerraMinestomWorldBuilder pack(ConfigPack pack) { this.pack = pack; return this; } public TerraMinestomWorldBuilder packById(String id) { - this.pack = MinestomPlatform.getInstance().getConfigRegistry().getByID(id).orElseThrow(); + this.pack = platform.getConfigRegistry().getByID(id).orElseThrow(); return this; } public TerraMinestomWorldBuilder findPack(Function, ConfigPack> fn) { - this.pack = fn.apply(MinestomPlatform.getInstance().getConfigRegistry()); + this.pack = fn.apply(platform.getConfigRegistry()); return this; } @@ -72,7 +64,12 @@ public class TerraMinestomWorldBuilder { return this; } + public TerraMinestomWorldBuilder biomeFactory(BiomeFactory factory) { + this.biomeFactory = factory; + return this; + } + public TerraMinestomWorld attach() { - return new TerraMinestomWorld(instance, pack, seed, entityFactory, blockEntityFactory); + return new TerraMinestomWorld(platform, instance, pack, seed, entityFactory, blockEntityFactory, biomeFactory); } } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiome.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiome.java index a4c146359..eb4a121a1 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiome.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiome.java @@ -1,17 +1,18 @@ package com.dfsek.terra.minestom.biome; +import net.minestom.server.registry.RegistryKey; +import net.minestom.server.world.biome.Biome; + import com.dfsek.terra.api.world.biome.PlatformBiome; -import net.minestom.server.world.biome.Biome; - public class MinestomBiome implements PlatformBiome { - private final Biome biome; + private final RegistryKey biome; - public MinestomBiome(Biome biome) { this.biome = biome; } + public MinestomBiome(RegistryKey biome) { this.biome = biome; } @Override - public Biome getHandle() { + public RegistryKey getHandle() { return biome; } } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiomeLoader.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiomeLoader.java index 92ea8f0f7..21e4645b4 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiomeLoader.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiomeLoader.java @@ -4,28 +4,23 @@ import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.ConfigLoader; import com.dfsek.tectonic.api.loader.type.TypeLoader; - -import com.dfsek.terra.api.world.biome.PlatformBiome; - import net.kyori.adventure.key.Key; -import net.minestom.server.MinecraftServer; -import net.minestom.server.registry.DynamicRegistry; -import net.minestom.server.world.biome.Biome; +import net.minestom.server.registry.RegistryKey; +import org.intellij.lang.annotations.Subst; import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; +import com.dfsek.terra.api.world.biome.PlatformBiome; + public class MinestomBiomeLoader implements TypeLoader { - private final DynamicRegistry biomeRegistry = MinecraftServer.getBiomeRegistry(); - @Override public PlatformBiome load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException { + @Subst("name:value") String id = (String) o; - Key biomeID = Key.key(id); - Biome biome = biomeRegistry.get(biomeID); - if(biome == null) throw new LoadException("Biome %s does not exist in registry".formatted(id), depthTracker); - return new MinestomBiome(biome); + Key key = Key.key(id); + return new MinestomBiome(RegistryKey.unsafeOf(key)); } -} +} \ No newline at end of file diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomeFactory.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomeFactory.java new file mode 100644 index 000000000..644350d49 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomeFactory.java @@ -0,0 +1,74 @@ +package com.dfsek.terra.minestom.biome; + +import net.kyori.adventure.key.Key; +import net.minestom.server.MinecraftServer; +import net.minestom.server.color.Color; +import net.minestom.server.registry.DynamicRegistry; +import net.minestom.server.registry.RegistryKey; +import net.minestom.server.world.biome.Biome; +import net.minestom.server.world.biome.BiomeEffects; +import org.intellij.lang.annotations.Subst; +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; +import java.util.Objects; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.minestom.api.BiomeFactory; +import com.dfsek.terra.minestom.config.VanillaBiomeProperties; + + +public class MinestomUserDefinedBiomeFactory implements BiomeFactory { + private final DynamicRegistry biomeRegistry = MinecraftServer.getBiomeRegistry(); + private final @NotNull Biome plainsBiome = Objects.requireNonNull(biomeRegistry.get(Key.key("minecraft:plains"))); + + private static T mergeNullable(T first, T second) { + if(first == null) return second; + return first; + } + + @Subst("value") + protected static String createBiomeID(ConfigPack pack, String biomeId) { + return pack.getID().toLowerCase() + "/" + biomeId.toLowerCase(Locale.ROOT); + } + + @Override + public UserDefinedBiome create(ConfigPack pack, com.dfsek.terra.api.world.biome.Biome source) { + VanillaBiomeProperties properties = source.getContext().get(VanillaBiomeProperties.class); + RegistryKey parentKey = ((MinestomBiome) source.getPlatformBiome()).getHandle(); + Biome parent = mergeNullable(biomeRegistry.get(parentKey), plainsBiome); + BiomeEffects parentEffects = parent.effects(); + Key key = Key.key("terra", createBiomeID(pack, source.getID())); + + BiomeEffects.Builder effectsBuilder = BiomeEffects.builder() + .fogColor(mergeNullable(properties.getFogColor(), parentEffects.fogColor())) + .skyColor(mergeNullable(properties.getSkyColor(), parentEffects.skyColor())) + .waterColor(mergeNullable(properties.getWaterColor(), parentEffects.waterColor())) + .waterFogColor(mergeNullable(properties.getWaterFogColor(), parentEffects.waterFogColor())) + .foliageColor(mergeNullable(properties.getFoliageColor(), parentEffects.foliageColor())) + .grassColor(mergeNullable(properties.getGrassColor(), parentEffects.grassColor())) + .grassColorModifier(mergeNullable(properties.getGrassColorModifier(), parentEffects.grassColorModifier())) + .biomeParticle(mergeNullable(properties.getParticleConfig(), parentEffects.biomeParticle())) + .ambientSound(mergeNullable(properties.getLoopSound(), parentEffects.ambientSound())) + .moodSound(mergeNullable(properties.getMoodSound(), parentEffects.moodSound())) + .additionsSound(mergeNullable(properties.getAdditionsSound(), parentEffects.additionsSound())) + // TODO music + .music(parentEffects.music()) + .musicVolume(parentEffects.musicVolume()); + + if(effectsBuilder.build().equals(BiomeEffects.PLAINS_EFFECTS)) { + effectsBuilder.fogColor(new Color(0xC0D8FE)); // circumvent a minestom bug + } + + Biome target = Biome.builder() + .downfall(mergeNullable(properties.getDownfall(), parent.downfall())) + .hasPrecipitation(mergeNullable(properties.getPrecipitation(), parent.hasPrecipitation())) + .temperature(mergeNullable(properties.getTemperature(), parent.temperature())) + .temperatureModifier(mergeNullable(properties.getTemperatureModifier(), parent.temperatureModifier())) + .effects(effectsBuilder.build()) + .build(); + + RegistryKey registryKey = MinecraftServer.getBiomeRegistry().register(key, target); + return new UserDefinedBiome(key, registryKey, source.getID(), target); + } +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomePool.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomePool.java new file mode 100644 index 000000000..8e5eb4fbc --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomePool.java @@ -0,0 +1,45 @@ +package com.dfsek.terra.minestom.biome; + +import java.util.HashSet; +import java.util.IdentityHashMap; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.minestom.api.BiomeFactory; + + +public class MinestomUserDefinedBiomePool { + private final IdentityHashMap biomes = new IdentityHashMap<>(); + private final HashSet createdBiomes = new HashSet<>(); + private final BiomeFactory factory; + private final ConfigPack configPack; + + public MinestomUserDefinedBiomePool(ConfigPack configPack, BiomeFactory factory) { + this.configPack = configPack; + this.factory = factory; + } + + public UserDefinedBiome getBiome(Biome source) { + UserDefinedBiome userDefinedBiome = biomes.get(source); + if(userDefinedBiome != null) return userDefinedBiome; + userDefinedBiome = factory.create(configPack, source); + biomes.put(source, userDefinedBiome); + createdBiomes.add(source.getID()); + return userDefinedBiome; + } + + public void preloadBiomes(Iterable biomesToLoad) { + biomesToLoad + .forEach(biome -> { + if(!this.createdBiomes.contains(biome.getID())) { + UserDefinedBiome udf = factory.create(configPack, biome); + this.biomes.put(biome, udf); + this.createdBiomes.add(biome.getID()); + } + }); + } + + public void invalidate() { + biomes.clear(); + } +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/UserDefinedBiome.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/UserDefinedBiome.java new file mode 100644 index 000000000..40b25cfd3 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/UserDefinedBiome.java @@ -0,0 +1,49 @@ +package com.dfsek.terra.minestom.biome; + +import net.kyori.adventure.key.Key; +import net.minestom.server.MinecraftServer; +import net.minestom.server.registry.DynamicRegistry; +import net.minestom.server.registry.RegistryKey; +import net.minestom.server.world.biome.Biome; + + +public class UserDefinedBiome { + private static final DynamicRegistry BIOME_REGISTRY = MinecraftServer.getBiomeRegistry(); + + private final Key key; + private final RegistryKey registry; + private final String id; + private final Biome biome; + + private int registryId = -1; + + public UserDefinedBiome(Key key, RegistryKey registry, String id, Biome biome) { + this.key = key; + this.registry = registry; + this.id = id; + this.biome = biome; + } + + public Key key() { + return key; + } + + public RegistryKey registryKey() { + return registry; + } + + public String id() { + return id; + } + + public Biome biome() { + return biome; + } + + public int registryId() { + if(registryId == -1) { + registryId = BIOME_REGISTRY.getId(registry); + } + return registryId; + } +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/DefaultBlockEntityFactory.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/DefaultBlockEntityFactory.java index 559736b6a..a816ba441 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/DefaultBlockEntityFactory.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/DefaultBlockEntityFactory.java @@ -1,14 +1,15 @@ package com.dfsek.terra.minestom.block; -import com.dfsek.terra.api.block.entity.BlockEntity; -import com.dfsek.terra.minestom.api.BlockEntityFactory; - import net.minestom.server.coordinate.BlockVec; import net.minestom.server.instance.Instance; +import com.dfsek.terra.api.block.entity.BlockEntity; +import com.dfsek.terra.minestom.api.BlockEntityFactory; + public class DefaultBlockEntityFactory implements BlockEntityFactory { private final Instance instance; + public DefaultBlockEntityFactory(Instance instance) { this.instance = instance; } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockEntity.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockEntity.java index 3e89509fa..059bcf7f4 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockEntity.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockEntity.java @@ -1,7 +1,6 @@ package com.dfsek.terra.minestom.block; -import com.dfsek.terra.api.util.vector.Vector3; - +import com.dfsek.seismic.type.vector.Vector3; import net.minestom.server.coordinate.BlockVec; import net.minestom.server.instance.Instance; import net.minestom.server.instance.block.Block; @@ -9,6 +8,7 @@ import net.minestom.server.instance.block.Block; import com.dfsek.terra.api.block.entity.BlockEntity; import com.dfsek.terra.api.block.state.BlockState; + public class MinestomBlockEntity implements BlockEntity { private final Instance instance; private final BlockVec position; diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java index 991996380..f0a97590d 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java @@ -2,6 +2,7 @@ package com.dfsek.terra.minestom.block; import net.minestom.server.instance.block.Block; +import java.util.HashMap; import java.util.Objects; import java.util.stream.Collectors; @@ -22,10 +23,24 @@ public class MinestomBlockState implements BlockState { } public MinestomBlockState(String data) { - block = Block.fromState(data); - if (block == null) { - throw new IllegalArgumentException("Invalid block state: " + data); + if(!data.contains("[")) { + block = Block.fromKey(data); + return; } + + String[] split = data.split("\\["); + String namespaceId = split[0]; + String properties = split[1].substring(0, split[1].length() - 1); + Block block = Block.fromKey(namespaceId); + HashMap propertiesMap = new HashMap<>(); + + for(String property : properties.split(",")) { + String[] kv = property.split("="); + propertiesMap.put(kv[0].strip(), kv[1].strip()); + } + + assert block != null; + this.block = block.withProperties(propertiesMap); } @Override @@ -80,4 +95,4 @@ public class MinestomBlockState implements BlockState { public int hashCode() { return Objects.hashCode(block.id()); } -} +} \ No newline at end of file diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockType.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockType.java index 8e4bd4360..e8602306f 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockType.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockType.java @@ -1,10 +1,10 @@ package com.dfsek.terra.minestom.block; +import net.minestom.server.instance.block.Block; + import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; -import net.minestom.server.instance.block.Block; - public class MinestomBlockType implements BlockType { private final Block block; @@ -41,7 +41,7 @@ public class MinestomBlockType implements BlockType { @Override public boolean equals(Object obj) { if(obj instanceof MinestomBlockType other) { - return block.id() == other.block.id(); + return block.stateId() == other.block.stateId(); } return false; } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/CachedChunk.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/CachedChunk.java index ed9ad8622..5c0f030e4 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/CachedChunk.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/CachedChunk.java @@ -1,49 +1,48 @@ package com.dfsek.terra.minestom.chunk; -import com.dfsek.terra.api.block.state.BlockState; - -import com.dfsek.terra.api.world.chunk.generation.ProtoChunk; -import com.dfsek.terra.minestom.block.MinestomBlockState; - import net.minestom.server.instance.block.Block; import net.minestom.server.instance.generator.UnitModifier; import org.jetbrains.annotations.NotNull; +import java.util.Arrays; + +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.world.chunk.generation.ProtoChunk; +import com.dfsek.terra.minestom.block.MinestomBlockState; + public class CachedChunk implements ProtoChunk { private final int minHeight; private final int maxHeight; - private final Block[][][] blocks; + private final Block[] blocks; public CachedChunk(int minHeight, int maxHeight) { this.minHeight = minHeight; this.maxHeight = maxHeight; - this.blocks = new Block[16][maxHeight - minHeight + 1][16]; - - for(int x = 0; x < 16; x++) { - for(int z = 0; z < 16; z++) { - for(int y = 0; y < maxHeight - minHeight + 1; y++) { - blocks[x][y][z] = Block.AIR; - } - } - } + this.blocks = new Block[16 * (maxHeight - minHeight + 1) * 16]; + Arrays.fill(blocks, Block.AIR); } public void writeRelative(UnitModifier modifier) { - modifier.setAllRelative((x, y, z) -> blocks[x][y][z]); + modifier.setAllRelative((x, y, z) -> blocks[getIndex(x, y + minHeight, z)]); } @Override public void setBlock(int x, int y, int z, @NotNull BlockState blockState) { Block block = (Block) blockState.getHandle(); if(block == null) return; - blocks[x][y - minHeight][z] = block; + blocks[getIndex(x, y, z)] = block; + } + + private int getIndex(int x, int y, int z) { + int y_normalized = y - minHeight; + return x + (z * 16) + (y_normalized * 256); } @Override public @NotNull BlockState getBlock(int x, int y, int z) { - return new MinestomBlockState(blocks[x][y - minHeight][z]); + return new MinestomBlockState(blocks[getIndex(x, y, z)]); } @Override diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/GeneratedChunkCache.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/GeneratedChunkCache.java index 018c82c72..a84477fef 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/GeneratedChunkCache.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/GeneratedChunkCache.java @@ -1,11 +1,5 @@ package com.dfsek.terra.minestom.chunk; -import com.dfsek.terra.api.util.generic.pair.Pair; - -import com.dfsek.terra.api.world.ServerWorld; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; - import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; import com.github.benmanes.caffeine.cache.stats.CacheStats; @@ -13,6 +7,11 @@ import net.minestom.server.world.DimensionType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.world.ServerWorld; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; + public class GeneratedChunkCache { private static final Logger log = LoggerFactory.getLogger(GeneratedChunkCache.class); @@ -22,13 +21,15 @@ public class GeneratedChunkCache { private final ServerWorld world; private final BiomeProvider biomeProvider; - public GeneratedChunkCache(DimensionType dimensionType, ChunkGenerator generator, ServerWorld world) { + public GeneratedChunkCache(DimensionType dimensionType, ChunkGenerator generator, ServerWorld world, BiomeProvider biomeProvider) { this.dimensionType = dimensionType; this.generator = generator; this.world = world; - this.biomeProvider = world.getBiomeProvider(); - this.cache = Caffeine.newBuilder().maximumSize(128).recordStats().build( - (Pair key) -> generateChunk(key.getLeft(), key.getRight())); + this.biomeProvider = biomeProvider; + this.cache = Caffeine.newBuilder() + .maximumSize(128) + .recordStats() + .build((Pair key) -> generateChunk(key.getLeft(), key.getRight())); } private CachedChunk generateChunk(int x, int z) { @@ -39,8 +40,13 @@ public class GeneratedChunkCache { public void displayStats() { CacheStats stats = cache.stats(); - log.info("Avg load time: {}ms | Hit rate: {}% | Load Count: {}", stats.averageLoadPenalty(), stats.hitRate() * 100, - stats.loadCount()); + log.info("Avg load time: %.4fms | Hit rate: %3.4f%% | Load Count: %d" + .formatted( + stats.averageLoadPenalty() / 1000000f, + stats.hitRate() * 100, + stats.loadCount() + ) + ); } public CachedChunk at(int x, int z) { diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/TerraMinestomChunk.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/TerraMinestomChunk.java index fdcf01aa7..4056f9bf9 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/TerraMinestomChunk.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/TerraMinestomChunk.java @@ -1,18 +1,17 @@ package com.dfsek.terra.minestom.chunk; -import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.world.ServerWorld; -import com.dfsek.terra.api.world.chunk.Chunk; - -import com.dfsek.terra.minestom.block.MinestomBlockState; - import net.minestom.server.instance.block.Block; import org.jetbrains.annotations.NotNull; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.world.ServerWorld; +import com.dfsek.terra.api.world.chunk.Chunk; +import com.dfsek.terra.minestom.block.MinestomBlockState; + public class TerraMinestomChunk implements Chunk { - private net.minestom.server.instance.Chunk delegate; private final ServerWorld world; + private net.minestom.server.instance.Chunk delegate; public TerraMinestomChunk(net.minestom.server.instance.Chunk delegate, ServerWorld world) { this.delegate = delegate; diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeAdditionsSoundTemplate.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeAdditionsSoundTemplate.java new file mode 100644 index 000000000..85e4499fc --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeAdditionsSoundTemplate.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.minestom.config; + +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.minestom.server.sound.SoundEvent; +import net.minestom.server.world.biome.BiomeEffects; + + +public class BiomeAdditionsSoundTemplate implements ObjectTemplate { + @Value("sound") + @Default + private SoundEvent sound = null; + + @Value("sound-chance") + @Default + private Double soundChance = null; + + @Override + public BiomeEffects.AdditionsSound get() { + if(sound == null) return null; + return new BiomeEffects.AdditionsSound(sound, soundChance); + } +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeMoodSoundTemplate.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeMoodSoundTemplate.java new file mode 100644 index 000000000..a3b7bb3c8 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeMoodSoundTemplate.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.minestom.config; + +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.minestom.server.sound.SoundEvent; +import net.minestom.server.world.biome.BiomeEffects; + + +public class BiomeMoodSoundTemplate implements ObjectTemplate { + @Value("sound") + @Default + private SoundEvent sound = null; + + @Value("cultivation-ticks") + @Default + private Integer soundCultivationTicks = null; + + @Value("spawn-range") + @Default + private Integer soundSpawnRange = null; + + @Value("extra-distance") + @Default + private Double soundExtraDistance = null; + + @Override + public BiomeEffects.MoodSound get() { + if(sound == null) return null; + return new BiomeEffects.MoodSound( + sound, + soundCultivationTicks, + soundSpawnRange, + soundExtraDistance + ); + } +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeParticleConfigTemplate.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeParticleConfigTemplate.java new file mode 100644 index 000000000..c095b7893 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeParticleConfigTemplate.java @@ -0,0 +1,30 @@ +package com.dfsek.terra.minestom.config; + +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.minestom.server.particle.Particle; +import net.minestom.server.world.biome.BiomeEffects; + + +public class BiomeParticleConfigTemplate implements ObjectTemplate { + @Value("particle") + @Default + private String particle = null; + + @Value("probability") + @Default + private Float probability = null; + + @Override + public BiomeEffects.Particle get() { + if(particle == null || probability == null) { + return null; + } + + return new BiomeEffects.Particle( + probability, + Particle.fromKey(particle) + ); + } +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/KeyLoader.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/KeyLoader.java new file mode 100644 index 000000000..64329307a --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/KeyLoader.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.minestom.config; + +import com.dfsek.tectonic.api.depth.DepthTracker; +import com.dfsek.tectonic.api.exception.LoadException; +import com.dfsek.tectonic.api.loader.ConfigLoader; +import com.dfsek.tectonic.api.loader.type.TypeLoader; +import net.kyori.adventure.key.InvalidKeyException; +import net.kyori.adventure.key.Key; +import org.intellij.lang.annotations.Subst; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.AnnotatedType; + + +public class KeyLoader implements TypeLoader { + @Override + public Key load( + @NotNull AnnotatedType annotatedType, + @NotNull Object o, + @NotNull ConfigLoader configLoader, + DepthTracker depthTracker + ) throws LoadException { + if(!(o instanceof @Subst("a:o")String stringKey)) { + throw new LoadException("Value is not a String", depthTracker); + } + try { + return Key.key(stringKey); + } catch(InvalidKeyException e) { + throw new LoadException("Can't load key: Invalid Format", e, depthTracker); + } + } +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/RGBLikeLoader.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/RGBLikeLoader.java new file mode 100644 index 000000000..b89507d1f --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/RGBLikeLoader.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.minestom.config; + +import com.dfsek.tectonic.api.depth.DepthTracker; +import com.dfsek.tectonic.api.exception.LoadException; +import com.dfsek.tectonic.api.loader.ConfigLoader; +import com.dfsek.tectonic.api.loader.type.TypeLoader; +import net.kyori.adventure.util.RGBLike; +import net.minestom.server.color.Color; +import org.intellij.lang.annotations.Subst; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.AnnotatedType; + + +public class RGBLikeLoader implements TypeLoader { + @Override + public RGBLike load( + @NotNull AnnotatedType annotatedType, + @NotNull Object o, + @NotNull ConfigLoader configLoader, + DepthTracker depthTracker + ) throws LoadException { + if(!(o instanceof @Subst("a:o")Integer value)) { + throw new LoadException("Value is not an integer", depthTracker); + } + return new Color(value); + } +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/SoundEventTemplate.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/SoundEventTemplate.java new file mode 100644 index 000000000..c8bd81a13 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/SoundEventTemplate.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.minestom.config; + +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.kyori.adventure.key.Key; +import net.minestom.server.sound.SoundEvent; + + +public class SoundEventTemplate implements ObjectTemplate { + @Value("id") + @Default + private Key id = null; + + @Value("distance-to-travel") + @Default + private Float distanceToTravel = null; + + @Override + public SoundEvent get() { + if(id == null) { + return null; + } else { + // distanceToTravel is specifically allowed to be null. + return SoundEvent.of(id, distanceToTravel); + } + } +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/VanillaBiomeProperties.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/VanillaBiomeProperties.java new file mode 100644 index 000000000..14b91b5c1 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/VanillaBiomeProperties.java @@ -0,0 +1,139 @@ +package com.dfsek.terra.minestom.config; + +import com.dfsek.tectonic.api.config.template.ConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import net.kyori.adventure.util.RGBLike; +import net.minestom.server.sound.SoundEvent; +import net.minestom.server.world.biome.Biome.TemperatureModifier; +import net.minestom.server.world.biome.BiomeEffects; +import net.minestom.server.world.biome.BiomeEffects.GrassColorModifier; + +import com.dfsek.terra.api.properties.Properties; + + +public class VanillaBiomeProperties implements ConfigTemplate, Properties { + @Value("colors.grass") + @Default + private RGBLike grassColor = null; + + @Value("colors.fog") + @Default + private RGBLike fogColor = null; + + @Value("colors.water") + @Default + private RGBLike waterColor = null; + + @Value("colors.water-fog") + @Default + private RGBLike waterFogColor = null; + + @Value("colors.foliage") + @Default + private RGBLike foliageColor = null; + + @Value("colors.sky") + @Default + private RGBLike skyColor = null; + + @Value("colors.modifier") + @Default + private GrassColorModifier grassColorModifier = null; + + @Value("particles") + @Default + private BiomeEffects.Particle particleConfig = null; + + @Value("climate.precipitation") + @Default + private Boolean precipitation = null; + + @Value("climate.temperature") + @Default + private Float temperature = null; + + @Value("climate.temperature-modifier") + @Default + private TemperatureModifier temperatureModifier = null; + + @Value("climate.downfall") + @Default + private Float downfall = null; + + @Value("sound.loop-sound.sound") + @Default + private SoundEvent loopSound = null; + + @Value("sound.mood-sound") + @Default + private BiomeEffects.MoodSound moodSound = null; + + @Value("sound.additions-sound") + @Default + private BiomeEffects.AdditionsSound additionsSound = null; + + // @Value("sound.music") + // @Default + // private MusicSound music = null; + + public RGBLike getGrassColor() { + return grassColor; + } + + public RGBLike getFogColor() { + return fogColor; + } + + public RGBLike getWaterColor() { + return waterColor; + } + + public RGBLike getWaterFogColor() { + return waterFogColor; + } + + public RGBLike getFoliageColor() { + return foliageColor; + } + + public RGBLike getSkyColor() { + return skyColor; + } + + public GrassColorModifier getGrassColorModifier() { + return grassColorModifier; + } + + public BiomeEffects.Particle getParticleConfig() { + return particleConfig; + } + + public Boolean getPrecipitation() { + return precipitation; + } + + public Float getTemperature() { + return temperature; + } + + public TemperatureModifier getTemperatureModifier() { + return temperatureModifier; + } + + public Float getDownfall() { + return downfall; + } + + public SoundEvent getLoopSound() { + return loopSound; + } + + public BiomeEffects.MoodSound getMoodSound() { + return moodSound; + } + + public BiomeEffects.AdditionsSound getAdditionsSound() { + return additionsSound; + } +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DefaultEntityFactory.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DefaultEntityFactory.java index 23226fc99..c25e86cf5 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DefaultEntityFactory.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DefaultEntityFactory.java @@ -1,10 +1,10 @@ package com.dfsek.terra.minestom.entity; -import com.dfsek.terra.minestom.api.EntityFactory; - import net.minestom.server.entity.Entity; import net.minestom.server.entity.EntityType; +import com.dfsek.terra.minestom.api.EntityFactory; + public class DefaultEntityFactory implements EntityFactory { @Override diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DeferredMinestomEntity.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DeferredMinestomEntity.java index 4a053ec2d..965ab2050 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DeferredMinestomEntity.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DeferredMinestomEntity.java @@ -1,13 +1,13 @@ package com.dfsek.terra.minestom.entity; +import com.dfsek.seismic.type.vector.Vector3; +import net.minestom.server.coordinate.Pos; + import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.EntityType; -import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.minestom.world.TerraMinestomWorld; -import net.minestom.server.coordinate.Pos; - public class DeferredMinestomEntity implements Entity { private final EntityType type; diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntity.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntity.java index c46a6a1d3..0818b19fa 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntity.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntity.java @@ -1,16 +1,15 @@ package com.dfsek.terra.minestom.entity; -import com.dfsek.terra.api.entity.EntityType; -import com.dfsek.terra.api.util.vector.Vector3; -import com.dfsek.terra.api.world.ServerWorld; - -import com.dfsek.terra.minestom.MinestomAdapter; -import com.dfsek.terra.minestom.world.TerraMinestomWorld; - +import com.dfsek.seismic.type.vector.Vector3; import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.Entity; import net.minestom.server.instance.Instance; +import com.dfsek.terra.api.entity.EntityType; +import com.dfsek.terra.api.world.ServerWorld; +import com.dfsek.terra.minestom.MinestomAdapter; +import com.dfsek.terra.minestom.world.TerraMinestomWorld; + public class MinestomEntity implements com.dfsek.terra.api.entity.Entity { private final Entity delegate; @@ -21,6 +20,13 @@ public class MinestomEntity implements com.dfsek.terra.api.entity.Entity { this.world = world; } + public static MinestomEntity spawn(double x, double y, double z, EntityType type, TerraMinestomWorld world) { + Instance instance = world.getHandle(); + Entity entity = world.getEntityFactory().createEntity(((MinestomEntityType) type).getHandle()); + entity.setInstance(instance, new Pos(x, y, z)); + return new MinestomEntity(entity, world); + } + @Override public Vector3 position() { return MinestomAdapter.adapt(delegate.getPosition()); @@ -45,11 +51,4 @@ public class MinestomEntity implements com.dfsek.terra.api.entity.Entity { public Object getHandle() { return delegate; } - - public static MinestomEntity spawn(double x, double y, double z, EntityType type, TerraMinestomWorld world) { - Instance instance = world.getHandle(); - Entity entity = world.getEntityFactory().createEntity(((MinestomEntityType) type).getHandle()); - entity.setInstance(instance, new Pos(x, y, z)); - return new MinestomEntity(entity, world); - } } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntityType.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntityType.java index fbcd2a9f0..1efa1cbd5 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntityType.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntityType.java @@ -1,6 +1,5 @@ package com.dfsek.terra.minestom.entity; - import net.minestom.server.entity.EntityType; @@ -15,4 +14,4 @@ public class MinestomEntityType implements com.dfsek.terra.api.entity.EntityType public EntityType getHandle() { return delegate; } -} +} \ No newline at end of file diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomEnchantment.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomEnchantment.java index ca32a8dc9..26ab94cac 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomEnchantment.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomEnchantment.java @@ -1,51 +1,67 @@ package com.dfsek.terra.minestom.item; -import com.dfsek.terra.api.inventory.ItemStack; -import com.dfsek.terra.api.inventory.item.Enchantment; - +import net.kyori.adventure.key.Key; import net.minestom.server.MinecraftServer; import net.minestom.server.item.Material; import net.minestom.server.registry.DynamicRegistry; import net.minestom.server.registry.RegistryKey; +import java.util.Objects; + +import com.dfsek.terra.api.inventory.ItemStack; +import com.dfsek.terra.api.inventory.item.Enchantment; + public class MinestomEnchantment implements Enchantment { - private final net.minestom.server.item.enchant.Enchantment registryItem; - private final RegistryKey id; - private static final DynamicRegistry enchantmentRegistry = - MinecraftServer.getEnchantmentRegistry(); + private final net.minestom.server.item.enchant.Enchantment delegate; + private final String id; - public MinestomEnchantment(RegistryKey id) { - this.id = id; - this.registryItem = enchantmentRegistry.get(id); + public MinestomEnchantment(net.minestom.server.item.enchant.Enchantment delegate) { + this.delegate = delegate; + DynamicRegistry registry = MinecraftServer.getEnchantmentRegistry(); + this.id = Objects.requireNonNull(registry.getKey(delegate)).toString(); } public MinestomEnchantment(String id) { - this(RegistryKey.unsafeOf(id)); + Key key = Key.key(id); + this.delegate = MinecraftServer.getEnchantmentRegistry().get(key); + this.id = id; } @Override public boolean canEnchantItem(ItemStack itemStack) { - return registryItem.supportedItems().contains((Material) itemStack.getType().getHandle()); + return delegate.supportedItems().contains((Material) itemStack.getType().getHandle()); } @Override public boolean conflictsWith(Enchantment other) { - return registryItem.exclusiveSet().contains(((MinestomEnchantment) other).id); + var otherDelegate = ((MinestomEnchantment) other).delegate; + delegate.exclusiveSet(); + + // Get the registry key for the other enchantment to use in contains + try { + DynamicRegistry registry = MinecraftServer.getEnchantmentRegistry(); + RegistryKey otherKey = registry.getKey(otherDelegate); + return delegate.exclusiveSet().contains(otherKey); + } catch(Exception e) { + // If the key approach fails, fall back to a more basic implementation + String otherId = ((MinestomEnchantment) other).id; + return otherId.equals(this.id); + } } @Override public String getID() { - return id.name(); + return id; } @Override public int getMaxLevel() { - return registryItem.maxLevel(); + return delegate.maxLevel(); } @Override public net.minestom.server.item.enchant.Enchantment getHandle() { - return registryItem; + return delegate; } -} +} \ No newline at end of file diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemHandle.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemHandle.java index a4ff0c344..dddc4c738 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemHandle.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemHandle.java @@ -1,14 +1,14 @@ package com.dfsek.terra.minestom.item; -import com.dfsek.terra.api.handle.ItemHandle; -import com.dfsek.terra.api.inventory.Item; -import com.dfsek.terra.api.inventory.item.Enchantment; - import net.minestom.server.MinecraftServer; import java.util.Set; import java.util.stream.Collectors; +import com.dfsek.terra.api.handle.ItemHandle; +import com.dfsek.terra.api.inventory.Item; +import com.dfsek.terra.api.inventory.item.Enchantment; + public class MinestomItemHandle implements ItemHandle { @Override @@ -23,6 +23,6 @@ public class MinestomItemHandle implements ItemHandle { @Override public Set getEnchantments() { - return MinecraftServer.getEnchantmentRegistry().keys().stream().map(MinestomEnchantment::new).collect(Collectors.toSet()); + return MinecraftServer.getEnchantmentRegistry().values().stream().map(MinestomEnchantment::new).collect(Collectors.toSet()); } } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemMeta.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemMeta.java index 861a9549c..c239527ef 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemMeta.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemMeta.java @@ -1,11 +1,11 @@ package com.dfsek.terra.minestom.item; -import com.dfsek.terra.api.inventory.item.Enchantment; -import com.dfsek.terra.api.inventory.item.ItemMeta; - import java.util.HashMap; import java.util.Map; +import com.dfsek.terra.api.inventory.item.Enchantment; +import com.dfsek.terra.api.inventory.item.ItemMeta; + public class MinestomItemMeta implements ItemMeta { private final HashMap enchantments; diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemStack.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemStack.java index 1da6cba76..04256c4c0 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemStack.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemStack.java @@ -1,10 +1,5 @@ package com.dfsek.terra.minestom.item; -import com.dfsek.terra.api.inventory.Item; - -import com.dfsek.terra.api.inventory.item.Enchantment; -import com.dfsek.terra.api.inventory.item.ItemMeta; - import net.minestom.server.MinecraftServer; import net.minestom.server.component.DataComponents; import net.minestom.server.item.ItemStack; @@ -16,6 +11,10 @@ import org.jetbrains.annotations.NotNull; import java.util.HashMap; import java.util.Objects; +import com.dfsek.terra.api.inventory.Item; +import com.dfsek.terra.api.inventory.item.Enchantment; +import com.dfsek.terra.api.inventory.item.ItemMeta; + public class MinestomItemStack implements com.dfsek.terra.api.inventory.ItemStack { private ItemStack base; @@ -50,7 +49,8 @@ public class MinestomItemStack implements com.dfsek.terra.api.inventory.ItemStac EnchantmentList enchantmentList = base.get(DataComponents.ENCHANTMENTS); if(enchantmentList != null) { enchantmentList.enchantments().forEach((enchantmentKey, integer) -> { - enchantments.put(new MinestomEnchantment(enchantmentKey), integer); + enchantments.put( + new MinestomEnchantment(Objects.requireNonNull(MinecraftServer.getEnchantmentRegistry().get(enchantmentKey))), integer); }); } return new MinestomItemMeta(enchantments); diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomMaterial.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomMaterial.java index fea36bbb9..805fd3f6a 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomMaterial.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomMaterial.java @@ -1,10 +1,10 @@ package com.dfsek.terra.minestom.item; +import net.minestom.server.item.Material; + import com.dfsek.terra.api.inventory.Item; import com.dfsek.terra.api.inventory.ItemStack; -import net.minestom.server.item.Material; - public class MinestomMaterial implements Item { private final Material delegate; @@ -14,7 +14,7 @@ public class MinestomMaterial implements Item { } public MinestomMaterial(String id) { - this.delegate = Material.fromKey(id); + this.delegate = Material.fromId(Integer.parseInt(id)); } @Override @@ -31,4 +31,4 @@ public class MinestomMaterial implements Item { public Material getHandle() { return delegate; } -} +} \ No newline at end of file diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomChunkGeneratorWrapper.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomChunkGeneratorWrapper.java index 81529db48..3e4d421e4 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomChunkGeneratorWrapper.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomChunkGeneratorWrapper.java @@ -1,43 +1,88 @@ package com.dfsek.terra.minestom.world; -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; - -import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; -import com.dfsek.terra.api.world.chunk.generation.util.GeneratorWrapper; -import com.dfsek.terra.minestom.chunk.CachedChunk; -import com.dfsek.terra.minestom.chunk.GeneratedChunkCache; - import net.minestom.server.coordinate.Point; import net.minestom.server.instance.generator.GenerationUnit; import net.minestom.server.instance.generator.Generator; +import net.minestom.server.instance.generator.GeneratorImpl.AreaModifierImpl; +import net.minestom.server.instance.generator.GeneratorImpl.SectionModifierImpl; +import net.minestom.server.instance.generator.UnitModifier; +import net.minestom.server.instance.palette.Palette; import org.jetbrains.annotations.NotNull; +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; +import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; +import com.dfsek.terra.api.world.chunk.generation.util.GeneratorWrapper; +import com.dfsek.terra.minestom.biome.MinestomUserDefinedBiomePool; +import com.dfsek.terra.minestom.biome.UserDefinedBiome; +import com.dfsek.terra.minestom.chunk.CachedChunk; +import com.dfsek.terra.minestom.chunk.GeneratedChunkCache; + public class MinestomChunkGeneratorWrapper implements Generator, GeneratorWrapper { private final GeneratedChunkCache cache; - private ChunkGenerator generator; private final TerraMinestomWorld world; + private final BiomeProvider biomeProvider; + private final MinestomUserDefinedBiomePool biomePool; + private ChunkGenerator generator; private ConfigPack pack; - public MinestomChunkGeneratorWrapper(ChunkGenerator generator, TerraMinestomWorld world, ConfigPack pack) { + public MinestomChunkGeneratorWrapper( + ChunkGenerator generator, + TerraMinestomWorld world, + ConfigPack pack, + MinestomUserDefinedBiomePool biomePool + ) { this.generator = generator; this.world = world; this.pack = pack; - this.cache = new GeneratedChunkCache(world.getDimensionType(), generator, world); + this.biomePool = biomePool; + this.biomeProvider = pack.getBiomeProvider(); + this.cache = new GeneratedChunkCache(world.getDimensionType(), generator, world, biomeProvider); + preloadBiomes(); } public ChunkGenerator getGenerator() { return generator; } + @SuppressWarnings("UnstableApiUsage") @Override public void generate(@NotNull GenerationUnit unit) { Point start = unit.absoluteStart(); int x = start.chunkX(); int z = start.chunkZ(); + int blockX = start.blockX(); + int blockZ = start.blockZ(); CachedChunk chunk = cache.at(x, z); - chunk.writeRelative(unit.modifier()); + UnitModifier modifier = unit.modifier(); + chunk.writeRelative(modifier); + + AreaModifierImpl areaModifiers = (AreaModifierImpl) modifier; + for(GenerationUnit section : areaModifiers.sections()) { + SectionModifierImpl sectionModifier = (SectionModifierImpl) section.modifier(); + Palette biomes = sectionModifier.genSection().biomes(); + int minY = section.absoluteStart().blockY(); + for(int relativeX = 0; relativeX < 16; relativeX += 1) { + int absoluteX = blockX + relativeX; + for(int relativeZ = 0; relativeZ < 16; relativeZ += 1) { + int absoluteZ = blockZ + relativeZ; + for(int relativeY = 0; relativeY < 16; relativeY += 1) { + int absoluteY = minY + relativeY; + + if(relativeX % 4 == 0 && relativeY % 4 == 0 && relativeZ % 4 == 0) { + UserDefinedBiome userDefinedBiome = biomePool.getBiome( + biomeProvider.getBiome(absoluteX, absoluteY, absoluteZ, world.getSeed()) + ); + + int registryId = userDefinedBiome.registryId(); + biomes.set(relativeX / 4, relativeY / 4, relativeZ / 4, registryId); + } + } + } + } + } unit.fork(setter -> { MinestomProtoWorld protoWorld = new MinestomProtoWorld(cache, x, z, world, setter); @@ -55,6 +100,12 @@ public class MinestomChunkGeneratorWrapper implements Generator, GeneratorWrappe public void setPack(ConfigPack pack) { this.pack = pack; this.generator = pack.getGeneratorProvider().newInstance(pack); + this.biomePool.invalidate(); + preloadBiomes(); + } + + private void preloadBiomes() { + this.biomePool.preloadBiomes(world.getBiomeProvider().getBiomes()); } public void displayStats() { diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomProtoWorld.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomProtoWorld.java index 65ec22654..44afc9353 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomProtoWorld.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomProtoWorld.java @@ -1,5 +1,8 @@ package com.dfsek.terra.minestom.world; +import net.minestom.server.instance.block.Block; +import net.minestom.server.instance.block.Block.Setter; + import com.dfsek.terra.api.block.entity.BlockEntity; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.ConfigPack; @@ -11,12 +14,8 @@ import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; import com.dfsek.terra.api.world.chunk.generation.ProtoWorld; import com.dfsek.terra.minestom.chunk.CachedChunk; import com.dfsek.terra.minestom.chunk.GeneratedChunkCache; - import com.dfsek.terra.minestom.entity.DeferredMinestomEntity; -import net.minestom.server.instance.block.Block; -import net.minestom.server.instance.block.Block.Setter; - public class MinestomProtoWorld implements ProtoWorld { private final GeneratedChunkCache cache; @@ -51,6 +50,10 @@ public class MinestomProtoWorld implements ProtoWorld { @Override public void setBlockState(int x, int y, int z, BlockState data, boolean physics) { modifier.setBlock(x, y, z, (Block) data.getHandle()); + int chunkX = x >> 4; + int chunkZ = z >> 4; + CachedChunk chunk = cache.at(chunkX, chunkZ); + chunk.setBlock(x & 15, y, z & 15, data); } @Override diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomWorldHandle.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomWorldHandle.java index 98429ab6d..777850952 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomWorldHandle.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomWorldHandle.java @@ -1,15 +1,14 @@ package com.dfsek.terra.minestom.world; +import net.minestom.server.instance.block.Block; +import org.jetbrains.annotations.NotNull; + import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.entity.EntityType; import com.dfsek.terra.api.handle.WorldHandle; - import com.dfsek.terra.minestom.block.MinestomBlockState; import com.dfsek.terra.minestom.entity.MinestomEntityType; -import net.minestom.server.instance.block.Block; -import org.jetbrains.annotations.NotNull; - public class MinestomWorldHandle implements WorldHandle { private static final MinestomBlockState AIR = new MinestomBlockState(Block.AIR); diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorld.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorld.java index 4f4aef091..fe272a864 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorld.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorld.java @@ -1,23 +1,5 @@ package com.dfsek.terra.minestom.world; -import com.dfsek.terra.api.block.entity.BlockEntity; -import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.entity.Entity; -import com.dfsek.terra.api.entity.EntityType; -import com.dfsek.terra.api.world.ServerWorld; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import com.dfsek.terra.api.world.chunk.Chunk; - -import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; - -import com.dfsek.terra.api.world.info.WorldProperties; - -import com.dfsek.terra.minestom.api.BlockEntityFactory; -import com.dfsek.terra.minestom.api.EntityFactory; -import com.dfsek.terra.minestom.block.MinestomBlockState; -import com.dfsek.terra.minestom.entity.MinestomEntity; - import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.BlockVec; import net.minestom.server.coordinate.Point; @@ -27,6 +9,24 @@ import net.minestom.server.world.DimensionType; import java.util.function.Consumer; +import com.dfsek.terra.api.block.entity.BlockEntity; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.entity.Entity; +import com.dfsek.terra.api.entity.EntityType; +import com.dfsek.terra.api.world.ServerWorld; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.chunk.Chunk; +import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; +import com.dfsek.terra.api.world.info.WorldProperties; +import com.dfsek.terra.minestom.TerraMinestomPlatform; +import com.dfsek.terra.minestom.api.BiomeFactory; +import com.dfsek.terra.minestom.api.BlockEntityFactory; +import com.dfsek.terra.minestom.api.EntityFactory; +import com.dfsek.terra.minestom.biome.MinestomUserDefinedBiomePool; +import com.dfsek.terra.minestom.block.MinestomBlockState; +import com.dfsek.terra.minestom.entity.MinestomEntity; + public final class TerraMinestomWorld implements ServerWorld, WorldProperties { private final Instance instance; @@ -37,8 +37,15 @@ public final class TerraMinestomWorld implements ServerWorld, WorldProperties { private final EntityFactory entityFactory; private final BlockEntityFactory blockEntityFactory; - public TerraMinestomWorld(Instance instance, ConfigPack pack, long seed, EntityFactory entityFactory, - BlockEntityFactory blockEntityFactory) { + public TerraMinestomWorld( + TerraMinestomPlatform platform, + Instance instance, + ConfigPack pack, + long seed, + EntityFactory entityFactory, + BlockEntityFactory blockEntityFactory, + BiomeFactory factory + ) { this.instance = instance; this.pack = pack; this.seed = seed; @@ -46,7 +53,12 @@ public final class TerraMinestomWorld implements ServerWorld, WorldProperties { this.dimensionType = MinecraftServer.getDimensionTypeRegistry().get(instance.getDimensionType()); this.blockEntityFactory = blockEntityFactory; - this.wrapper = new MinestomChunkGeneratorWrapper(pack.getGeneratorProvider().newInstance(pack), this, pack); + this.wrapper = new MinestomChunkGeneratorWrapper( + pack.getGeneratorProvider().newInstance(pack), + this, + pack, + new MinestomUserDefinedBiomePool(pack, factory) + ); this.entityFactory = entityFactory; instance.setGenerator(this.wrapper); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/MinecraftAddon.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/MinecraftAddon.java index 9d7dfdcae..4586dce2a 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/MinecraftAddon.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/MinecraftAddon.java @@ -31,6 +31,7 @@ import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.mod.config.PostLoadCompatibilityOptions; import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions; import com.dfsek.terra.mod.config.VanillaBiomeProperties; +import com.dfsek.terra.mod.config.VanillaWorldProperties; public abstract class MinecraftAddon implements BaseAddon { @@ -44,6 +45,12 @@ public abstract class MinecraftAddon implements BaseAddon { @Override public void initialize() { + modPlatform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPostLoadEvent.class) + .then(event -> event.getPack().getContext().put(event.loadTemplate(new VanillaWorldProperties()))) + .priority(100) + .global(); modPlatform.getEventManager() .getHandler(FunctionalEventHandler.class) .register(this, ConfigPackPreLoadEvent.class) diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java index 3f3296f10..262fbf8fe 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java @@ -20,15 +20,14 @@ import net.minecraft.world.biome.Biome.TemperatureModifier; import net.minecraft.world.biome.BiomeEffects.GrassColorModifier; import net.minecraft.world.biome.BiomeParticleConfig; import net.minecraft.world.biome.SpawnSettings; -import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.WorldPreset; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.jetbrains.annotations.NotNull; +import java.util.HashSet; import java.util.List; -import java.util.Locale; import java.util.function.BiConsumer; import com.dfsek.terra.AbstractPlatform; @@ -60,8 +59,16 @@ public abstract class ModPlatform extends AbstractPlatform { public abstract MinecraftServer getServer(); public void registerWorldTypes(BiConsumer registerFunction) { + HashSet configPacksInMetaPack = new HashSet<>(); + getRawMetaConfigRegistry().forEach(pack -> { + PresetUtil.createMetaPackPreset(pack, this, false).apply(registerFunction); + pack.packs().forEach((k, v) -> configPacksInMetaPack.add(v.getID())); + }); getRawConfigRegistry() - .forEach(pack -> PresetUtil.createDefault(pack, this).apply(registerFunction)); + .forEach(pack -> { + boolean packInMetapack = configPacksInMetaPack.contains(pack.getID()); + PresetUtil.createDefault(pack, this, packInMetapack, packInMetapack).apply(registerFunction); + }); } @Override @@ -74,14 +81,11 @@ public abstract class ModPlatform extends AbstractPlatform { throw new LoadException("Invalid identifier: " + o, depthTracker); return identifier; }) - .registerLoader(Precipitation.class, (type, o, loader, depthTracker) -> Precipitation.valueOf(((String) o).toUpperCase( - Locale.ROOT))) + .registerLoader(Precipitation.class, (type, o, loader, depthTracker) -> Precipitation.valueOf(((String) o).toUpperCase())) .registerLoader(GrassColorModifier.class, - (type, o, loader, depthTracker) -> GrassColorModifier.valueOf(((String) o).toUpperCase( - Locale.ROOT))) - .registerLoader(GrassColorModifier.class, - (type, o, loader, depthTracker) -> TemperatureModifier.valueOf(((String) o).toUpperCase( - Locale.ROOT))) + (type, o, loader, depthTracker) -> GrassColorModifier.valueOf(((String) o).toUpperCase())) + .registerLoader(TemperatureModifier.class, + (type, o, loader, depthTracker) -> TemperatureModifier.valueOf(((String) o).toUpperCase())) .registerLoader(SpawnGroup.class, (type, o, loader, depthTracker) -> SpawnGroup.valueOf((String) o)) .registerLoader(BiomeParticleConfig.class, BiomeParticleConfigTemplate::new) .registerLoader(SoundEvent.class, SoundEventTemplate::new) diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeParticleConfigTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeParticleConfigTemplate.java index 6c253a19a..ba2c4c1fb 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeParticleConfigTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeParticleConfigTemplate.java @@ -32,7 +32,7 @@ public class BiomeParticleConfigTemplate implements ObjectTemplate { + @Value("piglin-safe") + @Default + private Boolean piglinSafe = null; + + @Value("has-raids") + @Default + private Boolean hasRaids = null; + + @Value("monster-spawn-light") + @Default + private Range monsterSpawnLight = null; + + @Value("monster-spawn-block-light-limit") + @Default + private Integer monsterSpawnBlockLightLimit = null; + + public Boolean getPiglinSafe() { + return piglinSafe; + } + + public Boolean getHasRaids() { + return hasRaids; + } + + public Range getMonsterSpawnLight() { + return monsterSpawnLight; + } + + public Integer getMonsterSpawnBlockLightLimit() { + return monsterSpawnBlockLightLimit; + } + + + @Override + public MonsterSettingsConfig get() { + return this; + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/MusicSoundTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/MusicSoundTemplate.java index 83a2f20ec..c10f132b8 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/MusicSoundTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/MusicSoundTemplate.java @@ -7,19 +7,17 @@ import net.minecraft.registry.Registries; import net.minecraft.sound.MusicSound; import net.minecraft.sound.SoundEvent; +import com.dfsek.terra.api.util.range.Range; + public class MusicSoundTemplate implements ObjectTemplate { @Value("sound") @Default private SoundEvent sound = null; - @Value("min-delay") + @Value("delay") @Default - private Integer minDelay = null; - - @Value("max-delay") - @Default - private Integer maxDelay = null; + private Range delay = null; @Value("replace-current-music") @Default @@ -27,10 +25,10 @@ public class MusicSoundTemplate implements ObjectTemplate { @Override public MusicSound get() { - if(sound == null || minDelay == null || maxDelay == null || replaceCurrentMusic == null) { + if(sound == null || delay == null || replaceCurrentMusic == null) { return null; } else { - return new MusicSound(Registries.SOUND_EVENT.getEntry(sound), minDelay, maxDelay, replaceCurrentMusic); + return new MusicSound(Registries.SOUND_EVENT.getEntry(sound), delay.getMin(), delay.getMax(), replaceCurrentMusic); } } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/PreLoadCompatibilityOptions.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/PreLoadCompatibilityOptions.java index 7efd74015..3dce7ef6e 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/PreLoadCompatibilityOptions.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/PreLoadCompatibilityOptions.java @@ -42,6 +42,10 @@ public class PreLoadCompatibilityOptions implements ConfigTemplate, Properties { @Default private double airThreshold = -0.5; + @Value("minecraft.inject-flora") + @Default + private boolean injectFlora = false; + public boolean useVanillaBiomes() { return vanillaBiomes; } @@ -57,4 +61,8 @@ public class PreLoadCompatibilityOptions implements ConfigTemplate, Properties { public double getAirThreshold() { return airThreshold; } + + public boolean isInjectFlora() { + return injectFlora; + } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnEntryConfig.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnEntryConfig.java index 058437303..36cd0305d 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnEntryConfig.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnEntryConfig.java @@ -6,6 +6,8 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import net.minecraft.entity.EntityType; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; +import com.dfsek.terra.api.util.range.Range; + public class SpawnEntryConfig implements ObjectTemplate { @Value("type") @@ -16,20 +18,16 @@ public class SpawnEntryConfig implements ObjectTemplate { @Default private Integer weight = null; - @Value("min-group-size") + @Value("group-size") @Default - private Integer minGroupSize = null; - - @Value("max-group-size") - @Default - private Integer maxGroupSize = null; + private Range groupSize = null; public Integer getWeight() { return weight; } public SpawnEntry getSpawnEntry() { - return new SpawnEntry(type, minGroupSize, maxGroupSize); + return new SpawnEntry(type, groupSize.getMin(), groupSize.getMax()); } @Override diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaWorldProperties.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaWorldProperties.java new file mode 100644 index 000000000..4534bc617 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaWorldProperties.java @@ -0,0 +1,179 @@ +package com.dfsek.terra.mod.config; + +import com.dfsek.tectonic.api.config.template.ConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import net.minecraft.util.Identifier; + +import com.dfsek.terra.api.properties.Properties; +import com.dfsek.terra.api.util.range.ConstantRange; +import com.dfsek.terra.api.util.range.Range; + + +public class VanillaWorldProperties implements ConfigTemplate, Properties { + + @Value("vanilla") + @Default + private String vanillaDimension = "minecraft:overworld"; + + @Value("vanilla-generation") + @Default + private String vanillaGeneration = vanillaDimension; + + @Value("minecraft.fixed-time") + @Default + private Long fixedTime = null; + + @Value("minecraft.has-sky-light") + @Default + private Boolean hasSkyLight = null; + + @Value("minecraft.has-ceiling") + @Default + private Boolean hasCeiling = null; + + @Value("minecraft.ultra-warm") + @Default + private Boolean ultraWarm = null; + + @Value("minecraft.natural") + @Default + private Boolean natural = null; + + @Value("minecraft.coordinate-scale") + @Default + private Double coordinateScale = null; + + @Value("minecraft.bed-works") + @Default + private Boolean bedWorks = null; + + @Value("minecraft.respawn-anchor-works") + @Default + private Boolean respawnAnchorWorks = null; + + @Value("minecraft.height") + @Default + private Range height = null; + + @Value("minecraft.height.logical") + @Default + private Integer logicalHeight = null; + + @Value("minecraft.infiniburn") + @Default + private Identifier infiniburn = null; + + @Value("minecraft.effects") + @Default + private Identifier effects = null; + + @Value("minecraft.ambient-light") + @Default + private Float ambientLight = null; + + @Value("minecraft.cloud-height") + @Default + private Integer cloudHeight = null; + + @Value("minecraft.monster-settings") + @Default + private MonsterSettingsConfig monsterSettings = null; + + @Value("minecraft.mob-generation") + @Default + private Boolean mobGeneration = null; + + @Value("minecraft.sealevel") + @Default + private Integer sealevel = null; + + @Value("minecraft.spawn-height") + @Default + private Integer spawnHeight = 64; + + public String getVanillaDimension() { + return vanillaDimension; + } + + public String getVanillaGeneration() { + return vanillaGeneration; + } + + public Long getFixedTime() { + return fixedTime; + } + + public Boolean getHasSkyLight() { + return hasSkyLight; + } + + public Boolean getHasCeiling() { + return hasCeiling; + } + + public Boolean getUltraWarm() { + return ultraWarm; + } + + public Boolean getNatural() { + return natural; + } + + public Double getCoordinateScale() { + return coordinateScale; + } + + public Boolean getBedWorks() { + return bedWorks; + } + + public Boolean getRespawnAnchorWorks() { + return respawnAnchorWorks; + } + + public ConstantRange getHeight() { + //TODO THIS IS BAD + if(height != null) { + return new ConstantRange(height.getMin(), height.getMax()); + } else { + return null; + } + } + + public Integer getLogicalHeight() { + return logicalHeight; + } + + public Identifier getInfiniburn() { + return infiniburn; + } + + public Identifier getEffects() { + return effects; + } + + public Float getAmbientLight() { + return ambientLight; + } + + public Integer getCloudHeight() { + return cloudHeight; + } + + public MonsterSettingsConfig getMonsterSettings() { + return monsterSettings; + } + + public Boolean getMobGeneration() { + return mobGeneration; + } + + public Integer getSealevel() { + return sealevel; + } + + public Integer getSpawnHeight() { + return spawnHeight; + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java index bca0a30b1..da871ce26 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java @@ -3,7 +3,6 @@ package com.dfsek.terra.mod.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.util.Identifier; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java index ab7604fe5..8cdc42c6b 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java @@ -3,13 +3,15 @@ package com.dfsek.terra.mod.data; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.registry.key.RegistryKey; +import com.dfsek.terra.api.util.range.ConstantRange; import com.dfsek.terra.mod.CommonPlatform; +import com.dfsek.terra.mod.generation.GenerationSettings; import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; import com.dfsek.terra.mod.generation.TerraBiomeSource; +import com.dfsek.terra.mod.implmentation.TerraIntProvider; public final class Codecs { @@ -40,6 +42,19 @@ public final class Codecs { .forGetter(TerraBiomeSource::getPack)) .apply(instance, instance.stable(TerraBiomeSource::new))); + public static final Codec TERRA_CONSTANT_RANGE = RecordCodecBuilder.create(range -> range.group( + Codec.INT.fieldOf("min").stable().forGetter(ConstantRange::getMin), + Codec.INT.fieldOf("max").stable().forGetter(ConstantRange::getMax)).apply(range, range.stable(ConstantRange::new))); + + public static final Codec TERRA_GENERATION_SETTINGS = RecordCodecBuilder + .create(instance -> instance.group( + TERRA_CONSTANT_RANGE.fieldOf("height").stable().forGetter(GenerationSettings::height), + Codec.INT.fieldOf("sea_level").forGetter(GenerationSettings::sealevel), + Codec.BOOL.fieldOf("mob_generation").forGetter(GenerationSettings::mobGeneration), + Codec.INT.fieldOf("spawn_height").forGetter(GenerationSettings::sealevel)) + .apply(instance, instance.stable(GenerationSettings::new))); + + public static final MapCodec MINECRAFT_CHUNK_GENERATOR_WRAPPER = RecordCodecBuilder .mapCodec( instance -> instance.group( @@ -49,10 +64,17 @@ public final class Codecs { CONFIG_PACK.fieldOf("pack") .stable() .forGetter(MinecraftChunkGeneratorWrapper::getPack), - ChunkGeneratorSettings.REGISTRY_CODEC.fieldOf("settings") + TERRA_GENERATION_SETTINGS.fieldOf("settings") .stable() .forGetter(MinecraftChunkGeneratorWrapper::getSettings) ).apply(instance, instance.stable( MinecraftChunkGeneratorWrapper::new)) ); + + public static final MapCodec TERRA_CONSTANT_RANGE_INT_PROVIDER_TYPE = RecordCodecBuilder.mapCodec( + range -> range.group( + Codec.INT.fieldOf("min").stable().forGetter(TerraIntProvider::getMin), + Codec.INT.fieldOf("max").stable().forGetter(TerraIntProvider::getMax)) + .apply(range, range.stable((min, max) -> new TerraIntProvider(new ConstantRange( + min, max))))); } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/GenerationSettings.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/GenerationSettings.java new file mode 100644 index 000000000..2c3476001 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/GenerationSettings.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.mod.generation; + +import com.dfsek.terra.api.util.range.ConstantRange; + + +public record GenerationSettings(ConstantRange height, Integer sealevel, Boolean mobGeneration, Integer spawnHeight) { +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java index 704b9f295..75a3d5fbf 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java @@ -38,7 +38,6 @@ import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.StructureWeightSampler; import net.minecraft.world.gen.chunk.Blender; -import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.VerticalBlockSample; import net.minecraft.world.gen.densityfunction.DensityFunction.UnblendedNoisePos; import net.minecraft.world.gen.noise.NoiseConfig; @@ -67,12 +66,13 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun private static final Logger logger = LoggerFactory.getLogger(MinecraftChunkGeneratorWrapper.class); private final TerraBiomeSource biomeSource; - private final RegistryEntry settings; + private final GenerationSettings settings; private ChunkGenerator delegate; private ConfigPack pack; + public MinecraftChunkGeneratorWrapper(TerraBiomeSource biomeSource, ConfigPack configPack, - RegistryEntry settingsSupplier) { + GenerationSettings settingsSupplier) { super(biomeSource); this.pack = configPack; this.settings = settingsSupplier; @@ -94,7 +94,7 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun @Override public void populateEntities(ChunkRegion region) { - if(!this.settings.value().mobGenerationDisabled()) { + if(this.settings.mobGeneration()) { ChunkPos chunkPos = region.getCenterPos(); RegistryEntry registryEntry = region.getBiome(chunkPos.getStartPos().withY(region.getTopYInclusive() - 1)); ChunkRandom chunkRandom = new ChunkRandom(new CheckedRandom(RandomSeed.getSeed())); @@ -103,11 +103,6 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun } } - @Override - public int getWorldHeight() { - return settings.value().generationShapeConfig().height(); - } - @Override public CompletableFuture populateNoise(Blender blender, NoiseConfig noiseConfig, StructureAccessor structureAccessor, Chunk chunk) { @@ -162,16 +157,25 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun }); } + @Override + public int getWorldHeight() { + return settings.height().getRange(); + } + @Override public int getSeaLevel() { - return settings.value().seaLevel(); + return settings.sealevel(); } @Override public int getMinimumY() { - return settings.value().generationShapeConfig().minimumY(); + return settings.height().getMin(); } + @Override + public int getSpawnHeight(HeightLimitView world) { + return settings.spawnHeight(); + } @Override public int getHeight(int x, int z, Type heightmap, HeightLimitView height, NoiseConfig noiseConfig) { @@ -199,7 +203,7 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun @Override public void appendDebugHudText(List text, NoiseConfig noiseConfig, BlockPos pos) { - + // no op } public ConfigPack getPack() { @@ -226,7 +230,7 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun return delegate; } - public RegistryEntry getSettings() { + public GenerationSettings getSettings() { return settings; } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/TerraBiomeSource.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/TerraBiomeSource.java index 81651ece8..1d5910082 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/TerraBiomeSource.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/TerraBiomeSource.java @@ -61,10 +61,10 @@ public class TerraBiomeSource extends BiomeSource { } @Override - public RegistryEntry getBiome(int biomeX, int biomeY, int biomeZ, MultiNoiseSampler noiseSampler) { + public RegistryEntry getBiome(int biomeX, int biomeY, int biomeZ, MultiNoiseSampler Sampler) { return ((ProtoPlatformBiome) pack .getBiomeProvider() - .getBiome(biomeX << 2, biomeY << 2, biomeZ << 2, SeedHack.getSeed(noiseSampler)) + .getBiome(biomeX << 2, biomeY << 2, biomeZ << 2, SeedHack.getSeed(Sampler)) .getPlatformBiome()).getDelegate(); } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java index a44a022d3..183b2e379 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java @@ -41,13 +41,6 @@ public class MinecraftWorldHandle implements WorldHandle { @Override public @NotNull BlockState createBlockState(@NotNull String data) { try { - if(data.equals("minecraft:grass")) { //TODO: remove in 7.0 - data = "minecraft:short_grass"; - logger.warn( - "Translating minecraft:grass to minecraft:short_grass. In 1.20.3 minecraft:grass was renamed to minecraft:short_grass" + - ". You are advised to perform this rename in your config packs as this translation will be removed in the next major " + - "version of Terra."); - } net.minecraft.block.BlockState state = BlockArgumentParser.block(Registries.BLOCK, data, true) .blockState(); if(state == null) throw new IllegalArgumentException("Invalid data: " + data); @@ -64,15 +57,6 @@ public class MinecraftWorldHandle implements WorldHandle { @Override public @NotNull EntityType getEntity(@NotNull String id) { - if(!id.contains(":")) { //TODO: remove in 7.0 - String newid = "minecraft:" + id.toLowerCase(); - ; - logger.warn( - "Translating " + id + " to " + newid + ". In 1.20.3 entity parsing was reworked" + - ". You are advised to perform this rename in your config packs as this translation will be removed in the next major " + - "version of Terra."); - id = newid; - } if(!id.contains(":")) throw new IllegalArgumentException("Invalid entity identifier " + id); Identifier identifier = Identifier.tryParse(id); if(identifier == null) identifier = Identifier.tryParse(id); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/implmentation/TerraIntProvider.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/implmentation/TerraIntProvider.java new file mode 100644 index 000000000..afce31b90 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/implmentation/TerraIntProvider.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.mod.implmentation; + +import net.minecraft.util.math.intprovider.IntProvider; +import net.minecraft.util.math.intprovider.IntProviderType; +import net.minecraft.util.math.random.Random; + +import java.util.HashMap; +import java.util.Map; + +import com.dfsek.terra.api.util.range.Range; +import com.dfsek.terra.mod.util.MinecraftAdapter; + + +public class TerraIntProvider extends IntProvider { + public static final Map TERRA_RANGE_TYPE_TO_INT_PROVIDER_TYPE = new HashMap<>(); + + public Range delegate; + + public TerraIntProvider(Range delegate) { + this.delegate = delegate; + } + + @Override + public int get(Random random) { + return delegate.get(MinecraftAdapter.adapt(random)); + } + + @Override + public int getMin() { + return delegate.getMin(); + } + + @Override + public int getMax() { + return delegate.getMax(); + } + + @Override + public IntProviderType getType() { + return TERRA_RANGE_TYPE_TO_INT_PROVIDER_TYPE.get(delegate.getClass()); + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/NetherFossilOptimization.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/NetherFossilOptimization.java deleted file mode 100644 index f2ab4956a..000000000 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/NetherFossilOptimization.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dfsek.terra.mod.mixin.fix; - -import net.minecraft.world.gen.structure.NetherFossilStructure; -import net.minecraft.world.gen.structure.Structure.Context; -import net.minecraft.world.gen.structure.Structure.StructurePosition; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.Optional; - -import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; - - -/** - * Disable fossil generation in Terra worlds, as they are very expensive due to consistently triggering cache misses. - *

- * Currently, on Fabric, Terra cannot be specified as a Nether generator. TODO: logic to turn fossils back on if chunk generator is in - * nether. - */ -@Mixin(NetherFossilStructure.class) -public class NetherFossilOptimization { - @Inject(method = "getStructurePosition", at = @At("HEAD"), cancellable = true) - public void injectFossilPositions(Context context, CallbackInfoReturnable> cir) { - if(context.chunkGenerator() instanceof MinecraftChunkGeneratorWrapper) { - cir.setReturnValue(Optional.empty()); - } - } -} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/generalize/ServerWorldMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/generalize/ServerWorldMixin.java new file mode 100644 index 000000000..470b0fa29 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/generalize/ServerWorldMixin.java @@ -0,0 +1,44 @@ +package com.dfsek.terra.mod.mixin.generalize; + + +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.random.RandomSequencesState; +import net.minecraft.world.World; +import net.minecraft.world.chunk.ChunkLoadProgress; +import net.minecraft.world.dimension.DimensionOptions; +import net.minecraft.world.dimension.DimensionTypes; +import net.minecraft.world.level.ServerWorldProperties; +import net.minecraft.world.level.storage.LevelStorage; +import net.minecraft.world.spawner.SpecialSpawner; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.List; +import java.util.concurrent.Executor; + + +@Mixin(ServerWorld.class) +public abstract class ServerWorldMixin extends World { + public ServerWorldMixin(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, + RegistryKey worldKey, DimensionOptions dimensionOptions, + ChunkLoadProgress chunkLoadProgress, boolean debugWorld, long seed, + List spawners, boolean shouldTickTime, @Nullable RandomSequencesState randomSequencesState) { + super(properties, worldKey, server.getRegistryManager(), dimensionOptions.dimensionTypeEntry(), false, debugWorld, seed, + server.getMaxChainedNeighborUpdates()); + } + + @Redirect(method = "", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/registry/entry/RegistryEntry;matchesKey(Lnet/minecraft/registry/RegistryKey;)Z")) + public boolean matchesKeyProxy(RegistryEntry instance, RegistryKey tRegistryKey) { + if(tRegistryKey == DimensionTypes.THE_END) { + return (this.getRegistryKey() == World.END); + } + return instance.matchesKey(tRegistryKey); + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java index 10271cf33..002759eb4 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java @@ -55,7 +55,8 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity { public EntityType terra$getSpawnedType() { return (EntityType) Registries.ENTITY_TYPE.getEntry( - Identifier.tryParse(((MobSpawnerLogicAccessor) getLogic()).getSpawnEntry().getNbt().getString("id").orElseThrow())).orElseThrow(); + Identifier.tryParse(((MobSpawnerLogicAccessor) getLogic()).getSpawnEntry().getNbt().getString("id").orElseThrow())) + .orElseThrow(); } public void terra$setSpawnedType(@NotNull EntityType creatureType) { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java index 53317b7f5..4e92d76b2 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java @@ -18,7 +18,6 @@ package com.dfsek.terra.mod.mixin.implementations.terra.chunk; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.chunk.Chunk.TickSchedulers; import net.minecraft.world.chunk.WorldChunk; import net.minecraft.world.tick.OrderedTick; import org.jetbrains.annotations.NotNull; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityMixin.java index e6f62a6bf..7bc47dc62 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityMixin.java @@ -17,6 +17,7 @@ package com.dfsek.terra.mod.mixin.implementations.terra.entity; +import com.dfsek.seismic.type.vector.Vector3; import net.minecraft.entity.Entity; import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Implements; @@ -24,7 +25,6 @@ import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.mod.util.MinecraftAdapter; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/DataPackContentsMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/DataPackContentsMixin.java index 0fa4006cc..ee7864d3b 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/DataPackContentsMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/DataPackContentsMixin.java @@ -17,17 +17,15 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.dfsek.terra.mod.util.MinecraftUtil; -import com.dfsek.terra.mod.util.TagUtil; - import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; +import com.dfsek.terra.mod.util.MinecraftUtil; +import com.dfsek.terra.mod.util.TagUtil; + @Mixin(DataPackContents.class) public class DataPackContentsMixin { @@ -38,7 +36,11 @@ public class DataPackContentsMixin { /* * #refresh populates all tags in the registries */ - @Inject(method = "reload(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/CombinedDynamicRegistries;Ljava/util/List;Lnet/minecraft/resource/featuretoggle/FeatureSet;Lnet/minecraft/server/command/CommandManager$RegistrationEnvironment;ILjava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;", at = @At("RETURN")) + @Inject(method = "reload(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/CombinedDynamicRegistries;Ljava/util/List;" + + "Lnet/minecraft/resource/featuretoggle/FeatureSet;" + + "Lnet/minecraft/server/command/CommandManager$RegistrationEnvironment;ILjava/util/concurrent/Executor;" + + "Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;", + at = @At("RETURN")) private static void injectReload(ResourceManager resourceManager, CombinedDynamicRegistries dynamicRegistries, List> pendingTagLoads, FeatureSet enabledFeatures, diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/BiomeUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/BiomeUtil.java index b3ee4c774..fc8304d09 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/BiomeUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/BiomeUtil.java @@ -5,6 +5,7 @@ import net.minecraft.util.Identifier; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Builder; import net.minecraft.world.biome.BiomeEffects; +import net.minecraft.world.biome.GenerationSettings; import java.util.HashMap; import java.util.List; @@ -15,9 +16,6 @@ import java.util.Objects; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.mod.config.VanillaBiomeProperties; import com.dfsek.terra.mod.mixin.access.BiomeAccessor; -import com.dfsek.terra.mod.mixin.invoke.BiomeInvoker; - -import net.minecraft.world.biome.GenerationSettings; public class BiomeUtil { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/DimensionUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/DimensionUtil.java new file mode 100644 index 000000000..2704d5f59 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/DimensionUtil.java @@ -0,0 +1,75 @@ +package com.dfsek.terra.mod.util; + +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.tag.TagKey; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.dimension.DimensionType.MonsterSettings; +import org.jetbrains.annotations.NotNull; + +import java.util.OptionalLong; + +import com.dfsek.terra.mod.ModPlatform; +import com.dfsek.terra.mod.config.MonsterSettingsConfig; +import com.dfsek.terra.mod.config.VanillaWorldProperties; +import com.dfsek.terra.mod.implmentation.TerraIntProvider; + + +public class DimensionUtil { + public static DimensionType createDimension(VanillaWorldProperties vanillaWorldProperties, DimensionType defaultDimension, + ModPlatform platform) { + + MonsterSettingsConfig monsterSettingsConfig; + if(vanillaWorldProperties.getMonsterSettings() != null) { + monsterSettingsConfig = vanillaWorldProperties.getMonsterSettings(); + } else { + monsterSettingsConfig = new MonsterSettingsConfig(); + } + + MonsterSettings monsterSettings = getMonsterSettings(defaultDimension, monsterSettingsConfig); + + return new DimensionType( + vanillaWorldProperties.getFixedTime() == null ? defaultDimension.fixedTime() : OptionalLong.of( + vanillaWorldProperties.getFixedTime()), + vanillaWorldProperties.getHasSkyLight() == null ? defaultDimension.hasSkyLight() : vanillaWorldProperties.getHasSkyLight(), + vanillaWorldProperties.getHasCeiling() == null ? defaultDimension.hasCeiling() : vanillaWorldProperties.getHasCeiling(), + vanillaWorldProperties.getUltraWarm() == null ? defaultDimension.ultrawarm() : vanillaWorldProperties.getUltraWarm(), + vanillaWorldProperties.getNatural() == null ? defaultDimension.natural() : vanillaWorldProperties.getNatural(), + vanillaWorldProperties.getCoordinateScale() == null + ? defaultDimension.coordinateScale() + : vanillaWorldProperties.getCoordinateScale(), + vanillaWorldProperties.getBedWorks() == null ? defaultDimension.bedWorks() : vanillaWorldProperties.getBedWorks(), + vanillaWorldProperties.getRespawnAnchorWorks() == null + ? defaultDimension.respawnAnchorWorks() + : vanillaWorldProperties.getRespawnAnchorWorks(), + vanillaWorldProperties.getHeight() == null ? defaultDimension.minY() : vanillaWorldProperties.getHeight().getMin(), + vanillaWorldProperties.getHeight() == null ? defaultDimension.height() : vanillaWorldProperties.getHeight().getRange(), + vanillaWorldProperties.getLogicalHeight() == null + ? defaultDimension.logicalHeight() + : vanillaWorldProperties.getLogicalHeight(), + vanillaWorldProperties.getInfiniburn() == null + ? defaultDimension.infiniburn() + : TagKey.of(RegistryKeys.BLOCK, vanillaWorldProperties.getInfiniburn()), + vanillaWorldProperties.getEffects() == null ? defaultDimension.effects() : vanillaWorldProperties.getEffects(), + vanillaWorldProperties.getAmbientLight() == null ? defaultDimension.ambientLight() : vanillaWorldProperties.getAmbientLight(), + vanillaWorldProperties.getCloudHeight() == null + ? defaultDimension.cloudHeight() + : vanillaWorldProperties.getCloudHeight().describeConstable(), + monsterSettings + ); + } + + @NotNull + private static MonsterSettings getMonsterSettings(DimensionType defaultDimension, MonsterSettingsConfig monsterSettingsConfig) { + MonsterSettings defaultMonsterSettings = defaultDimension.monsterSettings(); + + return new MonsterSettings( + monsterSettingsConfig.getPiglinSafe() == null ? defaultMonsterSettings.piglinSafe() : monsterSettingsConfig.getPiglinSafe(), + monsterSettingsConfig.getHasRaids() == null ? defaultMonsterSettings.hasRaids() : monsterSettingsConfig.getHasRaids(), + monsterSettingsConfig.getMonsterSpawnLight() == null ? defaultMonsterSettings.monsterSpawnLightTest() : new TerraIntProvider( + monsterSettingsConfig.getMonsterSpawnLight()), + monsterSettingsConfig.getMonsterSpawnBlockLightLimit() == null + ? defaultMonsterSettings.monsterSpawnBlockLightLimit() + : monsterSettingsConfig.getMonsterSpawnBlockLightLimit() + ); + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java index a5ad15a99..cb6f5c52c 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java @@ -17,10 +17,13 @@ package com.dfsek.terra.mod.util; +import com.dfsek.seismic.type.vector.Vector3; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.random.Random; import net.minecraft.world.HeightLimitView; -import com.dfsek.terra.api.util.vector.Vector3; +import java.util.random.RandomGenerator; + import com.dfsek.terra.api.world.info.WorldProperties; @@ -53,4 +56,48 @@ public final class MinecraftAdapter { } }; } + + public static RandomGenerator adapt(Random random) { + return new RandomGenerator() { + @Override + public boolean nextBoolean() { + return random.nextBoolean(); + } + + @Override + public float nextFloat() { + return random.nextFloat(); + } + + @Override + public double nextDouble() { + return random.nextDouble(); + } + + @Override + public int nextInt() { + return random.nextInt(); + } + + @Override + public int nextInt(int bound) { + return random.nextInt(bound); + } + + @Override + public long nextLong() { + return random.nextLong(); + } + + @Override + public double nextGaussian() { + return random.nextGaussian(); + } + + @Override + public int nextInt(int origin, int bound) { + return random.nextBetween(origin, bound); + } + }; + } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java index a2486cbb7..822e7cd89 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java @@ -3,27 +3,21 @@ package com.dfsek.terra.mod.util; import net.minecraft.block.entity.LootableContainerBlockEntity; import net.minecraft.block.entity.MobSpawnerBlockEntity; import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.intprovider.IntProviderType; import net.minecraft.world.WorldAccess; import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.Biome.Builder; -import net.minecraft.world.biome.BiomeEffects; -import net.minecraft.world.biome.GenerationSettings; +import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.feature.ConfiguredFeature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.HashMap; import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; import java.util.Optional; import com.dfsek.terra.api.block.entity.BlockEntity; @@ -31,8 +25,12 @@ 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.mod.config.VanillaBiomeProperties; -import com.dfsek.terra.mod.mixin.access.BiomeAccessor; +import com.dfsek.terra.api.util.range.ConstantRange; +import com.dfsek.terra.mod.CommonPlatform; +import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions; +import com.dfsek.terra.mod.config.ProtoPlatformBiome; +import com.dfsek.terra.mod.data.Codecs; +import com.dfsek.terra.mod.implmentation.TerraIntProvider; import com.dfsek.terra.mod.mixin_ifaces.FloraFeatureHolder; @@ -45,7 +43,7 @@ public final class MinecraftUtil { public static Optional> getEntry(Registry registry, Identifier identifier) { return registry.getOptionalValue(identifier) - .flatMap(id -> Optional.ofNullable(registry.getEntry(id))); + .flatMap(id -> Optional.ofNullable(registry.getEntry(id))); } public static BlockEntity createState(WorldAccess worldAccess, BlockPos pos) { @@ -60,32 +58,57 @@ public final class MinecraftUtil { return null; } - public static void registerFlora(Registry biomes) { - logger.info("Injecting flora into Terra biomes..."); - BiomeUtil.TERRA_BIOME_MAP - .forEach((vb, terraBiomes) -> - biomes.getOptionalValue(vb) - .ifPresentOrElse(vanilla -> terraBiomes - .forEach(tb -> biomes.getOptionalValue(tb) - .ifPresentOrElse( - terra -> { - List> flowerFeatures = List.copyOf( - vanilla.getGenerationSettings() - .getFlowerFeatures()); - logger.debug("Injecting flora into biome" + - " {} : {}", tb, - flowerFeatures); - ((FloraFeatureHolder) terra.getGenerationSettings()).setFloraFeatures( - flowerFeatures); - }, - () -> logger.error( - "No such biome: {}", - tb))), - () -> logger.error("No vanilla biome: {}", vb))); + public static void registerIntProviderTypes() { + IntProviderType CONSTANT = IntProviderType.register("terra:constant_range", + Codecs.TERRA_CONSTANT_RANGE_INT_PROVIDER_TYPE); + TerraIntProvider.TERRA_RANGE_TYPE_TO_INT_PROVIDER_TYPE.put(ConstantRange.class, CONSTANT); } - public static RegistryKey registerKey(Identifier identifier) { + public static void registerFlora(Registry biomeRegistry) { + logger.info("Injecting flora into Terra biomes..."); + CommonPlatform.get().getConfigRegistry().forEach(pack -> { // Register all Terra biomes. + PreLoadCompatibilityOptions compatibilityOptions = pack.getContext().get(PreLoadCompatibilityOptions.class); + if(compatibilityOptions.isInjectFlora()) { + pack.getCheckedRegistry(com.dfsek.terra.api.world.biome.Biome.class) + .forEach((id, biome) -> { + registerFlora(biome, pack, id, biomeRegistry); + }); + } + }); + } + + private static void registerFlora(com.dfsek.terra.api.world.biome.Biome biome, ConfigPack pack, + com.dfsek.terra.api.registry.key.RegistryKey id, + Registry biomeRegistry) { + RegistryKey vanillaKey = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(biomeRegistry); + biomeRegistry.getOptionalValue(vanillaKey) + .ifPresentOrElse(vanillaBiome -> { + Identifier terraBiomeIdentifier = Identifier.of("terra", BiomeUtil.createBiomeID(pack, id)); + biomeRegistry.getOptionalValue(terraBiomeIdentifier).ifPresentOrElse( + terraBiome -> { + List> flowerFeatures = List.copyOf( + vanillaBiome.getGenerationSettings() + .getFlowerFeatures()); + logger.debug("Injecting flora into biome" + + " {} : {}", terraBiomeIdentifier, + flowerFeatures); + ((FloraFeatureHolder) terraBiome.getGenerationSettings()).setFloraFeatures( + flowerFeatures); + }, + () -> logger.error( + "No such biome: {}", + terraBiomeIdentifier) + ); + }, + () -> logger.error("No vanilla biome: {}", vanillaKey)); + } + + public static RegistryKey registerBiomeKey(Identifier identifier) { return RegistryKey.of(RegistryKeys.BIOME, identifier); } + + public static RegistryKey registerDimensionTypeKey(Identifier identifier) { + return RegistryKey.of(RegistryKeys.DIMENSION_TYPE, identifier); + } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java index 2ca4be005..b387a75c5 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java @@ -1,8 +1,11 @@ package com.dfsek.terra.mod.util; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.Identifier; +import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.MultiNoiseBiomeSource; import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList; import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterLists; @@ -18,70 +21,185 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Locale; -import java.util.Map; import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.config.MetaPack; import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.range.ConstantRange; import com.dfsek.terra.mod.ModPlatform; +import com.dfsek.terra.mod.config.VanillaWorldProperties; +import com.dfsek.terra.mod.generation.GenerationSettings; import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; import com.dfsek.terra.mod.generation.TerraBiomeSource; public class PresetUtil { private static final Logger LOGGER = LoggerFactory.getLogger(PresetUtil.class); - private static final List PRESETS = new ArrayList<>(); + private static final List> PRESETS = new ArrayList<>(); - public static Pair createDefault(ConfigPack pack, ModPlatform platform) { + public static Pair createDefault(ConfigPack pack, ModPlatform platform, boolean extended, boolean packInMetapack) { Registry dimensionTypeRegistry = platform.dimensionTypeRegistry(); Registry chunkGeneratorSettingsRegistry = platform.chunkGeneratorSettingsRegistry(); Registry multiNoiseBiomeSourceParameterLists = platform.multiNoiseBiomeSourceParameterListRegistry(); - RegistryEntry overworldDimensionType = dimensionTypeRegistry.getEntry(dimensionTypeRegistry.get(DimensionTypes.OVERWORLD)); - RegistryEntry overworld = chunkGeneratorSettingsRegistry.getEntry(chunkGeneratorSettingsRegistry.get(ChunkGeneratorSettings.OVERWORLD)); - - Identifier generatorID = Identifier.tryParse( "terra:" + pack.getID().toLowerCase(Locale.ROOT) + "/" + pack.getNamespace().toLowerCase( Locale.ROOT)); - PRESETS.add(generatorID); + PRESETS.add(Pair.of(generatorID, extended)); - RegistryEntry registryEntry = dimensionTypeRegistry.getEntry(dimensionTypeRegistry.get(DimensionTypes.THE_NETHER)); - RegistryEntry reference = multiNoiseBiomeSourceParameterLists.getEntry( - multiNoiseBiomeSourceParameterLists.get(MultiNoiseBiomeSourceParameterLists.NETHER)); - RegistryEntry registryEntry2 = chunkGeneratorSettingsRegistry.getEntry(chunkGeneratorSettingsRegistry.get(ChunkGeneratorSettings.NETHER)); + HashMap, DimensionOptions> dimensionMap = new HashMap<>(); - RegistryEntry registryEntry3 = dimensionTypeRegistry.getEntry(dimensionTypeRegistry.get(DimensionTypes.THE_END)); - RegistryEntry registryEntry4 = chunkGeneratorSettingsRegistry.getEntry(chunkGeneratorSettingsRegistry.get(ChunkGeneratorSettings.END)); + insertCustom(platform, "minecraft:overworld", pack, dimensionTypeRegistry, chunkGeneratorSettingsRegistry, dimensionMap, packInMetapack); - TerraBiomeSource biomeSource = new TerraBiomeSource(pack); - ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(biomeSource, pack, overworld); + insertDefaults(dimensionTypeRegistry, chunkGeneratorSettingsRegistry, multiNoiseBiomeSourceParameterLists, platform.biomeRegistry(), + dimensionMap); - DimensionOptions dimensionOptions = new DimensionOptions(overworldDimensionType, generator); - DimensionOptions netherDimensionOptions = new DimensionOptions(registryEntry, - new NoiseChunkGenerator(MultiNoiseBiomeSource.create(reference), - registryEntry2)); - DimensionOptions endDimensionOptions = new DimensionOptions(registryEntry3, new NoiseChunkGenerator( - TheEndBiomeSource.createVanilla(platform.biomeRegistry()), registryEntry4)); - - WorldPreset preset = createPreset(dimensionOptions, netherDimensionOptions, endDimensionOptions); + WorldPreset preset = new WorldPreset(dimensionMap); LOGGER.info("Created world type \"{}\"", generatorID); return Pair.of(generatorID, preset); } - private static WorldPreset createPreset(DimensionOptions dimensionOptions, DimensionOptions netherDimensionOptions, - DimensionOptions endDimensionOptions) { - return new WorldPreset( - Map.of(DimensionOptions.OVERWORLD, dimensionOptions, DimensionOptions.NETHER, netherDimensionOptions, DimensionOptions.END, - endDimensionOptions) - ); + public static Pair createMetaPackPreset(MetaPack metaPack, ModPlatform platform, boolean extended) { + Registry dimensionTypeRegistry = platform.dimensionTypeRegistry(); + Registry chunkGeneratorSettingsRegistry = platform.chunkGeneratorSettingsRegistry(); + Registry multiNoiseBiomeSourceParameterLists = + platform.multiNoiseBiomeSourceParameterListRegistry(); + + Identifier generatorID = Identifier.of("terra", + metaPack.getID().toLowerCase(Locale.ROOT) + "/" + metaPack.getNamespace().toLowerCase( + Locale.ROOT)); + + PRESETS.add(Pair.of(generatorID, extended)); + + HashMap, DimensionOptions> dimensionMap = new HashMap<>(); + + metaPack.packs().forEach((key, pack) -> { + insertCustom(platform, key, pack, dimensionTypeRegistry, chunkGeneratorSettingsRegistry, dimensionMap, false); + }); + + insertDefaults(dimensionTypeRegistry, chunkGeneratorSettingsRegistry, multiNoiseBiomeSourceParameterLists, platform.biomeRegistry(), + dimensionMap); + + WorldPreset preset = new WorldPreset(dimensionMap); + LOGGER.info("Created world type \"{}\"", generatorID); + return Pair.of(generatorID, preset); } - public static List getPresets() { + private static void insertCustom(ModPlatform platform, String key, ConfigPack pack, Registry dimensionTypeRegistry, + Registry chunkGeneratorSettingsRegistry, + HashMap, DimensionOptions> dimensionMap, boolean packInMetapack) { + Identifier demensionIdentifier = Identifier.of(key); + + VanillaWorldProperties vanillaWorldProperties; + + if(pack.getContext().has(VanillaWorldProperties.class)) { + vanillaWorldProperties = pack.getContext().get(VanillaWorldProperties.class); + } else { + vanillaWorldProperties = new VanillaWorldProperties(); + } + + DimensionType defaultDimension = dimensionTypeRegistry.get(Identifier.of(vanillaWorldProperties.getVanillaDimension())); + + assert defaultDimension != null; + + Identifier dimensionTypeID = Identifier.of("terra", pack.getID().toLowerCase(Locale.ROOT)); + + DimensionType dimensionType; + if (!packInMetapack) { + dimensionType = DimensionUtil.createDimension(vanillaWorldProperties, defaultDimension, platform); + RegistryKey dimensionTypeRegistryKey = MinecraftUtil.registerDimensionTypeKey( + dimensionTypeID); + + Registry.registerReference(dimensionTypeRegistry, dimensionTypeRegistryKey, dimensionType); + } else { + dimensionType = dimensionTypeRegistry.get(dimensionTypeID); + } + + RegistryEntry dimensionTypeRegistryEntry = dimensionTypeRegistry.getEntry(dimensionType); + + TerraBiomeSource biomeSource = new TerraBiomeSource(pack); + + RegistryEntry defaultGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry( + chunkGeneratorSettingsRegistry.get(Identifier.of(vanillaWorldProperties.getVanillaGeneration()))); + + GenerationSettings generatorSettings = new GenerationSettings( + vanillaWorldProperties.getHeight() == null ? new ConstantRange( + defaultGeneratorSettings.value().generationShapeConfig().minimumY(), + defaultGeneratorSettings.value().generationShapeConfig().height()) : vanillaWorldProperties.getHeight(), + vanillaWorldProperties.getSealevel() == null + ? defaultGeneratorSettings.value().seaLevel() + : vanillaWorldProperties.getSealevel(), + vanillaWorldProperties.getMobGeneration() == null + ? !defaultGeneratorSettings.value().mobGenerationDisabled() + : vanillaWorldProperties.getMobGeneration(), + vanillaWorldProperties.getSpawnHeight()); + + ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(biomeSource, pack, generatorSettings); + + DimensionOptions dimensionOptions = new DimensionOptions(dimensionTypeRegistryEntry, generator); + RegistryKey dimensionOptionsRegistryKey = RegistryKey.of(RegistryKeys.DIMENSION, demensionIdentifier); + dimensionMap.put(dimensionOptionsRegistryKey, dimensionOptions); + } + + private static void insertDefaults(Registry dimensionTypeRegistry, + Registry chunkGeneratorSettingsRegistry, + Registry multiNoiseBiomeSourceParameterLists, + Registry biomeRegistry, HashMap, DimensionOptions> map) { + if(!map.containsKey(DimensionOptions.OVERWORLD)) { + RegistryEntry overworldDimensionType = dimensionTypeRegistry.getEntry( + dimensionTypeRegistry.get(DimensionTypes.OVERWORLD)); + + RegistryEntry overworldChunkBiomeReference = + multiNoiseBiomeSourceParameterLists.getEntry(multiNoiseBiomeSourceParameterLists.get( + MultiNoiseBiomeSourceParameterLists.OVERWORLD)); + + RegistryEntry overworldChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry( + chunkGeneratorSettingsRegistry.get( + ChunkGeneratorSettings.OVERWORLD)); + + + DimensionOptions overworldDimensionOptions = new DimensionOptions(overworldDimensionType, + (new NoiseChunkGenerator(MultiNoiseBiomeSource.create(overworldChunkBiomeReference), overworldChunkGeneratorSettings))); + map.put(DimensionOptions.OVERWORLD, overworldDimensionOptions); + } + if(!map.containsKey(DimensionOptions.NETHER)) { + RegistryEntry netherDimensionType = dimensionTypeRegistry.getEntry( + dimensionTypeRegistry.get(DimensionTypes.THE_NETHER)); + + RegistryEntry netherChunkBiomeReference = + multiNoiseBiomeSourceParameterLists.getEntry(multiNoiseBiomeSourceParameterLists.get( + MultiNoiseBiomeSourceParameterLists.NETHER)); + + RegistryEntry netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry( + chunkGeneratorSettingsRegistry.get( + ChunkGeneratorSettings.NETHER)); + + DimensionOptions overworldDimensionOptions = new DimensionOptions(netherDimensionType, + (new NoiseChunkGenerator(MultiNoiseBiomeSource.create(netherChunkBiomeReference), netherChunkGeneratorSettings))); + map.put(DimensionOptions.NETHER, overworldDimensionOptions); + } + if(!map.containsKey(DimensionOptions.END)) { + RegistryEntry endDimensionType = dimensionTypeRegistry.getEntry( + dimensionTypeRegistry.get(DimensionTypes.THE_END)); + + RegistryEntry endChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry( + chunkGeneratorSettingsRegistry.get( + ChunkGeneratorSettings.END)); + + + DimensionOptions overworldDimensionOptions = new DimensionOptions(endDimensionType, + (new NoiseChunkGenerator(TheEndBiomeSource.createVanilla(biomeRegistry), endChunkGeneratorSettings))); + map.put(DimensionOptions.END, overworldDimensionOptions); + } + } + + public static List> getPresets() { return PRESETS; } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java index 6da1a4ec9..9e23a9662 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java @@ -31,21 +31,25 @@ public final class TagUtil { } public static void registerWorldPresetTags(Registry registry) { - logger.info("Doing preset tag garbage...."); + logger.info("Registering Preset Tags."); Map, List>> collect = tagsToMutableMap(registry); PresetUtil .getPresets() - .forEach(id -> MinecraftUtil - .getEntry(registry, id) + .forEach(pair -> MinecraftUtil + .getEntry(registry, pair.getLeft()) .ifPresentOrElse( - preset -> collect - .computeIfAbsent(WorldPresetTags.NORMAL, tag -> new ArrayList<>()) - .add(preset), - () -> logger.error("Preset {} does not exist!", id))); + preset -> { + boolean useExtendedTag = pair.getRight(); // Get the boolean value from the pair + collect + .computeIfAbsent(useExtendedTag ? WorldPresetTags.EXTENDED : WorldPresetTags.NORMAL, tag -> new ArrayList<>()) + .add(preset); + }, + () -> logger.error("Preset {} does not exist!", pair.getLeft()))); registry.startTagReload(new RegistryTags<>(registry.getKey(), collect)).apply(); + if(logger.isDebugEnabled()) { registry.streamEntries() .map(e -> e.registryKey().getValue() + ": " + diff --git a/platforms/mixin-common/src/main/resources/terra.accesswidener b/platforms/mixin-common/src/main/resources/terra.accesswidener index 46f1b986e..c8bf52150 100644 --- a/platforms/mixin-common/src/main/resources/terra.accesswidener +++ b/platforms/mixin-common/src/main/resources/terra.accesswidener @@ -1,4 +1,5 @@ accessWidener v1 named accessible class net/minecraft/world/biome/Biome$Weather accessible class net/minecraft/world/gen/WorldPresets$Registrar +accessible field net/minecraft/world/dimension/DimensionOptionsRegistryHolder VANILLA_KEYS Ljava/util/Set; accessible class net/minecraft/registry/RegistryLoader$Loader \ No newline at end of file diff --git a/platforms/mixin-common/src/main/resources/terra.common.mixins.json b/platforms/mixin-common/src/main/resources/terra.common.mixins.json index 7ea2642ac..33e9f4668 100644 --- a/platforms/mixin-common/src/main/resources/terra.common.mixins.json +++ b/platforms/mixin-common/src/main/resources/terra.common.mixins.json @@ -9,7 +9,7 @@ "access.StateAccessor", "access.StructureAccessorAccessor", "access.VillagerTypeAccessor", - "fix.NetherFossilOptimization", + "generalize.ServerWorldMixin", "implementations.compat.GenerationSettingsFloraFeaturesMixin", "implementations.terra.BiomeMixin", "implementations.terra.HandleImplementationMixin", diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java index 48dc88249..0cbfa77b4 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java @@ -1,8 +1,5 @@ package com.dfsek.terra.lifecycle; -import com.dfsek.terra.api.command.CommandSender; -import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; - import net.minecraft.server.command.ServerCommandSource; import org.incendo.cloud.SenderMapper; import org.incendo.cloud.execution.ExecutionCoordinator; @@ -10,6 +7,9 @@ import org.incendo.cloud.fabric.FabricServerCommandManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.dfsek.terra.api.command.CommandSender; +import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; + public final class LifecycleEntryPoint { private static final Logger logger = LoggerFactory.getLogger(LifecycleEntryPoint.class); diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java index d696ce180..5f9d6a651 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java @@ -3,11 +3,9 @@ package com.dfsek.terra.lifecycle; import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import ca.solostudios.strata.version.Version; - -import com.dfsek.terra.api.util.reflection.ReflectionUtil; - -import net.minecraft.MinecraftVersion; +import net.minecraft.SharedConstants; import net.minecraft.enchantment.Enchantment; +import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; @@ -39,14 +37,17 @@ public abstract class LifecyclePlatform extends ModPlatform { private static final AtomicReference> SETTINGS = new AtomicReference<>(); private static final AtomicReference> NOISE = new AtomicReference<>(); private static final AtomicReference> ENCHANTMENT = new AtomicReference<>(); + private static final AtomicReference DYNAMIC_REGISTRY_MANAGER = new AtomicReference<>(); private static MinecraftServer server; private int generationThreads; public LifecyclePlatform() { - generationThreads = getGenerationThreadsWithReflection("com.ishland.c2me.base.common.GlobalExecutors", "GLOBAL_EXECUTOR_PARALLELISM", "C2ME"); - if (generationThreads == 0) { + generationThreads = getGenerationThreadsWithReflection("com.ishland.c2me.base.common.GlobalExecutors", + "GLOBAL_EXECUTOR_PARALLELISM", "C2ME"); + if(generationThreads == 0) { generationThreads = getMoonriseGenerationThreadsWithReflection(); - } if (generationThreads == 0) { + } + if(generationThreads == 0) { generationThreads = 1; } CommonPlatform.initialize(this); @@ -65,7 +66,9 @@ public abstract class LifecyclePlatform extends ModPlatform { ENCHANTMENT.set(enchantmentRegistry); } - + public static void setDynamicRegistryManager(DynamicRegistryManager.Immutable dynamicRegistryManager) { + DYNAMIC_REGISTRY_MANAGER.set(dynamicRegistryManager); + } @Override public MinecraftServer getServer() { @@ -79,9 +82,7 @@ public abstract class LifecyclePlatform extends ModPlatform { @Override public boolean reload() { getTerraConfig().load(this); - getRawConfigRegistry().clear(); - boolean succeed = getRawConfigRegistry().loadAll(this); - + boolean succeed = loadConfigPacks(); if(server != null) { LifecycleBiomeUtil.registerBiomes(server.getRegistryManager().getOrThrow(RegistryKeys.BIOME)); @@ -107,7 +108,7 @@ public abstract class LifecyclePlatform extends ModPlatform { super.platformAddon().forEach(addons::add); - String mcVersion = MinecraftVersion.CURRENT.name(); + String mcVersion = SharedConstants.getGameVersion().name(); try { addons.add(new EphemeralAddon(Versions.parseVersion(mcVersion), "minecraft")); } catch(ParseException e) { diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java index e52b0fdab..9cde600c3 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java @@ -1,14 +1,11 @@ package com.dfsek.terra.lifecycle.mixin.lifecycle; -import com.dfsek.terra.mod.CommonPlatform; -import com.dfsek.terra.mod.ModPlatform; - import com.mojang.datafixers.DataFixer; import net.minecraft.resource.ResourcePackManager; import net.minecraft.server.MinecraftServer; import net.minecraft.server.SaveLoader; -import net.minecraft.server.WorldGenerationProgressListenerFactory; import net.minecraft.util.ApiServices; +import net.minecraft.world.chunk.ChunkLoadProgress; import net.minecraft.world.level.storage.LevelStorage; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -25,11 +22,11 @@ public class MinecraftServerMixin { @Inject(method = "(Ljava/lang/Thread;Lnet/minecraft/world/level/storage/LevelStorage$Session;" + "Lnet/minecraft/resource/ResourcePackManager;Lnet/minecraft/server/SaveLoader;Ljava/net/Proxy;" + "Lcom/mojang/datafixers/DataFixer;Lnet/minecraft/util/ApiServices;" + - "Lnet/minecraft/server/WorldGenerationProgressListenerFactory;)V", + "Lnet/minecraft/world/chunk/ChunkLoadProgress;)V", at = @At("RETURN")) private void injectConstructor(Thread serverThread, LevelStorage.Session session, ResourcePackManager dataPackManager, SaveLoader saveLoader, Proxy proxy, DataFixer dataFixer, ApiServices apiServices, - WorldGenerationProgressListenerFactory worldGenerationProgressListenerFactory, CallbackInfo ci) { + ChunkLoadProgress chunkLoadProgress, CallbackInfo ci) { LifecyclePlatform.setServer((MinecraftServer) (Object) this); } } diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java index 625aa3e88..d0a50afea 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java @@ -1,16 +1,15 @@ package com.dfsek.terra.lifecycle.mixin.lifecycle; -import com.dfsek.terra.mod.CommonPlatform; -import com.dfsek.terra.mod.ModPlatform; - +import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.enchantment.Enchantment; +import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.MutableRegistry; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryLoader; -import net.minecraft.registry.RegistryLoader.Loader; import net.minecraft.registry.RegistryWrapper; +import net.minecraft.resource.ResourceManager; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList; import net.minecraft.world.dimension.DimensionType; @@ -24,57 +23,50 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Coerce; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; - -import com.llamalad7.mixinextras.sugar.Local; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Coerce; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.RegistryLoader; -import net.minecraft.registry.RegistryWrapper; -import net.minecraft.resource.ResourceManager; - import java.util.List; import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.Consumer; import com.dfsek.terra.lifecycle.LifecyclePlatform; import com.dfsek.terra.lifecycle.util.LifecycleUtil; import com.dfsek.terra.lifecycle.util.RegistryHack; +import com.dfsek.terra.mod.CommonPlatform; +import com.dfsek.terra.mod.ModPlatform; @Mixin(RegistryLoader.class) public class RegistryLoaderMixin { + @Unique + private static final AtomicBoolean LOADING_DYNAMIC_REGISTRIES = new AtomicBoolean(false); @Shadow @Final private static Logger LOGGER; - @Unique - private static final AtomicBoolean LOADING_DYNAMIC_REGISTRIES = new AtomicBoolean(false); - - @Inject(method = "loadFromResource(Lnet/minecraft/resource/ResourceManager;Ljava/util/List;Ljava/util/List;)Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", at = @At("HEAD")) - private static void loadFromResources(ResourceManager resourceManager, List> registries, List> entries, CallbackInfoReturnable cir) { + @Inject(method = "loadFromResource(Lnet/minecraft/resource/ResourceManager;Ljava/util/List;Ljava/util/List;)" + + "Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", + at = @At("HEAD")) + private static void loadFromResources(ResourceManager resourceManager, List> registries, + List> entries, + CallbackInfoReturnable cir) { LOADING_DYNAMIC_REGISTRIES.set(entries.stream().anyMatch(entry -> entry.key() == RegistryKeys.BIOME)); } @Inject( - method = "load(Lnet/minecraft/registry/RegistryLoader$RegistryLoadable;Ljava/util/List;Ljava/util/List;)Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", + method = "load(Lnet/minecraft/registry/RegistryLoader$RegistryLoadable;Ljava/util/List;Ljava/util/List;)" + + "Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", at = @At( value = "INVOKE", target = "Ljava/util/List;forEach(Ljava/util/function/Consumer;)V", ordinal = 1 ) ) - private static void beforeFreeze(@Coerce Object loadable, List> wrappers, List> entries, CallbackInfoReturnable cir, @Local(ordinal = 2) List> registriesList) { - if (LOADING_DYNAMIC_REGISTRIES.getAndSet(false)) { + private static void beforeFreeze(@Coerce Object loadable, List> wrappers, List> entries, + CallbackInfoReturnable cir, + @Local(ordinal = 2) List> registriesList) { + if(LOADING_DYNAMIC_REGISTRIES.getAndSet(false)) { ModPlatform platform = CommonPlatform.get(); platform.getRawConfigRegistry().clear(); MutableRegistry biomes = extractRegistry(registriesList, RegistryKeys.BIOME).orElseThrow(); diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java index 98aa4d27f..a7bf93453 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java @@ -19,10 +19,14 @@ public class SaveLoadingMixin { "Ljava/util/concurrent/CompletableFuture;", at = @At( value = "INVOKE", - target = "Lnet/minecraft/server/DataPackContents;reload(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/CombinedDynamicRegistries;Ljava/util/List;Lnet/minecraft/resource/featuretoggle/FeatureSet;Lnet/minecraft/server/command/CommandManager$RegistrationEnvironment;ILjava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"), + target = "Lnet/minecraft/server/DataPackContents;reload(Lnet/minecraft/resource/ResourceManager;" + + "Lnet/minecraft/registry/CombinedDynamicRegistries;Ljava/util/List;Lnet/minecraft/resource/featuretoggle/FeatureSet;" + + "Lnet/minecraft/server/command/CommandManager$RegistrationEnvironment;ILjava/util/concurrent/Executor;" + + "Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"), index = 1 ) - private static CombinedDynamicRegistries grabManager(CombinedDynamicRegistries dynamicRegistries) { + private static CombinedDynamicRegistries grabManager( + CombinedDynamicRegistries dynamicRegistries) { MinecraftUtil.registerFlora(dynamicRegistries.getCombinedRegistryManager().getOrThrow(RegistryKeys.BIOME)); return dynamicRegistries; } diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleBiomeUtil.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleBiomeUtil.java index 3ad399862..f9fcd0f72 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleBiomeUtil.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleBiomeUtil.java @@ -1,7 +1,5 @@ package com.dfsek.terra.lifecycle.util; -import com.dfsek.terra.mod.util.BiomeUtil; - import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; @@ -21,6 +19,7 @@ import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions; import com.dfsek.terra.mod.config.ProtoPlatformBiome; import com.dfsek.terra.mod.config.VanillaBiomeProperties; import com.dfsek.terra.mod.mixin.access.VillagerTypeAccessor; +import com.dfsek.terra.mod.util.BiomeUtil; import com.dfsek.terra.mod.util.MinecraftUtil; @@ -51,7 +50,7 @@ public final class LifecycleBiomeUtil { Registry registry) { RegistryKey vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(registry); - if (vanilla == null) { + if(vanilla == null) { logger.error(""" Failed to get Vanilla Biome Regiestry key! Terra Biome ID: {} @@ -65,9 +64,9 @@ public final class LifecycleBiomeUtil { net.minecraft.world.biome.Biome vanilaBiome = registry.get(vanilla); - if (vanilaBiome == null) { + if(vanilaBiome == null) { String vanillaBiomeName; - if (vanilla != null ) { + if(vanilla != null) { vanillaBiomeName = vanilla.getValue().toString(); } else { vanillaBiomeName = "NULL"; @@ -89,12 +88,13 @@ public final class LifecycleBiomeUtil { .orElseThrow()); } else { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(Registry.registerReference(registry, - MinecraftUtil.registerKey(identifier) + MinecraftUtil.registerBiomeKey(identifier) .getValue(), minecraftBiome)); } - Map, RegistryKey> villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap(); + Map, RegistryKey> villagerMap = + VillagerTypeAccessor.getBiomeTypeToIdMap(); villagerMap.put(RegistryKey.of(RegistryKeys.BIOME, identifier), Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java index f9427dfa5..3d896c4ab 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java @@ -12,10 +12,6 @@ import com.dfsek.terra.mod.CommonPlatform; public final class LifecycleUtil { - private LifecycleUtil() { - - } - public static void initialize(MutableRegistry biomeMutableRegistry, MutableRegistry worldPresetMutableRegistry) { CommonPlatform.get().getEventManager().callEvent(new PlatformInitializationEvent()); LifecycleBiomeUtil.registerBiomes(biomeMutableRegistry); diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryUtil.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryUtil.java index 69bc2ce21..7c9232d7e 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryUtil.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryUtil.java @@ -5,6 +5,7 @@ import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; import com.dfsek.terra.mod.data.Codecs; +import com.dfsek.terra.mod.util.MinecraftUtil; public final class RegistryUtil { @@ -13,6 +14,7 @@ public final class RegistryUtil { } public static void register() { + MinecraftUtil.registerIntProviderTypes(); Registry.register(Registries.CHUNK_GENERATOR, Identifier.of("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER); Registry.register(Registries.BIOME_SOURCE, Identifier.of("terra:terra"), Codecs.TERRA_BIOME_SOURCE); } diff --git a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json index 26e9f9006..29f4f61a6 100644 --- a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -1,21 +1,21 @@ { - "required": true, - "minVersion": "0.8", - "package": "com.dfsek.terra.lifecycle.mixin", - "compatibilityLevel": "JAVA_21", - "mixins": [ - "NoiseConfigMixin", - "RegistryEntryReferenceInvoker", - "RegistryMixin", - "SimpleRegistryMixin", - "lifecycle.MinecraftServerMixin", - "lifecycle.RegistryLoaderMixin", - "lifecycle.SaveLoadingMixin" - ], - "server": [ - ], - "injectors": { - "defaultRequire": 1 - }, - "refmap": "terra.lifecycle.refmap.json" + "required": true, + "minVersion": "0.8", + "package": "com.dfsek.terra.lifecycle.mixin", + "compatibilityLevel": "JAVA_21", + "mixins": [ + "NoiseConfigMixin", + "RegistryEntryReferenceInvoker", + "RegistryMixin", + "SimpleRegistryMixin", + "lifecycle.MinecraftServerMixin", + "lifecycle.RegistryLoaderMixin", + "lifecycle.SaveLoadingMixin" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "terra.lifecycle.refmap.json" } \ No newline at end of file