diff --git a/LICENSE b/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/build.gradle.kts b/build.gradle.kts index 968d1e3b7..1d785b1a0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.5.1")) -versionProjects(":common:implementation", version("6.5.1")) -versionProjects(":platforms", version("6.5.1")) +versionProjects(":common:api", version("7.0.0")) +versionProjects(":common:implementation", version("7.0.0")) +versionProjects(":platforms", version("7.0.0")) allprojects { @@ -44,6 +44,7 @@ afterEvaluate { configureDistribution() } project(":platforms:bukkit:common").configureDistribution() + project(":platforms:minestom:example").configureDistribution() forSubProjects(":common:addons") { apply(plugin = "com.gradleup.shadow") diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index cec2d002d..4867397a3 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -17,8 +17,8 @@ repositories { dependencies { //TODO Allow pulling from Versions.kt implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.1") - implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.7.2") + implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "2.0.0-beta.16") implementation("org.ow2.asm", "asm", "9.7") implementation("org.ow2.asm", "asm-tree", "9.7") implementation("com.dfsek.tectonic", "common", "4.2.1") diff --git a/buildSrc/src/main/kotlin/DependencyConfig.kt b/buildSrc/src/main/kotlin/DependencyConfig.kt index 0df8e29f2..dc1c821b1 100644 --- a/buildSrc/src/main/kotlin/DependencyConfig.kt +++ b/buildSrc/src/main/kotlin/DependencyConfig.kt @@ -51,6 +51,21 @@ fun Project.configureDependencies() { maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") { name = "Sonatype Snapshots" } + maven("https://repo.opencollab.dev/maven-releases/") { + name = "OpenCollab Releases" + } + maven("https://repo.opencollab.dev/maven-snapshots/") { + name = "OpenCollab Snapshots" + } + maven("https://storehouse.okaeri.eu/repository/maven-public/") { + name = "Okaeri" + } + maven("https://maven.solo-studios.ca/releases") { + name = "Solo Studios" + } + maven("https://maven.solo-studios.ca/snapshots") { + name = "Solo Studios" + } } dependencies { diff --git a/buildSrc/src/main/kotlin/DistributionConfig.kt b/buildSrc/src/main/kotlin/DistributionConfig.kt index 0a1c2d060..65d295aba 100644 --- a/buildSrc/src/main/kotlin/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/DistributionConfig.kt @@ -4,9 +4,11 @@ import java.io.File import java.io.FileWriter import java.net.URL import java.nio.file.FileSystems +import java.nio.file.Path import org.gradle.api.DefaultTask import org.gradle.api.Project import org.gradle.api.plugins.BasePluginExtension +import org.gradle.jvm.tasks.Jar import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.extra @@ -19,6 +21,25 @@ import kotlin.io.path.createDirectories import kotlin.io.path.createFile import kotlin.io.path.exists +private fun Project.installAddonsInto(dest: Path) { + FileSystems.newFileSystem(dest, mapOf("create" to "false"), null).use { fs -> + forSubProjects(":common:addons") { + val jar = getJarTask() + + logger.info("Packaging addon ${jar.archiveFileName.get()} to $dest. size: ${jar.archiveFile.get().asFile.length() / 1024}KB") + + val boot = if (extra.has("bootstrap") && extra.get("bootstrap") as Boolean) "bootstrap/" else "" + val addonPath = fs.getPath("/addons/$boot${jar.archiveFileName.get()}") + + if (!addonPath.exists()) { + addonPath.parent.createDirectories() + addonPath.createFile() + jar.archiveFile.get().asFile.toPath().copyTo(addonPath, overwrite = true) + } + + } + } +} fun Project.configureDistribution() { apply(plugin = "com.gradleup.shadow") @@ -26,10 +47,12 @@ fun Project.configureDistribution() { val downloadDefaultPacks = tasks.create("downloadDefaultPacks") { group = "terra" doFirst { - file("${buildDir}/resources/main/packs/").deleteRecursively() - val defaultPackUrl = - URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/" + Versions.Terra.overworldConfig + "/default.zip") - downloadPack(defaultPackUrl, project) + try { + file("${buildDir}/resources/main/packs/").deleteRecursively() + val defaultPackUrl = + URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/" + Versions.Terra.overworldConfig + "/default.zip") + downloadPack(defaultPackUrl, project) + } catch (_:Exception) {} } } @@ -48,25 +71,17 @@ fun Project.configureDistribution() { doLast { // https://github.com/johnrengelman/shadow/issues/111 val dest = tasks.named("shadowJar").get().archiveFile.get().path - - - FileSystems.newFileSystem(dest, mapOf("create" to "false"), null).use { fs -> - forSubProjects(":common:addons") { - val jar = getJarTask() - - logger.info("Packaging addon ${jar.archiveFileName.get()} to $dest. size: ${jar.archiveFile.get().asFile.length() / 1024}KB") - - val boot = if (extra.has("bootstrap") && extra.get("bootstrap") as Boolean) "bootstrap/" else "" - val addonPath = fs.getPath("/addons/$boot${jar.archiveFileName.get()}") - - if (!addonPath.exists()) { - addonPath.parent.createDirectories() - addonPath.createFile() - jar.archiveFile.get().asFile.toPath().copyTo(addonPath, overwrite = true) - } - - } - } + installAddonsInto(dest) + } + } + + tasks.create("installAddonsIntoDefaultJar") { + group = "terra" + dependsOn(compileAddons) + + doLast { + val dest = tasks.named("jar").get().archiveFile.get().path + installAddonsInto(dest) } } @@ -133,7 +148,6 @@ fun Project.configureDistribution() { version = project.version relocate("org.apache.commons", "com.dfsek.terra.lib.commons") relocate("org.objectweb.asm", "com.dfsek.terra.lib.asm") - relocate("com.dfsek.paralithic", "com.dfsek.terra.lib.paralithic") relocate("org.json", "com.dfsek.terra.lib.json") relocate("org.yaml", "com.dfsek.terra.lib.yaml") diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 1e48e716a..c9d294cc7 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -5,31 +5,32 @@ object Versions { object Libraries { const val tectonic = "4.2.1" - const val paralithic = "0.7.1" + const val paralithic = "1.0.3" const val strata = "1.3.2" + const val seismic = "0.3.4" const val cloud = "2.0.0" - const val cloudPaper = "2.0.0-beta.10" - const val cloudFabric = "2.0.0-beta.9" const val caffeine = "3.1.8" const val slf4j = "2.0.16" - + object Internal { - const val shadow = "8.3.1" + const val shadow = "8.3.3" const val apacheText = "1.12.0" - const val apacheIO = "2.16.1" - const val guava = "33.3.0-jre" - const val asm = "9.7" + const val apacheIO = "2.17.0" + const val guava = "33.3.1-jre" + const val asm = "9.7.1" const val snakeYml = "2.3" - const val jetBrainsAnnotations = "24.1.0" - const val junit = "5.11.0" + const val jetBrainsAnnotations = "26.0.1" + const val junit = "5.11.3" + const val nbt = "6.1" } } object Fabric { - const val fabricAPI = "0.104.0+${Mod.minecraft}" + const val fabricAPI = "0.118.0+${Mod.minecraft}" + const val cloud = "2.0.0-beta.9" } // // object Quilt { @@ -40,12 +41,13 @@ object Versions { object Mod { const val mixin = "0.15.3+mixin.0.8.7" - const val minecraft = "1.21.1" - const val yarn = "$minecraft+build.3" - const val fabricLoader = "0.16.5" + const val minecraft = "1.21.4" + const val yarn = "$minecraft+build.8" + const val fabricLoader = "0.16.10" - const val architecuryLoom = "1.7.413" - const val architecturyPlugin = "3.4.159" + const val architecuryLoom = "1.9.428" + const val architecturyPlugin = "3.4.161" + } // // object Forge { @@ -54,14 +56,15 @@ object Versions { // } object Bukkit { - const val minecraft = "1.21.1" - const val paperBuild = "$minecraft-R0.1-20240917.151311-80" + const val minecraft = "1.21.4" + const val paperBuild = "$minecraft-R0.1-20250317.101324-208" const val paper = paperBuild const val paperLib = "1.0.8" const val reflectionRemapper = "0.1.1" const val paperDevBundle = paperBuild const val runPaper = "2.3.1" - const val paperWeight = "1.7.2" + const val paperWeight = "2.0.0-beta.16" + const val cloud = "2.0.0-beta.10" } // @@ -72,7 +75,18 @@ object Versions { // } // object CLI { - const val nbt = "6.1" const val logback = "1.5.8" + const val picocli = "4.7.6" } -} \ No newline at end of file + + object Allay { + const val api = "0.2.0" + const val gson = "2.12.1" + const val mappings = "3626653" + const val mappingsGenerator = "366618e" + } + + object Minestom { + const val minestom = "187931e50b" + } +} diff --git a/common/addons/api-addon-loader/LICENSE b/common/addons/api-addon-loader/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/api-addon-loader/LICENSE +++ b/common/addons/api-addon-loader/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonClassLoader.java b/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonClassLoader.java index 31c1eda90..9d1e1b234 100644 --- a/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonClassLoader.java +++ b/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonClassLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java b/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java index 3d2c977f5..4d16b43c9 100644 --- a/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java +++ b/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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..cb1a8ee14 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 @@ -5,13 +5,13 @@ 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.seismic.type.sampler.Sampler; +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..b67e033c8 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 @@ -7,8 +7,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.seismic.type.sampler.Sampler; +import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.Biome; @@ -17,7 +17,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 +25,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..ee0a63191 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 @@ -6,8 +6,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.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.Range; +import com.dfsek.seismic.type.sampler.Sampler; +import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.Biome; @@ -16,13 +16,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 22b8e06e5..000000000 --- a/common/addons/biome-provider-image-v2/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020-2023 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 073bea70e..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-2023 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 8c9763336..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-2023 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/LICENSE b/common/addons/biome-provider-image/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/biome-provider-image/LICENSE +++ b/common/addons/biome-provider-image/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 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 47132b653..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 b561910bf..f87628ec8 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -8,11 +8,14 @@ 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; @@ -24,12 +27,19 @@ 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; +import java.util.function.Supplier; + 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 01bbffab6..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-2023 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 87% 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 6596a0a8d..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 @@ -1,18 +1,18 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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.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 22b8e06e5..000000000 --- a/common/addons/biome-provider-pipeline-v2/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020-2023 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 509651d7d..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-2023 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/Pipeline.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Pipeline.java deleted file mode 100644 index 37c8f1db0..000000000 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Pipeline.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.api; - -import java.util.List; - - -public interface Pipeline { - BiomeChunk generateChunk(SeededVector worldCoordinates); - - int getChunkSize(); - - Source getSource(); - - List getStages(); -} diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/SeededVector.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/SeededVector.java deleted file mode 100644 index bee1f2424..000000000 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/SeededVector.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.api; - -public record SeededVector(long seed, int x, int z) { - - @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/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 75ffb8d65..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-2023 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 d3bbe528c..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-2023 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 7c1b58ad4..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-2023 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 8f897c0ab..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-2023 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/LICENSE b/common/addons/biome-provider-pipeline/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/biome-provider-pipeline/LICENSE +++ b/common/addons/biome-provider-pipeline/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 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 73dc95675..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-2023 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 e5f5f9ed6..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-2023 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 5df9c900c..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 ef952736d..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-2023 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 77% 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 8c36a7ccf..c045c905a 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,4 +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. + */ + +package com.dfsek.terra.addons.biome.pipeline; + +import com.dfsek.terra.api.util.cache.SeededVector2Key; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; @@ -9,12 +18,11 @@ 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.SeededVector; -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.seismic.type.sampler.Sampler; import com.dfsek.terra.api.registry.key.StringIdentifiable; import com.dfsek.terra.api.util.Column; import com.dfsek.terra.api.world.biome.Biome; @@ -23,14 +31,14 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider; public class PipelineBiomeProvider implements BiomeProvider { - private final LoadingCache biomeChunkCache; + 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; @@ -75,8 +83,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 += mutator.getSample(seed + 1, x, z) * noiseAmp; + z += mutator.getSample(seed + 2, x, z) * noiseAmp; x /= resolution; z /= resolution; @@ -90,7 +98,7 @@ public class PipelineBiomeProvider implements BiomeProvider { int xInChunk = x - chunkWorldX; int zInChunk = z - chunkWorldZ; - return biomeChunkCache.get(new SeededVector(seed, chunkWorldX, chunkWorldZ)).get(xInChunk, zInChunk).getBiome(); + return biomeChunkCache.get(new SeededVector2Key(chunkWorldX, chunkWorldZ, seed)).get(xInChunk, zInChunk).getBiome(); } @Override 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 5acb166a1..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-2023 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/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Pipeline.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Pipeline.java new file mode 100644 index 000000000..2eae6cd6a --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Pipeline.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.addons.biome.pipeline.api; + +import com.dfsek.terra.api.util.cache.SeededVector2Key; + +import java.util.List; + + +public interface Pipeline { + BiomeChunk generateChunk(SeededVector2Key worldCoordinates); + + int getChunkSize(); + + Source getSource(); + + List getStages(); +} 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 d007c6c8f..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-2023 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 4fcb9feeb..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-2023 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 6362b582d..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-2023 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 1566de524..575487d8c 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -10,45 +10,46 @@ 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 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.seismic.type.sampler.Sampler; 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 93f84e80a..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-2023 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 b79c2e79a..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-2023 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 6f04cfd47..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-2023 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 66% 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 8b98cad62..348e24d86 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 @@ -1,27 +1,27 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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.source; +package com.dfsek.terra.addons.biome.pipeline.config.source; 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.seismic.type.sampler.Sampler; 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 64% 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 2c87fc98f..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 @@ -1,15 +1,15 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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.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 ec326ed0c..973f9bb5f 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -11,13 +11,13 @@ 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; +import com.dfsek.seismic.type.sampler.Sampler; 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 9c13e1fd2..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 5cb7287e1..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-2023 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 69% 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 0f5ccc6ed..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 @@ -1,20 +1,20 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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; +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 f9b8888df..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-2023 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 64% 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 6b6bbe4f8..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 @@ -1,18 +1,18 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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; +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 8522f0488..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-2023 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 67% 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 53d6aff2f..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 @@ -1,20 +1,20 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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; +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 48e3da95b..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-2023 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 62% 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 4a62704c9..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 @@ -1,18 +1,18 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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; +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/SmoothMutatorTemplate.java deleted file mode 100644 index 8959a229a..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2020-2023 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.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.SmoothMutator; -import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage; - - -public class SmoothMutatorTemplate extends StageTemplate { - @Override - public Stage get() { - return new MutatorStage(new SmoothMutator(noise)); - } -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothStageTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothStageTemplate.java new file mode 100644 index 000000000..a837bded1 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothStageTemplate.java @@ -0,0 +1,20 @@ +/* + * 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.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; +import com.dfsek.terra.addons.biome.pipeline.stage.mutators.SmoothStage; + + +public class SmoothStageTemplate extends StageTemplate { + @Override + public Stage get() { + 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 aa06967e2..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-2023 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 21ed29efe..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-2023 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 43fd9f663..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-2023 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 3939b133b..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-2023 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 f64871b39..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-2023 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 8d8d01bf2..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-2023 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 90% 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 78b0fe806..678190896 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,23 +1,23 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.pipeline; +package com.dfsek.terra.addons.biome.pipeline.pipeline; 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.SeededVector; -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; public class BiomeChunkImpl implements BiomeChunk { - private final SeededVector worldOrigin; + private final SeededVector2Key worldOrigin; private final int chunkOriginArrayIndex; private final int worldCoordinateScale; private final int size; private PipelineBiome[] biomes; - public BiomeChunkImpl(SeededVector worldOrigin, PipelineImpl pipeline) { + public BiomeChunkImpl(SeededVector2Key worldOrigin, PipelineImpl pipeline) { this.worldOrigin = worldOrigin; this.chunkOriginArrayIndex = pipeline.getChunkOriginArrayIndex(); @@ -44,7 +44,7 @@ public class BiomeChunkImpl implements BiomeChunk { for(int gridZ = 0; gridZ < gridSize; gridZ++) { int xIndex = gridOrigin + gridX * gridInterval; int zIndex = gridOrigin + gridZ * gridInterval; - biomes[(xIndex * size) + zIndex] = pipeline.getSource().get(worldOrigin.seed(), xIndexToWorldCoordinate(xIndex), + biomes[(xIndex * size) + zIndex] = pipeline.getSource().get(worldOrigin.seed, xIndexToWorldCoordinate(xIndex), zIndexToWorldCoordinate(zIndex)); } } @@ -139,14 +139,14 @@ public class BiomeChunkImpl implements BiomeChunk { } private int xIndexToWorldCoordinate(int xIndex) { - return (worldOrigin.x() + xIndex - chunkOriginArrayIndex) * worldCoordinateScale; + return (worldOrigin.x + xIndex - chunkOriginArrayIndex) * worldCoordinateScale; } private int zIndexToWorldCoordinate(int zIndex) { - return (worldOrigin.z() + zIndex - chunkOriginArrayIndex) * worldCoordinateScale; + return (worldOrigin.z + zIndex - chunkOriginArrayIndex) * worldCoordinateScale; } - private SeededVector getOrigin() { + private SeededVector2Key getOrigin() { return worldOrigin; } @@ -216,7 +216,7 @@ public class BiomeChunkImpl implements BiomeChunk { } public long worldSeed() { - return chunk.getOrigin().seed(); + return chunk.getOrigin().seed; } } } 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 82% 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 3adef3d8e..6b0977ca9 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,16 +1,17 @@ -package com.dfsek.terra.addons.biome.pipeline.v2.pipeline; +package com.dfsek.terra.addons.biome.pipeline.pipeline; + +import com.dfsek.terra.api.util.cache.SeededVector2Key; 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.SeededVector; -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; public class PipelineImpl implements Pipeline { @@ -55,7 +56,7 @@ public class PipelineImpl implements Pipeline { } @Override - public BiomeChunk generateChunk(SeededVector worldCoordinates) { + public BiomeChunk generateChunk(SeededVector2Key worldCoordinates) { return new BiomeChunkImpl(worldCoordinates, this); } 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 56b67b7f4..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-2023 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 7fc981d31..ca2982fd7 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,27 +7,28 @@ 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.terra.addons.biome.pipeline.api.Source; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.seismic.type.sampler.Sampler; 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..a60f09f87 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,16 @@ -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.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; +import com.dfsek.seismic.type.sampler.Sampler; 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 +20,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 79% 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 a269fb7f2..9beaa7ec7 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 @@ -1,11 +1,11 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.stage.mutators; import java.util.ArrayList; import java.util.HashSet; @@ -14,17 +14,18 @@ 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.seismic.type.vector.Vector2Int; + +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.seismic.type.sampler.Sampler; 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 73% 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 c1b5dbfba..f41918f3e 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 @@ -1,11 +1,11 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.stage.mutators; import java.util.ArrayList; import java.util.HashSet; @@ -13,24 +13,24 @@ 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.seismic.type.sampler.Sampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.vector.Vector2Int; +import com.dfsek.seismic.type.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 +50,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 85% 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 4d86958a2..1c634c950 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 @@ -1,32 +1,32 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.stage.mutators; 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.seismic.type.sampler.Sampler; 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 79% 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 b15986c82..1f4e4222a 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 @@ -1,29 +1,29 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.stage.mutators; 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.seismic.type.sampler.Sampler; 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 67% 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 5b8cac234..6c111ecdb 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 @@ -1,25 +1,25 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.stage.mutators; 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; +import com.dfsek.seismic.type.sampler.Sampler; 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 +30,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 45602fb6b..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-2023 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 8efbaaa27..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-2023 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/biome-provider-single/LICENSE b/common/addons/biome-provider-single/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/biome-provider-single/LICENSE +++ b/common/addons/biome-provider-single/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java index 839508981..04b16d723 100644 --- a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java +++ b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderAddon.java b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderAddon.java index ebf355e72..dd8a524dc 100644 --- a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderAddon.java +++ b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderTemplate.java b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderTemplate.java index 3a4c3f05e..51ba4af69 100644 --- a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderTemplate.java +++ b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/chunk-generator-noise-3d/LICENSE b/common/addons/chunk-generator-noise-3d/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/chunk-generator-noise-3d/LICENSE +++ b/common/addons/chunk-generator-noise-3d/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java index f2f0c9386..e24b6973e 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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..ce55469b0 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 @@ -5,20 +5,20 @@ 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.seismic.type.sampler.Sampler; 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..e58978be0 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,12 @@ 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/config/palette/BiomePaletteTemplate.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomePaletteTemplate.java index a4ff986e4..f51356f3b 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomePaletteTemplate.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomePaletteTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/NoiseChunkGenerator3D.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/NoiseChunkGenerator3D.java index 4f891d12b..b2b357ee6 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/NoiseChunkGenerator3D.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/NoiseChunkGenerator3D.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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..d7cf84133 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,7 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math; import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D; -import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3; public enum SlantCalculationMethod { @@ -22,7 +22,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/ChunkInterpolator.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator.java index 2a2640a91..afb97499e 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 d5f1c03ad..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 74cc8fd99..13f421389 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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,7 @@ 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 +42,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 5ea8ef578..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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..dcab4df14 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,9 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation; +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; @@ -56,7 +57,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 +82,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 +101,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 fcae0ce8c..90d69461a 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/BiomePaletteInfo.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/BiomePaletteInfo.java index 56555afef..1e676323c 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/BiomePaletteInfo.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/BiomePaletteInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolder.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolder.java index 5b5673770..4d1f036c7 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolder.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/MultipleSlantHolder.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/MultipleSlantHolder.java index 08f1d16fe..119d90877 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/MultipleSlantHolder.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/MultipleSlantHolder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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/LICENSE b/common/addons/config-biome/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/config-biome/LICENSE +++ b/common/addons/config-biome/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeAddon.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeAddon.java index 01d80e999..5e00dbc06 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeAddon.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java index 8ed5d2aea..c247f0447 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeFactory.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeFactory.java index 95029a434..f60d10a00 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeFactory.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeTemplate.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeTemplate.java index 9ae2d52f0..102a70ef5 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeTemplate.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/PaletteSettingsImpl.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/PaletteSettingsImpl.java index 57b56cd0e..9973091cb 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/PaletteSettingsImpl.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/PaletteSettingsImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiome.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiome.java index 8f9ac0d11..24f5c64cb 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiome.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiome.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolder.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolder.java index 81a5973aa..50d2c2961 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolder.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 a96cbcc48..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/LICENSE b/common/addons/config-distributors/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/config-distributors/LICENSE +++ b/common/addons/config-distributors/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java index 0006885a7..552f36184 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/AndDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/AndDistributorTemplate.java index 28408129f..df60e7b4e 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/AndDistributorTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/AndDistributorTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoDistributorTemplate.java index eecc77b77..4bc5b170d 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoDistributorTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoDistributorTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/OrDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/OrDistributorTemplate.java index a48f912ec..0e86b3d57 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/OrDistributorTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/OrDistributorTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PointSetDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PointSetDistributorTemplate.java index ef8e2649b..be7cb307d 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PointSetDistributorTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PointSetDistributorTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 6640fbe01..be6fa7c6f 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -13,7 +13,7 @@ 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.seismic.type.sampler.Sampler; 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/config/XorDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/XorDistributorTemplate.java index ffeaa146b..1376b8930 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/XorDistributorTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/XorDistributorTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/YesDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/YesDistributorTemplate.java index a4bae8e4f..9e52796cc 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/YesDistributorTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/YesDistributorTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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..d7b0b6fb0 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,13 @@ package com.dfsek.terra.addons.feature.distributor.distributors; -import java.util.Random; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; + +import com.dfsek.seismic.algorithms.hashing.HashingFunctions; + +import com.dfsek.seismic.math.integer.IntegerFunctions; import com.dfsek.terra.api.structure.feature.Distributor; -import com.dfsek.terra.api.util.MathUtil; public class PaddedGridDistributor implements Distributor { @@ -24,7 +28,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 4285af486..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 d93c85fa4..51bea61b3 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,22 +7,22 @@ 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-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/Point.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/Point.java index 47248c6e2..96241b18c 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/Point.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/Point.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/PointTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/PointTemplate.java index aabe7c004..03500f280 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/PointTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/PointTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-feature/LICENSE b/common/addons/config-feature/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/config-feature/LICENSE +++ b/common/addons/config-feature/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 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 46066c9fb..1cc985996 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,7 +7,7 @@ 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 +19,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/FeatureAddon.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureAddon.java index c8fee225b..9ad3520f6 100644 --- a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureAddon.java +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureConfigType.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureConfigType.java index aeae9f9e0..53372bea4 100644 --- a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureConfigType.java +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureConfigType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureFactory.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureFactory.java index 7d4d2be12..4426cbdb2 100644 --- a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureFactory.java +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 5e3eb95cc..791c0fc46 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -12,7 +12,7 @@ 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.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.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/LICENSE b/common/addons/config-flora/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/config-flora/LICENSE +++ b/common/addons/config-flora/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraAddon.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraAddon.java index 132a52594..37c8fff6d 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraAddon.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java index 30e0f3ec8..3d555d19a 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraFactory.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraFactory.java index 14a50d55a..ed7125ede 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraFactory.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 214a17ab4..a5dbfa78a 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -16,7 +16,7 @@ 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.seismic.type.sampler.Sampler; 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/config/BlockLayerTemplate.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/config/BlockLayerTemplate.java index 6b99c8277..64515cdb8 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/config/BlockLayerTemplate.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/config/BlockLayerTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/BlockLayer.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/BlockLayer.java index d372ac2fe..42fcb8d7a 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/BlockLayer.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/BlockLayer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 661b820f2..7e8e5ee3c 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -10,16 +10,18 @@ package com.dfsek.terra.addons.flora.flora.gen; 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.seismic.type.Rotation; 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.seismic.type.sampler.Sampler; 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.seismic.type.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/LICENSE b/common/addons/config-locators/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/config-locators/LICENSE +++ b/common/addons/config-locators/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java index 8a0896181..4cde89377 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 9afff0a28..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/AndLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/AndLocatorTemplate.java index 3de3c59f1..93e319227 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/AndLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/AndLocatorTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 350c818c2..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/OrLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/OrLocatorTemplate.java index bbbb10e7f..bf7fbc1eb 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/OrLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/OrLocatorTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 a7e7c2fa7..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 db73e11bd..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 b0dfaab3d..0382985a9 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -12,13 +12,13 @@ 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.seismic.type.sampler.Sampler; 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 599d37e66..f2915f234 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -14,13 +14,13 @@ 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.seismic.type.sampler.Sampler; 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 861adb0fd..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 0967e47af..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/XorLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/XorLocatorTemplate.java index 48dca2bb0..4d3d8cbe1 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/XorLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/XorLocatorTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 41398b9c7..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/AndPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AndPatternTemplate.java index 59a786e4a..d47093020 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AndPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AndPatternTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 5b9be9beb..1bca74dc8 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -13,7 +13,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.config.meta.Meta; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.api.util.collection.MaterialSet; diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/NotPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/NotPatternTemplate.java index 6aa0d8689..b9c41de55 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/NotPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/NotPatternTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/OrPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/OrPatternTemplate.java index c97873fb6..c1fa09f5e 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/OrPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/OrPatternTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 72c791971..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 b3710d9f1..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/config/pattern/XorPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/XorPatternTemplate.java index 5250a2129..fad6db1ad 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/XorPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/XorPatternTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 0cbf09c64..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 db1279ab9..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 869d3cc0e..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 1f8dbd19a..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 a91049299..b419853d4 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,16 +7,16 @@ 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 +25,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 42b04f4d7..5423e25f4 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -9,7 +9,7 @@ package com.dfsek.terra.addons.feature.locator.locators; import java.util.List; -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; @@ -17,9 +17,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 +42,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 9f7fd625f..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 35547d88d..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 78a0e0232..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/Pattern.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/Pattern.java index 9d6617d39..f28516d5b 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/Pattern.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/Pattern.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-noise-function/LICENSE b/common/addons/config-noise-function/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/config-noise-function/LICENSE +++ b/common/addons/config-noise-function/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 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 3fd52950c..19da4e2af 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,6 +7,10 @@ package com.dfsek.terra.addons.noise; +import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; +import com.dfsek.seismic.algorithms.sampler.noise.CellularSampler; +import com.dfsek.seismic.type.CubicSpline; +import com.dfsek.seismic.type.DistanceFunction; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.LinkedHashMap; @@ -15,12 +19,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.DerivativeNoiseSamplerTemplate; +import com.dfsek.terra.addons.noise.config.templates.CacheSamplerTemplate; +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; @@ -37,42 +41,31 @@ import com.dfsek.terra.addons.noise.config.templates.noise.fractal.RidgedFractal import com.dfsek.terra.addons.noise.config.templates.normalizer.ClampNormalizerTemplate; import com.dfsek.terra.addons.noise.config.templates.normalizer.CubicSplineNormalizerTemplate; import com.dfsek.terra.addons.noise.config.templates.normalizer.ExpressionNormalizerTemplate; +import com.dfsek.terra.addons.noise.config.templates.normalizer.LinearMapNormalizerTemplate; import com.dfsek.terra.addons.noise.config.templates.normalizer.LinearNormalizerTemplate; import com.dfsek.terra.addons.noise.config.templates.normalizer.NormalNormalizerTemplate; import com.dfsek.terra.addons.noise.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.seismic.type.sampler.DerivativeSampler; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; - +import com.dfsek.seismic.algorithms.sampler.noise.*; +import com.dfsek.seismic.algorithms.sampler.noise.simplex.*; +import com.dfsek.seismic.algorithms.sampler.noise.fractal.*; +import com.dfsek.seismic.algorithms.sampler.noise.random.*; +import com.dfsek.seismic.algorithms.sampler.noise.value.*; +import com.dfsek.seismic.algorithms.sampler.normalizer.*; +import com.dfsek.seismic.algorithms.sampler.arithmetic.*; 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; @@ -86,21 +79,24 @@ public class NoiseAddon implements AddonInitializer { .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) .then(event -> { - CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry( + ParseOptions expressionParseOptions = event.getPack().getExpressionParseOptions(); + + CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry( NOISE_SAMPLER_TOKEN); event.getPack() - .applyLoader(CellularSampler.DistanceFunction.class, - (type, o, loader, depthTracker) -> CellularSampler.DistanceFunction.valueOf((String) o)) + .applyLoader(DistanceFunction.class, + (type, o, loader, depthTracker) -> 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(FunctionTemplate.class, FunctionTemplate::new) + .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); noiseRegistry.register(addon.key("NORMAL"), NormalNormalizerTemplate::new); noiseRegistry.register(addon.key("CLAMP"), ClampNormalizerTemplate::new); noiseRegistry.register(addon.key("PROBABILITY"), ProbabilityNormalizerTemplate::new); @@ -108,8 +104,6 @@ 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); @@ -148,12 +142,14 @@ public class NoiseAddon implements AddonInitializer { noiseRegistry.register(addon.key("MAX"), () -> new BinaryArithmeticTemplate<>(MaxSampler::new)); noiseRegistry.register(addon.key("MIN"), () -> new BinaryArithmeticTemplate<>(MinSampler::new)); + 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)); + noiseRegistry.register(addon.key("EXPRESSION"), () -> new ExpressionFunctionTemplate(packSamplers, packFunctions, expressionParseOptions)); noiseRegistry.register(addon.key("EXPRESSION_NORMALIZER"), - () -> new ExpressionNormalizerTemplate(packSamplers, packFunctions)); + () -> new ExpressionNormalizerTemplate(packSamplers, packFunctions, expressionParseOptions)); NoiseConfigPackTemplate template = event.loadTemplate(new NoiseConfigPackTemplate()); packSamplers.putAll(template.getSamplers()); 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 d6ac6c00c..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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..0b609ff96 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,11 +1,11 @@ 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; +import com.dfsek.terra.api.config.meta.Meta; public class CubicSplinePointTemplate implements ObjectTemplate { 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 64% 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 bc5d32555..38b474b3f 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -11,18 +11,18 @@ 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.seismic.type.sampler.Sampler; -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(Sampler sampler, int dimensions) { + this.sampler = sampler; + if (dimensions == 2) { + this.cache2D = ThreadLocal.withInitial(() -> { + LoadingCache cache = Caffeine + .newBuilder() + .executor(CACHE_EXECUTOR) + .scheduler(Scheduler.systemScheduler()) + .initialCapacity(256) + .maximumSize(256) + .build(this::sampleNoise); + return Pair.of(new DoubleSeededVector2Key(0, 0, 0), cache).mutable(); + }); + this.cache3D = null; + } else { + this.cache3D = ThreadLocal.withInitial(() -> { + LoadingCache cache = Caffeine + .newBuilder() + .executor(CACHE_EXECUTOR) + .scheduler(Scheduler.systemScheduler()) + .initialCapacity(981504) + .maximumSize(981504) + .build(this::sampleNoise); + return Pair.of(new DoubleSeededVector3Key(0, 0, 0, 0), cache).mutable(); + }); + this.cache2D = null; + } + } + + private Double sampleNoise(DoubleSeededVector2Key vec) { + this.cache2D.get().setLeft(new DoubleSeededVector2Key(0, 0, 0)); + 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.getSample(vec.seed, vec.x, vec.y, vec.z); + } + + @Override + public double getSample(long seed, double x, double y) { + Mutable> cachePair = cache2D.get(); + DoubleSeededVector2Key mutableKey = cachePair.getLeft(); + mutableKey.set(x, y, seed); + return cachePair.getRight().get(mutableKey); + } + + @Override + 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); + return cachePair.getRight().get(mutableKey); + } +} 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..a1ff9438d 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.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; +import com.dfsek.seismic.type.sampler.Sampler; 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 new file mode 100644 index 000000000..9af1a6462 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/CacheSamplerTemplate.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.addons.noise.config.templates; + +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.seismic.type.sampler.Sampler; + +import com.dfsek.terra.addons.noise.config.sampler.CacheSampler; + +import org.jetbrains.annotations.ApiStatus.Experimental; + + +@Experimental +public class CacheSamplerTemplate extends SamplerTemplate { + @Value("sampler") + @Default + private Sampler sampler; + + public CacheSamplerTemplate() { + + } + + @Override + 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..e322d59a3 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeSamplerTemplate.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.addons.noise.config.templates; + +import com.dfsek.seismic.type.sampler.DerivativeSampler; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.exception.ValidationException; + +import com.dfsek.seismic.type.sampler.Sampler; + + +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 6780d593e..f1d1ed93c 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,28 +7,28 @@ package com.dfsek.terra.addons.noise.config.templates; +import com.dfsek.seismic.algorithms.sampler.DomainWarpedSampler; 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; +import com.dfsek.seismic.type.sampler.Sampler; @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/FunctionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/FunctionTemplate.java index 543ac908a..12abfa99c 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/FunctionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/FunctionTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,19 +7,22 @@ package com.dfsek.terra.addons.noise.config.templates; +import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; 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 java.util.LinkedHashMap; import java.util.List; import java.util.Objects; -import com.dfsek.terra.api.config.meta.Meta; - @SuppressWarnings("unused") public class FunctionTemplate implements ObjectTemplate { + private final ParseOptions parseOptions; + @Value("arguments") private List args; @@ -30,6 +33,10 @@ public class FunctionTemplate implements ObjectTemplate { @Default private @Meta LinkedHashMap functions = new LinkedHashMap<>(); + public FunctionTemplate(ParseOptions parseOptions) { + this.parseOptions = parseOptions; + } + @Override public FunctionTemplate get() { return this; @@ -47,6 +54,10 @@ public class FunctionTemplate implements ObjectTemplate { return functions; } + public ParseOptions getParseOptions() { + return parseOptions; + } + @Override public boolean equals(Object o) { if(this == o) return true; 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 c7359426c..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-2023 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 3d2478e35..407313b66 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,15 +7,15 @@ package com.dfsek.terra.addons.noise.config.templates; +import com.dfsek.seismic.algorithms.sampler.KernelSampler; 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; +import com.dfsek.seismic.type.sampler.Sampler; @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++) { 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..744c3cb46 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.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; +import com.dfsek.seismic.type.sampler.Sampler; @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..1a73a21b2 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.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; +import com.dfsek.seismic.type.sampler.Sampler; 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 01b370e55..9c4aa142d 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,20 +7,22 @@ package com.dfsek.terra.addons.noise.config.templates.noise; +import com.dfsek.seismic.algorithms.sampler.noise.CellularSampler; +import com.dfsek.seismic.algorithms.sampler.noise.simplex.OpenSimplex2Sampler; +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.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; +import com.dfsek.seismic.type.sampler.Sampler; @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 @@ -33,10 +35,14 @@ public class CellularNoiseTemplate extends NoiseTemplate { @Value("lookup") @Default - private @Meta NoiseSampler lookup = new OpenSimplex2Sampler(); + private @Meta Sampler lookup = new OpenSimplex2Sampler(); + + @Value("salt-lookup") + @Default + private @Meta boolean saltLookup = true; @Override - public NoiseSampler get() { + public Sampler get() { CellularSampler sampler = new CellularSampler(); sampler.setNoiseLookup(lookup); sampler.setFrequency(frequency); @@ -44,6 +50,7 @@ public class CellularNoiseTemplate extends NoiseTemplate { sampler.setReturnType(cellularReturnType); sampler.setDistanceFunction(cellularDistanceFunction); sampler.setSalt(salt); + sampler.setSaltLookup(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 4755f5f8d..49922b07d 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,13 +7,13 @@ package com.dfsek.terra.addons.noise.config.templates.noise; +import com.dfsek.seismic.algorithms.sampler.noise.ConstantSampler; 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; +import com.dfsek.seismic.type.sampler.Sampler; @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..997661313 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,11 +1,12 @@ 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; @@ -13,7 +14,7 @@ public class DistanceSamplerTemplate extends SamplerTemplate { @Value("distance-function") @Default - private DistanceSampler.@Meta DistanceFunction distanceFunction = DistanceFunction.Euclidean; + private @Meta DistanceFunction distanceFunction = DistanceFunction.Euclidean; @Value("point.x") @Default 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 3268af5b0..273511467 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,7 +7,9 @@ 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.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -15,20 +17,20 @@ 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 com.dfsek.seismic.type.sampler.Sampler; 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") @Default private @Meta Map vars = new HashMap<>(); @@ -36,25 +38,27 @@ 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, - Map globalFunctions) { + public ExpressionFunctionTemplate(Map globalSamplers, + Map globalFunctions, + ParseOptions parseOptions) { this.globalSamplers = globalSamplers; this.globalFunctions = globalFunctions; + this.parseOptions = parseOptions; } @Override - public NoiseSampler get() { + public Sampler get() { var mergedFunctions = new HashMap<>(globalFunctions); mergedFunctions.putAll(functions); var mergedSamplers = new HashMap<>(globalSamplers); mergedSamplers.putAll(samplers); try { - return new ExpressionFunction(convertFunctionsAndSamplers(mergedFunctions, mergedSamplers), expression, vars); + 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 ef32def58..2347f76b7 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,16 +7,17 @@ package com.dfsek.terra.addons.noise.config.templates.noise; +import com.dfsek.seismic.algorithms.sampler.noise.GaborSampler; 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; +import com.dfsek.seismic.type.sampler.Sampler; @SuppressWarnings("FieldMayBeFinal") -public class GaborNoiseTemplate extends NoiseTemplate { +public class GaborNoiseTemplate extends NoiseTemplate { @Value("rotation") @Default private @Meta double rotation = 0.25; @@ -38,15 +39,15 @@ public class GaborNoiseTemplate extends NoiseTemplate { private @Meta double f0 = 0.625; @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(); + gaborSampler.setFrequency(frequency); + gaborSampler.setRotation(rotation); + gaborSampler.setIsotropic(isotropic); + gaborSampler.setDeviation(deviation); + gaborSampler.setImpulsesPerKernel(impulses); + gaborSampler.setFrequency0(f0); + gaborSampler.setSalt(salt); + 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 b83971c14..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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..6cbc4a6b6 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.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; +import com.dfsek.seismic.type.sampler.DerivativeSampler; 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(); @Value("slope-mask.enable") @Default 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 5a9c497a5..d93569aa8 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -9,8 +9,8 @@ package com.dfsek.terra.addons.noise.config.templates.noise; import java.util.function.Supplier; -import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.seismic.algorithms.sampler.noise.NoiseFunction; +import com.dfsek.seismic.type.sampler.Sampler; public class SimpleNoiseTemplate extends NoiseTemplate { @@ -21,7 +21,7 @@ public class SimpleNoiseTemplate extends NoiseTemplate { } @Override - public NoiseSampler get() { + public Sampler get() { NoiseFunction sampler = samplerSupplier.get(); sampler.setFrequency(frequency); sampler.setSalt(salt); 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 d4fae6e9c..2ca2fd047 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,13 +7,14 @@ 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() { + public Sampler get() { BrownianMotionSampler sampler = new BrownianMotionSampler(function); sampler.setGain(fractalGain); sampler.setLacunarity(fractalLacunarity); 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 c363235b3..02587ebe4 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,13 +7,13 @@ package com.dfsek.terra.addons.noise.config.templates.noise.fractal; +import com.dfsek.seismic.algorithms.sampler.noise.fractal.FractalNoiseFunction; 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.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.seismic.type.sampler.Sampler; public abstract class FractalTemplate extends SamplerTemplate { @@ -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 3092c7cb8..3913d0930 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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.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; +import com.dfsek.seismic.type.sampler.Sampler; @SuppressWarnings({ "unused", "FieldMayBeFinal" }) @@ -22,7 +22,7 @@ public class PingPongTemplate extends FractalTemplate { private @Meta double pingPong = 2.0D; @Override - public NoiseSampler get() { + public Sampler get() { PingPongSampler sampler = new PingPongSampler(function); sampler.setGain(fractalGain); sampler.setLacunarity(fractalLacunarity); 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 7d3cd340f..fa447ca9b 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,13 +7,14 @@ 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() { + public Sampler get() { RidgedFractalSampler sampler = new RidgedFractalSampler(function); sampler.setGain(fractalGain); sampler.setLacunarity(fractalLacunarity); 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 6e8cdb2e4..91d764909 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,11 +7,11 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer; +import com.dfsek.seismic.algorithms.sampler.normalizer.ClampNormalizer; 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; +import com.dfsek.seismic.type.sampler.Sampler; @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..3ff448bc2 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.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.addons.noise.config.templates.SamplerTemplate; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.seismic.type.sampler.Sampler; - -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 4254f4798..a5f06fad8 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,6 +7,7 @@ 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.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -15,11 +16,11 @@ 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 com.dfsek.seismic.type.sampler.Sampler; +import com.dfsek.paralithic.sampler.normalizer.ExpressionNormalizer; import static com.dfsek.terra.addons.noise.paralithic.FunctionUtil.convertFunctionsAndSamplers; @@ -27,8 +28,9 @@ 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; @Value("expression") private @Meta String expression; @@ -39,26 +41,28 @@ 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, - Map globalFunctions) { + public ExpressionNormalizerTemplate(Map globalSamplers, + Map globalFunctions, + ParseOptions parseOptions) { this.globalSamplers = globalSamplers; this.globalFunctions = globalFunctions; + this.parseOptions = parseOptions; } @Override - public NoiseSampler get() { + public Sampler get() { var mergedFunctions = new HashMap<>(globalFunctions); mergedFunctions.putAll(functions); var mergedSamplers = new HashMap<>(globalSamplers); mergedSamplers.putAll(samplers); try { - return new ExpressionNormalizer(function, convertFunctionsAndSamplers(mergedFunctions, mergedSamplers), expression, vars); + 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 new file mode 100644 index 000000000..c335c914b --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/LinearMapNormalizerTemplate.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.addons.noise.config.templates.normalizer; + +import com.dfsek.seismic.algorithms.sampler.normalizer.LinearMapNormalizer; +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.seismic.type.sampler.Sampler; + + +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 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 faa0818bc..b12e7f3ba 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,11 +7,11 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer; +import com.dfsek.seismic.algorithms.sampler.normalizer.LinearNormalizer; 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; +import com.dfsek.seismic.type.sampler.Sampler; @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..1be8b7c01 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.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; +import com.dfsek.seismic.type.sampler.Sampler; @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..506190201 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.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; +import com.dfsek.seismic.type.sampler.Sampler; 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 76b85de0a..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-2023 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 68a5dc2d0..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ExpressionNormalizer.java +++ /dev/null @@ -1,33 +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.Scope; -import com.dfsek.paralithic.eval.tokenizer.ParseException; -import com.dfsek.paralithic.functions.Function; - -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) - throws ParseException { - super(sampler); - Parser p = new Parser(); - Scope scope = new Scope(); - 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/LinearNormalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/LinearNormalizer.java deleted file mode 100644 index 42678ceb5..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-2023 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 c20cc8ee7..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-2023 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 60206bc1a..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-2023 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..4e6451193 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 @@ -6,20 +6,22 @@ import com.dfsek.paralithic.functions.Function; import java.util.HashMap; import java.util.Map; -import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; +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 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 93% 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 f55fe3e12..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 @@ -1,11 +1,11 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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.defined; +package com.dfsek.terra.addons.noise.paralithic; import com.dfsek.paralithic.Expression; import com.dfsek.paralithic.eval.parser.Parser; @@ -35,7 +35,7 @@ public class UserDefinedFunction implements DynamicFunction { public static UserDefinedFunction newInstance(FunctionTemplate template) throws ParseException { UserDefinedFunction function = CACHE.get(template); if(function == null) { - Parser parser = new Parser(); + Parser parser = new Parser(template.getParseOptions()); Scope parent = new Scope(); Scope functionScope = new Scope().withParent(parent); 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 10844d38c..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-2023 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 725439ad3..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-2023 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 78d6d3862..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-2023 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 beb4d691b..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-2023 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 13c9ceb6d..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-2023 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 96c81bca5..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-2023 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 c393d314d..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/AdditionSampler.java +++ /dev/null @@ -1,15 +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; - } -} 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 03f3a3794..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/BinaryArithmeticSampler.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers.arithmetic; - -import com.dfsek.terra.api.noise.NoiseSampler; - - -public abstract class BinaryArithmeticSampler implements NoiseSampler { - private final NoiseSampler left; - private final NoiseSampler right; - - protected BinaryArithmeticSampler(NoiseSampler left, NoiseSampler right) { - this.left = left; - this.right = 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)); - } - - public abstract double operate(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 09169b613..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/DivisionSampler.java +++ /dev/null @@ -1,15 +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; - } -} 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 e97722614..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MaxSampler.java +++ /dev/null @@ -1,15 +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); - } -} 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 7fcd42bdc..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MinSampler.java +++ /dev/null @@ -1,15 +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); - } -} 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 d9fc46b7e..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MultiplicationSampler.java +++ /dev/null @@ -1,15 +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; - } -} 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 0b7f0b816..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/SubtractionSampler.java +++ /dev/null @@ -1,15 +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; - } -} 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 6facef332..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java +++ /dev/null @@ -1,416 +0,0 @@ -/* - * Copyright (c) 2020-2023 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; - - 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; - } - - @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.CellValue) { - 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, centerX, centerY); - case LocalNoiseLookup -> noiseLookup.noise(sl, 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.CellValue) { - 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, centerX, centerY, centerZ); - case LocalNoiseLookup -> noiseLookup.noise(sl, 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 a8372bfb7..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-2023 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 15b7dfbb0..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2020-2023 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.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) throws ParseException { - Parser p = new Parser(); - 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 5d0e763f9..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-2023 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 bdc03618f..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-2023 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 bc766c731..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2020-2023 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 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; - } -} 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 6ffdd0528..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2020-2023 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.NoiseFunction; -import com.dfsek.terra.api.noise.NoiseSampler; - - -public abstract class FractalNoiseFunction extends NoiseFunction { - 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; - } -} 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 761a5deaa..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-2023 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 1b45ed820..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-2023 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 6a4be9cbe..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-2023 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 86be91206..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-2023 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 482c0cc9c..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-2023 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 86adcee3b..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-2023 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 e86ec2234..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-2023 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 8ce0c19dc..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-2023 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 1a1f12245..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-2023 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 f9c3f65a7..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-2023 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) { - return new double[]{ 0, 0, 0 }; - } - - @Override - public double[] getNoiseDerivativeRaw(long seed, double x, double y, double z) { - return new double[]{ 0, 0, 0, 0 }; - } - - @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 811241f52..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-2023 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 f0ce72403..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-2023 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 58212b6fe..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-2023 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 2ea535016..b76b64160 100644 --- a/common/addons/config-number-predicate/build.gradle.kts +++ b/common/addons/config-number-predicate/build.gradle.kts @@ -5,9 +5,4 @@ version = version("1.0.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) api("com.dfsek", "paralithic", Versions.Libraries.paralithic) -} - - -tasks.named("shadowJar") { - relocate("com.dfsek.paralithic", "com.dfsek.terra.addons.numberpredicate.lib.paralithic") -} +} \ No newline at end of file diff --git a/common/addons/config-number-predicate/src/main/java/com/dfsek/terra/addons/numberpredicate/DoublePredicateLoader.java b/common/addons/config-number-predicate/src/main/java/com/dfsek/terra/addons/numberpredicate/DoublePredicateLoader.java index a9528d31b..f3ba0231b 100644 --- a/common/addons/config-number-predicate/src/main/java/com/dfsek/terra/addons/numberpredicate/DoublePredicateLoader.java +++ b/common/addons/config-number-predicate/src/main/java/com/dfsek/terra/addons/numberpredicate/DoublePredicateLoader.java @@ -2,6 +2,7 @@ package com.dfsek.terra.addons.numberpredicate; 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.tectonic.api.depth.DepthTracker; @@ -15,6 +16,13 @@ import java.util.function.DoublePredicate; public class DoublePredicateLoader implements TypeLoader { + + private final ParseOptions parseOptions; + + public DoublePredicateLoader(ParseOptions parseOptions) { + this.parseOptions = parseOptions; + } + @Override public DoublePredicate load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException { @@ -22,7 +30,7 @@ public class DoublePredicateLoader implements TypeLoader { Scope scope = new Scope(); scope.addInvocationVariable("value"); try { - Expression expression = new Parser().parse(expressionString, scope); + Expression expression = new Parser(parseOptions).parse(expressionString, scope); return d -> expression.evaluate(d) != 0; // Paralithic expressions treat '!= 0' as true } catch(ParseException e) { throw new LoadException("Failed to parse double predicate expression", e, depthTracker); 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 541249369..fa8d84575 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -30,7 +30,7 @@ public class NumberPredicateAddon implements AddonInitializer { plugin.getEventManager() .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) - .then(event -> event.getPack().applyLoader(DoublePredicate.class, new DoublePredicateLoader())) + .then(event -> event.getPack().applyLoader(DoublePredicate.class, new DoublePredicateLoader(event.getPack().getExpressionParseOptions()))) .priority(50) .failThrough(); } diff --git a/common/addons/config-ore/LICENSE b/common/addons/config-ore/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/config-ore/LICENSE +++ b/common/addons/config-ore/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreAddon.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreAddon.java index 9527fa84e..a75a0510c 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreAddon.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java index 5b3feebd0..ff14f7b01 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreFactory.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreFactory.java index 23d0daa8d..8032e5a34 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreFactory.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreTemplate.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreTemplate.java index 24bbd6d3c..d10d03e02 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreTemplate.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ScatteredOreConfigType.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ScatteredOreConfigType.java index c9749ddde..3e888624f 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ScatteredOreConfigType.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ScatteredOreConfigType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ScatteredOreFactory.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ScatteredOreFactory.java index 6d9178854..22dd4cbdf 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ScatteredOreFactory.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ScatteredOreFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ScatteredOreTemplate.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ScatteredOreTemplate.java index 58448b442..7170f78ec 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ScatteredOreTemplate.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ScatteredOreTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 f51ac47ef..84ff59543 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -9,15 +9,17 @@ package com.dfsek.terra.addons.ore.ores; import java.util.BitSet; import java.util.Map; -import java.util.Random; +import java.util.random.RandomGenerator; + +import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions; +import com.dfsek.seismic.math.trigonometry.TrigonometryFunctions; +import com.dfsek.seismic.type.Rotation; 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.seismic.type.vector.Vector3Int; import com.dfsek.terra.api.world.WritableWorld; import static com.dfsek.terra.addons.ore.utils.VanillaOreUtils.shouldPlace; @@ -44,16 +46,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 +66,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; 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..aad282294 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 java.util.Map; -import java.util.Random; +import java.util.random.RandomGenerator; + +import com.dfsek.seismic.type.Rotation; 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.seismic.type.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/LICENSE b/common/addons/config-palette/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/config-palette/LICENSE +++ b/common/addons/config-palette/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java index a7e7c6b10..dc2a5291e 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java index ff0c92800..8f13b9ef1 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java index 74ee564dd..6c7c93aef 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -8,7 +8,6 @@ package com.dfsek.terra.addons.palette; import com.dfsek.terra.addons.palette.palette.PaletteImpl; -import com.dfsek.terra.addons.palette.palette.PaletteLayerHolder; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.world.chunk.generation.util.Palette; @@ -17,10 +16,6 @@ import com.dfsek.terra.api.world.chunk.generation.util.Palette; public class PaletteFactory implements ConfigFactory { @Override public Palette build(PaletteTemplate config, Platform platform) { - PaletteImpl palette = new PaletteImpl(config.getNoise()); - for(PaletteLayerHolder layer : config.getPalette()) { - palette.add(layer.getLayer(), layer.getSize(), layer.getSampler()); - } - return palette; + return new PaletteImpl(config.getPalette(), config.getDefaultSampler()); } } 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 de4af6319..5f0a03b0c 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -16,14 +16,14 @@ 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; +import com.dfsek.seismic.type.sampler.Sampler; @SuppressWarnings({ "FieldMayBeFinal", "unused" }) public class PaletteTemplate implements AbstractableTemplate { @Value("sampler") @Default - private @Meta NoiseSampler noise = NoiseSampler.zero(); + private @Meta Sampler defaultSampler = Sampler.zero(); @Value("id") @Final @@ -40,7 +40,7 @@ public class PaletteTemplate implements AbstractableTemplate { return palette; } - public NoiseSampler getNoise() { - return noise; + 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 e0a314726..d70c14e92 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -11,77 +11,49 @@ 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.seismic.type.sampler.Sampler; 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. */ public class PaletteImpl implements Palette { - private final List pallet = new ArrayList<>(); - private final NoiseSampler sampler; + private final PaletteLayer[] layers; - public PaletteImpl(NoiseSampler sampler) { - this.sampler = sampler; - } + public PaletteImpl(List layers, Sampler defaultSampler) { + List layerArray = new ArrayList<>(); - public Palette add(ProbabilityCollection m, int layers, NoiseSampler sampler) { - for(int i = 0; i < layers; i++) { - pallet.add(new PaletteLayer(m, sampler)); + for (PaletteLayerHolder holder : layers) { + PaletteLayer layer; + ProbabilityCollection materials = holder.getLayer(); + Sampler sampler = holder.getSampler() == null ? defaultSampler : holder.getSampler(); + layer = new PaletteLayer(materials, sampler); + for (int i = 0; i < holder.getSize(); i++) + layerArray.add(layer); } - return this; + + this.layers = layerArray.toArray(new PaletteLayer[0]); } @Override public BlockState get(int layer, double x, double y, double z, long seed) { - PaletteLayer paletteLayer; - if(layer > this.getSize()) paletteLayer = this.getLayers().get(this.getLayers().size() - 1); - else { - List pl = getLayers(); - if(layer >= pl.size()) paletteLayer = pl.get(pl.size() - 1); - else paletteLayer = pl.get(layer); - } - NoiseSampler paletteSampler = paletteLayer.getSampler(); - return paletteLayer.get(paletteSampler == null ? sampler : paletteSampler, x, y, z, seed); + int idx = layer < layers.length ? layer : layers.length - 1; + return layers[idx].get(x, y, z, seed); } - - public int getSize() { - return pallet.size(); - } - - public List getLayers() { - return pallet; - } - - /** - * Class representation of a layer of a BlockPalette. - */ - public static class PaletteLayer { - private final NoiseSampler sampler; + static class PaletteLayer { + private final Sampler sampler; private final ProbabilityCollection collection; - /** - * Constructs a PaletteLayerHolder with a ProbabilityCollection of materials and a number of layers. - * - * @param type The collection of materials to choose from. - * @param sampler Noise sampler to use - */ - public PaletteLayer(ProbabilityCollection type, NoiseSampler sampler) { + public PaletteLayer(ProbabilityCollection type, Sampler sampler) { this.sampler = sampler; this.collection = type; } - public BlockState get(NoiseSampler random, double x, double y, double z, long seed) { - return this.collection.get(random, x, y, z, seed); + public BlockState get(double x, double y, double z, long seed) { + return this.collection.get(sampler, x, y, z, seed); } - - public NoiseSampler getSampler() { - return sampler; - } - } } 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 6ff4bdd8d..33fb7e012 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -10,16 +10,16 @@ package com.dfsek.terra.addons.palette.palette; import org.jetbrains.annotations.NotNull; import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.seismic.type.sampler.Sampler; 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 918b9abb4..a21885a92 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -13,7 +13,7 @@ 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.seismic.type.sampler.Sampler; 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/LICENSE b/common/addons/config-structure/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/config-structure/LICENSE +++ b/common/addons/config-structure/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructures.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructures.java index dfebf0f79..6c0fa5d1c 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructures.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructures.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructuresTemplate.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructuresTemplate.java index 99e80e9bc..4cf7e5a6f 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructuresTemplate.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructuresTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureAddon.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureAddon.java index c56823307..6b195a8ef 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureAddon.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureConfigType.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureConfigType.java index cf8f662a6..c1b03cfcc 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureConfigType.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureConfigType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureFactory.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureFactory.java index eac1bc6ce..01982d738 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureFactory.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 5856ab5a5..d9d0fa175 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -14,7 +14,7 @@ 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.range.Range; import com.dfsek.terra.api.util.collection.ProbabilityCollection; 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 2fd78f77d..9b99f5b4a 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/TerraStructure.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/TerraStructure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -10,7 +10,7 @@ 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.range.Range; import com.dfsek.terra.api.util.collection.ProbabilityCollection; 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 106147229..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 cebf93ef2..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 dd80e03ec..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 2605840f6..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 c90090199..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 e741bd9f5..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 a881ca634..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/LICENSE b/common/addons/generation-stage-feature/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/generation-stage-feature/LICENSE +++ b/common/addons/generation-stage-feature/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 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 f1ca7d945..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 132889d23..5d948418c 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,21 +7,23 @@ package com.dfsek.terra.addons.generation.feature; +import java.util.Collections; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; + +import com.dfsek.seismic.type.Rotation; + 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.seismic.type.sampler.Sampler; 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.seismic.type.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/BiomeFeatures.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeatures.java index afd10efce..03ee04c2f 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeatures.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeatures.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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..0e788d585 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 @@ -8,7 +8,7 @@ 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.seismic.type.sampler.Sampler; 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/generation-stage-structure/LICENSE b/common/addons/generation-stage-structure/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/generation-stage-structure/LICENSE +++ b/common/addons/generation-stage-structure/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/language-yaml/LICENSE b/common/addons/language-yaml/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/language-yaml/LICENSE +++ b/common/addons/language-yaml/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 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 08cb9751a..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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..43a7a3221 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 @@ -15,8 +15,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 +26,7 @@ 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.seismic.type.sampler.Sampler; 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 9283aa4b7..10611b1d8 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 @@ -4,8 +4,10 @@ import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; 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,22 +15,25 @@ 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; + /* * 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(); + 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); @@ -45,17 +50,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..ad9fdb6e4 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 @@ -3,29 +3,26 @@ package com.dfsek.terra.addons.image.config.image; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -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; + +import java.io.IOException; 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..6f163db55 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.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; +import com.dfsek.seismic.type.sampler.Sampler; -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..3eea5b9d9 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,4 +1,4 @@ -package com.dfsek.terra.addons.image.config.noisesampler; +package com.dfsek.terra.addons.image.config.sampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -9,10 +9,10 @@ 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; +import com.dfsek.seismic.type.sampler.Sampler; -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)]; } @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..7c01e52eb 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,14 @@ -package com.dfsek.terra.addons.image.noisesampler; +package com.dfsek.terra.addons.image.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 com.dfsek.seismic.type.sampler.Sampler; 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 +18,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 +26,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 +34,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/manifest-addon-loader/LICENSE b/common/addons/manifest-addon-loader/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/manifest-addon-loader/LICENSE +++ b/common/addons/manifest-addon-loader/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/manifest-addon-loader/build.gradle.kts b/common/addons/manifest-addon-loader/build.gradle.kts index 6a5b6f54e..8a2c03003 100644 --- a/common/addons/manifest-addon-loader/build.gradle.kts +++ b/common/addons/manifest-addon-loader/build.gradle.kts @@ -1,8 +1,8 @@ version = version("1.0.0") dependencies { - api("commons-io:commons-io:2.7") - implementation("com.dfsek.tectonic:yaml:${Versions.Libraries.tectonic}") + api("commons-io", "commons-io", Versions.Libraries.Internal.apacheIO) + implementation("com.dfsek.tectonic", "yaml", Versions.Libraries.tectonic) } tasks.withType { diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/AddonInitializer.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/AddonInitializer.java index 8f195d62c..8fa12d1b8 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/AddonInitializer.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/AddonInitializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java index b3c19d872..c267dc918 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonClassLoader.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonClassLoader.java index 109142a98..cdc1ea8ec 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonClassLoader.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonClassLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java index 8055c2101..92671ac48 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/AddonManifest.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/AddonManifest.java index 97cd8332f..5a0a1abbf 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/AddonManifest.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/AddonManifest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/WebsiteConfig.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/WebsiteConfig.java index d648223df..d4dc1f81a 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/WebsiteConfig.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/WebsiteConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionLoader.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionLoader.java index 263c691d3..aab6e66ae 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionLoader.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionRangeLoader.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionRangeLoader.java index 1f7d4d983..aecc5b401 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionRangeLoader.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionRangeLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/AddonException.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/AddonException.java index 9db7b67bf..84ea4fcdd 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/AddonException.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/AddonException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestException.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestException.java index e8d8ad5c7..366c87b16 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestException.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestNotPresentException.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestNotPresentException.java index 77b579d12..3c1f396e0 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestNotPresentException.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestNotPresentException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/palette-block-shortcut/LICENSE b/common/addons/palette-block-shortcut/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/palette-block-shortcut/LICENSE +++ b/common/addons/palette-block-shortcut/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/pipeline-image/LICENSE b/common/addons/pipeline-image/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/pipeline-image/LICENSE +++ b/common/addons/pipeline-image/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 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..d743e9e8b 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 @@ -5,7 +5,7 @@ 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; 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/LICENSE b/common/addons/structure-block-shortcut/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/structure-block-shortcut/LICENSE +++ b/common/addons/structure-block-shortcut/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 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..3d728b97d 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 java.util.random.RandomGenerator; + +import com.dfsek.seismic.type.Rotation; 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.seismic.type.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..6c482249b 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 java.util.random.RandomGenerator; + +import com.dfsek.seismic.type.Rotation; + 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.seismic.type.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/LICENSE b/common/addons/structure-sponge-loader/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/structure-sponge-loader/LICENSE +++ b/common/addons/structure-sponge-loader/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/structure-sponge-loader/build.gradle.kts b/common/addons/structure-sponge-loader/build.gradle.kts index dba93405f..20c002866 100644 --- a/common/addons/structure-sponge-loader/build.gradle.kts +++ b/common/addons/structure-sponge-loader/build.gradle.kts @@ -3,11 +3,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar version = version("1.0.0") dependencies { - api("commons-io:commons-io:2.7") - api("com.github.Querz:NBT:6.1") + api("commons-io", "commons-io", Versions.Libraries.Internal.apacheIO) + api("com.github.Querz", "NBT", Versions.Libraries.Internal.nbt) compileOnlyApi(project(":common:addons:manifest-addon-loader")) -} - -tasks.named("shadowJar") { - relocate("org.apache.commons", "com.dfsek.terra.addons.sponge.lib.commons") } \ No newline at end of file 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 199864cd1..2444f0d40 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -16,6 +16,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 +30,8 @@ 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; +import com.dfsek.seismic.type.vector.Vector3Int; 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 12ce1f42b..9dae8e27b 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,15 +7,16 @@ package com.dfsek.terra.addons.sponge; -import java.util.Random; +import java.util.random.RandomGenerator; + +import com.dfsek.seismic.type.Rotation; 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.seismic.type.vector.Vector2Int; +import com.dfsek.seismic.type.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/LICENSE b/common/addons/structure-terrascript-loader/LICENSE index 22b8e06e5..da43ecc81 100644 --- a/common/addons/structure-terrascript-loader/LICENSE +++ b/common/addons/structure-terrascript-loader/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2023 Polyhedral Development +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 diff --git a/common/addons/structure-terrascript-loader/build.gradle.kts b/common/addons/structure-terrascript-loader/build.gradle.kts index a042ee13c..24e3a20e9 100644 --- a/common/addons/structure-terrascript-loader/build.gradle.kts +++ b/common/addons/structure-terrascript-loader/build.gradle.kts @@ -3,10 +3,6 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar version = version("1.2.0") dependencies { - api("commons-io:commons-io:2.7") + api("commons-io", "commons-io", Versions.Libraries.Internal.apacheIO) compileOnlyApi(project(":common:addons:manifest-addon-loader")) -} - -tasks.named("shadowJar") { - relocate("org.apache.commons", "com.dfsek.terra.addons.terrascript.lib.commons") -} +} \ No newline at end of file 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 b555b7bac..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/Parser.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java index 1a24c5ee2..484aa4ba4 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java index 4fc805a8f..1dba8e8ae 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/exceptions/ParseException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/exceptions/ParseException.java index 9e62ad278..ef3f08e75 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/exceptions/ParseException.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/exceptions/ParseException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Block.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Block.java index 1b49e8ca4..7daf0f761 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Block.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Block.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/ImplementationArguments.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/ImplementationArguments.java index 18c82e574..df1f8589e 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/ImplementationArguments.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/ImplementationArguments.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Item.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Item.java index 297319fe8..22617eb80 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Item.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Item.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Keyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Keyword.java index e2be6b0aa..3a6417d19 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Keyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Keyword.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Returnable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Returnable.java index 8faaba844..3212c97bd 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Returnable.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Returnable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Statement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Statement.java index 8651cff52..f7295a14b 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Statement.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Statement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/BooleanConstant.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/BooleanConstant.java index 7629beb16..4897081f0 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/BooleanConstant.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/BooleanConstant.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/ConstantExpression.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/ConstantExpression.java index 668f5ab49..9c37fc7b3 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/ConstantExpression.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/ConstantExpression.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/NumericConstant.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/NumericConstant.java index e0fe4e352..6a151ddf1 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/NumericConstant.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/NumericConstant.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/StringConstant.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/StringConstant.java index db45f04b2..a2ac1b439 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/StringConstant.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/StringConstant.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/Function.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/Function.java index 4a31c0f62..16691cd15 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/Function.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/Function.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java index a29b11643..f8a06006a 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/BreakKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/BreakKeyword.java index 6375b0c92..aed14379c 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/BreakKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/BreakKeyword.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ContinueKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ContinueKeyword.java index 5b774c4bb..1aa0f477f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ContinueKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ContinueKeyword.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/FailKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/FailKeyword.java index 94a9f43e6..5f17b4ceb 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/FailKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/FailKeyword.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ReturnKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ReturnKeyword.java index 01873d4f2..eeda9ca87 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ReturnKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ReturnKeyword.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/ForKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/ForKeyword.java index 0cf31eac2..6aa156a48 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/ForKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/ForKeyword.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java index f7952b8f2..aa299c7aa 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/WhileKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/WhileKeyword.java index 1d86c70a0..cb6574a7e 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/WhileKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/WhileKeyword.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BinaryOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BinaryOperation.java index 036473537..d83295065 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BinaryOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BinaryOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanAndOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanAndOperation.java index e936aa172..f5cfc5ada 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanAndOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanAndOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanNotOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanNotOperation.java index fedeac9f6..b33518f6b 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanNotOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanNotOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanOrOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanOrOperation.java index 34a55f566..9a4b458b2 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanOrOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanOrOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ConcatenationOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ConcatenationOperation.java index 3b683733d..09a413714 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ConcatenationOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ConcatenationOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/DivisionOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/DivisionOperation.java index 7dea11393..eaff14217 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/DivisionOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/DivisionOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ModuloOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ModuloOperation.java index 966726e41..4c56d865e 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ModuloOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ModuloOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/MultiplicationOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/MultiplicationOperation.java index 25dca639f..7accfb7aa 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/MultiplicationOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/MultiplicationOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NegationOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NegationOperation.java index a56feb2ca..e459f277f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NegationOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NegationOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NumberAdditionOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NumberAdditionOperation.java index 5183bd690..309d175cc 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NumberAdditionOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NumberAdditionOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/SubtractionOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/SubtractionOperation.java index 8b8bf5585..a3e03e0de 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/SubtractionOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/SubtractionOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/UnaryOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/UnaryOperation.java index 316b884d6..1b1423515 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/UnaryOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/UnaryOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 b9b892439..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/GreaterOrEqualsThanStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java index 4a2b67505..e3c44623a 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterThanStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterThanStatement.java index 1119b0adf..5735ee542 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterThanStatement.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterThanStatement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanOrEqualsStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanOrEqualsStatement.java index 0a72a8da4..d1cfadbc0 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanOrEqualsStatement.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanOrEqualsStatement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanStatement.java index c56366819..d51cbfec2 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanStatement.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanStatement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 fab918c89..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/parser/lang/variables/BooleanVariable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/BooleanVariable.java index 9e4c8aa24..90ea7098d 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/BooleanVariable.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/BooleanVariable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/NumberVariable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/NumberVariable.java index 8d4cfb62b..e6c596266 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/NumberVariable.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/NumberVariable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/StringVariable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/StringVariable.java index 564e71ebf..ec84eaae6 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/StringVariable.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/StringVariable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Variable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Variable.java index a19122f37..3659d40df 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Variable.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Variable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/VariableAssignmentNode.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/VariableAssignmentNode.java index 634ff152a..e541dc28a 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/VariableAssignmentNode.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/VariableAssignmentNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/VariableReferenceNode.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/VariableReferenceNode.java index 598828b34..a79b77c9c 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/VariableReferenceNode.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/VariableReferenceNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 45b004a22..3600fb4e2 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,6 +7,9 @@ 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 org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,7 +17,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 +46,7 @@ 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.seismic.type.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 97e69feca..74c4a6a5e 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -9,25 +9,26 @@ package com.dfsek.terra.addons.terrascript.script; import java.util.HashMap; import java.util.Map; -import java.util.Random; +import java.util.random.RandomGenerator; + +import com.dfsek.seismic.type.Rotation; 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.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.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/BinaryNumberFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BinaryNumberFunctionBuilder.java index 66fdf3555..35b93f73f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BinaryNumberFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BinaryNumberFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BiomeFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BiomeFunctionBuilder.java index 2b53cfef7..7f14601cd 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BiomeFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BiomeFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java index d0621e206..6578aaea9 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 cfef3f572..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/builders/EntityFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/EntityFunctionBuilder.java index c91f89f11..a9e73d593 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/EntityFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/EntityFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/GetMarkFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/GetMarkFunctionBuilder.java index 487548ab5..6384e7837 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/GetMarkFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/GetMarkFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/LootFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/LootFunctionBuilder.java index c26900dd1..1ce926f47 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/LootFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/LootFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/PullFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/PullFunctionBuilder.java index e92174323..218202f56 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/PullFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/PullFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RandomFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RandomFunctionBuilder.java index b83543d9e..6ca3eaaf6 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RandomFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RandomFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RecursionsFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RecursionsFunctionBuilder.java index 37827e830..fff9425e0 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RecursionsFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RecursionsFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/SetMarkFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/SetMarkFunctionBuilder.java index 35bf746c7..e008113a7 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/SetMarkFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/SetMarkFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StateFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StateFunctionBuilder.java index 3ff527e89..f4ab857d0 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StateFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StateFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StructureFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StructureFunctionBuilder.java index 9985c36b4..a6624601b 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StructureFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StructureFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryBooleanFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryBooleanFunctionBuilder.java index 0be9cd209..79ab95481 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryBooleanFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryBooleanFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryNumberFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryNumberFunctionBuilder.java index 888dedf1a..379133750 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryNumberFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryNumberFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryStringFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryStringFunctionBuilder.java index fd009b249..34170ec14 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryStringFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryStringFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/ZeroArgFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/ZeroArgFunctionBuilder.java index 55d39bd23..e750db2dc 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/ZeroArgFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/ZeroArgFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 21a1d155b..14cb8b381 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,15 +7,15 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.type.vector.Vector2; + 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.seismic.type.vector.Vector3; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; @@ -36,15 +36,14 @@ 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()), y.apply(implementationArguments, scope).intValue(), 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 28de64481..fb8ffa22e 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -22,9 +22,8 @@ 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; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; public class BlockFunction implements Function { @@ -69,12 +68,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()), y.apply(implementationArguments, scope).doubleValue(), - (int) Math.round(xz.getZ())).mutable().add(arguments.getOrigin()); + (int) Math.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 8cc0d8864..fd3465c45 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -13,9 +13,8 @@ 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.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; public class CheckBlockFunction implements Function { @@ -34,14 +33,12 @@ 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()), y.apply(implementationArguments, scope) 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 cf703fbe8..d1b664019 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -19,9 +19,8 @@ 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; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; public class EntityFunction implements Function { @@ -45,13 +44,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 613773441..b98dda159 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -13,9 +13,8 @@ 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.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; public class GetMarkFunction implements Function { @@ -32,14 +31,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( y.apply(implementationArguments, scope).doubleValue()), (int) Math.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 67dd7fad3..5fcc8e46b 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -10,7 +10,8 @@ package com.dfsek.terra.addons.terrascript.script.functions; 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 +27,8 @@ 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; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; public class LootFunction implements Function { @@ -55,9 +55,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); @@ -68,7 +67,7 @@ public class LootFunction implements Function { Vector3 apply = Vector3.of((int) Math.round(xz.getX()), y.apply(implementationArguments, scope) .intValue(), - (int) Math.round(xz.getZ())).mutable().add(arguments.getOrigin()).immutable(); + (int) Math.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()).immutable(); try { BlockEntity data = arguments.getWorld().getBlockEntity(apply); @@ -84,7 +83,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 600cecae0..b6cbd2bde 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -17,9 +17,8 @@ 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; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; public class PullFunction implements Function { @@ -41,17 +40,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()); + (int) Math.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/RandomFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RandomFunction.java index 6b794d776..aae3cd753 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RandomFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RandomFunction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RecursionsFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RecursionsFunction.java index c19329656..d40343856 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RecursionsFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RecursionsFunction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 908164030..905ff23ae 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -13,9 +13,8 @@ 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.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; public class SetMarkFunction implements Function { @@ -34,14 +33,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( y.apply(implementationArguments, scope).doubleValue()), - (int) Math.floor(xz.getZ())).mutable().add(arguments.getOrigin()).immutable(), + (int) Math.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 bed6773a9..fbc9dfced 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -17,9 +17,8 @@ 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; +import com.dfsek.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; public class StateFunction implements Function { @@ -40,12 +39,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(); + (int) Math.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 6eb60e8a3..c62efde0a 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,6 +7,7 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.type.Rotation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,9 +23,7 @@ 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; +import com.dfsek.seismic.type.vector.Vector2; public class StructureFunction implements Function { @@ -60,8 +59,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); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Char.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Char.java index 59d949acd..9bb67ab98 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Char.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Char.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Lookahead.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Lookahead.java index e7c3754c8..88af856d4 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Lookahead.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Lookahead.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Position.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Position.java index 9edbadc93..25517d57d 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Position.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Position.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java index b27803fc6..a4f8b8db6 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java index 1c70a840d..da4518110 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/EOFException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/EOFException.java index d0855664d..0f87d1af0 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/EOFException.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/EOFException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/FormatException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/FormatException.java index 8154b2d0d..0aa5a5da9 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/FormatException.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/FormatException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/TokenizerException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/TokenizerException.java index c1ce67d4f..a39c3b3f4 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/TokenizerException.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/TokenizerException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/test/java/structure/LookaheadTest.java b/common/addons/structure-terrascript-loader/src/test/java/structure/LookaheadTest.java index 037e67f6e..ea5689408 100644 --- a/common/addons/structure-terrascript-loader/src/test/java/structure/LookaheadTest.java +++ b/common/addons/structure-terrascript-loader/src/test/java/structure/LookaheadTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/addons/structure-terrascript-loader/src/test/java/structure/ParserTest.java b/common/addons/structure-terrascript-loader/src/test/java/structure/ParserTest.java index f3f1b4995..0e03664fd 100644 --- a/common/addons/structure-terrascript-loader/src/test/java/structure/ParserTest.java +++ b/common/addons/structure-terrascript-loader/src/test/java/structure/ParserTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 5cb593a29..0e9972fc0 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -15,9 +15,8 @@ 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.seismic.type.vector.Vector2; +import com.dfsek.seismic.type.vector.Vector3; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.WritableWorld; @@ -41,12 +40,10 @@ 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 location = arguments.getOrigin().toFloat().mutable().add( Vector3.of((int) Math.round(xz.getX()), y.apply(implementationArguments, scope).doubleValue(), (int) Math.round(xz.getZ()))).immutable(); @@ -64,7 +61,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 +69,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-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunctionBuilder.java b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunctionBuilder.java index 84e465b1b..c546726d3 100644 --- a/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunctionBuilder.java +++ b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunctionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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..1cdbe0f07 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 @@ -6,18 +6,18 @@ 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; +import com.dfsek.seismic.type.sampler.Sampler; 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 +39,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..c813fc13c 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 @@ -8,14 +8,14 @@ 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; +import com.dfsek.seismic.type.sampler.Sampler; 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 +24,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 +43,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 898f8bdcd..b8aad060e 100644 --- a/common/api/build.gradle.kts +++ b/common/api/build.gradle.kts @@ -1,11 +1,15 @@ 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/Handle.java b/common/api/src/main/java/com/dfsek/terra/api/Handle.java index 2bd59fbb1..72858e921 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/Handle.java +++ b/common/api/src/main/java/com/dfsek/terra/api/Handle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 95b00c575..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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(); @@ -81,4 +86,7 @@ public interface Platform extends LoaderRegistrar { @NotNull @Contract(pure = true) Profiler getProfiler(); + + @Contract(pure = true) + int getGenerationThreads(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java b/common/api/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java index ad695d3c5..fef882915 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java +++ b/common/api/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java b/common/api/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java index 03aa177ae..30a17b864 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java +++ b/common/api/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java b/common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java index 62b117e7b..01371f9a7 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 40489ab84..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/entity/Container.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/Container.java index 5cbcba323..1645d3c96 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/entity/Container.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/entity/Container.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/entity/MobSpawner.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/MobSpawner.java index 780c391bd..d5e18745c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/entity/MobSpawner.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/entity/MobSpawner.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/entity/SerialState.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/SerialState.java index 6bd45df22..90a2a6e99 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/entity/SerialState.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/entity/SerialState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/entity/Sign.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/Sign.java index adc0bc359..f69bcadd5 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/entity/Sign.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/entity/Sign.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockState.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockState.java index d62c77d8d..2bcbd8a7a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockState.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/Property.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/Property.java index 1a209010c..7cd7ddc4c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/Property.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/Property.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/BooleanProperty.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/BooleanProperty.java index 9044051a0..6b052a54d 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/BooleanProperty.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/BooleanProperty.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java index ca3797fa6..4053a90d1 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java index 59cd63017..36652cb58 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Axis.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Axis.java index cddd00f54..47703144e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Axis.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Axis.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 ea7bf8b8f..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/block/state/properties/enums/Half.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Half.java index 42b0e7123..1c5cf1801 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Half.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Half.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RailShape.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RailShape.java index ed3864c69..4d3809c4a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RailShape.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RailShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RedstoneConnection.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RedstoneConnection.java index a3f674e17..ded6ec753 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RedstoneConnection.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RedstoneConnection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/WallHeight.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/WallHeight.java index 956ea2082..afc68db95 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/WallHeight.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/WallHeight.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java b/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java index b58da77f2..9755c2005 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/AbstractableTemplate.java b/common/api/src/main/java/com/dfsek/terra/api/config/AbstractableTemplate.java index 5910b1f25..07ef0a9ea 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/AbstractableTemplate.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/AbstractableTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigFactory.java b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigFactory.java index a8c94eca8..f0a195186 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigFactory.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 8e0214ff0..1d616d4d9 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -10,9 +10,12 @@ package com.dfsek.terra.api.config; import ca.solostudios.strata.version.Version; import ca.solostudios.strata.version.VersionRange; +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; @@ -43,12 +46,14 @@ public interface ConfigPack extends LoaderRegistrar, List getStages(); - Loader getLoader(); + Path getRootPath(); String getAuthor(); Version getVersion(); + ParseOptions getExpressionParseOptions(); + ConfigPack registerShortcut(TypeKey clazz, String shortcut, ShortcutLoader loader); default ConfigPack registerShortcut(Class clazz, String shortcut, ShortcutLoader loader) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java index c577f533b..316cc2ab9 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 5b12e43c2..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2020-2023 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 7946d0ec9..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/config/meta/Meta.java b/common/api/src/main/java/com/dfsek/terra/api/config/meta/Meta.java index 4df20e7d8..96640b8d3 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/meta/Meta.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/meta/Meta.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 aaa53ce4e..b5e77f2b4 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -8,7 +8,7 @@ package com.dfsek.terra.api.entity; import com.dfsek.terra.api.Handle; -import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; diff --git a/common/api/src/main/java/com/dfsek/terra/api/entity/EntityType.java b/common/api/src/main/java/com/dfsek/terra/api/entity/EntityType.java index c0bcfbedc..7196edccf 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/entity/EntityType.java +++ b/common/api/src/main/java/com/dfsek/terra/api/entity/EntityType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/entity/Player.java b/common/api/src/main/java/com/dfsek/terra/api/entity/Player.java index f71c38aa6..b4a8c855a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/entity/Player.java +++ b/common/api/src/main/java/com/dfsek/terra/api/entity/Player.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/EventHandler.java b/common/api/src/main/java/com/dfsek/terra/api/event/EventHandler.java index 011f27614..1208ed8ac 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/EventHandler.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/EventHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/EventManager.java b/common/api/src/main/java/com/dfsek/terra/api/event/EventManager.java index c705e4beb..99f6b3522 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/EventManager.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/EventManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/AbstractCancellable.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/AbstractCancellable.java index f13858638..32488d360 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/AbstractCancellable.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/AbstractCancellable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/Cancellable.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/Cancellable.java index e3967a598..01fdf8b8a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/Cancellable.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/Cancellable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/Event.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/Event.java index 145957333..805998712 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/Event.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/Event.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/FailThroughEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/FailThroughEvent.java index 3cd44267b..c8405a6a8 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/FailThroughEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/FailThroughEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/PackEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/PackEvent.java index cc621fb57..48446c0a0 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/PackEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/PackEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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/config/ConfigurationLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java index ba832dff9..e707e06d8 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java index f18e32109..cff441672 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPostLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPostLoadEvent.java index b565d3c7d..7309fb066 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPostLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPostLoadEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPreLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPreLoadEvent.java index 96816ee4f..d6f57348a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPreLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPreLoadEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java index 517460a7c..f06223a75 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java index 358e0ea3a..7f08d60fd 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java index 0028b0f04..2c29d370d 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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/platform/PlatformInitializationEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/PlatformInitializationEvent.java index 39b7c6546..d2c4a7ad6 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/PlatformInitializationEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/PlatformInitializationEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/EntitySpawnEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/EntitySpawnEvent.java index bebbfa21e..eca61193a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/EntitySpawnEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/EntitySpawnEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 b03f897af..5a5fb2b54 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -15,7 +15,7 @@ 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; +import com.dfsek.seismic.type.vector.Vector3; /** diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/functional/EventContext.java b/common/api/src/main/java/com/dfsek/terra/api/event/functional/EventContext.java index c09396059..ca74a0ee0 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/functional/EventContext.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/functional/EventContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java b/common/api/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java index a4af619de..d61d9b46f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/handle/ItemHandle.java b/common/api/src/main/java/com/dfsek/terra/api/handle/ItemHandle.java index 83295c5fd..918195a40 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/handle/ItemHandle.java +++ b/common/api/src/main/java/com/dfsek/terra/api/handle/ItemHandle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java b/common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java index be1bb893a..862791471 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java +++ b/common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/inject/Injector.java b/common/api/src/main/java/com/dfsek/terra/api/inject/Injector.java index 87eec5263..37fd936a3 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/inject/Injector.java +++ b/common/api/src/main/java/com/dfsek/terra/api/inject/Injector.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/inject/annotations/Inject.java b/common/api/src/main/java/com/dfsek/terra/api/inject/annotations/Inject.java index 78b0e746d..df8d4a458 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/inject/annotations/Inject.java +++ b/common/api/src/main/java/com/dfsek/terra/api/inject/annotations/Inject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/inject/exception/InjectionException.java b/common/api/src/main/java/com/dfsek/terra/api/inject/exception/InjectionException.java index a395d5369..9beb83923 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/inject/exception/InjectionException.java +++ b/common/api/src/main/java/com/dfsek/terra/api/inject/exception/InjectionException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/inject/impl/InjectorImpl.java b/common/api/src/main/java/com/dfsek/terra/api/inject/impl/InjectorImpl.java index f0e870e07..35de6b1ed 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/inject/impl/InjectorImpl.java +++ b/common/api/src/main/java/com/dfsek/terra/api/inject/impl/InjectorImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 3e961e42a..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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/inventory/Inventory.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/Inventory.java index 0b6c3ab1c..04a86e493 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/inventory/Inventory.java +++ b/common/api/src/main/java/com/dfsek/terra/api/inventory/Inventory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/inventory/InventoryHolder.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/InventoryHolder.java index 304e448c9..99b05a5dc 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/inventory/InventoryHolder.java +++ b/common/api/src/main/java/com/dfsek/terra/api/inventory/InventoryHolder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/inventory/Item.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/Item.java index bc9a92b6c..b17be420e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/inventory/Item.java +++ b/common/api/src/main/java/com/dfsek/terra/api/inventory/Item.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/inventory/ItemStack.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/ItemStack.java index 070efaf73..a95ccc42a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/inventory/ItemStack.java +++ b/common/api/src/main/java/com/dfsek/terra/api/inventory/ItemStack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/inventory/item/Damageable.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/item/Damageable.java index 121c3652c..289bd2977 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/inventory/item/Damageable.java +++ b/common/api/src/main/java/com/dfsek/terra/api/inventory/item/Damageable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/inventory/item/Enchantment.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/item/Enchantment.java index a8c7e07b3..986f31f7f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/inventory/item/Enchantment.java +++ b/common/api/src/main/java/com/dfsek/terra/api/inventory/item/Enchantment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/inventory/item/ItemMeta.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/item/ItemMeta.java index b2bc68ca9..92c03ee19 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/inventory/item/ItemMeta.java +++ b/common/api/src/main/java/com/dfsek/terra/api/inventory/item/ItemMeta.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 f9e40f0ea..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java +++ /dev/null @@ -1,45 +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) { - if(sampler instanceof DerivativeNoiseSampler dSampler) { - return dSampler.isDifferentiable(); - } - return false; - } - - /** - * 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 06021126e..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2020-2023 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/profiler/Profiler.java b/common/api/src/main/java/com/dfsek/terra/api/profiler/Profiler.java index 0e8122891..ec57cf4cb 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/profiler/Profiler.java +++ b/common/api/src/main/java/com/dfsek/terra/api/profiler/Profiler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/profiler/Timings.java b/common/api/src/main/java/com/dfsek/terra/api/profiler/Timings.java index 6beae577d..55fd80ddc 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/profiler/Timings.java +++ b/common/api/src/main/java/com/dfsek/terra/api/profiler/Timings.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 45e5ea07e..b840711f0 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/properties/Properties.java b/common/api/src/main/java/com/dfsek/terra/api/properties/Properties.java index 32e95ac9d..9f0a5fa85 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/properties/Properties.java +++ b/common/api/src/main/java/com/dfsek/terra/api/properties/Properties.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/properties/PropertyHolder.java b/common/api/src/main/java/com/dfsek/terra/api/properties/PropertyHolder.java index 0e8fbdf5d..3004992ae 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/properties/PropertyHolder.java +++ b/common/api/src/main/java/com/dfsek/terra/api/properties/PropertyHolder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/properties/annotations/Linked.java b/common/api/src/main/java/com/dfsek/terra/api/properties/annotations/Linked.java index 1845ec5b3..08afcde61 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/properties/annotations/Linked.java +++ b/common/api/src/main/java/com/dfsek/terra/api/properties/annotations/Linked.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java index 20535a293..87e34d3be 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/OpenRegistry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/OpenRegistry.java index ababb389d..a0bba3937 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/OpenRegistry.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/OpenRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java index 33995a9f5..a034214fb 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/exception/DuplicateEntryException.java b/common/api/src/main/java/com/dfsek/terra/api/registry/exception/DuplicateEntryException.java index 82afcda98..3a6b5ba2a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/exception/DuplicateEntryException.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/exception/DuplicateEntryException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/key/StringIdentifiable.java b/common/api/src/main/java/com/dfsek/terra/api/registry/key/StringIdentifiable.java index 70ccfb6d5..d8bf42b38 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/key/StringIdentifiable.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/key/StringIdentifiable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryHolder.java b/common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryHolder.java index b7a8b1530..718ec561a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryHolder.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryHolder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 3108dd1f3..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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -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 d5f3ca7e2..59f1efba6 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,13 +7,13 @@ package com.dfsek.terra.api.structure; -import java.util.Random; +import java.util.random.RandomGenerator; -import com.dfsek.terra.api.util.Rotation; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.Rotation; +import com.dfsek.seismic.type.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 09c4f785d..11d1ba001 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -9,7 +9,7 @@ package com.dfsek.terra.api.structure; import org.jetbrains.annotations.ApiStatus.Experimental; -import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3; @Experimental 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 37a03996f..aa48f641d 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -12,7 +12,7 @@ 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.range.Range; import com.dfsek.terra.api.util.collection.ProbabilityCollection; 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 9a4baab54..9e4afc43a 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -10,7 +10,7 @@ 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.range.Range; import com.dfsek.terra.api.util.function.IntToBooleanFunction; import com.dfsek.terra.api.util.generic.Lazy; diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java index 7f2ec0a1b..d3ed6ebae 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java index 5ce08b3dd..c2874b0b1 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Locator.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Locator.java index ac0f4be3d..850cf8f06 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Locator.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Locator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/tectonic/ConfigLoadingDelegate.java b/common/api/src/main/java/com/dfsek/terra/api/tectonic/ConfigLoadingDelegate.java index ce05d5ae1..d84a1724a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/tectonic/ConfigLoadingDelegate.java +++ b/common/api/src/main/java/com/dfsek/terra/api/tectonic/ConfigLoadingDelegate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/tectonic/LoaderRegistrar.java b/common/api/src/main/java/com/dfsek/terra/api/tectonic/LoaderRegistrar.java index ec70d4077..74b32787e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/tectonic/LoaderRegistrar.java +++ b/common/api/src/main/java/com/dfsek/terra/api/tectonic/LoaderRegistrar.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/transform/Transform.java b/common/api/src/main/java/com/dfsek/terra/api/transform/Transform.java index fe7741070..58882b99a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/transform/Transform.java +++ b/common/api/src/main/java/com/dfsek/terra/api/transform/Transform.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/transform/Transformer.java b/common/api/src/main/java/com/dfsek/terra/api/transform/Transformer.java index eb1427aee..0bc848260 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/transform/Transformer.java +++ b/common/api/src/main/java/com/dfsek/terra/api/transform/Transformer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/transform/Validator.java b/common/api/src/main/java/com/dfsek/terra/api/transform/Validator.java index 430f3df3b..6455df0c2 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/transform/Validator.java +++ b/common/api/src/main/java/com/dfsek/terra/api/transform/Validator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/transform/exception/AttemptsFailedException.java b/common/api/src/main/java/com/dfsek/terra/api/transform/exception/AttemptsFailedException.java index 694df9fb5..dbe6ebfae 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/transform/exception/AttemptsFailedException.java +++ b/common/api/src/main/java/com/dfsek/terra/api/transform/exception/AttemptsFailedException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/transform/exception/TransformException.java b/common/api/src/main/java/com/dfsek/terra/api/transform/exception/TransformException.java index d0625a226..33c0e384a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/transform/exception/TransformException.java +++ b/common/api/src/main/java/com/dfsek/terra/api/transform/exception/TransformException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 e57765f2e..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright (c) 2020-2023 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 f3ea39f10..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/PopulationUtil.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2020-2023 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 6f0a17c71..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/Rotation.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2020-2023 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 96c968650..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/RotationUtil.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2020-2023 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 d48753fb2..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/StringUtil.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2020-2023 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/CacheUtils.java b/common/api/src/main/java/com/dfsek/terra/api/util/cache/CacheUtils.java new file mode 100644 index 000000000..9c5e7766b --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/cache/CacheUtils.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.api.util.cache; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + + +public class CacheUtils { + public static final Executor CACHE_EXECUTOR = Executors.newSingleThreadExecutor(); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/cache/DoubleSeededVector2Key.java b/common/api/src/main/java/com/dfsek/terra/api/util/cache/DoubleSeededVector2Key.java new file mode 100644 index 000000000..16845f7bc --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/cache/DoubleSeededVector2Key.java @@ -0,0 +1,35 @@ +package com.dfsek.terra.api.util.cache; + +public class DoubleSeededVector2Key { + + public double x; + public double z; + public long seed; + + public DoubleSeededVector2Key(double x, double z, long seed) { + this.x = x; + this.z = z; + this.seed = seed; + } + + public void set(double x, double z, long seed) { + this.x = x; + this.z = z; + this.seed = seed; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof DoubleSeededVector2Key that) { + return this.z == that.z && this.x == that.x && this.seed == that.seed; + } + return false; + } + + @Override + public int hashCode() { + int code = (int) Double.doubleToLongBits(x); + code = 31 * code + (int) Double.doubleToLongBits(z); + return 31 * code + (Long.hashCode(seed)); + } +} \ No newline at end of file diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/cache/DoubleSeededVector3Key.java b/common/api/src/main/java/com/dfsek/terra/api/util/cache/DoubleSeededVector3Key.java new file mode 100644 index 000000000..dff9e5929 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/cache/DoubleSeededVector3Key.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.api.util.cache; + +public class DoubleSeededVector3Key { + public double x; + public double y; + public double z; + public long seed; + + public DoubleSeededVector3Key(double x, double y, double z, long seed) { + this.x = x; + this.y = y; + this.z = z; + this.seed = seed; + } + + public void set(double x, double y, double z, long seed) { + this.x = x; + this.y = y; + this.z = z; + this.seed = seed; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof DoubleSeededVector3Key that) { + return this.y == that.y && this.z == that.z && this.x == that.x && this.seed == that.seed; + } + return false; + } + + @Override + public int hashCode() { + int code = (int) Double.doubleToLongBits(x); + code = 31 * code + (int) Double.doubleToLongBits(y); + code = 31 * code + (int) Double.doubleToLongBits(z); + return 31 * code + (Long.hashCode(seed)); + } +} \ No newline at end of file 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 new file mode 100644 index 000000000..2023867a6 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/cache/SeededVector2Key.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.api.util.cache; + + + + +public class SeededVector2Key { + 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)); + } + } 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 new file mode 100644 index 000000000..90af87b32 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/cache/SeededVector3Key.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.api.util.cache; + + + +public class SeededVector3Key { + public int x; + public int y; + public int z; + public long seed; + + public SeededVector3Key(int x, int y, int z, long seed) { + this.x = x; + this.y = y; + this.z = z; + this.seed = seed; + } + + public void set(int x, int y, int z, long seed) { + this.x = x; + this.y = y; + this.z = z; + this.seed = seed; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof SeededVector3Key that) { + return this.y == that.y && this.z == that.z && this.x == that.x && this.seed == that.seed; + } + return false; + } + + @Override + public int hashCode() { + int code = x; + code = 31 * code + y; + code = 31 * code + z; + return 31 * code + (Long.hashCode(seed)); + } +} \ No newline at end of file diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java b/common/api/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java index a0c28b1e1..7875535e6 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 4aad8b7e1..aea2ec113 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,6 +7,8 @@ package com.dfsek.terra.api.util.collection; +import com.dfsek.seismic.math.normalization.NormalizationFunctions; +import com.dfsek.seismic.type.sampler.Sampler; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -15,15 +17,13 @@ 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; +import com.dfsek.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3Int; public class ProbabilityCollection implements Collection { @@ -43,35 +43,35 @@ 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 +197,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/generic/Construct.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Construct.java index 88ee6a751..6fb7bba01 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Construct.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Construct.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java index 7a1a11831..c9adddf1e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java index b60a09ef4..7b05d1afb 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java index 424d8bea0..9c08d6bf6 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableBoolean.java b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableBoolean.java index 6dfef1ca5..e876faabf 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableBoolean.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableBoolean.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableDouble.java b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableDouble.java index 91c21a9af..55c4bd99e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableDouble.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableDouble.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableInteger.java b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableInteger.java index e66bcff43..c095fa49c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableInteger.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableInteger.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableNumber.java b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableNumber.java index 8ba43fac8..4fdae5130 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableNumber.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableNumber.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutablePrimitive.java b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutablePrimitive.java index f4c9fd65f..8011cb30f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutablePrimitive.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutablePrimitive.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/mutable/package-info.java b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/package-info.java index fb53df1a7..093ceed27 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/mutable/package-info.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 94% 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 68b062d21..d791c08fc 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 @@ -1,16 +1,16 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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; +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 { @@ -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 88% 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 f42bc174d..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 @@ -1,17 +1,17 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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; +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/reflection/ReflectionUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java index 2583b9ab6..3daca1877 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/reflection/TypeKey.java b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/TypeKey.java index b5ae20265..0989624ca 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/reflection/TypeKey.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/TypeKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 021e98122..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector2.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (c) 2020-2023 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 d6d74c68a..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector3.java +++ /dev/null @@ -1,441 +0,0 @@ -/* - * Copyright (c) 2020-2023 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..7f4647c95 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 @@ -7,7 +7,7 @@ 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.seismic.type.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..8d5fe4437 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 @@ -2,8 +2,8 @@ package com.dfsek.terra.api.world; 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; +import com.dfsek.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3Int; /** @@ -29,7 +29,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 +46,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 be30a3f33..54510d34a 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,7 +7,7 @@ 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 +15,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..31b991a7e 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 @@ -3,18 +3,18 @@ package com.dfsek.terra.api.world; 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.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.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/Biome.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/Biome.java index af52720a4..907058466 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/Biome.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/Biome.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/PaletteSettings.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/PaletteSettings.java index 45a5c1a10..cee700116 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/PaletteSettings.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/PaletteSettings.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/PlatformBiome.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/PlatformBiome.java index d749b4089..370dc7231 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/PlatformBiome.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/PlatformBiome.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 d049cd43b..b911ff84e 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -7,6 +7,8 @@ package com.dfsek.terra.api.world.biome.generation; +import com.dfsek.terra.api.Platform; + import org.jetbrains.annotations.Contract; import java.util.Optional; @@ -14,8 +16,8 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; 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.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3Int; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.info.WorldProperties; @@ -47,7 +49,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); } /** @@ -91,7 +93,7 @@ public interface BiomeProvider { return StreamSupport.stream(getBiomes().spliterator(), false); } - default CachingBiomeProvider caching() { + default CachingBiomeProvider caching(Platform platform) { if(this instanceof CachingBiomeProvider cachingBiomeProvider) { return cachingBiomeProvider; } 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 a07e9efd9..3e42ff1d1 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,5 +1,11 @@ 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; @@ -9,6 +15,8 @@ import java.util.Optional; import com.dfsek.terra.api.Handle; import com.dfsek.terra.api.world.biome.Biome; +import static com.dfsek.terra.api.util.cache.CacheUtils.CACHE_EXECUTOR; + /** * A biome provider implementation that lazily evaluates biomes, and caches them. @@ -18,24 +26,47 @@ import com.dfsek.terra.api.world.biome.Biome; public class CachingBiomeProvider implements BiomeProvider, Handle { protected final BiomeProvider delegate; private final int res; - private final LoadingCache cache; - private final LoadingCache> baseCache; + private final ThreadLocal>> cache; + private final ThreadLocal>>> baseCache; protected CachingBiomeProvider(BiomeProvider delegate) { this.delegate = delegate; this.res = delegate.resolution(); - this.cache = Caffeine - .newBuilder() - .scheduler(Scheduler.disabledScheduler()) - .initialCapacity(98304) - .maximumSize(98304) // 1 full chunk (high res) - .build(vec -> delegate.getBiome(vec.x * res, vec.y * res, vec.z * res, vec.seed)); - this.baseCache = Caffeine - .newBuilder() - .maximumSize(256) // 1 full chunk (high res) - .build(vec -> delegate.getBaseBiome(vec.x * res, vec.z * res, vec.seed)); + this.baseCache = ThreadLocal.withInitial(() -> { + LoadingCache> cache = Caffeine + .newBuilder() + .executor(CACHE_EXECUTOR) + .scheduler(Scheduler.systemScheduler()) + .initialCapacity(256) + .maximumSize(256) + .build(this::sampleBiome); + return Pair.of(new SeededVector2Key(0, 0, 0), cache).mutable(); + }); + this.cache = ThreadLocal.withInitial(() -> { + LoadingCache cache3D = Caffeine + .newBuilder() + .executor(CACHE_EXECUTOR) + .scheduler(Scheduler.systemScheduler()) + .initialCapacity(981504) + .maximumSize(981504) + .build(this::sampleBiome); + return Pair.of(new SeededVector3Key(0, 0, 0, 0), cache3D).mutable(); + }); + + + + } + + private Optional sampleBiome(SeededVector2Key vec) { + this.baseCache.get().setLeft(new SeededVector2Key(0, 0, 0)); + return this.delegate.getBaseBiome(vec.x * res, vec.z * res, vec.seed); + } + + private Biome sampleBiome(SeededVector3Key vec) { + this.cache.get().setLeft(new SeededVector3Key(0, 0, 0, 0)); + return this.delegate.getBiome(vec.x * res, vec.y * res, vec.z * res, vec.seed); } @Override @@ -45,12 +76,18 @@ public class CachingBiomeProvider implements BiomeProvider, Handle { @Override public Biome getBiome(int x, int y, int z, long seed) { - return cache.get(new SeededVector3(x / res, y / res, z / res, seed)); + Mutable> cachePair = cache.get(); + SeededVector3Key mutableKey = cachePair.getLeft(); + mutableKey.set(x, y, z, seed); + return cachePair.getRight().get(mutableKey); } @Override public Optional getBaseBiome(int x, int z, long seed) { - return baseCache.get(new SeededVector2(x / res, z / res, seed)); + Mutable>> cachePair = baseCache.get(); + SeededVector2Key mutableKey = cachePair.getLeft(); + mutableKey.set(x, z, seed); + return cachePair.getRight().get(mutableKey); } @Override @@ -62,40 +99,4 @@ public class CachingBiomeProvider implements BiomeProvider, Handle { public int resolution() { return delegate.resolution(); } - - private record SeededVector3(int x, int y, int z, long seed) { - @Override - public boolean equals(Object obj) { - if(obj instanceof SeededVector3 that) { - return this.y == that.y && this.z == that.z && this.x == that.x && this.seed == that.seed; - } - return false; - } - - @Override - public int hashCode() { - int code = x; - code = 31 * code + y; - code = 31 * code + z; - return 31 * code + ((int) (seed ^ (seed >>> 32))); - } - } - - - private record SeededVector2(int x, int z, long seed) { - @Override - public boolean equals(Object obj) { - if(obj instanceof SeededVector2 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/api/src/main/java/com/dfsek/terra/api/world/chunk/Chunk.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/Chunk.java index b1d532631..6500e9cf0 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/Chunk.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/Chunk.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/ChunkAccess.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/ChunkAccess.java index a98d0e42e..9b87255c8 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/ChunkAccess.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/ChunkAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 0bf8d753d..3609e9c7b 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. @@ -10,8 +10,8 @@ package com.dfsek.terra.api.world.chunk.generation; 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.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.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/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ProtoChunk.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ProtoChunk.java index 744bfda7f..688697304 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ProtoChunk.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ProtoChunk.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/Chunkified.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/Chunkified.java index fe8d81f8c..3cd5936e8 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/Chunkified.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/Chunkified.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/GenerationStage.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/GenerationStage.java index 0d7401910..b0e368a6c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/GenerationStage.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/GenerationStage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java index d41d17237..358fbb9bc 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/GeneratorWrapper.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/GeneratorWrapper.java index fc7044a98..ba67bdd02 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/GeneratorWrapper.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/GeneratorWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Palette.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Palette.java index 19f948495..ccaf04c9c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Palette.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Palette.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/ChunkGeneratorProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/ChunkGeneratorProvider.java index 1a169da02..f66d3af96 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/ChunkGeneratorProvider.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/ChunkGeneratorProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/GenerationStageProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/GenerationStageProvider.java index 470db1a22..090a24892 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/GenerationStageProvider.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/GenerationStageProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Polyhedral Development + * 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. 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 86d22bc2a..ed29141b7 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 @@ -51,6 +51,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; @@ -72,6 +73,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,9 +88,12 @@ public abstract class AbstractPlatform implements Platform { private static final MutableBoolean LOADED = new MutableBoolean(false); 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); @@ -102,6 +108,10 @@ public abstract class AbstractPlatform implements Platform { return configRegistry; } + public MetaConfigRegistry getRawMetaConfigRegistry() { + return metaConfigRegistry; + } + protected Iterable platformAddon() { return Collections.emptySet(); } @@ -133,11 +143,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(); @@ -147,11 +154,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(); @@ -159,6 +167,38 @@ public abstract class AbstractPlatform implements Platform { logger.info("Finished initialization."); } + 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<>(); @@ -216,7 +256,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."); @@ -258,51 +298,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) { @@ -310,6 +354,24 @@ 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; + + } + @Override public void register(TypeRegistry registry) { loaders.register(registry); @@ -325,6 +387,12 @@ public abstract class AbstractPlatform implements Platform { return checkedConfigRegistry; } + @Override + public @NotNull CheckedRegistry getMetaConfigRegistry() { + return checkedMetaConfigRegistry; + } + + @Override public @NotNull Registry getAddons() { return lockedAddonRegistry; @@ -339,4 +407,9 @@ public abstract class AbstractPlatform implements Platform { public @NotNull Profiler getProfiler() { return profiler; } + + @Override + public int getGenerationThreads() { + return 1; + } } 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 d49d75752..bd8c6dead 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 @@ -19,6 +19,7 @@ package com.dfsek.terra.config; import ca.solostudios.strata.version.Version; import ca.solostudios.strata.version.VersionRange; +import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; import com.dfsek.tectonic.api.TypeRegistry; import java.util.LinkedHashMap; @@ -28,11 +29,10 @@ 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.range.Range; import com.dfsek.terra.api.util.collection.MaterialSet; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import com.dfsek.terra.api.util.vector.Vector3; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.terra.config.loaders.ExpressionParserOptionsTemplate; import com.dfsek.terra.config.loaders.LinkedHashMapLoader; import com.dfsek.terra.config.loaders.MaterialSetLoader; import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; @@ -53,14 +53,15 @@ public class GenericLoaders implements LoaderRegistrar { @Override public void register(TypeRegistry registry) { registry.registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) - .registerLoader(Range.class, new RangeLoader()) - .registerLoader(Version.class, new VersionLoader()) - .registerLoader(MaterialSet.class, new MaterialSetLoader()) - .registerLoader(VersionRange.class, new VersionRangeLoader()) - .registerLoader(LinkedHashMap.class, new LinkedHashMapLoader()) + .registerLoader(Range.class, new RangeLoader()) + .registerLoader(Version.class, new VersionLoader()) + .registerLoader(MaterialSet.class, new MaterialSetLoader()) + .registerLoader(VersionRange.class, new VersionRangeLoader()) + .registerLoader(LinkedHashMap.class, new LinkedHashMapLoader()) + .registerLoader(ParseOptions.class, ExpressionParserOptionsTemplate::new); + .registerLoader(Vector3.class, new Vector3Loader()) .registerLoader(Vector3Int.class, new Vector3IntLoader()); - if(platform != null) { registry.registerLoader(BaseAddon.class, platform.getAddons()) .registerLoader(BlockType.class, (type, object, configLoader, depthTracker) -> platform 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 new file mode 100644 index 000000000..caa74e402 --- /dev/null +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/ExpressionParserOptionsTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.config.loaders; + +import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; +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; + + +public class ExpressionParserOptionsTemplate implements ObjectTemplate { + + private static final ParseOptions DEFAULT_PARSE_OPTIONS = new ParseOptions(); + + @Value("use-let-expressions") + @Default + private boolean useLetExpressions = DEFAULT_PARSE_OPTIONS.useLetExpressions(); + + @Override + public ParseOptions get() { + return new ParseOptions(useLetExpressions); + } +} diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java index 6a9e10bd0..0c0406bf3 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java @@ -43,23 +43,27 @@ public class ProbabilityCollectionLoader implements TypeLoader map = (Map) o; + if (map.size() == 1) { + Object onlyKey = map.keySet().iterator().next(); + return new ProbabilityCollection.Singleton<>(configLoader.loadType(generic, onlyKey, depthTracker)); + } for(Map.Entry entry : map.entrySet()) { collection.add(configLoader.loadType(generic, entry.getKey(), depthTracker.entry((String) entry.getKey())), configLoader.loadType(Integer.class, entry.getValue(), depthTracker.entry((String) entry.getKey()))); } } else if(o instanceof List) { - List> map = (List>) o; - if(map.size() == 1) { - Map entry = map.get(0); - if(entry.size() == 1) { - for(Object value : entry.keySet()) { + List> list = (List>) o; + if(list.size() == 1) { + Map map = list.getFirst(); + if(map.size() == 1) { + for(Object value : map.keySet()) { return new ProbabilityCollection.Singleton<>(configLoader.loadType(generic, value, depthTracker)); } } } - for(int i = 0; i < map.size(); i++) { - Map l = map.get(i); - for(Entry entry : l.entrySet()) { + for(int i = 0; i < list.size(); i++) { + Map map = list.get(i); + for(Entry entry : map.entrySet()) { if(entry.getValue() == null) throw new LoadException("No probability defined for entry \"" + entry.getKey() + "\"", depthTracker); Object val = configLoader.loadType(generic, entry.getKey(), depthTracker.index(i).entry((String) entry.getKey())); 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/ConfigPackExpressionOptionsTemplate.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackExpressionOptionsTemplate.java new file mode 100644 index 000000000..a4dcf2155 --- /dev/null +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackExpressionOptionsTemplate.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.config.pack; + +import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; +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; + + +public class ConfigPackExpressionOptionsTemplate implements ConfigTemplate { + @Value("expressions.options") + @Default + private ParseOptions parseOptions = new ParseOptions(); + + public ParseOptions getParseOptions() { + return parseOptions; + } +} 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 82ec7d95b..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 @@ -19,6 +19,7 @@ package com.dfsek.terra.config.pack; import ca.solostudios.strata.version.Version; import ca.solostudios.strata.version.VersionRange; +import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; import com.dfsek.tectonic.api.TypeRegistry; import com.dfsek.tectonic.api.config.Configuration; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; @@ -33,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; @@ -51,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; @@ -72,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; @@ -107,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; @@ -121,40 +116,31 @@ public class ConfigPackImpl implements ConfigPack { private final RegistryKey key; - 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); - } + private final ParseOptions parseOptions; - 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(); @@ -168,6 +154,11 @@ public class ConfigPackImpl implements ConfigPack { selfLoader.load(addonsTemplate, packManifest); this.addons = addonsTemplate.getAddons(); + ConfigPackExpressionOptionsTemplate expressionOptionsTemplate = new ConfigPackExpressionOptionsTemplate(); + selfLoader.load(expressionOptionsTemplate, packManifest); + this.parseOptions = expressionOptionsTemplate.getParseOptions(); + + Map configurations = discoverConfigurations(); registerMeta(configurations); @@ -232,13 +223,13 @@ public class ConfigPackImpl implements ConfigPack { ConfigPackPostTemplate packPostTemplate = new ConfigPackPostTemplate(); selfLoader.load(packPostTemplate, packManifest); seededBiomeProvider = - template.getBiomeCache() ? packPostTemplate.getProviderBuilder().caching() : packPostTemplate.getProviderBuilder(); + template.getBiomeCache() ? packPostTemplate.getProviderBuilder().caching(platform) : packPostTemplate.getProviderBuilder(); checkDeadEntries(); } 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; @@ -261,7 +252,7 @@ public class ConfigPackImpl implements ConfigPack { selfLoader.registerPreprocessor(Meta.class, valuePreprocessor); abstractConfigLoader.registerPreprocessor(Meta.class, valuePreprocessor); - MetaNumberPreprocessor numberPreprocessor = new MetaNumberPreprocessor(configurations); + MetaNumberPreprocessor numberPreprocessor = new MetaNumberPreprocessor(configurations, parseOptions); selfLoader.registerPreprocessor(Meta.class, numberPreprocessor); abstractConfigLoader.registerPreprocessor(Meta.class, numberPreprocessor); } @@ -283,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 } @@ -309,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 -> { @@ -348,8 +338,8 @@ public class ConfigPackImpl implements ConfigPack { } @Override - public Loader getLoader() { - return loader; + public Path getRootPath() { + return rootPath; } @Override @@ -362,7 +352,12 @@ public class ConfigPackImpl implements ConfigPack { return template.getVersion(); } - @SuppressWarnings("unchecked,rawtypes") + @Override + public ParseOptions getExpressionParseOptions() { + return parseOptions; + } + + @SuppressWarnings("rawtypes") @Override public ConfigPack registerShortcut(TypeKey clazz, String shortcut, ShortcutLoader loader) { ShortcutHolder holder = shortcuts @@ -406,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 c823d7ec4..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 @@ -18,28 +18,30 @@ package com.dfsek.terra.config.preprocessor; import com.dfsek.paralithic.eval.parser.Parser; +import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; import com.dfsek.paralithic.eval.tokenizer.ParseException; import com.dfsek.tectonic.api.config.Configuration; 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>() { }; + private final ParseOptions parseOptions; - public MetaNumberPreprocessor(Map configs) { + public MetaNumberPreprocessor(Map configs, ParseOptions parseOptions) { super(configs); + this.parseOptions = parseOptions; } private static boolean isNumber(Class clazz) { @@ -57,7 +59,7 @@ public class MetaNumberPreprocessor extends MetaPreprocessor { if(t.getType() instanceof Class && isNumber((Class) t.getType()) && c instanceof String) { String expression = (String) loader.loadType(META_STRING_KEY.getAnnotatedType(), c, depthTracker); try { - return (Result) Result.overwrite(new Parser().eval(expression), depthTracker); + return (Result) Result.overwrite(new Parser(parseOptions).eval(expression), depthTracker); } catch(ParseException e) { throw new LoadException("Invalid expression: ", e, depthTracker); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java index 4e419f883..81519cac8 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java @@ -57,7 +57,7 @@ public class ProfilerImpl implements Profiler { Stack stack = THREAD_STACK.get(); stack.push(new Frame(stack.isEmpty() ? frame : stack.peek().getId() + "." + frame)); } else SAFE.set(false); - } else SAFE.set(false); + } } @Override @@ -99,6 +99,7 @@ public class ProfilerImpl implements Profiler { public void stop() { logger.info("Stopping Terra profiler"); running = false; + SAFE.set(false); } @Override 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 28886b354..124135fcf 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 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(ConfigException 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 | ConfigException 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..ae2f6c2a8 100644 --- a/common/implementation/base/src/main/resources/config.yml +++ b/common/implementation/base/src/main/resources/config.yml @@ -10,11 +10,13 @@ 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" \ No newline at end of file diff --git a/common/implementation/base/src/test/java/MetaTest.java b/common/implementation/base/src/test/java/MetaTest.java index 92ad15de1..b4e630d9b 100644 --- a/common/implementation/base/src/test/java/MetaTest.java +++ b/common/implementation/base/src/test/java/MetaTest.java @@ -1,3 +1,4 @@ +import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; import com.dfsek.tectonic.api.config.Configuration; import com.dfsek.tectonic.api.config.template.ConfigTemplate; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -32,7 +33,7 @@ public class MetaTest { loader.registerPreprocessor(Meta.class, new MetaStringPreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaListLikePreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaMapPreprocessor(configurationMap)); - loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap)); + loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap, new ParseOptions())); loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap)); @@ -53,7 +54,7 @@ public class MetaTest { loader.registerPreprocessor(Meta.class, new MetaStringPreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaListLikePreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaMapPreprocessor(configurationMap)); - loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap)); + loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap, new ParseOptions())); loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap)); @@ -75,7 +76,7 @@ public class MetaTest { loader.registerPreprocessor(Meta.class, new MetaStringPreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaListLikePreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaMapPreprocessor(configurationMap)); - loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap)); + loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap, new ParseOptions())); loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap)); @@ -96,7 +97,7 @@ public class MetaTest { loader.registerPreprocessor(Meta.class, new MetaStringPreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaListLikePreprocessor(configurationMap)); loader.registerPreprocessor(Meta.class, new MetaMapPreprocessor(configurationMap)); - loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap)); + loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap, new ParseOptions())); loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap)); diff --git a/common/implementation/base/src/test/java/registry/RegistryTest.java b/common/implementation/base/src/test/java/registry/RegistryTest.java index 4ea1326fe..01612bd7e 100644 --- a/common/implementation/base/src/test/java/registry/RegistryTest.java +++ b/common/implementation/base/src/test/java/registry/RegistryTest.java @@ -17,8 +17,6 @@ package registry; -import org.junit.jupiter.api.Test; - import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.registry.exception.DuplicateEntryException; @@ -27,7 +25,10 @@ import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.registry.CheckedRegistryImpl; import com.dfsek.terra.registry.OpenRegistryImpl; -import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; public class RegistryTest { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e6441136f..a4b76b953 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8e876e1c5..e1b837a19 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip +distributionSha256Sum=7a00d51fb93147819aab76024feece20b6b84e420694101f276be952e08bef03 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index b740cf133..f5feea6d6 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 25da30dbd..9d21a2183 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## diff --git a/platforms/allay/README.md b/platforms/allay/README.md new file mode 100644 index 000000000..7acfbf8d7 --- /dev/null +++ b/platforms/allay/README.md @@ -0,0 +1,9 @@ +# Allay platform + +## Resource files + +Current mapping version: je 1.21.4 to be 1.21.50 + +- `mapping/biomes.json` and `mapping/items.json` obtain from [GeyserMC/mappings](https://github.com/GeyserMC/mappings). +- `mapping/blocks.json` generated by using [GeyserMC/mappings-generator](https://github.com/GeyserMC/mappings-generator), and it's origin name is `generator_blocks.json`. +- `je_block_default_states.json` converted from [Block state values](https://zh.minecraft.wiki/w/Module:Block_state_values). diff --git a/platforms/allay/build.gradle.kts b/platforms/allay/build.gradle.kts new file mode 100644 index 000000000..9b096a201 --- /dev/null +++ b/platforms/allay/build.gradle.kts @@ -0,0 +1,37 @@ +repositories { + ivy { + url = uri("https://raw.githubusercontent.com/") + patternLayout { + artifact("[organisation]/[revision]/[artifact].([ext])") + setM2compatible(true) + } + metadataSources { + artifact() + } + } +} + +val geyserMappings: Configuration by configurations.register("geyserMappings") { + isCanBeConsumed = false +} + +dependencies { + shadedApi(project(":common:implementation:base")) + + implementation("com.google.code.gson", "gson", Versions.Allay.gson) + + compileOnly("org.allaymc.allay", "api", Versions.Allay.api) + + geyserMappings("GeyserMC.mappings", "items", Versions.Allay.mappings, ext = "json") + geyserMappings("GeyserMC.mappings", "biomes", Versions.Allay.mappings, ext = "json") + geyserMappings("GeyserMC.mappings-generator", "generator_blocks", Versions.Allay.mappingsGenerator, ext = "json") +} + +tasks.processResources { + from(geyserMappings) { + into("mapping") + + // rather jank, but whatever + rename("(?:generator_)?([^-]+)-(.*)\\.json", "$1.json") + } +} 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 new file mode 100644 index 000000000..a09b6a9e2 --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/AllayPlatform.java @@ -0,0 +1,93 @@ +package com.dfsek.terra.allay; + +import com.dfsek.tectonic.api.TypeRegistry; +import com.dfsek.tectonic.api.depth.DepthTracker; +import com.dfsek.tectonic.api.exception.LoadException; +import org.allaymc.api.server.Server; +import org.allaymc.api.world.biome.BiomeId; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.HashSet; +import java.util.Set; + +import com.dfsek.terra.AbstractPlatform; +import com.dfsek.terra.allay.delegate.AllayBiome; +import com.dfsek.terra.allay.generator.AllayGeneratorWrapper; +import com.dfsek.terra.allay.handle.AllayItemHandle; +import com.dfsek.terra.allay.handle.AllayWorldHandle; +import com.dfsek.terra.api.block.state.BlockState; +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 + */ +public class AllayPlatform extends AbstractPlatform { + + public static final Set GENERATOR_WRAPPERS = new HashSet<>(); + + protected static final AllayWorldHandle ALLAY_WORLD_HANDLE = new AllayWorldHandle(); + protected static final AllayItemHandle ALLAY_ITEM_HANDLE = new AllayItemHandle(); + + public AllayPlatform() { + load(); + } + + @Override + public boolean reload() { + getTerraConfig().load(this); + boolean succeed = loadConfigPacks(); + + GENERATOR_WRAPPERS.forEach(wrapper -> { + getConfigRegistry().get(wrapper.getConfigPack().getRegistryKey()).ifPresent(pack -> { + wrapper.setConfigPack(pack); + var dimension = wrapper.getAllayWorldGenerator().getDimension(); + TerraAllayPlugin.INSTANCE.getPluginLogger().info( + "Replaced pack in chunk generator for world {}", + dimension.getWorld().getWorldData().getDisplayName() + ":" + dimension.getDimensionInfo().dimensionId() + ); + }); + }); + + return succeed; + } + + @Override + public @NotNull String platformName() { + return "Allay"; + } + + @Override + public @NotNull WorldHandle getWorldHandle() { + return ALLAY_WORLD_HANDLE; + } + + @Override + public @NotNull ItemHandle getItemHandle() { + return ALLAY_ITEM_HANDLE; + } + + @Override + public @NotNull File getDataFolder() { + return TerraAllayPlugin.INSTANCE.getPluginContainer().dataFolder().toFile(); + } + + @Override + public void runPossiblyUnsafeTask(@NotNull Runnable task) { + Server.getInstance().getScheduler().runLater(Server.getInstance(), task); + } + + @Override + public void register(TypeRegistry registry) { + super.register(registry); + registry.registerLoader(BlockState.class, (type, o, loader, depthTracker) -> ALLAY_WORLD_HANDLE.createBlockState((String) o)) + .registerLoader(PlatformBiome.class, (type, o, loader, depthTracker) -> parseBiome((String) o, depthTracker)); + } + + protected AllayBiome parseBiome(String id, DepthTracker depthTracker) throws LoadException { + if(!id.startsWith("minecraft:")) throw new LoadException("Invalid biome identifier " + id, depthTracker); + return new AllayBiome(BiomeId.fromId(Mapping.biomeIdJeToBe(id))); + } +} 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 new file mode 100644 index 000000000..60583f22c --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/JeBlockState.java @@ -0,0 +1,79 @@ +package com.dfsek.terra.allay; + +import org.allaymc.api.utils.HashUtils; + +import java.util.Map; +import java.util.TreeMap; + + +/** + * @author daoge_cmd + */ +public class JeBlockState { + protected final String identifier; + 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++) { + final String tmp = strings[i]; + final int index = tmp.indexOf("="); + properties.put(tmp.substring(0, index), tmp.substring(index + 1)); + } + } + completeMissingProperties(); + } + + public String getPropertyValue(String key) { + return properties.get(key); + } + + private void completeMissingProperties() { + Map defaultProperties = Mapping.getJeBlockDefaultProperties(identifier); + if(properties.size() == defaultProperties.size()) { + return; + } + defaultProperties.entrySet().stream().filter(entry -> !properties.containsKey(entry.getKey())).forEach( + 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) { + hash = HashUtils.fnv1a_32(str.getBytes()); + } + return str; + } + + public int getHash() { + if (hash == Integer.MAX_VALUE) { + hash = HashUtils.fnv1a_32(toString(true).getBytes()); + } + return hash; + } + + @Override + public String toString() { + return toString(true); + } +} diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/Mapping.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/Mapping.java new file mode 100644 index 000000000..a29b1a735 --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/Mapping.java @@ -0,0 +1,272 @@ +package com.dfsek.terra.allay; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.TypeAdapter; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.allaymc.api.block.type.BlockState; +import org.allaymc.api.block.type.BlockStateSafeGetter; +import org.allaymc.api.block.type.BlockTypes; +import org.allaymc.api.item.type.ItemType; +import org.allaymc.api.item.type.ItemTypeSafeGetter; + +import javax.annotation.Nullable; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; +import java.util.TreeMap; + + +/** + * @author daoge_cmd + * @author IWareQ + */ +public final class Mapping { + private static final Gson GSON = new GsonBuilder() + .registerTypeAdapterFactory(new IgnoreFailureTypeAdapterFactory()) + .create(); + + private static final Map> JE_BLOCK_DEFAULT_PROPERTIES = new Object2ObjectOpenHashMap<>(); + private static final Map BE_BLOCK_STATE_TO_JE = new Object2ObjectOpenHashMap<>(); + private static final Map JE_BLOCK_STATE_HASH_TO_BE = new Int2ObjectOpenHashMap<>(); + private static final Map> JE_ITEM_ID_TO_BE = new Object2ObjectOpenHashMap<>(); + private static final Map JE_BIOME_ID_TO_BE = new Object2IntOpenHashMap<>(); + + private static final BlockState BE_AIR_STATE = BlockTypes.AIR.getDefaultState(); + + public static void init() { + if(!initBlockStateMapping()) error(); + if(!initJeBlockDefaultProperties()) error(); + if(!initItemMapping()) error(); + if(!initBiomeMapping()) error(); + } + + public static JeBlockState blockStateBeToJe(BlockState beBlockState) { + return BE_BLOCK_STATE_TO_JE.get(beBlockState); + } + + public static BlockState blockStateJeToBe(JeBlockState jeBlockState) { + BlockState result = JE_BLOCK_STATE_HASH_TO_BE.get(jeBlockState.getHash()); + if(result == null) { + TerraAllayPlugin.INSTANCE.getPluginLogger().warn("Failed to find be block state for {}", jeBlockState); + return BE_AIR_STATE; + } + return result; + } + + public static ItemType itemIdJeToBe(String jeItemId) { + return JE_ITEM_ID_TO_BE.get(jeItemId); + } + + // Enchantment identifiers are same in both versions + + public static String enchantmentIdBeToJe(String beEnchantmentId) { + return beEnchantmentId; + } + + public static String enchantmentIdJeToBe(String jeEnchantmentId) { + return jeEnchantmentId; + } + + public static int biomeIdJeToBe(String jeBiomeId) { + return JE_BIOME_ID_TO_BE.get(jeBiomeId); + } + + public static Map getJeBlockDefaultProperties(String jeBlockIdentifier) { + var defaultProperties = JE_BLOCK_DEFAULT_PROPERTIES.get(jeBlockIdentifier); + if(defaultProperties == null) { + TerraAllayPlugin.INSTANCE.getPluginLogger().warn("Failed to find default properties for {}", jeBlockIdentifier); + return Map.of(); + } + + return defaultProperties; + } + + private static void error() { + throw new RuntimeException("Mapping not initialized"); + } + + private static boolean initBiomeMapping() { + try(InputStream stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/biomes.json")) { + if(stream == null) { + TerraAllayPlugin.INSTANCE.getPluginLogger().error("biomes mapping not found"); + return false; + } + + Map mappings = from(stream, new TypeToken<>() {}); + mappings.forEach((javaId, mapping) -> JE_BIOME_ID_TO_BE.put(javaId, mapping.bedrockId())); + } catch(IOException e) { + TerraAllayPlugin.INSTANCE.getPluginLogger().error("Failed to load biomes mapping", e); + return false; + } + return true; + } + + private static boolean initItemMapping() { + try(InputStream stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/items.json")) { + if(stream == null) { + TerraAllayPlugin.INSTANCE.getPluginLogger().error("items mapping not found"); + return false; + } + + Map mappings = from(stream, new TypeToken<>() {}); + mappings.forEach((javaId, mapping) -> { + ItemType itemType = ItemTypeSafeGetter + .name(mapping.bedrockId()) + .meta(mapping.bedrockData()) + .itemType(); + JE_ITEM_ID_TO_BE.put(javaId, itemType); + }); + } catch(IOException e) { + TerraAllayPlugin.INSTANCE.getPluginLogger().error("Failed to load items mapping", e); + return false; + } + return true; + } + + private static boolean initBlockStateMapping() { + try(InputStream stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/blocks.json")) { + if(stream == null) { + TerraAllayPlugin.INSTANCE.getPluginLogger().error("blocks mapping not found"); + return false; + } + + Map> root = from(stream, new TypeToken<>() {}); + List mappings = root.get("mappings"); + mappings.forEach(mapping -> { + JeBlockState jeState = createJeBlockState(mapping.javaState()); + BlockState beState = createBeBlockState(mapping.bedrockState()); + BE_BLOCK_STATE_TO_JE.put(beState, jeState); + JE_BLOCK_STATE_HASH_TO_BE.put(jeState.getHash(), beState); + }); + } catch(IOException e) { + TerraAllayPlugin.INSTANCE.getPluginLogger().error("Failed to load blocks mapping", e); + return false; + } + return true; + } + + private static boolean initJeBlockDefaultProperties() { + try(InputStream stream = Mapping.class.getClassLoader().getResourceAsStream("je_block_default_states.json")) { + if(stream == null) { + TerraAllayPlugin.INSTANCE.getPluginLogger().error("je_block_default_states.json not found"); + return false; + } + + Map> states = from(stream, new TypeToken<>() {}); + JE_BLOCK_DEFAULT_PROPERTIES.putAll(states); + } catch(IOException e) { + throw new RuntimeException(e); + } + return true; + } + + private static JeBlockState createJeBlockState(BlockMapping.JavaState state) { + Map properties = state.properties() == null ? Map.of() : state.properties(); + return JeBlockState.create(state.name(), new TreeMap<>(properties)); + } + + private static BlockState createBeBlockState(BlockMapping.BedrockState state) { + BlockStateSafeGetter.Getter getter = BlockStateSafeGetter.name("minecraft:" + state.bedrockId()); + if(state.state() != null) { + convertValueType(state.state()).forEach(getter::property); + } + return getter.blockState(); + } + + private static Map convertValueType(Map data) { + Map result = new TreeMap<>(); + for(Entry entry : data.entrySet()) { + if(entry.getValue() instanceof Number number) { + // Convert double to int because the number in json is double + result.put(entry.getKey(), number.intValue()); + } else { + result.put(entry.getKey(), entry.getValue()); + } + } + + return result; + } + + public static V from(InputStream inputStream, TypeToken typeToken) { + JsonReader reader = new JsonReader(new InputStreamReader(Objects.requireNonNull(inputStream))); + return GSON.fromJson(reader, typeToken.getType()); + } + + public record BiomeMapping( + @SerializedName("bedrock_id") + int bedrockId + ) { + } + + + public record ItemMapping( + @SerializedName("bedrock_identifier") + String bedrockId, + @SerializedName("bedrock_data") + int bedrockData + ) { + } + + + public record BlockMapping( + @SerializedName("java_state") + BlockMapping.JavaState javaState, + @SerializedName("bedrock_state") + BlockMapping.BedrockState bedrockState + ) { + public record JavaState( + @SerializedName("Name") + String name, + @Nullable + @SerializedName("Properties") + Map properties + ) { + } + + + public record BedrockState( + @SerializedName("bedrock_identifier") + String bedrockId, + @Nullable + Map state + ) { + } + } + + + // see https://stackoverflow.com/questions/59655279/is-there-an-easy-way-to-make-gson-skip-a-field-if-theres-an-error-deserializing + public static class IgnoreFailureTypeAdapterFactory implements TypeAdapterFactory { + @Override + public TypeAdapter create(Gson gson, TypeToken typeToken) { + TypeAdapter delegate = gson.getDelegateAdapter(this, typeToken); + return new TypeAdapter<>() { + @Override + public void write(JsonWriter writer, T value) throws IOException { + delegate.write(writer, value); + } + + @Override + public T read(JsonReader reader) throws IOException { + try { + return delegate.read(reader); + } catch(Exception e) { + reader.skipValue(); + return null; + } + } + }; + } + } +} 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 new file mode 100644 index 000000000..d6f5f1d14 --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/TerraAllayPlugin.java @@ -0,0 +1,75 @@ +package com.dfsek.terra.allay; + +import org.allaymc.api.eventbus.EventHandler; +import org.allaymc.api.eventbus.event.world.WorldUnloadEvent; +import org.allaymc.api.plugin.Plugin; +import org.allaymc.api.registry.Registries; +import org.allaymc.api.server.Server; + +import com.dfsek.terra.allay.generator.AllayGeneratorWrapper; +import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; + + +/** + * @author daoge_cmd + */ +public class TerraAllayPlugin extends Plugin { + + public static TerraAllayPlugin INSTANCE; + public static AllayPlatform PLATFORM; + + { + INSTANCE = this; + } + + @Override + public void onLoad() { + pluginLogger.info("Starting Terra..."); + + pluginLogger.info("Loading mapping..."); + Mapping.init(); + + pluginLogger.info("Initializing allay platform..."); + PLATFORM = new AllayPlatform(); + PLATFORM.getEventManager().callEvent(new PlatformInitializationEvent()); + // TODO: adapt command manager + + pluginLogger.info("Registering generator..."); + Registries.WORLD_GENERATOR_FACTORIES.register("TERRA", preset -> { + try { + AllayGeneratorWrapper wrapper = new AllayGeneratorWrapper(preset); + AllayPlatform.GENERATOR_WRAPPERS.add(wrapper); + return wrapper.getAllayWorldGenerator(); + } catch(IllegalArgumentException e) { + TerraAllayPlugin.INSTANCE.getPluginLogger().error("Fail to create world generator with preset: {}", preset, e); + return Registries.WORLD_GENERATOR_FACTORIES.get("FLAT").apply(""); + } + }); + + pluginLogger.info("Terra started"); + } + + @Override + public void onEnable() { + Server.getInstance().getEventBus().registerListener(this); + } + + @Override + public boolean isReloadable() { + return true; + } + + @Override + public void reload() { + if(PLATFORM.reload()) { + pluginLogger.info("Terra reloaded successfully."); + } else { + pluginLogger.error("Terra failed to reload."); + } + } + + @EventHandler + private void onWorldUnload(WorldUnloadEvent event) { + 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 new file mode 100644 index 000000000..d9607fcb7 --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBiome.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.allay.delegate; + +import org.allaymc.api.world.biome.BiomeType; + +import com.dfsek.terra.api.world.biome.PlatformBiome; + +/** + * @author daoge_cmd + */ +public record AllayBiome(BiomeType allayBiome) implements PlatformBiome { + @Override + public BiomeType getHandle() { + return allayBiome; + } +} 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 new file mode 100644 index 000000000..be8988400 --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockState.java @@ -0,0 +1,74 @@ +package com.dfsek.terra.allay.delegate; + +import org.allaymc.api.block.type.BlockState; +import org.allaymc.api.block.type.BlockTypes; + +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 + */ +public final class AllayBlockState implements com.dfsek.terra.api.block.state.BlockState { + + public static final AllayBlockState AIR = new AllayBlockState(BlockTypes.AIR.getDefaultState(), + JeBlockState.fromString("minecraft:air")); + + private final BlockState allayBlockState; + private final JeBlockState jeBlockState; + private final boolean containsWater; + + public AllayBlockState(BlockState allayBlockState, JeBlockState jeBlockState) { + this.allayBlockState = allayBlockState; + this.jeBlockState = jeBlockState; + this.containsWater = "true".equals(jeBlockState.getPropertyValue("waterlogged")); + } + + @Override + public boolean matches(com.dfsek.terra.api.block.state.BlockState o) { + AllayBlockState other = ((AllayBlockState) o); + return other.allayBlockState == this.allayBlockState && other.containsWater == this.containsWater; + } + + @Override + public > boolean has(Property property) { + return false; + } + + @Override + public > T get(Property property) { + return null; + } + + @Override + public > com.dfsek.terra.api.block.state.BlockState set(Property property, T value) { + return null; + } + + @Override + public BlockType getBlockType() { + return new AllayBlockType(allayBlockState.getBlockType()); + } + + @Override + public String getAsString(boolean properties) { + return jeBlockState.toString(properties); + } + + @Override + public boolean isAir() { + return allayBlockState.getBlockType() == BlockTypes.AIR; + } + + @Override + public BlockState getHandle() { + return allayBlockState; + } + + public BlockState allayBlockState() { return allayBlockState; } + + 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 new file mode 100644 index 000000000..901f04ee3 --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockType.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.allay.delegate; + +import org.allaymc.api.block.tag.BlockTags; +import org.allaymc.api.block.type.BlockType; + +import com.dfsek.terra.allay.Mapping; +import com.dfsek.terra.api.block.state.BlockState; + +/** + * @author daoge_cmd + */ +public record AllayBlockType(BlockType allayBlockType) implements com.dfsek.terra.api.block.BlockType { + @Override + public BlockState getDefaultState() { + return new AllayBlockState(allayBlockType.getDefaultState(), Mapping.blockStateBeToJe(allayBlockType.getDefaultState())); + } + + @Override + public boolean isSolid() { + return allayBlockType.getDefaultState().getBlockStateData().isSolid(); + } + + @Override + public boolean isWater() { + return allayBlockType.hasBlockTag(BlockTags.WATER); + } + + @Override + public BlockType getHandle() { + return allayBlockType; + } +} 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 new file mode 100644 index 000000000..c67ed2d88 --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayChunk.java @@ -0,0 +1,54 @@ +package com.dfsek.terra.allay.delegate; + +import org.allaymc.api.block.property.type.BlockPropertyTypes; +import org.allaymc.api.block.tag.BlockTags; +import org.allaymc.api.block.type.BlockTypes; +import org.allaymc.api.world.chunk.Chunk; +import org.jetbrains.annotations.NotNull; + +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)); + + @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)) { + allayChunk.setBlockState(x, y, z, WATER, 1); + } + } + + @Override + public @NotNull BlockState getBlock(int x, int y, int z) { + org.allaymc.api.block.type.BlockState blockState = allayChunk.getBlockState(x, y, z); + return new AllayBlockState(blockState, Mapping.blockStateBeToJe(blockState)); + } + + @Override + public int getX() { + return allayChunk.getX(); + } + + @Override + public int getZ() { + return allayChunk.getZ(); + } + + @Override + public ServerWorld getWorld() { + return world; + } + + @Override + public Chunk getHandle() { + return allayChunk; + } +} 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 new file mode 100644 index 000000000..b41fa7b75 --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayEnchantment.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.allay.delegate; + +import org.allaymc.api.item.enchantment.EnchantmentType; + +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); + } + + @Override + public boolean conflictsWith(Enchantment other) { + return ((AllayEnchantment)other).allayEnchantment.isIncompatibleWith(allayEnchantment); + } + + @Override + public String getID() { + return Mapping.enchantmentIdBeToJe(allayEnchantment.getIdentifier().toString()); + } + + @Override + public int getMaxLevel() { + return allayEnchantment.getMaxLevel(); + } + + @Override + public EnchantmentType getHandle() { + return allayEnchantment; + } +} 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 new file mode 100644 index 000000000..fc792270c --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayFakeEntity.java @@ -0,0 +1,47 @@ +package com.dfsek.terra.allay.delegate; + +import com.dfsek.terra.api.entity.Entity; +import com.dfsek.seismic.type.vector.Vector3; +import com.dfsek.terra.api.world.ServerWorld; + +/** + * NOTICE: Entity is not supported currently, and this is a fake implementation. + * + * @author daoge_cmd + */ +public final class AllayFakeEntity implements Entity { + + private final Object fakeHandle = new Object(); + private Vector3 position; + private ServerWorld world; + + public AllayFakeEntity(Vector3 position, ServerWorld world) { + this.position = position; + this.world = world; + } + + @Override + public Vector3 position() { + return position; + } + + @Override + public void position(Vector3 position) { + this.position = position; + } + + @Override + public void world(ServerWorld world) { + this.world = world; + } + + @Override + public ServerWorld world() { + return world; + } + + @Override + public Object getHandle() { + return fakeHandle; + } +} 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 new file mode 100644 index 000000000..857f0af6d --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayItemMeta.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.allay.delegate; + +import org.allaymc.api.item.ItemStack; +import org.allaymc.api.item.enchantment.EnchantmentInstance; +import org.allaymc.api.item.enchantment.EnchantmentType; + +import java.util.HashMap; +import java.util.Map; + +import com.dfsek.terra.api.inventory.item.Enchantment; +import com.dfsek.terra.api.inventory.item.ItemMeta; + +/** + * @author daoge_cmd + */ +public record AllayItemMeta(ItemStack allayItemStack) implements ItemMeta { + @Override + public void addEnchantment(Enchantment enchantment, int level) { + EnchantmentType allayEnchantment = ((AllayEnchantment) enchantment).allayEnchantment(); + allayItemStack.addEnchantment(allayEnchantment, (short) level); + } + + @Override + public Map getEnchantments() { + Map results = new HashMap<>(); + for (EnchantmentInstance allayEnchantmentInstance : allayItemStack.getEnchantments()) { + results.put(new AllayEnchantment(allayEnchantmentInstance.getType()), allayEnchantmentInstance.getLevel()); + } + return results; + } + + @Override + public ItemStack getHandle() { + return allayItemStack; + } +} 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 new file mode 100644 index 000000000..8c6b03e35 --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayItemStack.java @@ -0,0 +1,50 @@ +package com.dfsek.terra.allay.delegate; + +import org.allaymc.api.item.ItemStack; +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{ + @Override + public int getAmount() { + return allayItemStack.getCount(); + } + + @Override + public void setAmount(int i) { + allayItemStack.setCount(i); + } + + @Override + public Item getType() { + return new AllayItemType(allayItemStack.getItemType()); + } + + @Override + public ItemMeta getItemMeta() { + return new AllayItemMeta(allayItemStack); + } + + @Override + public void setItemMeta(ItemMeta meta) { + ItemStack targetItem = ((AllayItemMeta) meta).allayItemStack(); + allayItemStack.removeAllEnchantments(); + for (EnchantmentInstance enchantment : targetItem.getEnchantments()) { + allayItemStack.addEnchantment(enchantment.getType(), enchantment.getLevel()); + } + allayItemStack.setLore(targetItem.getLore()); + allayItemStack.setDurability(targetItem.getDurability()); + allayItemStack.setCustomName(targetItem.getCustomName()); + allayItemStack.setMeta(targetItem.getMeta()); + } + + @Override + public ItemStack getHandle() { + return allayItemStack; + } +} diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayItemType.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayItemType.java new file mode 100644 index 000000000..b96064814 --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayItemType.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.allay.delegate; + +import org.allaymc.api.item.type.ItemType; + +import com.dfsek.terra.api.inventory.Item; + + +/** + * @author daoge_cmd + */ +public final class AllayItemType implements Item { + private final ItemType allayItemType; + private final double maxDurability; + + public AllayItemType(ItemType allayItemType) { + this.allayItemType = allayItemType; + this.maxDurability = allayItemType.getItemData().maxDamage(); + } + + @Override + public com.dfsek.terra.api.inventory.ItemStack newItemStack(int amount) { + return new AllayItemStack(allayItemType.createItemStack(amount)); + } + + @Override + public double getMaxDurability() { + return maxDurability; + } + + @Override + public ItemType getHandle() { + return allayItemType; + } +} 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 new file mode 100644 index 000000000..5b67727fb --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayProtoChunk.java @@ -0,0 +1,44 @@ +package com.dfsek.terra.allay.delegate; + +import org.allaymc.api.block.property.type.BlockPropertyTypes; +import org.allaymc.api.block.tag.BlockTags; +import org.allaymc.api.block.type.BlockTypes; +import org.allaymc.api.world.chunk.UnsafeChunk; +import org.jetbrains.annotations.NotNull; + +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)); + + @Override + public int getMaxHeight() { + return allayChunk.getDimensionInfo().maxHeight(); + } + + @Override + public void setBlock(int x, int y, int z, @NotNull BlockState blockState) { + AllayBlockState allayBlockState = (AllayBlockState) blockState; + allayChunk.setBlockState(x, y, z, allayBlockState.allayBlockState()); + if(allayBlockState.containsWater() || allayChunk.getBlockState(x, y, z).getBlockType().hasBlockTag(BlockTags.WATER)) { + allayChunk.setBlockState(x, y, z, WATER, 1); + } + } + + @Override + public @NotNull BlockState getBlock(int x, int y, int z) { + org.allaymc.api.block.type.BlockState blockState = allayChunk.getBlockState(x, y, z); + return new AllayBlockState(blockState, Mapping.blockStateBeToJe(blockState)); + } + + @Override + public UnsafeChunk getHandle() { + return allayChunk; + } +} 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 new file mode 100644 index 000000000..82ecb2839 --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayProtoWorld.java @@ -0,0 +1,101 @@ +package com.dfsek.terra.allay.delegate; + +import org.allaymc.api.block.property.type.BlockPropertyTypes; +import org.allaymc.api.block.tag.BlockTags; +import org.allaymc.api.block.type.BlockTypes; +import org.allaymc.api.world.generator.context.OtherChunkAccessibleContext; + +import com.dfsek.terra.allay.Mapping; +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.seismic.type.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)); + + @Override + public int centerChunkX() { + return context.getCurrentChunk().getX(); + } + + @Override + public int centerChunkZ() { + return context.getCurrentChunk().getZ(); + } + + @Override + public ServerWorld getWorld() { + return allayServerWorld; + } + + @Override + public void setBlockState(int x, int y, int z, BlockState data, boolean physics) { + AllayBlockState allayBlockState = (AllayBlockState) data; + context.setBlockState(x, y, z, allayBlockState.allayBlockState()); + if(allayBlockState.containsWater() || context.getBlockState(x, y, z).getBlockType().hasBlockTag(BlockTags.WATER)) { + context.setBlockState(x, y, z, WATER, 1); + } + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + org.allaymc.api.block.type.BlockState blockState = context.getBlockState(x, y, z); + return new AllayBlockState(blockState, Mapping.blockStateBeToJe(blockState)); + } + + @Override + public Entity spawnEntity(double x, double y, double z, EntityType entityType) { + return new AllayFakeEntity(Vector3.of(x, y, z), allayServerWorld); + } + + @Override + public BlockEntity getBlockEntity(int x, int y, int z) { + return null; + } + + @Override + public ChunkGenerator getGenerator() { + return allayServerWorld.getGenerator(); + } + + @Override + public BiomeProvider getBiomeProvider() { + return allayServerWorld.getBiomeProvider(); + } + + @Override + public ConfigPack getPack() { + return allayServerWorld.getPack(); + } + + @Override + public long getSeed() { + return allayServerWorld.getSeed(); + } + + @Override + public int getMaxHeight() { + return allayServerWorld.getMaxHeight(); + } + + @Override + public int getMinHeight() { + return allayServerWorld.getMinHeight(); + } + + @Override + public AllayServerWorld getHandle() { + return allayServerWorld; + } +} \ No newline at end of file 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 new file mode 100644 index 000000000..3a24422b0 --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayServerWorld.java @@ -0,0 +1,83 @@ +package com.dfsek.terra.allay.delegate; + +import org.allaymc.api.world.Dimension; + +import com.dfsek.terra.allay.Mapping; +import com.dfsek.terra.allay.generator.AllayGeneratorWrapper; +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.seismic.type.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 + */ +public record AllayServerWorld(AllayGeneratorWrapper allayGeneratorWrapper, Dimension allayDimension) implements ServerWorld { + @Override + public Chunk getChunkAt(int x, int z) { + return new AllayChunk(this, allayDimension.getChunkService().getChunk(x, z)); + } + + @Override + public void setBlockState(int x, int y, int z, BlockState data, boolean physics) { + // In dimension#setBlockState() method, Water will be moved to layer 1 if it is placed at layer 0 + allayDimension.setBlockState(x, y, z, ((AllayBlockState) data).allayBlockState()); + } + + @Override + public Entity spawnEntity(double x, double y, double z, EntityType entityType) { + return new AllayFakeEntity(Vector3.of(x, y, z), this); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + org.allaymc.api.block.type.BlockState allayBlockState = allayDimension.getBlockState(x, y, z); + return new AllayBlockState(allayBlockState, Mapping.blockStateBeToJe(allayBlockState)); + } + + @Override + public BlockEntity getBlockEntity(int x, int y, int z) { + return null; + } + + @Override + public ChunkGenerator getGenerator() { + return allayGeneratorWrapper.getHandle(); + } + + @Override + public BiomeProvider getBiomeProvider() { + return allayGeneratorWrapper.getBiomeProvider(); + } + + @Override + public ConfigPack getPack() { + return allayGeneratorWrapper.getConfigPack(); + } + + @Override + public long getSeed() { + return allayGeneratorWrapper.getSeed(); + } + + @Override + public int getMaxHeight() { + return allayDimension.getDimensionInfo().maxHeight(); + } + + @Override + public int getMinHeight() { + return allayDimension.getDimensionInfo().minHeight(); + } + + @Override + public Object getHandle() { + return allayDimension; + } +} 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 new file mode 100644 index 000000000..20422b831 --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/generator/AllayGeneratorWrapper.java @@ -0,0 +1,180 @@ +package com.dfsek.terra.allay.generator; + +import org.allaymc.api.utils.AllayStringUtils; +import org.allaymc.api.world.biome.BiomeType; +import org.allaymc.api.world.chunk.UnsafeChunk; +import org.allaymc.api.world.generator.WorldGenerator; +import org.allaymc.api.world.generator.context.NoiseContext; +import org.allaymc.api.world.generator.context.PopulateContext; +import org.allaymc.api.world.generator.function.Noiser; +import org.allaymc.api.world.generator.function.Populator; + +import java.util.Locale; +import java.util.Map; +import java.util.Optional; + +import com.dfsek.terra.allay.TerraAllayPlugin; +import com.dfsek.terra.allay.delegate.AllayProtoChunk; +import com.dfsek.terra.allay.delegate.AllayProtoWorld; +import com.dfsek.terra.allay.delegate.AllayServerWorld; +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.api.world.info.WorldProperties; + +/** + * @author daoge_cmd + */ +public class AllayGeneratorWrapper implements GeneratorWrapper { + + protected static final String OPTION_PACK_NAME = "pack"; + protected static final String OPTION_SEED = "seed"; + + protected final BiomeProvider biomeProvider; + protected final long seed; + protected final WorldGenerator allayWorldGenerator; + protected ChunkGenerator chunkGenerator; + protected ConfigPack configPack; + protected WorldProperties worldProperties; + protected AllayServerWorld allayServerWorld; + + public AllayGeneratorWrapper(String preset) { + Map options = AllayStringUtils.parseOptions(preset); + String packName = options.get(OPTION_PACK_NAME); + if(packName == null) { + throw new IllegalArgumentException("Missing config pack name"); + } + this.seed = Long.parseLong(options.getOrDefault(OPTION_SEED, "0")); + this.configPack = getConfigPack(packName); + this.chunkGenerator = createGenerator(this.configPack); + this.biomeProvider = this.configPack.getBiomeProvider(); + this.allayWorldGenerator = WorldGenerator + .builder() + .name("TERRA") + .preset(preset) + .noisers(new AllayNoiser()) + .populators(new AllayPopulator()) + .onDimensionSet(dimension -> { + this.allayServerWorld = new AllayServerWorld(this, dimension); + this.worldProperties = new WorldProperties() { + + private final Object fakeHandle = new Object(); + + @Override + public long getSeed() { + return seed; + } + + @Override + public int getMaxHeight() { + return dimension.getDimensionInfo().maxHeight(); + } + + @Override + public int getMinHeight() { + return dimension.getDimensionInfo().minHeight(); + } + + @Override + public Object getHandle() { + return fakeHandle; + } + }; + }) + .build(); + } + + @Override + public ChunkGenerator getHandle() { + return chunkGenerator; + } + + public BiomeProvider getBiomeProvider() { + return this.biomeProvider; + } + + public ConfigPack getConfigPack() { + return this.configPack; + } + + public void setConfigPack(ConfigPack configPack) { + this.configPack = configPack; + this.chunkGenerator = createGenerator(this.configPack); + } + + public long getSeed() { + return this.seed; + } + + public WorldGenerator getAllayWorldGenerator() { + return this.allayWorldGenerator; + } + + protected class AllayNoiser implements Noiser { + + @Override + public boolean apply(NoiseContext context) { + UnsafeChunk chunk = context.getCurrentChunk(); + int chunkX = chunk.getX(); + int chunkZ = chunk.getZ(); + chunkGenerator.generateChunkData( + new AllayProtoChunk(chunk), + worldProperties, biomeProvider, + chunkX, chunkZ + ); + int minHeight = context.getDimensionInfo().minHeight(); + int maxHeight = context.getDimensionInfo().maxHeight(); + for(int x = 0; x < 16; x++) { + for(int y = minHeight; y < maxHeight; y++) { + for(int z = 0; z < 16; z++) { + chunk.setBiome( + x, y, z, + (BiomeType) biomeProvider.getBiome(chunkX * 16 + x, y, chunkZ * 16 + z, seed).getPlatformBiome().getHandle() + ); + } + } + } + return true; + } + + @Override + public String getName() { + return "TERRA_NOISER"; + } + } + + protected class AllayPopulator implements Populator { + + @Override + public boolean apply(PopulateContext context) { + AllayProtoWorld tmp = new AllayProtoWorld(allayServerWorld, context); + try { + for(GenerationStage generationStage : configPack.getStages()) { + generationStage.populate(tmp); + } + } catch(Exception e) { + TerraAllayPlugin.INSTANCE.getPluginLogger().error("Error while populating chunk", e); + } + return true; + } + + @Override + public String getName() { + return "TERRA_POPULATOR"; + } + } + + 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/AllayItemHandle.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/handle/AllayItemHandle.java new file mode 100644 index 000000000..f85f001bb --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/handle/AllayItemHandle.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.allay.handle; + +import org.allaymc.api.registry.Registries; +import org.allaymc.api.utils.Identifier; + +import java.util.Set; +import java.util.stream.Collectors; + +import com.dfsek.terra.allay.Mapping; +import com.dfsek.terra.allay.delegate.AllayEnchantment; +import com.dfsek.terra.allay.delegate.AllayItemType; +import com.dfsek.terra.api.handle.ItemHandle; +import com.dfsek.terra.api.inventory.Item; +import com.dfsek.terra.api.inventory.item.Enchantment; + +/** + * @author daoge_cmd + */ +public class AllayItemHandle implements ItemHandle { + @Override + public Item createItem(String data) { + return new AllayItemType(Mapping.itemIdJeToBe(data)); + } + + @Override + public Enchantment getEnchantment(String id) { + return new AllayEnchantment(Registries.ENCHANTMENTS.getByK2(new Identifier(Mapping.enchantmentIdJeToBe(id)))); + } + + @Override + public Set getEnchantments() { + return Registries.ENCHANTMENTS.getContent().m1().values().stream() + .map(AllayEnchantment::new) + .collect(Collectors.toSet()); + } +} 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 new file mode 100644 index 000000000..37e84425f --- /dev/null +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/handle/AllayWorldHandle.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.allay.handle; + +import org.jetbrains.annotations.NotNull; + +import com.dfsek.terra.allay.JeBlockState; +import com.dfsek.terra.allay.Mapping; +import com.dfsek.terra.allay.delegate.AllayBlockState; +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 + */ +public class AllayWorldHandle implements WorldHandle { + + @Override + public @NotNull BlockState createBlockState(@NotNull String data) { + JeBlockState jeBlockState = JeBlockState.fromString(data); + return new AllayBlockState(Mapping.blockStateJeToBe(jeBlockState), jeBlockState); + } + + @Override + public @NotNull BlockState air() { + return AllayBlockState.AIR; + } + + @Override + 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/allay/src/main/resources/je_block_default_states.json b/platforms/allay/src/main/resources/je_block_default_states.json new file mode 100644 index 000000000..4e3e5de14 --- /dev/null +++ b/platforms/allay/src/main/resources/je_block_default_states.json @@ -0,0 +1,3613 @@ +{ + "minecraft:acacia_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:acacia_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:acacia_fence": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:acacia_fence_gate": { + "facing": "north", + "in_wall": "false", + "open": "false", + "powered": "false" + }, + "minecraft:acacia_hanging_sign": { + "attached": "false", + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:acacia_leaves": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + }, + "minecraft:acacia_log": { + "axis": "y" + }, + "minecraft:acacia_planks": {}, + "minecraft:acacia_pressure_plate": { + "powered": "false" + }, + "minecraft:acacia_sapling": { + "stage": "0" + }, + "minecraft:acacia_sign": { + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:acacia_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:acacia_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:acacia_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:acacia_wall_hanging_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:acacia_wall_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:acacia_wood": { + "axis": "y" + }, + "minecraft:activator_rail": { + "powered": "false", + "shape": "north_south", + "waterlogged": "false" + }, + "minecraft:air": {}, + "minecraft:allium": {}, + "minecraft:amethyst_block": {}, + "minecraft:amethyst_cluster": { + "facing": "up", + "waterlogged": "false" + }, + "minecraft:ancient_debris": {}, + "minecraft:andesite": {}, + "minecraft:andesite_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:andesite_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:andesite_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:anvil": { + "facing": "north" + }, + "minecraft:attached_melon_stem": { + "facing": "north" + }, + "minecraft:attached_pumpkin_stem": { + "facing": "north" + }, + "minecraft:azalea": {}, + "minecraft:azalea_leaves": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + }, + "minecraft:azure_bluet": {}, + "minecraft:bamboo": { + "age_1": "0", + "bamboo_leaves": "none", + "stage": "0" + }, + "minecraft:bamboo_block": { + "axis": "y" + }, + "minecraft:bamboo_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:bamboo_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:bamboo_fence": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:bamboo_fence_gate": { + "facing": "north", + "in_wall": "false", + "open": "false", + "powered": "false" + }, + "minecraft:bamboo_hanging_sign": { + "attached": "false", + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:bamboo_mosaic": {}, + "minecraft:bamboo_mosaic_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:bamboo_mosaic_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:bamboo_planks": {}, + "minecraft:bamboo_pressure_plate": { + "powered": "false" + }, + "minecraft:bamboo_sapling": {}, + "minecraft:bamboo_sign": { + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:bamboo_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:bamboo_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:bamboo_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:bamboo_wall_hanging_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:bamboo_wall_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:barrel": { + "facing": "north", + "open": "false" + }, + "minecraft:barrier": { + "waterlogged": "false" + }, + "minecraft:basalt": { + "axis": "y" + }, + "minecraft:beacon": {}, + "minecraft:bedrock": {}, + "minecraft:bee_nest": { + "facing": "north", + "honey_level": "0" + }, + "minecraft:beehive": { + "facing": "north", + "honey_level": "0" + }, + "minecraft:beetroots": { + "age_3": "0" + }, + "minecraft:bell": { + "bell_attachment": "floor", + "facing": "north", + "powered": "false" + }, + "minecraft:big_dripleaf": { + "facing": "north", + "tilt": "none", + "waterlogged": "false" + }, + "minecraft:big_dripleaf_stem": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:birch_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:birch_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:birch_fence": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:birch_fence_gate": { + "facing": "north", + "in_wall": "false", + "open": "false", + "powered": "false" + }, + "minecraft:birch_hanging_sign": { + "attached": "false", + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:birch_leaves": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + }, + "minecraft:birch_log": { + "axis": "y" + }, + "minecraft:birch_planks": {}, + "minecraft:birch_pressure_plate": { + "powered": "false" + }, + "minecraft:birch_sapling": { + "stage": "0" + }, + "minecraft:birch_sign": { + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:birch_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:birch_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:birch_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:birch_wall_hanging_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:birch_wall_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:birch_wood": { + "axis": "y" + }, + "minecraft:black_banner": { + "rotation": "0" + }, + "minecraft:black_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:black_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:black_candle_cake": { + "lit": "false" + }, + "minecraft:black_carpet": {}, + "minecraft:black_concrete": {}, + "minecraft:black_concrete_powder": {}, + "minecraft:black_glazed_terracotta": { + "facing": "north" + }, + "minecraft:black_shulker_box": { + "facing": "up" + }, + "minecraft:black_stained_glass": {}, + "minecraft:black_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:black_terracotta": {}, + "minecraft:black_wall_banner": { + "facing": "north" + }, + "minecraft:black_wool": {}, + "minecraft:blackstone": {}, + "minecraft:blackstone_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:blackstone_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:blackstone_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:blast_furnace": { + "facing": "north", + "lit": "false" + }, + "minecraft:blue_banner": { + "rotation": "0" + }, + "minecraft:blue_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:blue_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:blue_candle_cake": { + "lit": "false" + }, + "minecraft:blue_carpet": {}, + "minecraft:blue_concrete": {}, + "minecraft:blue_concrete_powder": {}, + "minecraft:blue_glazed_terracotta": { + "facing": "north" + }, + "minecraft:blue_ice": {}, + "minecraft:blue_orchid": {}, + "minecraft:blue_shulker_box": { + "facing": "up" + }, + "minecraft:blue_stained_glass": {}, + "minecraft:blue_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:blue_terracotta": {}, + "minecraft:blue_wall_banner": { + "facing": "north" + }, + "minecraft:blue_wool": {}, + "minecraft:bone_block": { + "axis": "y" + }, + "minecraft:bookshelf": {}, + "minecraft:brain_coral": { + "waterlogged": "true" + }, + "minecraft:brain_coral_block": {}, + "minecraft:brain_coral_fan": { + "waterlogged": "true" + }, + "minecraft:brain_coral_wall_fan": { + "facing": "north", + "waterlogged": "true" + }, + "minecraft:brewing_stand": { + "has_bottle_0": "false", + "has_bottle_1": "false", + "has_bottle_2": "false" + }, + "minecraft:brick_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:brick_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:brick_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:bricks": {}, + "minecraft:brown_banner": { + "rotation": "0" + }, + "minecraft:brown_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:brown_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:brown_candle_cake": { + "lit": "false" + }, + "minecraft:brown_carpet": {}, + "minecraft:brown_concrete": {}, + "minecraft:brown_concrete_powder": {}, + "minecraft:brown_glazed_terracotta": { + "facing": "north" + }, + "minecraft:brown_mushroom": {}, + "minecraft:brown_mushroom_block": { + "down": "true", + "east": "true", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + }, + "minecraft:brown_shulker_box": { + "facing": "up" + }, + "minecraft:brown_stained_glass": {}, + "minecraft:brown_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:brown_terracotta": {}, + "minecraft:brown_wall_banner": { + "facing": "north" + }, + "minecraft:brown_wool": {}, + "minecraft:bubble_column": { + "drag": "true" + }, + "minecraft:bubble_coral": { + "waterlogged": "true" + }, + "minecraft:bubble_coral_block": {}, + "minecraft:bubble_coral_fan": { + "waterlogged": "true" + }, + "minecraft:bubble_coral_wall_fan": { + "facing": "north", + "waterlogged": "true" + }, + "minecraft:budding_amethyst": {}, + "minecraft:bush": {}, + "minecraft:cactus": { + "age": "0" + }, + "minecraft:cactus_flower": {}, + "minecraft:cake": { + "bites": "0" + }, + "minecraft:calcite": {}, + "minecraft:calibrated_sculk_sensor": { + "facing": "north", + "power": "0", + "sculk_sensor_phase": "inactive", + "waterlogged": "false" + }, + "minecraft:campfire": { + "facing": "north", + "lit": "true", + "signal_fire": "false", + "waterlogged": "false" + }, + "minecraft:candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:candle_cake": { + "lit": "false" + }, + "minecraft:carrots": { + "age": "0" + }, + "minecraft:cartography_table": {}, + "minecraft:carved_pumpkin": { + "facing": "north" + }, + "minecraft:cauldron": {}, + "minecraft:cave_air": {}, + "minecraft:cave_vines": { + "age": "0", + "berries": "false" + }, + "minecraft:cave_vines_plant": { + "berries": "false" + }, + "minecraft:chain": { + "axis": "y", + "waterlogged": "false" + }, + "minecraft:chain_command_block": { + "conditional": "false", + "facing": "north" + }, + "minecraft:cherry_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:cherry_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:cherry_fence": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:cherry_fence_gate": { + "facing": "north", + "in_wall": "false", + "open": "false", + "powered": "false" + }, + "minecraft:cherry_hanging_sign": { + "attached": "false", + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:cherry_leaves": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + }, + "minecraft:cherry_log": { + "axis": "y" + }, + "minecraft:cherry_planks": {}, + "minecraft:cherry_pressure_plate": { + "powered": "false" + }, + "minecraft:cherry_sapling": { + "stage": "0" + }, + "minecraft:cherry_sign": { + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:cherry_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:cherry_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:cherry_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:cherry_wall_hanging_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:cherry_wall_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:cherry_wood": { + "axis": "y" + }, + "minecraft:chest": { + "chest_type": "single", + "facing": "north", + "waterlogged": "false" + }, + "minecraft:chipped_anvil": { + "facing": "north" + }, + "minecraft:chiseled_bookshelf": { + "chiseled_bookshelf_slot_0_occupied": "false", + "chiseled_bookshelf_slot_1_occupied": "false", + "chiseled_bookshelf_slot_2_occupied": "false", + "chiseled_bookshelf_slot_3_occupied": "false", + "chiseled_bookshelf_slot_4_occupied": "false", + "chiseled_bookshelf_slot_5_occupied": "false", + "facing": "north" + }, + "minecraft:chiseled_copper": {}, + "minecraft:chiseled_deepslate": {}, + "minecraft:chiseled_nether_bricks": {}, + "minecraft:chiseled_polished_blackstone": {}, + "minecraft:chiseled_quartz_block": {}, + "minecraft:chiseled_red_sandstone": {}, + "minecraft:chiseled_resin_bricks": {}, + "minecraft:chiseled_sandstone": {}, + "minecraft:chiseled_stone_bricks": {}, + "minecraft:chiseled_tuff": {}, + "minecraft:chiseled_tuff_bricks": {}, + "minecraft:chorus_flower": { + "age_5": "0" + }, + "minecraft:chorus_plant": { + "down": "false", + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + }, + "minecraft:clay": {}, + "minecraft:closed_eyeblossom": {}, + "minecraft:coal_block": {}, + "minecraft:coal_ore": {}, + "minecraft:coarse_dirt": {}, + "minecraft:cobbled_deepslate": {}, + "minecraft:cobbled_deepslate_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:cobbled_deepslate_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:cobbled_deepslate_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:cobblestone": {}, + "minecraft:cobblestone_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:cobblestone_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:cobblestone_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:cobweb": {}, + "minecraft:cocoa": { + "age_2": "0", + "facing": "north" + }, + "minecraft:command_block": { + "conditional": "false", + "facing": "north" + }, + "minecraft:comparator": { + "facing": "north", + "mode_comparator": "compare", + "powered": "false" + }, + "minecraft:composter": { + "level_composter": "0" + }, + "minecraft:conduit": { + "waterlogged": "true" + }, + "minecraft:copper_block": {}, + "minecraft:copper_bulb": { + "lit": "false", + "powered": "false" + }, + "minecraft:copper_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:copper_grate": { + "waterlogged": "false" + }, + "minecraft:copper_ore": {}, + "minecraft:copper_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:cornflower": {}, + "minecraft:cracked_deepslate_bricks": {}, + "minecraft:cracked_deepslate_tiles": {}, + "minecraft:cracked_nether_bricks": {}, + "minecraft:cracked_polished_blackstone_bricks": {}, + "minecraft:cracked_stone_bricks": {}, + "minecraft:crafter": { + "crafting": "false", + "orientation": "north_up", + "triggered": "false" + }, + "minecraft:crafting_table": {}, + "minecraft:creaking_heart": { + "axis": "y", + "creaking_heart_state": "uprooted", + "natural": "false" + }, + "minecraft:creeper_head": { + "powered": "false", + "rotation": "0" + }, + "minecraft:creeper_wall_head": { + "facing": "north", + "powered": "false" + }, + "minecraft:crimson_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:crimson_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:crimson_fence": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:crimson_fence_gate": { + "facing": "north", + "in_wall": "false", + "open": "false", + "powered": "false" + }, + "minecraft:crimson_fungus": {}, + "minecraft:crimson_hanging_sign": { + "attached": "false", + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:crimson_hyphae": { + "axis": "y" + }, + "minecraft:crimson_nylium": {}, + "minecraft:crimson_planks": {}, + "minecraft:crimson_pressure_plate": { + "powered": "false" + }, + "minecraft:crimson_roots": {}, + "minecraft:crimson_sign": { + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:crimson_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:crimson_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:crimson_stem": { + "axis": "y" + }, + "minecraft:crimson_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:crimson_wall_hanging_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:crimson_wall_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:crying_obsidian": {}, + "minecraft:cut_copper": {}, + "minecraft:cut_copper_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:cut_copper_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:cut_red_sandstone": {}, + "minecraft:cut_red_sandstone_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:cut_sandstone": {}, + "minecraft:cut_sandstone_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:cyan_banner": { + "rotation": "0" + }, + "minecraft:cyan_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:cyan_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:cyan_candle_cake": { + "lit": "false" + }, + "minecraft:cyan_carpet": {}, + "minecraft:cyan_concrete": {}, + "minecraft:cyan_concrete_powder": {}, + "minecraft:cyan_glazed_terracotta": { + "facing": "north" + }, + "minecraft:cyan_shulker_box": { + "facing": "up" + }, + "minecraft:cyan_stained_glass": {}, + "minecraft:cyan_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:cyan_terracotta": {}, + "minecraft:cyan_wall_banner": { + "facing": "north" + }, + "minecraft:cyan_wool": {}, + "minecraft:damaged_anvil": { + "facing": "north" + }, + "minecraft:dandelion": {}, + "minecraft:dark_oak_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:dark_oak_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:dark_oak_fence": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:dark_oak_fence_gate": { + "facing": "north", + "in_wall": "false", + "open": "false", + "powered": "false" + }, + "minecraft:dark_oak_hanging_sign": { + "attached": "false", + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:dark_oak_leaves": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + }, + "minecraft:dark_oak_log": { + "axis": "y" + }, + "minecraft:dark_oak_planks": {}, + "minecraft:dark_oak_pressure_plate": { + "powered": "false" + }, + "minecraft:dark_oak_sapling": { + "stage": "0" + }, + "minecraft:dark_oak_sign": { + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:dark_oak_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:dark_oak_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:dark_oak_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:dark_oak_wall_hanging_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:dark_oak_wall_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:dark_oak_wood": { + "axis": "y" + }, + "minecraft:dark_prismarine": {}, + "minecraft:dark_prismarine_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:dark_prismarine_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:daylight_detector": { + "inverted": "false", + "power": "0" + }, + "minecraft:dead_brain_coral": { + "waterlogged": "true" + }, + "minecraft:dead_brain_coral_block": {}, + "minecraft:dead_brain_coral_fan": { + "waterlogged": "true" + }, + "minecraft:dead_brain_coral_wall_fan": { + "facing": "north", + "waterlogged": "true" + }, + "minecraft:dead_bubble_coral": { + "waterlogged": "true" + }, + "minecraft:dead_bubble_coral_block": {}, + "minecraft:dead_bubble_coral_fan": { + "waterlogged": "true" + }, + "minecraft:dead_bubble_coral_wall_fan": { + "facing": "north", + "waterlogged": "true" + }, + "minecraft:dead_bush": {}, + "minecraft:dead_fire_coral": { + "waterlogged": "true" + }, + "minecraft:dead_fire_coral_block": {}, + "minecraft:dead_fire_coral_fan": { + "waterlogged": "true" + }, + "minecraft:dead_fire_coral_wall_fan": { + "facing": "north", + "waterlogged": "true" + }, + "minecraft:dead_horn_coral": { + "waterlogged": "true" + }, + "minecraft:dead_horn_coral_block": {}, + "minecraft:dead_horn_coral_fan": { + "waterlogged": "true" + }, + "minecraft:dead_horn_coral_wall_fan": { + "facing": "north", + "waterlogged": "true" + }, + "minecraft:dead_tube_coral": { + "waterlogged": "true" + }, + "minecraft:dead_tube_coral_block": {}, + "minecraft:dead_tube_coral_fan": { + "waterlogged": "true" + }, + "minecraft:dead_tube_coral_wall_fan": { + "facing": "north", + "waterlogged": "true" + }, + "minecraft:decorated_pot": { + "cracked": "false", + "facing": "north", + "waterlogged": "false" + }, + "minecraft:deepslate": { + "axis": "y" + }, + "minecraft:deepslate_brick_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:deepslate_brick_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:deepslate_brick_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:deepslate_bricks": {}, + "minecraft:deepslate_coal_ore": {}, + "minecraft:deepslate_copper_ore": {}, + "minecraft:deepslate_diamond_ore": {}, + "minecraft:deepslate_emerald_ore": {}, + "minecraft:deepslate_gold_ore": {}, + "minecraft:deepslate_iron_ore": {}, + "minecraft:deepslate_lapis_ore": {}, + "minecraft:deepslate_redstone_ore": { + "lit": "false" + }, + "minecraft:deepslate_tile_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:deepslate_tile_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:deepslate_tile_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:deepslate_tiles": {}, + "minecraft:detector_rail": { + "powered": "false", + "shape": "north_south", + "waterlogged": "false" + }, + "minecraft:diamond_block": {}, + "minecraft:diamond_ore": {}, + "minecraft:diorite": {}, + "minecraft:diorite_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:diorite_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:diorite_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:dirt": {}, + "minecraft:dirt_path": {}, + "minecraft:dispenser": { + "facing": "north", + "triggered": "false" + }, + "minecraft:dragon_egg": {}, + "minecraft:dragon_head": { + "powered": "false", + "rotation": "0" + }, + "minecraft:dragon_wall_head": { + "facing": "north", + "powered": "false" + }, + "minecraft:dried_kelp_block": {}, + "minecraft:dripstone_block": {}, + "minecraft:dropper": { + "facing": "north", + "triggered": "false" + }, + "minecraft:emerald_block": {}, + "minecraft:emerald_ore": {}, + "minecraft:enchanting_table": {}, + "minecraft:end_gateway": {}, + "minecraft:end_portal": {}, + "minecraft:end_portal_frame": { + "eye": "false", + "facing": "north" + }, + "minecraft:end_rod": { + "facing": "up" + }, + "minecraft:end_stone": {}, + "minecraft:end_stone_brick_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:end_stone_brick_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:end_stone_brick_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:end_stone_bricks": {}, + "minecraft:ender_chest": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:exposed_chiseled_copper": {}, + "minecraft:exposed_copper": {}, + "minecraft:exposed_copper_bulb": { + "lit": "false", + "powered": "false" + }, + "minecraft:exposed_copper_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:exposed_copper_grate": { + "waterlogged": "false" + }, + "minecraft:exposed_copper_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:exposed_cut_copper": {}, + "minecraft:exposed_cut_copper_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:exposed_cut_copper_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:farmland": { + "moisture": "0" + }, + "minecraft:fern": {}, + "minecraft:fire": { + "age": "0", + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + }, + "minecraft:fire_coral": { + "waterlogged": "true" + }, + "minecraft:fire_coral_block": {}, + "minecraft:fire_coral_fan": { + "waterlogged": "true" + }, + "minecraft:fire_coral_wall_fan": { + "facing": "north", + "waterlogged": "true" + }, + "minecraft:firefly_bush": {}, + "minecraft:fletching_table": {}, + "minecraft:flower_pot": {}, + "minecraft:flowering_azalea": {}, + "minecraft:flowering_azalea_leaves": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + }, + "minecraft:frogspawn": {}, + "minecraft:frosted_ice": { + "age_3": "0" + }, + "minecraft:furnace": { + "facing": "north", + "lit": "false" + }, + "minecraft:gilded_blackstone": {}, + "minecraft:glass": {}, + "minecraft:glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:glow_lichen": { + "down": "false", + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:glowstone": {}, + "minecraft:gold_block": {}, + "minecraft:gold_ore": {}, + "minecraft:granite": {}, + "minecraft:granite_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:granite_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:granite_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:grass_block": { + "snowy": "false" + }, + "minecraft:gravel": {}, + "minecraft:gray_banner": { + "rotation": "0" + }, + "minecraft:gray_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:gray_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:gray_candle_cake": { + "lit": "false" + }, + "minecraft:gray_carpet": {}, + "minecraft:gray_concrete": {}, + "minecraft:gray_concrete_powder": {}, + "minecraft:gray_glazed_terracotta": { + "facing": "north" + }, + "minecraft:gray_shulker_box": { + "facing": "up" + }, + "minecraft:gray_stained_glass": {}, + "minecraft:gray_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:gray_terracotta": {}, + "minecraft:gray_wall_banner": { + "facing": "north" + }, + "minecraft:gray_wool": {}, + "minecraft:green_banner": { + "rotation": "0" + }, + "minecraft:green_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:green_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:green_candle_cake": { + "lit": "false" + }, + "minecraft:green_carpet": {}, + "minecraft:green_concrete": {}, + "minecraft:green_concrete_powder": {}, + "minecraft:green_glazed_terracotta": { + "facing": "north" + }, + "minecraft:green_shulker_box": { + "facing": "up" + }, + "minecraft:green_stained_glass": {}, + "minecraft:green_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:green_terracotta": {}, + "minecraft:green_wall_banner": { + "facing": "north" + }, + "minecraft:green_wool": {}, + "minecraft:grindstone": { + "face": "wall", + "facing": "north" + }, + "minecraft:hanging_roots": { + "waterlogged": "false" + }, + "minecraft:hay_block": { + "axis": "y" + }, + "minecraft:heavy_core": { + "waterlogged": "false" + }, + "minecraft:heavy_weighted_pressure_plate": { + "power": "0" + }, + "minecraft:honey_block": {}, + "minecraft:honeycomb_block": {}, + "minecraft:hopper": { + "enabled": "true", + "facing_hopper": "down" + }, + "minecraft:horn_coral": { + "waterlogged": "true" + }, + "minecraft:horn_coral_block": {}, + "minecraft:horn_coral_fan": { + "waterlogged": "true" + }, + "minecraft:horn_coral_wall_fan": { + "facing": "north", + "waterlogged": "true" + }, + "minecraft:ice": {}, + "minecraft:infested_chiseled_stone_bricks": {}, + "minecraft:infested_cobblestone": {}, + "minecraft:infested_cracked_stone_bricks": {}, + "minecraft:infested_deepslate": { + "axis": "y" + }, + "minecraft:infested_mossy_stone_bricks": {}, + "minecraft:infested_stone": {}, + "minecraft:infested_stone_bricks": {}, + "minecraft:iron_bars": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:iron_block": {}, + "minecraft:iron_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:iron_ore": {}, + "minecraft:iron_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:jack_o_lantern": { + "facing": "north" + }, + "minecraft:jigsaw": { + "orientation": "north_up" + }, + "minecraft:jukebox": { + "has_record": "false" + }, + "minecraft:jungle_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:jungle_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:jungle_fence": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:jungle_fence_gate": { + "facing": "north", + "in_wall": "false", + "open": "false", + "powered": "false" + }, + "minecraft:jungle_hanging_sign": { + "attached": "false", + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:jungle_leaves": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + }, + "minecraft:jungle_log": { + "axis": "y" + }, + "minecraft:jungle_planks": {}, + "minecraft:jungle_pressure_plate": { + "powered": "false" + }, + "minecraft:jungle_sapling": { + "stage": "0" + }, + "minecraft:jungle_sign": { + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:jungle_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:jungle_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:jungle_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:jungle_wall_hanging_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:jungle_wall_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:jungle_wood": { + "axis": "y" + }, + "minecraft:kelp": { + "age": "0" + }, + "minecraft:kelp_plant": {}, + "minecraft:ladder": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:lantern": { + "hanging": "false", + "waterlogged": "false" + }, + "minecraft:lapis_block": {}, + "minecraft:lapis_ore": {}, + "minecraft:large_amethyst_bud": { + "facing": "up", + "waterlogged": "false" + }, + "minecraft:large_fern": { + "half": "lower" + }, + "minecraft:lava": { + "level": "0" + }, + "minecraft:lava_cauldron": {}, + "minecraft:leaf_litter": { + "facing": "north", + "segment_amount": "1" + }, + "minecraft:lectern": { + "facing": "north", + "has_book": "false", + "powered": "false" + }, + "minecraft:lever": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:light": { + "level": "15", + "waterlogged": "false" + }, + "minecraft:light_blue_banner": { + "rotation": "0" + }, + "minecraft:light_blue_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:light_blue_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:light_blue_candle_cake": { + "lit": "false" + }, + "minecraft:light_blue_carpet": {}, + "minecraft:light_blue_concrete": {}, + "minecraft:light_blue_concrete_powder": {}, + "minecraft:light_blue_glazed_terracotta": { + "facing": "north" + }, + "minecraft:light_blue_shulker_box": { + "facing": "up" + }, + "minecraft:light_blue_stained_glass": {}, + "minecraft:light_blue_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:light_blue_terracotta": {}, + "minecraft:light_blue_wall_banner": { + "facing": "north" + }, + "minecraft:light_blue_wool": {}, + "minecraft:light_gray_banner": { + "rotation": "0" + }, + "minecraft:light_gray_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:light_gray_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:light_gray_candle_cake": { + "lit": "false" + }, + "minecraft:light_gray_carpet": {}, + "minecraft:light_gray_concrete": {}, + "minecraft:light_gray_concrete_powder": {}, + "minecraft:light_gray_glazed_terracotta": { + "facing": "north" + }, + "minecraft:light_gray_shulker_box": { + "facing": "up" + }, + "minecraft:light_gray_stained_glass": {}, + "minecraft:light_gray_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:light_gray_terracotta": {}, + "minecraft:light_gray_wall_banner": { + "facing": "north" + }, + "minecraft:light_gray_wool": {}, + "minecraft:light_weighted_pressure_plate": { + "power": "0" + }, + "minecraft:lightning_rod": { + "facing": "up", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:lilac": { + "half": "lower" + }, + "minecraft:lily_of_the_valley": {}, + "minecraft:lily_pad": {}, + "minecraft:lime_banner": { + "rotation": "0" + }, + "minecraft:lime_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:lime_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:lime_candle_cake": { + "lit": "false" + }, + "minecraft:lime_carpet": {}, + "minecraft:lime_concrete": {}, + "minecraft:lime_concrete_powder": {}, + "minecraft:lime_glazed_terracotta": { + "facing": "north" + }, + "minecraft:lime_shulker_box": { + "facing": "up" + }, + "minecraft:lime_stained_glass": {}, + "minecraft:lime_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:lime_terracotta": {}, + "minecraft:lime_wall_banner": { + "facing": "north" + }, + "minecraft:lime_wool": {}, + "minecraft:lodestone": {}, + "minecraft:loom": { + "facing": "north" + }, + "minecraft:magenta_banner": { + "rotation": "0" + }, + "minecraft:magenta_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:magenta_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:magenta_candle_cake": { + "lit": "false" + }, + "minecraft:magenta_carpet": {}, + "minecraft:magenta_concrete": {}, + "minecraft:magenta_concrete_powder": {}, + "minecraft:magenta_glazed_terracotta": { + "facing": "north" + }, + "minecraft:magenta_shulker_box": { + "facing": "up" + }, + "minecraft:magenta_stained_glass": {}, + "minecraft:magenta_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:magenta_terracotta": {}, + "minecraft:magenta_wall_banner": { + "facing": "north" + }, + "minecraft:magenta_wool": {}, + "minecraft:magma_block": {}, + "minecraft:mangrove_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:mangrove_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:mangrove_fence": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:mangrove_fence_gate": { + "facing": "north", + "in_wall": "false", + "open": "false", + "powered": "false" + }, + "minecraft:mangrove_hanging_sign": { + "attached": "false", + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:mangrove_leaves": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + }, + "minecraft:mangrove_log": { + "axis": "y" + }, + "minecraft:mangrove_planks": {}, + "minecraft:mangrove_pressure_plate": { + "powered": "false" + }, + "minecraft:mangrove_propagule": { + "age_4": "0", + "hanging": "false", + "stage": "0", + "waterlogged": "false" + }, + "minecraft:mangrove_roots": { + "waterlogged": "false" + }, + "minecraft:mangrove_sign": { + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:mangrove_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:mangrove_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:mangrove_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:mangrove_wall_hanging_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:mangrove_wall_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:mangrove_wood": { + "axis": "y" + }, + "minecraft:medium_amethyst_bud": { + "facing": "up", + "waterlogged": "false" + }, + "minecraft:melon": {}, + "minecraft:melon_stem": { + "age": "0" + }, + "minecraft:moss_block": {}, + "minecraft:moss_carpet": {}, + "minecraft:mossy_cobblestone": {}, + "minecraft:mossy_cobblestone_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:mossy_cobblestone_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:mossy_cobblestone_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:mossy_stone_brick_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:mossy_stone_brick_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:mossy_stone_brick_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:mossy_stone_bricks": {}, + "minecraft:moving_piston": { + "facing": "north", + "piston_type": "normal" + }, + "minecraft:mud": {}, + "minecraft:mud_brick_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:mud_brick_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:mud_brick_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:mud_bricks": {}, + "minecraft:muddy_mangrove_roots": { + "axis": "y" + }, + "minecraft:mushroom_stem": { + "down": "true", + "east": "true", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + }, + "minecraft:mycelium": { + "snowy": "false" + }, + "minecraft:nether_brick_fence": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:nether_brick_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:nether_brick_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:nether_brick_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:nether_bricks": {}, + "minecraft:nether_gold_ore": {}, + "minecraft:nether_portal": { + "horizontal_axis": "x" + }, + "minecraft:nether_quartz_ore": {}, + "minecraft:nether_sprouts": {}, + "minecraft:nether_wart": { + "age_3": "0" + }, + "minecraft:nether_wart_block": {}, + "minecraft:netherite_block": {}, + "minecraft:netherrack": {}, + "minecraft:note_block": { + "note": "0", + "noteblock_instrument": "harp", + "powered": "false" + }, + "minecraft:oak_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:oak_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:oak_fence": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:oak_fence_gate": { + "facing": "north", + "in_wall": "false", + "open": "false", + "powered": "false" + }, + "minecraft:oak_hanging_sign": { + "attached": "false", + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:oak_leaves": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + }, + "minecraft:oak_log": { + "axis": "y" + }, + "minecraft:oak_planks": {}, + "minecraft:oak_pressure_plate": { + "powered": "false" + }, + "minecraft:oak_sapling": { + "stage": "0" + }, + "minecraft:oak_sign": { + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:oak_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:oak_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:oak_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:oak_wall_hanging_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:oak_wall_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:oak_wood": { + "axis": "y" + }, + "minecraft:observer": { + "facing": "south", + "powered": "false" + }, + "minecraft:obsidian": {}, + "minecraft:ochre_froglight": { + "axis": "y" + }, + "minecraft:open_eyeblossom": {}, + "minecraft:orange_banner": { + "rotation": "0" + }, + "minecraft:orange_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:orange_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:orange_candle_cake": { + "lit": "false" + }, + "minecraft:orange_carpet": {}, + "minecraft:orange_concrete": {}, + "minecraft:orange_concrete_powder": {}, + "minecraft:orange_glazed_terracotta": { + "facing": "north" + }, + "minecraft:orange_shulker_box": { + "facing": "up" + }, + "minecraft:orange_stained_glass": {}, + "minecraft:orange_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:orange_terracotta": {}, + "minecraft:orange_tulip": {}, + "minecraft:orange_wall_banner": { + "facing": "north" + }, + "minecraft:orange_wool": {}, + "minecraft:oxeye_daisy": {}, + "minecraft:oxidized_chiseled_copper": {}, + "minecraft:oxidized_copper": {}, + "minecraft:oxidized_copper_bulb": { + "lit": "false", + "powered": "false" + }, + "minecraft:oxidized_copper_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:oxidized_copper_grate": { + "waterlogged": "false" + }, + "minecraft:oxidized_copper_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:oxidized_cut_copper": {}, + "minecraft:oxidized_cut_copper_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:oxidized_cut_copper_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:packed_ice": {}, + "minecraft:packed_mud": {}, + "minecraft:pale_hanging_moss": { + "tip": "true" + }, + "minecraft:pale_moss_block": {}, + "minecraft:pale_moss_carpet": { + "bottom": "true", + "east": "none", + "north": "none", + "south": "none", + "west": "none" + }, + "minecraft:pale_oak_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:pale_oak_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:pale_oak_fence": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:pale_oak_fence_gate": { + "facing": "north", + "in_wall": "false", + "open": "false", + "powered": "false" + }, + "minecraft:pale_oak_hanging_sign": { + "attached": "false", + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:pale_oak_leaves": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + }, + "minecraft:pale_oak_log": { + "axis": "y" + }, + "minecraft:pale_oak_planks": {}, + "minecraft:pale_oak_pressure_plate": { + "powered": "false" + }, + "minecraft:pale_oak_sapling": { + "stage": "0" + }, + "minecraft:pale_oak_sign": { + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:pale_oak_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:pale_oak_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:pale_oak_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:pale_oak_wall_hanging_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:pale_oak_wall_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:pale_oak_wood": { + "axis": "y" + }, + "minecraft:pearlescent_froglight": { + "axis": "y" + }, + "minecraft:peony": { + "half": "lower" + }, + "minecraft:petrified_oak_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:piglin_head": { + "powered": "false", + "rotation": "0" + }, + "minecraft:piglin_wall_head": { + "facing": "north", + "powered": "false" + }, + "minecraft:pink_banner": { + "rotation": "0" + }, + "minecraft:pink_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:pink_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:pink_candle_cake": { + "lit": "false" + }, + "minecraft:pink_carpet": {}, + "minecraft:pink_concrete": {}, + "minecraft:pink_concrete_powder": {}, + "minecraft:pink_glazed_terracotta": { + "facing": "north" + }, + "minecraft:pink_petals": { + "facing": "north", + "flower_amount": "1" + }, + "minecraft:pink_shulker_box": { + "facing": "up" + }, + "minecraft:pink_stained_glass": {}, + "minecraft:pink_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:pink_terracotta": {}, + "minecraft:pink_tulip": {}, + "minecraft:pink_wall_banner": { + "facing": "north" + }, + "minecraft:pink_wool": {}, + "minecraft:piston": { + "extended": "false", + "facing": "north" + }, + "minecraft:piston_head": { + "facing": "north", + "piston_type": "normal", + "short": "false" + }, + "minecraft:pitcher_crop": { + "age_4": "0", + "half": "lower" + }, + "minecraft:pitcher_plant": { + "half": "lower" + }, + "minecraft:player_head": { + "powered": "false", + "rotation": "0" + }, + "minecraft:player_wall_head": { + "facing": "north", + "powered": "false" + }, + "minecraft:podzol": { + "snowy": "false" + }, + "minecraft:pointed_dripstone": { + "thickness": "tip", + "vertical_direction": "up", + "waterlogged": "false" + }, + "minecraft:polished_andesite": {}, + "minecraft:polished_andesite_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:polished_andesite_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:polished_basalt": { + "axis": "y" + }, + "minecraft:polished_blackstone": {}, + "minecraft:polished_blackstone_brick_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:polished_blackstone_brick_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:polished_blackstone_brick_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:polished_blackstone_bricks": {}, + "minecraft:polished_blackstone_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:polished_blackstone_pressure_plate": { + "powered": "false" + }, + "minecraft:polished_blackstone_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:polished_blackstone_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:polished_blackstone_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:polished_deepslate": {}, + "minecraft:polished_deepslate_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:polished_deepslate_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:polished_deepslate_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:polished_diorite": {}, + "minecraft:polished_diorite_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:polished_diorite_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:polished_granite": {}, + "minecraft:polished_granite_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:polished_granite_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:polished_tuff": {}, + "minecraft:polished_tuff_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:polished_tuff_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:polished_tuff_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:poppy": {}, + "minecraft:potatoes": { + "age": "0" + }, + "minecraft:potted_acacia_sapling": {}, + "minecraft:potted_allium": {}, + "minecraft:potted_azalea_bush": {}, + "minecraft:potted_azure_bluet": {}, + "minecraft:potted_bamboo": {}, + "minecraft:potted_birch_sapling": {}, + "minecraft:potted_blue_orchid": {}, + "minecraft:potted_brown_mushroom": {}, + "minecraft:potted_cactus": {}, + "minecraft:potted_cherry_sapling": {}, + "minecraft:potted_closed_eyeblossom": {}, + "minecraft:potted_cornflower": {}, + "minecraft:potted_crimson_fungus": {}, + "minecraft:potted_crimson_roots": {}, + "minecraft:potted_dandelion": {}, + "minecraft:potted_dark_oak_sapling": {}, + "minecraft:potted_dead_bush": {}, + "minecraft:potted_fern": {}, + "minecraft:potted_flowering_azalea_bush": {}, + "minecraft:potted_jungle_sapling": {}, + "minecraft:potted_lily_of_the_valley": {}, + "minecraft:potted_mangrove_propagule": {}, + "minecraft:potted_oak_sapling": {}, + "minecraft:potted_open_eyeblossom": {}, + "minecraft:potted_orange_tulip": {}, + "minecraft:potted_oxeye_daisy": {}, + "minecraft:potted_pale_oak_sapling": {}, + "minecraft:potted_pink_tulip": {}, + "minecraft:potted_poppy": {}, + "minecraft:potted_red_mushroom": {}, + "minecraft:potted_red_tulip": {}, + "minecraft:potted_spruce_sapling": {}, + "minecraft:potted_torchflower": {}, + "minecraft:potted_warped_fungus": {}, + "minecraft:potted_warped_roots": {}, + "minecraft:potted_white_tulip": {}, + "minecraft:potted_wither_rose": {}, + "minecraft:powder_snow": {}, + "minecraft:powder_snow_cauldron": { + "level": "1" + }, + "minecraft:powered_rail": { + "powered": "false", + "shape": "north_south", + "waterlogged": "false" + }, + "minecraft:prismarine": {}, + "minecraft:prismarine_brick_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:prismarine_brick_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:prismarine_bricks": {}, + "minecraft:prismarine_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:prismarine_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:prismarine_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:pumpkin": {}, + "minecraft:pumpkin_stem": { + "age": "0" + }, + "minecraft:purple_banner": { + "rotation": "0" + }, + "minecraft:purple_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:purple_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:purple_candle_cake": { + "lit": "false" + }, + "minecraft:purple_carpet": {}, + "minecraft:purple_concrete": {}, + "minecraft:purple_concrete_powder": {}, + "minecraft:purple_glazed_terracotta": { + "facing": "north" + }, + "minecraft:purple_shulker_box": { + "facing": "up" + }, + "minecraft:purple_stained_glass": {}, + "minecraft:purple_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:purple_terracotta": {}, + "minecraft:purple_wall_banner": { + "facing": "north" + }, + "minecraft:purple_wool": {}, + "minecraft:purpur_block": {}, + "minecraft:purpur_pillar": { + "axis": "y" + }, + "minecraft:purpur_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:purpur_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:quartz_block": {}, + "minecraft:quartz_bricks": {}, + "minecraft:quartz_pillar": { + "axis": "y" + }, + "minecraft:quartz_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:quartz_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:rail": { + "rail_shape": "north_south", + "waterlogged": "false" + }, + "minecraft:raw_copper_block": {}, + "minecraft:raw_gold_block": {}, + "minecraft:raw_iron_block": {}, + "minecraft:red_banner": { + "rotation": "0" + }, + "minecraft:red_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:red_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:red_candle_cake": { + "lit": "false" + }, + "minecraft:red_carpet": {}, + "minecraft:red_concrete": {}, + "minecraft:red_concrete_powder": {}, + "minecraft:red_glazed_terracotta": { + "facing": "north" + }, + "minecraft:red_mushroom": {}, + "minecraft:red_mushroom_block": { + "down": "true", + "east": "true", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + }, + "minecraft:red_nether_brick_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:red_nether_brick_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:red_nether_brick_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:red_nether_bricks": {}, + "minecraft:red_sand": {}, + "minecraft:red_sandstone": {}, + "minecraft:red_sandstone_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:red_sandstone_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:red_sandstone_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:red_shulker_box": { + "facing": "up" + }, + "minecraft:red_stained_glass": {}, + "minecraft:red_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:red_terracotta": {}, + "minecraft:red_tulip": {}, + "minecraft:red_wall_banner": { + "facing": "north" + }, + "minecraft:red_wool": {}, + "minecraft:redstone_block": {}, + "minecraft:redstone_lamp": { + "lit": "false" + }, + "minecraft:redstone_ore": { + "lit": "false" + }, + "minecraft:redstone_torch": { + "lit": "true" + }, + "minecraft:redstone_wall_torch": { + "facing": "north", + "lit": "true" + }, + "minecraft:redstone_wire": { + "east_redstone": "none", + "north_redstone": "none", + "power": "0", + "south_redstone": "none", + "west_redstone": "none" + }, + "minecraft:reinforced_deepslate": {}, + "minecraft:repeater": { + "delay": "1", + "facing": "north", + "locked": "false", + "powered": "false" + }, + "minecraft:repeating_command_block": { + "conditional": "false", + "facing": "north" + }, + "minecraft:resin_block": {}, + "minecraft:resin_brick_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:resin_brick_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:resin_brick_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:resin_bricks": {}, + "minecraft:resin_clump": { + "down": "false", + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:respawn_anchor": { + "respawn_anchor_charges": "0" + }, + "minecraft:rooted_dirt": {}, + "minecraft:rose_bush": { + "half": "lower" + }, + "minecraft:sand": {}, + "minecraft:sandstone": {}, + "minecraft:sandstone_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:sandstone_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:sandstone_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:scaffolding": { + "bottom": "false", + "stability_distance": "7", + "waterlogged": "false" + }, + "minecraft:sculk": {}, + "minecraft:sculk_catalyst": { + "bloom": "false" + }, + "minecraft:sculk_sensor": { + "power": "0", + "sculk_sensor_phase": "inactive", + "waterlogged": "false" + }, + "minecraft:sculk_shrieker": { + "can_summon": "false", + "shrieking": "false", + "waterlogged": "false" + }, + "minecraft:sculk_vein": { + "down": "false", + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:sea_lantern": {}, + "minecraft:sea_pickle": { + "pickles": "1", + "waterlogged": "true" + }, + "minecraft:seagrass": {}, + "minecraft:short_dry_grass": {}, + "minecraft:short_grass": {}, + "minecraft:shroomlight": {}, + "minecraft:shulker_box": { + "facing": "up" + }, + "minecraft:skeleton_skull": { + "powered": "false", + "rotation": "0" + }, + "minecraft:skeleton_wall_skull": { + "facing": "north", + "powered": "false" + }, + "minecraft:slime_block": {}, + "minecraft:small_amethyst_bud": { + "facing": "up", + "waterlogged": "false" + }, + "minecraft:small_dripleaf": { + "facing": "north", + "half": "lower", + "waterlogged": "false" + }, + "minecraft:smithing_table": {}, + "minecraft:smoker": { + "facing": "north", + "lit": "false" + }, + "minecraft:smooth_basalt": {}, + "minecraft:smooth_quartz": {}, + "minecraft:smooth_quartz_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:smooth_quartz_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:smooth_red_sandstone": {}, + "minecraft:smooth_red_sandstone_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:smooth_red_sandstone_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:smooth_sandstone": {}, + "minecraft:smooth_sandstone_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:smooth_sandstone_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:smooth_stone": {}, + "minecraft:smooth_stone_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:sniffer_egg": { + "hatch": "0" + }, + "minecraft:snow": { + "layers": "1" + }, + "minecraft:snow_block": {}, + "minecraft:soul_campfire": { + "facing": "north", + "lit": "true", + "signal_fire": "false", + "waterlogged": "false" + }, + "minecraft:soul_fire": {}, + "minecraft:soul_lantern": { + "hanging": "false", + "waterlogged": "false" + }, + "minecraft:soul_sand": {}, + "minecraft:soul_soil": {}, + "minecraft:soul_torch": {}, + "minecraft:soul_wall_torch": { + "facing": "north" + }, + "minecraft:spawner": {}, + "minecraft:sponge": {}, + "minecraft:spore_blossom": {}, + "minecraft:spruce_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:spruce_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:spruce_fence": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:spruce_fence_gate": { + "facing": "north", + "in_wall": "false", + "open": "false", + "powered": "false" + }, + "minecraft:spruce_hanging_sign": { + "attached": "false", + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:spruce_leaves": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + }, + "minecraft:spruce_log": { + "axis": "y" + }, + "minecraft:spruce_planks": {}, + "minecraft:spruce_pressure_plate": { + "powered": "false" + }, + "minecraft:spruce_sapling": { + "stage": "0" + }, + "minecraft:spruce_sign": { + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:spruce_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:spruce_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:spruce_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:spruce_wall_hanging_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:spruce_wall_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:spruce_wood": { + "axis": "y" + }, + "minecraft:sticky_piston": { + "extended": "false", + "facing": "north" + }, + "minecraft:stone": {}, + "minecraft:stone_brick_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:stone_brick_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:stone_brick_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:stone_bricks": {}, + "minecraft:stone_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:stone_pressure_plate": { + "powered": "false" + }, + "minecraft:stone_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:stone_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:stonecutter": { + "facing": "north" + }, + "minecraft:stripped_acacia_log": { + "axis": "y" + }, + "minecraft:stripped_acacia_wood": { + "axis": "y" + }, + "minecraft:stripped_bamboo_block": { + "axis": "y" + }, + "minecraft:stripped_birch_log": { + "axis": "y" + }, + "minecraft:stripped_birch_wood": { + "axis": "y" + }, + "minecraft:stripped_cherry_log": { + "axis": "y" + }, + "minecraft:stripped_cherry_wood": { + "axis": "y" + }, + "minecraft:stripped_crimson_hyphae": { + "axis": "y" + }, + "minecraft:stripped_crimson_stem": { + "axis": "y" + }, + "minecraft:stripped_dark_oak_log": { + "axis": "y" + }, + "minecraft:stripped_dark_oak_wood": { + "axis": "y" + }, + "minecraft:stripped_jungle_log": { + "axis": "y" + }, + "minecraft:stripped_jungle_wood": { + "axis": "y" + }, + "minecraft:stripped_mangrove_log": { + "axis": "y" + }, + "minecraft:stripped_mangrove_wood": { + "axis": "y" + }, + "minecraft:stripped_oak_log": { + "axis": "y" + }, + "minecraft:stripped_oak_wood": { + "axis": "y" + }, + "minecraft:stripped_pale_oak_log": { + "axis": "y" + }, + "minecraft:stripped_pale_oak_wood": { + "axis": "y" + }, + "minecraft:stripped_spruce_log": { + "axis": "y" + }, + "minecraft:stripped_spruce_wood": { + "axis": "y" + }, + "minecraft:stripped_warped_hyphae": { + "axis": "y" + }, + "minecraft:stripped_warped_stem": { + "axis": "y" + }, + "minecraft:structure_block": { + "structureblock_mode": "load" + }, + "minecraft:structure_void": {}, + "minecraft:sugar_cane": { + "age": "0" + }, + "minecraft:sunflower": { + "half": "lower" + }, + "minecraft:suspicious_gravel": { + "dusted": "0" + }, + "minecraft:suspicious_sand": { + "dusted": "0" + }, + "minecraft:sweet_berry_bush": { + "age_3": "0" + }, + "minecraft:tall_dry_grass": {}, + "minecraft:tall_grass": { + "half": "lower" + }, + "minecraft:tall_seagrass": { + "half": "lower" + }, + "minecraft:target": { + "power": "0" + }, + "minecraft:terracotta": {}, + "minecraft:test_block": { + "test_block_mode": "start" + }, + "minecraft:test_instance_block": {}, + "minecraft:tinted_glass": {}, + "minecraft:tnt": { + "unstable": "false" + }, + "minecraft:torch": {}, + "minecraft:torchflower": {}, + "minecraft:torchflower_crop": { + "age_1": "0" + }, + "minecraft:trapped_chest": { + "chest_type": "single", + "facing": "north", + "waterlogged": "false" + }, + "minecraft:trial_spawner": { + "ominous": "false", + "trial_spawner_state": "inactive" + }, + "minecraft:tripwire": { + "attached": "false", + "disarmed": "false", + "east": "false", + "north": "false", + "powered": "false", + "south": "false", + "west": "false" + }, + "minecraft:tripwire_hook": { + "attached": "false", + "facing": "north", + "powered": "false" + }, + "minecraft:tube_coral": { + "waterlogged": "true" + }, + "minecraft:tube_coral_block": {}, + "minecraft:tube_coral_fan": { + "waterlogged": "true" + }, + "minecraft:tube_coral_wall_fan": { + "facing": "north", + "waterlogged": "true" + }, + "minecraft:tuff": {}, + "minecraft:tuff_brick_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:tuff_brick_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:tuff_brick_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:tuff_bricks": {}, + "minecraft:tuff_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:tuff_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:tuff_wall": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + }, + "minecraft:turtle_egg": { + "eggs": "1", + "hatch": "0" + }, + "minecraft:twisting_vines": { + "age": "0" + }, + "minecraft:twisting_vines_plant": {}, + "minecraft:vault": { + "facing": "north", + "ominous": "false", + "vault_state": "inactive" + }, + "minecraft:verdant_froglight": { + "axis": "y" + }, + "minecraft:vine": { + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + }, + "minecraft:void_air": {}, + "minecraft:wall_torch": { + "facing": "north" + }, + "minecraft:warped_button": { + "face": "wall", + "facing": "north", + "powered": "false" + }, + "minecraft:warped_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:warped_fence": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:warped_fence_gate": { + "facing": "north", + "in_wall": "false", + "open": "false", + "powered": "false" + }, + "minecraft:warped_fungus": {}, + "minecraft:warped_hanging_sign": { + "attached": "false", + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:warped_hyphae": { + "axis": "y" + }, + "minecraft:warped_nylium": {}, + "minecraft:warped_planks": {}, + "minecraft:warped_pressure_plate": { + "powered": "false" + }, + "minecraft:warped_roots": {}, + "minecraft:warped_sign": { + "rotation": "0", + "waterlogged": "false" + }, + "minecraft:warped_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:warped_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:warped_stem": { + "axis": "y" + }, + "minecraft:warped_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:warped_wall_hanging_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:warped_wall_sign": { + "facing": "north", + "waterlogged": "false" + }, + "minecraft:warped_wart_block": {}, + "minecraft:water": { + "level": "0" + }, + "minecraft:water_cauldron": { + "level": "1" + }, + "minecraft:waxed_chiseled_copper": {}, + "minecraft:waxed_copper_block": {}, + "minecraft:waxed_copper_bulb": { + "lit": "false", + "powered": "false" + }, + "minecraft:waxed_copper_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:waxed_copper_grate": { + "waterlogged": "false" + }, + "minecraft:waxed_copper_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:waxed_cut_copper": {}, + "minecraft:waxed_cut_copper_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:waxed_cut_copper_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:waxed_exposed_chiseled_copper": {}, + "minecraft:waxed_exposed_copper": {}, + "minecraft:waxed_exposed_copper_bulb": { + "lit": "false", + "powered": "false" + }, + "minecraft:waxed_exposed_copper_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:waxed_exposed_copper_grate": { + "waterlogged": "false" + }, + "minecraft:waxed_exposed_copper_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:waxed_exposed_cut_copper": {}, + "minecraft:waxed_exposed_cut_copper_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:waxed_exposed_cut_copper_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:waxed_oxidized_chiseled_copper": {}, + "minecraft:waxed_oxidized_copper": {}, + "minecraft:waxed_oxidized_copper_bulb": { + "lit": "false", + "powered": "false" + }, + "minecraft:waxed_oxidized_copper_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:waxed_oxidized_copper_grate": { + "waterlogged": "false" + }, + "minecraft:waxed_oxidized_copper_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:waxed_oxidized_cut_copper": {}, + "minecraft:waxed_oxidized_cut_copper_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:waxed_oxidized_cut_copper_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:waxed_weathered_chiseled_copper": {}, + "minecraft:waxed_weathered_copper": {}, + "minecraft:waxed_weathered_copper_bulb": { + "lit": "false", + "powered": "false" + }, + "minecraft:waxed_weathered_copper_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:waxed_weathered_copper_grate": { + "waterlogged": "false" + }, + "minecraft:waxed_weathered_copper_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:waxed_weathered_cut_copper": {}, + "minecraft:waxed_weathered_cut_copper_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:waxed_weathered_cut_copper_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:weathered_chiseled_copper": {}, + "minecraft:weathered_copper": {}, + "minecraft:weathered_copper_bulb": { + "lit": "false", + "powered": "false" + }, + "minecraft:weathered_copper_door": { + "facing": "north", + "half": "lower", + "hinge": "left", + "open": "false", + "powered": "false" + }, + "minecraft:weathered_copper_grate": { + "waterlogged": "false" + }, + "minecraft:weathered_copper_trapdoor": { + "facing": "north", + "half": "bottom", + "open": "false", + "powered": "false", + "waterlogged": "false" + }, + "minecraft:weathered_cut_copper": {}, + "minecraft:weathered_cut_copper_slab": { + "type": "bottom", + "waterlogged": "false" + }, + "minecraft:weathered_cut_copper_stairs": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + }, + "minecraft:weeping_vines": { + "age": "0" + }, + "minecraft:weeping_vines_plant": {}, + "minecraft:wet_sponge": {}, + "minecraft:wheat": { + "age": "0" + }, + "minecraft:white_banner": { + "rotation": "0" + }, + "minecraft:white_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:white_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:white_candle_cake": { + "lit": "false" + }, + "minecraft:white_carpet": {}, + "minecraft:white_concrete": {}, + "minecraft:white_concrete_powder": {}, + "minecraft:white_glazed_terracotta": { + "facing": "north" + }, + "minecraft:white_shulker_box": { + "facing": "up" + }, + "minecraft:white_stained_glass": {}, + "minecraft:white_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:white_terracotta": {}, + "minecraft:white_tulip": {}, + "minecraft:white_wall_banner": { + "facing": "north" + }, + "minecraft:white_wool": {}, + "minecraft:wildflowers": { + "facing": "north", + "flower_amount": "1" + }, + "minecraft:wither_rose": {}, + "minecraft:wither_skeleton_skull": { + "powered": "false", + "rotation": "0" + }, + "minecraft:wither_skeleton_wall_skull": { + "facing": "north", + "powered": "false" + }, + "minecraft:yellow_banner": { + "rotation": "0" + }, + "minecraft:yellow_bed": { + "facing": "north", + "occupied": "false", + "part": "foot" + }, + "minecraft:yellow_candle": { + "candles": "1", + "lit": "false", + "waterlogged": "false" + }, + "minecraft:yellow_candle_cake": { + "lit": "false" + }, + "minecraft:yellow_carpet": {}, + "minecraft:yellow_concrete": {}, + "minecraft:yellow_concrete_powder": {}, + "minecraft:yellow_glazed_terracotta": { + "facing": "north" + }, + "minecraft:yellow_shulker_box": { + "facing": "up" + }, + "minecraft:yellow_stained_glass": {}, + "minecraft:yellow_stained_glass_pane": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + }, + "minecraft:yellow_terracotta": {}, + "minecraft:yellow_wall_banner": { + "facing": "north" + }, + "minecraft:yellow_wool": {}, + "minecraft:zombie_head": { + "powered": "false", + "rotation": "0" + }, + "minecraft:zombie_wall_head": { + "facing": "north", + "powered": "false" + } +} \ No newline at end of file diff --git a/platforms/allay/src/main/resources/plugin.json b/platforms/allay/src/main/resources/plugin.json new file mode 100644 index 000000000..fd1420e7d --- /dev/null +++ b/platforms/allay/src/main/resources/plugin.json @@ -0,0 +1,18 @@ +{ + "entrance": "com.dfsek.terra.allay.TerraAllayPlugin", + "name": "Terra", + "authors": [ + "daoge_cmd", + "IWareQ", + "dfsek", + "duplexsystem", + "Astrash", + "solonovamax", + "Sancires", + "Aureus", + "RogueShade" + ], + "version": "@VERSION@", + "description": "@DESCRIPTION@", + "website": "@WIKI@" +} \ No newline at end of file diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 08a75dc12..8af6d00c3 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -4,7 +4,7 @@ plugins { dependencies { shaded(project(":platforms:bukkit:common")) - shaded(project(":platforms:bukkit:nms:v1_21", configuration = "reobf")) + shaded(project(":platforms:bukkit:nms:v1_21_3", configuration = "reobf")) shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } diff --git a/platforms/bukkit/common/build.gradle.kts b/platforms/bukkit/common/build.gradle.kts index eaf1956cb..fb3b1cc8f 100644 --- a/platforms/bukkit/common/build.gradle.kts +++ b/platforms/bukkit/common/build.gradle.kts @@ -11,5 +11,5 @@ dependencies { shadedApi("com.google.guava", "guava", Versions.Libraries.Internal.guava) - shadedApi("org.incendo", "cloud-paper", Versions.Libraries.cloudPaper) + shadedApi("org.incendo", "cloud-paper", Versions.Bukkit.cloud) } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java index c8a59100d..1fba7bda8 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java @@ -4,18 +4,15 @@ 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.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.bukkit.config.PreLoadCompatibilityOptions; -import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; public class BukkitAddon implements BaseAddon { private static final Version VERSION = Versions.getVersion(1, 0, 0); - private final PlatformImpl terraBukkitPlugin; + protected final PlatformImpl terraBukkitPlugin; public BukkitAddon(PlatformImpl terraBukkitPlugin) { this.terraBukkitPlugin = terraBukkitPlugin; @@ -28,16 +25,6 @@ public class BukkitAddon implements BaseAddon { .register(this, ConfigPackPreLoadEvent.class) .then(event -> event.getPack().getContext().put(event.loadTemplate(new PreLoadCompatibilityOptions()))) .global(); - - terraBukkitPlugin.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 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..5306bc3e3 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 @@ -21,7 +21,7 @@ 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.seismic.type.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..2b90e73d8 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 @@ -21,7 +21,7 @@ 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.seismic.type.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/PlatformImpl.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java index 45a82c5cb..c2895fd5e 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,6 +20,9 @@ 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 com.dfsek.terra.bukkit.nms.Initializer; + import org.bukkit.Bukkit; import org.bukkit.entity.EntityType; import org.jetbrains.annotations.NotNull; @@ -51,7 +54,13 @@ public class PlatformImpl extends AbstractPlatform { private final TerraBukkitPlugin plugin; + private int generationThreads; + public PlatformImpl(TerraBukkitPlugin plugin) { + generationThreads = getGenerationThreadsWithReflection("ca.spottedleaf.moonrise.common.util.MoonriseCommon", "WORKER_THREADS", "Moonrise"); + if (generationThreads == 0) { + generationThreads = 1; + } this.plugin = plugin; load(); } @@ -63,8 +72,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) { @@ -90,7 +98,7 @@ public class PlatformImpl extends AbstractPlatform { @Override protected Iterable platformAddon() { - return List.of(new BukkitAddon(this)); + return List.of(Initializer.nmsAddon(this)); } @Override @@ -108,6 +116,11 @@ public class PlatformImpl extends AbstractPlatform { return itemHandle; } + @Override + public int getGenerationThreads() { + return generationThreads; + } + @Override public void register(TypeRegistry registry) { super.register(registry); 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 e3bc1d837..1ebd8de52 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 @@ -194,7 +194,7 @@ public class TerraBukkitPlugin extends JavaPlugin { @Override public @Nullable ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, String id) { - if(id == null || id.trim().equals("")) { return null; } + if(id == null || id.trim().isEmpty()) { return null; } return new BukkitChunkGeneratorWrapper(generatorMap.computeIfAbsent(worldName, name -> { ConfigPack pack = platform.getConfigRegistry().getByID(id).orElseThrow( () -> new IllegalArgumentException("No such config pack \"" + id + "\"")); diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/config/VanillaBiomeProperties.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/config/VanillaBiomeProperties.java deleted file mode 100644 index 628f329d5..000000000 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/config/VanillaBiomeProperties.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.dfsek.terra.bukkit.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; - - -public class VanillaBiomeProperties implements ConfigTemplate, Properties { - @Value("colors.grass") - @Default - private Integer grassColor = null; - - @Value("colors.fog") - @Default - private Integer fogColor = null; - - @Value("colors.water") - @Default - private Integer waterColor = null; - - @Value("colors.water-fog") - @Default - private Integer waterFogColor = null; - - @Value("colors.foliage") - @Default - private Integer foliageColor = null; - - @Value("colors.sky") - @Default - private Integer skyColor = null; - - public Integer getFogColor() { - return fogColor; - } - - public Integer getFoliageColor() { - return foliageColor; - } - - public Integer getGrassColor() { - return grassColor; - } - - public Integer getWaterColor() { - return waterColor; - } - - public Integer getWaterFogColor() { - return waterFogColor; - } - - public Integer getSkyColor() { - return skyColor; - } -} 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/nms/Initializer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java index fc28e4bc3..b3452714d 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,5 +1,7 @@ package com.dfsek.terra.bukkit.nms; +import com.dfsek.terra.bukkit.BukkitAddon; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,20 +15,11 @@ public interface Initializer { static boolean init(PlatformImpl platform) { Logger logger = LoggerFactory.getLogger(Initializer.class); - try { - String packageVersion = NMS; - if(NMS.equals("v1_21_1")) { - packageVersion = "v1_21"; - } - Class initializerClass = Class.forName(TERRA_PACKAGE + "." + packageVersion + ".NMSInitializer"); - try { - Initializer initializer = (Initializer) initializerClass.getConstructor().newInstance(); - initializer.initialize(platform); - } catch(ReflectiveOperationException e) { - throw new RuntimeException("Error initializing NMS bindings. Report this to Terra.", e); - } - } catch(ClassNotFoundException e) { + Initializer initializer = constructInitializer(); + if(initializer != null) { + initializer.initialize(platform); + } else { 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"; @@ -49,8 +42,34 @@ public interface Initializer { logger.error("Since you enabled the \"{}\" flag, we won't disable Terra. But be warned.", bypassKey); } } + return true; } + static BukkitAddon nmsAddon(PlatformImpl platform) { + Initializer initializer = constructInitializer(); + return initializer != null ? initializer.getNMSAddon(platform) : new BukkitAddon(platform); + } + + private static Initializer constructInitializer() { + try { + String packageVersion = NMS; + if (NMS.equals("v1_21_4")) { + packageVersion = "v1_21_3"; + } + + Class initializerClass = Class.forName(TERRA_PACKAGE + "." + packageVersion + ".NMSInitializer"); + try { + return (Initializer) initializerClass.getConstructor().newInstance(); + } catch(ReflectiveOperationException e) { + throw new RuntimeException("Error initializing NMS bindings. Report this to Terra.", e); + } + } catch(ClassNotFoundException e) { + return null; + } + } + void initialize(PlatformImpl plugin); + + BukkitAddon getNMSAddon(PlatformImpl plugin); } 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..fcc244504 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 @@ -34,7 +34,7 @@ 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.seismic.type.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; 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..080b57146 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 @@ -23,7 +23,7 @@ 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.seismic.type.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/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInjector.java deleted file mode 100644 index e6d1f7869..000000000 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInjector.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_21; - -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSpecialEffects; - -import java.util.Locale; -import java.util.Objects; -import java.util.Optional; - -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; - - -public class NMSBiomeInjector { - - public static Optional> getEntry(Registry registry, ResourceLocation identifier) { - return registry.getOptional(identifier) - .flatMap(registry::getResourceKey) - .flatMap(registry::getHolder); - } - - public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) - throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { - Biome.BiomeBuilder builder = new Biome.BiomeBuilder(); - - builder - .downfall(vanilla.climateSettings.downfall()) - .temperature(vanilla.getBaseTemperature()) - .mobSpawnSettings(vanilla.getMobSettings()) - .generationSettings(vanilla.getGenerationSettings()); - - - BiomeSpecialEffects.Builder effects = new BiomeSpecialEffects.Builder(); - - effects.grassColorModifier(vanilla.getSpecialEffects().getGrassColorModifier()); - - VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); - - effects.fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor())) - - .waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor())) - - .waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor())) - - .skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor())); - - if(vanillaBiomeProperties.getFoliageColor() == null) { - vanilla.getSpecialEffects().getFoliageColorOverride().ifPresent(effects::foliageColorOverride); - } else { - effects.foliageColorOverride(vanillaBiomeProperties.getFoliageColor()); - } - - if(vanillaBiomeProperties.getGrassColor() == null) { - vanilla.getSpecialEffects().getGrassColorOverride().ifPresent(effects::grassColorOverride); - } else { - // grass - effects.grassColorOverride(vanillaBiomeProperties.getGrassColor()); - } - - vanilla.getAmbientLoop().ifPresent(effects::ambientLoopSound); - vanilla.getAmbientAdditions().ifPresent(effects::ambientAdditionsSound); - vanilla.getAmbientMood().ifPresent(effects::ambientMoodSound); - vanilla.getBackgroundMusic().ifPresent(effects::backgroundMusic); - vanilla.getAmbientParticle().ifPresent(effects::ambientParticle); - - builder.specialEffects(effects.build()); - - return builder.build(); - } - - public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) { - return pack.getID() - .toLowerCase() + "/" + biomeID.getNamespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); - } -} diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java deleted file mode 100644 index a6f4ea9ba..000000000 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_21; - -import net.minecraft.core.Holder; -import net.minecraft.core.Holder.Reference; -import net.minecraft.core.MappedRegistry; -import net.minecraft.server.level.ChunkMap; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.StructureManager; -import net.minecraft.world.level.chunk.status.WorldGenContext; -import xyz.jpenilla.reflectionremapper.ReflectionRemapper; -import xyz.jpenilla.reflectionremapper.proxy.ReflectionProxyFactory; -import xyz.jpenilla.reflectionremapper.proxy.annotation.FieldGetter; -import xyz.jpenilla.reflectionremapper.proxy.annotation.FieldSetter; -import xyz.jpenilla.reflectionremapper.proxy.annotation.MethodName; -import xyz.jpenilla.reflectionremapper.proxy.annotation.Proxies; - - -public class Reflection { - public static final MappedRegistryProxy MAPPED_REGISTRY; - public static final StructureManagerProxy STRUCTURE_MANAGER; - - public static final ReferenceProxy REFERENCE; - - public static final ChunkMapProxy CHUNKMAP; - - static { - ReflectionRemapper reflectionRemapper = ReflectionRemapper.forReobfMappingsInPaperJar(); - ReflectionProxyFactory reflectionProxyFactory = ReflectionProxyFactory.create(reflectionRemapper, - Reflection.class.getClassLoader()); - - MAPPED_REGISTRY = reflectionProxyFactory.reflectionProxy(MappedRegistryProxy.class); - STRUCTURE_MANAGER = reflectionProxyFactory.reflectionProxy(StructureManagerProxy.class); - REFERENCE = reflectionProxyFactory.reflectionProxy(ReferenceProxy.class); - CHUNKMAP = reflectionProxyFactory.reflectionProxy(ChunkMapProxy.class); - } - - - @Proxies(MappedRegistry.class) - public interface MappedRegistryProxy { - @FieldSetter("frozen") - void setFrozen(MappedRegistry instance, boolean frozen); - } - - - @Proxies(StructureManager.class) - public interface StructureManagerProxy { - @FieldGetter("level") - LevelAccessor getLevel(StructureManager instance); - } - - - @Proxies(Holder.Reference.class) - public interface ReferenceProxy { - @MethodName("bindValue") - void invokeBindValue(Reference instance, T value); - } - - @Proxies(ChunkMap.class) - public interface ChunkMapProxy { - @FieldSetter("worldGenContext") - void setWorldGenContext(ChunkMap instance, WorldGenContext worldGenContext); - } -} diff --git a/platforms/bukkit/nms/v1_21/build.gradle.kts b/platforms/bukkit/nms/v1_21_3/build.gradle.kts similarity index 65% rename from platforms/bukkit/nms/v1_21/build.gradle.kts rename to platforms/bukkit/nms/v1_21_3/build.gradle.kts index d52f1d169..31cad053a 100644 --- a/platforms/bukkit/nms/v1_21/build.gradle.kts +++ b/platforms/bukkit/nms/v1_21_3/build.gradle.kts @@ -1,8 +1,10 @@ -apply(plugin = "io.papermc.paperweight.userdev") +plugins { + id("io.papermc.paperweight.userdev") +} dependencies { api(project(":platforms:bukkit:common")) - paperDevBundle(Versions.Bukkit.paperDevBundle) + paperweight.paperDevBundle(Versions.Bukkit.paperDevBundle) implementation("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/AwfulBukkitHacks.java similarity index 55% rename from platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java rename to platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/AwfulBukkitHacks.java index 42d683394..c98037f07 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/AwfulBukkitHacks.java @@ -1,11 +1,13 @@ -package com.dfsek.terra.bukkit.nms.v1_21; +package com.dfsek.terra.bukkit.nms.v1_21_3; + +import com.dfsek.terra.bukkit.nms.v1_21_3.config.VanillaBiomeProperties; -import com.google.common.collect.ImmutableMap; import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; +import net.minecraft.core.HolderSet; +import net.minecraft.core.HolderSet.Named; import net.minecraft.core.MappedRegistry; import net.minecraft.core.RegistrationInfo; -import net.minecraft.core.WritableRegistry; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -17,9 +19,11 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.HashMap; +import java.util.IdentityHashMap; import java.util.List; import java.util.Map; -import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; import com.dfsek.terra.registry.master.ConfigRegistry; @@ -33,17 +37,22 @@ public class AwfulBukkitHacks { public static void registerBiomes(ConfigRegistry configRegistry) { try { LOGGER.info("Hacking biome registry..."); - WritableRegistry biomeRegistry = (WritableRegistry) RegistryFetcher.biomeRegistry(); + MappedRegistry biomeRegistry = (MappedRegistry) RegistryFetcher.biomeRegistry(); - Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, false); + // Unfreeze the biome registry to allow modification + Reflection.MAPPED_REGISTRY.setFrozen(biomeRegistry, false); + // Register the terra biomes to the registry configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> { try { BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome(); NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey(); ResourceLocation vanillaMinecraftKey = ResourceLocation.fromNamespaceAndPath(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); - Biome platform = NMSBiomeInjector.createBiome(biome, Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey))); + + VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); + + Biome platform = NMSBiomeInjector.createBiome(biomeRegistry.get(vanillaMinecraftKey).orElseThrow().value(), vanillaBiomeProperties); ResourceKey delegateKey = ResourceKey.create( Registries.BIOME, @@ -63,14 +72,14 @@ public class AwfulBukkitHacks { } })); - Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, true); // freeze registry again :) + Reflection.MAPPED_REGISTRY.setFrozen(biomeRegistry, true); // freeze registry again :) LOGGER.info("Doing tag garbage...."); Map, List>> collect = biomeRegistry .getTags() // streamKeysAndEntries .collect(HashMap::new, (map, pair) -> - map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())), + map.put(pair.key(), new ArrayList<>(Reflection.HOLDER_SET.invokeContents(pair).stream().toList())), HashMap::putAll); terraBiomeMap @@ -91,12 +100,51 @@ public class AwfulBukkitHacks { () -> LOGGER.error("No such biome: {}", tb))), () -> LOGGER.error("No vanilla biome: {}", vb))); - biomeRegistry.resetTags(); - biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); + resetTags(biomeRegistry); + bindTags(biomeRegistry, collect); } catch(SecurityException | IllegalArgumentException exception) { throw new RuntimeException(exception); } } + + private static void bindTags(MappedRegistry registry, Map, List>> tagEntries) { + 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); +// } + + 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(", ")) +// ); +// } + + 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)); + 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())); + } } diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSAddon.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSAddon.java new file mode 100644 index 000000000..539b7f97b --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSAddon.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3; + +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_3.config.VanillaBiomeProperties; + + +public class NMSAddon extends BukkitAddon { + + public NMSAddon(PlatformImpl platform) { + super(platform); + } + + @Override + public void initialize() { + super.initialize(); + + terraBukkitPlugin.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(); + } +} diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSBiomeInfo.java similarity index 83% rename from platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInfo.java rename to platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSBiomeInfo.java index 5bf85aa6d..de6e7a3ff 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInfo.java +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSBiomeInfo.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21; +package com.dfsek.terra.bukkit.nms.v1_21_3; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSBiomeInjector.java new file mode 100644 index 000000000..691790be1 --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSBiomeInjector.java @@ -0,0 +1,102 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3; + +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeGenerationSettings; +import net.minecraft.world.level.biome.BiomeSpecialEffects; + +import java.util.Locale; +import java.util.Objects; +import java.util.Optional; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.bukkit.nms.v1_21_3.config.VanillaBiomeProperties; + + +public class NMSBiomeInjector { + + public static Optional> getEntry(Registry registry, ResourceLocation identifier) { + return registry.getOptional(identifier) + .flatMap(registry::getResourceKey) + .flatMap(registry::get); + } + + public static Biome createBiome(Biome vanilla, VanillaBiomeProperties vanillaBiomeProperties) + throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { + Biome.BiomeBuilder builder = new Biome.BiomeBuilder(); + + BiomeSpecialEffects.Builder effects = new BiomeSpecialEffects.Builder(); + + effects.fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor())) + .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())); +// .grassColorOverride(Objects.requireNonNullElse(vanillaBiomeProperties.getGrassColor(), vanilla.getSpecialEffects().getGrassColorOverride().orElseGet(() -> Reflection.BIOME.invokeGrassColorFromTexture(vanilla)))) +// .foliageColorOverride(Objects.requireNonNullElse(vanillaBiomeProperties.getFoliageColor(), vanilla.getFoliageColor())); + + if(vanillaBiomeProperties.getGrassColor() == null) { + vanilla.getSpecialEffects().getGrassColorOverride().ifPresent(effects::grassColorOverride); + } else { + effects.grassColorOverride(vanillaBiomeProperties.getGrassColor()); + } + + if(vanillaBiomeProperties.getFoliageColor() == null) { + vanilla.getSpecialEffects().getFoliageColorOverride().ifPresent(effects::foliageColorOverride); + } else { + effects.foliageColorOverride(vanillaBiomeProperties.getFoliageColor()); + } + + if(vanillaBiomeProperties.getParticleConfig() == null) { + vanilla.getSpecialEffects().getAmbientParticleSettings().ifPresent(effects::ambientParticle); + } else { + effects.ambientParticle(vanillaBiomeProperties.getParticleConfig()); + } + + if(vanillaBiomeProperties.getLoopSound() == null) { + vanilla.getSpecialEffects().getAmbientLoopSoundEvent().ifPresent(effects::ambientLoopSound); + } else { + RegistryFetcher.soundEventRegistry().get(vanillaBiomeProperties.getLoopSound().location()).ifPresent(effects::ambientLoopSound); + } + + if(vanillaBiomeProperties.getMoodSound() == null) { + vanilla.getSpecialEffects().getAmbientMoodSettings().ifPresent(effects::ambientMoodSound); + } else { + effects.ambientMoodSound(vanillaBiomeProperties.getMoodSound()); + } + + if(vanillaBiomeProperties.getAdditionsSound() == null) { + vanilla.getSpecialEffects().getAmbientAdditionsSettings().ifPresent(effects::ambientAdditionsSound); + } else { + effects.ambientAdditionsSound(vanillaBiomeProperties.getAdditionsSound()); + } + + if(vanillaBiomeProperties.getMusic() == null) { + vanilla.getSpecialEffects().getBackgroundMusic().ifPresent(effects::backgroundMusic); + } else { + effects.backgroundMusic(vanillaBiomeProperties.getMusic()); + } + + builder.hasPrecipitation(Objects.requireNonNullElse(vanillaBiomeProperties.getPrecipitation(), vanilla.hasPrecipitation())); + + builder.temperature(Objects.requireNonNullElse(vanillaBiomeProperties.getTemperature(), vanilla.getBaseTemperature())); + + builder.downfall(Objects.requireNonNullElse(vanillaBiomeProperties.getDownfall(), vanilla.climateSettings.downfall())); + + builder.temperatureAdjustment(Objects.requireNonNullElse(vanillaBiomeProperties.getTemperatureModifier(), vanilla.climateSettings.temperatureModifier())); + + builder.mobSpawnSettings(Objects.requireNonNullElse(vanillaBiomeProperties.getSpawnSettings(), vanilla.getMobSettings())); + + return builder + .specialEffects(effects.build()) + .generationSettings(new BiomeGenerationSettings.PlainBuilder().build()) + .build(); + } + + public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) { + return pack.getID() + .toLowerCase() + "/" + biomeID.getNamespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); + } +} diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSBiomeProvider.java similarity index 87% rename from platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java rename to platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSBiomeProvider.java index 8abe26a51..9cb08b61a 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSBiomeProvider.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21; +package com.dfsek.terra.bukkit.nms.v1_21_3; import com.mojang.serialization.MapCodec; import net.minecraft.core.Holder; @@ -29,7 +29,7 @@ public class NMSBiomeProvider extends BiomeSource { protected Stream> collectPossibleBiomes() { return delegate.stream() .map(biome -> RegistryFetcher.biomeRegistry() - .getHolderOrThrow(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() + .getOrThrow(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() .get(NMSBiomeInfo.class) .biomeKey())); } @@ -45,7 +45,7 @@ public class NMSBiomeProvider extends BiomeSource { @Override public @NotNull Holder getNoiseBiome(int x, int y, int z, @NotNull Sampler sampler) { - return biomeRegistry.getHolderOrThrow(((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed) + return biomeRegistry.getOrThrow(((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed) .getPlatformBiome()).getContext() .get(NMSBiomeInfo.class) .biomeKey()); diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSChunkGeneratorDelegate.java similarity index 96% rename from platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSChunkGeneratorDelegate.java rename to platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSChunkGeneratorDelegate.java index 16097df27..a8a8d21d1 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSChunkGeneratorDelegate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21; +package com.dfsek.terra.bukkit.nms.v1_21_3; import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; @@ -15,7 +15,6 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Beardifier; import net.minecraft.world.level.levelgen.DensityFunction.SinglePointContext; -import net.minecraft.world.level.levelgen.GenerationStep.Carving; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.RandomState; import net.minecraft.world.level.levelgen.blending.Blender; @@ -59,7 +58,7 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { @Override public void applyCarvers(@NotNull WorldGenRegion chunkRegion, long seed, @NotNull RandomState noiseConfig, @NotNull BiomeManager world, - @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk, @NotNull Carving carverStep) { + @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk) { // no-op } @@ -156,7 +155,7 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { BlockState[] array = new BlockState[world.getHeight()]; WorldProperties properties = new NMSWorldProperties(seed, world); BiomeProvider biomeProvider = pack.getBiomeProvider(); - for(int y = properties.getMaxHeight() - 1; y >= properties.getMinHeight(); y--) { + for(int y = properties.getMaxHeight(); y >= properties.getMinHeight(); y--) { array[y - properties.getMinHeight()] = ((CraftBlockData) delegate.getBlock(properties, x, y, z, biomeProvider) .getHandle()).getState(); } diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInitializer.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSInitializer.java similarity index 67% rename from platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInitializer.java rename to platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSInitializer.java index 18f1a058f..2ee41e82a 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInitializer.java +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSInitializer.java @@ -1,4 +1,6 @@ -package com.dfsek.terra.bukkit.nms.v1_21; +package com.dfsek.terra.bukkit.nms.v1_21_3; + +import com.dfsek.terra.bukkit.BukkitAddon; import org.bukkit.Bukkit; @@ -12,4 +14,9 @@ public class NMSInitializer implements Initializer { AwfulBukkitHacks.registerBiomes(platform.getRawConfigRegistry()); Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin()); } + + @Override + public BukkitAddon getNMSAddon(PlatformImpl plugin) { + return new NMSAddon(plugin); + } } diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSInjectListener.java similarity index 90% rename from platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java rename to platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSInjectListener.java index a25638594..95b041552 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSInjectListener.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21; +package com.dfsek.terra.bukkit.nms.v1_21_3; import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ServerLevel; @@ -17,7 +17,6 @@ import java.util.Set; import java.util.concurrent.locks.ReentrantLock; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.util.reflection.ReflectionUtil; import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; @@ -41,13 +40,14 @@ public class NMSInjectListener implements Listener { ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator(); NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed()); ChunkMap chunkMap = serverWorld.getChunkSource().chunkMap; - WorldGenContext worldGenContext = chunkMap.worldGenContext; + WorldGenContext worldGenContext = Reflection.CHUNKMAP.getWorldGenContext(chunkMap); Reflection.CHUNKMAP.setWorldGenContext(chunkMap, new WorldGenContext( worldGenContext.level(), new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()), worldGenContext.structureManager(), worldGenContext.lightEngine(), - worldGenContext.mainThreadMailBox() + worldGenContext.mainThreadExecutor(), + worldGenContext.unsavedListener() )); LOGGER.info("Successfully injected into world."); diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSWorldProperties.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSWorldProperties.java similarity index 83% rename from platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSWorldProperties.java rename to platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSWorldProperties.java index 7860cf530..0626c4e3d 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSWorldProperties.java +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/NMSWorldProperties.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_21; +package com.dfsek.terra.bukkit.nms.v1_21_3; import net.minecraft.world.level.LevelHeightAccessor; @@ -26,11 +26,11 @@ public class NMSWorldProperties implements WorldProperties { @Override public int getMaxHeight() { - return height.getMaxBuildHeight(); + return height.getMaxY(); } @Override public int getMinHeight() { - return height.getMinBuildHeight(); + return height.getMinY(); } } diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/Reflection.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/Reflection.java new file mode 100644 index 000000000..8be29690c --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/Reflection.java @@ -0,0 +1,124 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3; + +import net.minecraft.core.Holder; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.HolderSet; +import net.minecraft.core.MappedRegistry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ChunkMap; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.status.WorldGenContext; +import xyz.jpenilla.reflectionremapper.ReflectionRemapper; +import xyz.jpenilla.reflectionremapper.proxy.ReflectionProxyFactory; +import xyz.jpenilla.reflectionremapper.proxy.annotation.FieldGetter; +import xyz.jpenilla.reflectionremapper.proxy.annotation.FieldSetter; +import xyz.jpenilla.reflectionremapper.proxy.annotation.MethodName; +import xyz.jpenilla.reflectionremapper.proxy.annotation.Proxies; +import xyz.jpenilla.reflectionremapper.proxy.annotation.Static; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + + +public class Reflection { + public static final MappedRegistryProxy MAPPED_REGISTRY; + public static final MappedRegistryTagSetProxy MAPPED_REGISTRY_TAG_SET; + public static final StructureManagerProxy STRUCTURE_MANAGER; + + public static final ReferenceProxy REFERENCE; + + + public static final ChunkMapProxy CHUNKMAP; + public static final HolderReferenceProxy HOLDER_REFERENCE; + public static final HolderSetNamedProxy HOLDER_SET; + public static final BiomeProxy BIOME; + + static { + ReflectionRemapper reflectionRemapper = ReflectionRemapper.forReobfMappingsInPaperJar(); + ReflectionProxyFactory reflectionProxyFactory = ReflectionProxyFactory.create(reflectionRemapper, + Reflection.class.getClassLoader()); + + MAPPED_REGISTRY = reflectionProxyFactory.reflectionProxy(MappedRegistryProxy.class); + MAPPED_REGISTRY_TAG_SET = reflectionProxyFactory.reflectionProxy(MappedRegistryTagSetProxy.class); + STRUCTURE_MANAGER = reflectionProxyFactory.reflectionProxy(StructureManagerProxy.class); + REFERENCE = reflectionProxyFactory.reflectionProxy(ReferenceProxy.class); + CHUNKMAP = reflectionProxyFactory.reflectionProxy(ChunkMapProxy.class); + HOLDER_REFERENCE = reflectionProxyFactory.reflectionProxy(HolderReferenceProxy.class); + HOLDER_SET = reflectionProxyFactory.reflectionProxy(HolderSetNamedProxy.class); + BIOME = reflectionProxyFactory.reflectionProxy(BiomeProxy.class); + } + + + @Proxies(MappedRegistry.class) + public interface MappedRegistryProxy { + @FieldGetter("byKey") + Map, Reference> getByKey(MappedRegistry instance); + + @FieldSetter("allTags") + void setAllTags(MappedRegistry instance, Object obj); + + @FieldSetter("frozen") + void setFrozen(MappedRegistry instance, boolean frozen); + + @MethodName("createTag") + HolderSet.Named invokeCreateTag(MappedRegistry instance, TagKey tag); + } + + @Proxies(className = "net.minecraft.core.MappedRegistry$TagSet") + public interface MappedRegistryTagSetProxy { + @MethodName("fromMap") + @Static + Object invokeFromMap(Map, HolderSet.Named> map); + } + + + @Proxies(StructureManager.class) + public interface StructureManagerProxy { + @FieldGetter("level") + LevelAccessor getLevel(StructureManager instance); + } + + + @Proxies(Holder.Reference.class) + public interface ReferenceProxy { + @MethodName("bindValue") + void invokeBindValue(Reference instance, T value); + + @MethodName("bindTags") + void invokeBindTags(Reference instance, Collection> tags); + } + + @Proxies(ChunkMap.class) + public interface ChunkMapProxy { + @FieldGetter("worldGenContext") + WorldGenContext getWorldGenContext(ChunkMap instance); + + @FieldSetter("worldGenContext") + 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") + void invokeBind(HolderSet.Named instance, List> entries); + + @MethodName("contents") + List> invokeContents(HolderSet.Named instance); + } + + @Proxies(Biome.class) + public interface BiomeProxy { + @MethodName("getGrassColorFromTexture") + int invokeGrassColorFromTexture(Biome instance); + } +} diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/RegistryFetcher.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/RegistryFetcher.java similarity index 54% rename from platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/RegistryFetcher.java rename to platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/RegistryFetcher.java index 0377eea0f..9266d4102 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/RegistryFetcher.java +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/RegistryFetcher.java @@ -1,24 +1,25 @@ -package com.dfsek.terra.bukkit.nms.v1_21; +package com.dfsek.terra.bukkit.nms.v1_21_3; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; -import net.minecraft.server.dedicated.DedicatedServer; +import net.minecraft.server.MinecraftServer; +import net.minecraft.sounds.SoundEvent; import net.minecraft.world.level.biome.Biome; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.CraftServer; public class RegistryFetcher { private static Registry getRegistry(ResourceKey> key) { - CraftServer craftserver = (CraftServer) Bukkit.getServer(); - DedicatedServer dedicatedserver = craftserver.getServer(); - return dedicatedserver + return MinecraftServer.getServer() .registryAccess() - .registryOrThrow(key); + .lookupOrThrow(key); } public static Registry biomeRegistry() { return getRegistry(Registries.BIOME); } + + public static Registry soundEventRegistry() { + return getRegistry(Registries.SOUND_EVENT); + } } diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/BiomeAdditionsSoundTemplate.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/BiomeAdditionsSoundTemplate.java new file mode 100644 index 000000000..ee5781784 --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/BiomeAdditionsSoundTemplate.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3.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.core.registries.BuiltInRegistries; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.level.biome.AmbientAdditionsSettings; + + +public class BiomeAdditionsSoundTemplate implements ObjectTemplate { + @Value("sound") + @Default + private SoundEvent sound = null; + + @Value("sound-chance") + @Default + private Double soundChance = null; + + @Override + public AmbientAdditionsSettings get() { + if(sound == null || soundChance == null) { + return null; + } else { + return new AmbientAdditionsSettings(BuiltInRegistries.SOUND_EVENT.wrapAsHolder(sound), soundChance); + } + } +} diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/BiomeMoodSoundTemplate.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/BiomeMoodSoundTemplate.java new file mode 100644 index 000000000..1c67c7052 --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/BiomeMoodSoundTemplate.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3.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.core.registries.BuiltInRegistries; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.level.biome.AmbientMoodSettings; + + +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 AmbientMoodSettings get() { + if(sound == null || soundCultivationTicks == null || soundSpawnRange == null || soundExtraDistance == null) { + return null; + } else { + return new AmbientMoodSettings(BuiltInRegistries.SOUND_EVENT.wrapAsHolder(sound), soundCultivationTicks, soundSpawnRange, soundExtraDistance); + } + } +} diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/BiomeParticleConfigTemplate.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/BiomeParticleConfigTemplate.java new file mode 100644 index 000000000..f62bd344d --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/BiomeParticleConfigTemplate.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3.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.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.arguments.ParticleArgument; +import net.minecraft.core.HolderLookup.Provider; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.biome.AmbientParticleSettings; + + +public class BiomeParticleConfigTemplate implements ObjectTemplate { + @Value("particle") + @Default + private String particle = null; + + @Value("probability") + @Default + private Integer probability = null; + + @Override + public AmbientParticleSettings get() { + if(particle == null || probability == null) { + return null; + } + + try { + return new AmbientParticleSettings(ParticleArgument.readParticle(new StringReader(particle), + (Provider) BuiltInRegistries.PARTICLE_TYPE.asHolderIdMap()), probability); + } catch(CommandSyntaxException e) { + throw new RuntimeException(e); + } + } +} diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/EntityTypeTemplate.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/EntityTypeTemplate.java new file mode 100644 index 000000000..ea9d002a4 --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/EntityTypeTemplate.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3.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.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; + + +public class EntityTypeTemplate 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_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/MusicSoundTemplate.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/MusicSoundTemplate.java new file mode 100644 index 000000000..9342aec45 --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/MusicSoundTemplate.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3.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.core.registries.BuiltInRegistries; +import net.minecraft.sounds.Music; +import net.minecraft.sounds.SoundEvent; + + +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) { + return null; + } else { + return new Music(BuiltInRegistries.SOUND_EVENT.wrapAsHolder(sound), minDelay, maxDelay, replaceCurrentMusic); + } + } +} diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SoundEventTemplate.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SoundEventTemplate.java new file mode 100644 index 000000000..0c4052f87 --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SoundEventTemplate.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3.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.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; + + +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) { + return null; + } else if(distanceToTravel == null) { + return SoundEvent.createVariableRangeEvent(id); + } else { + return SoundEvent.createFixedRangeEvent(id, distanceToTravel); + } + } +} diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SpawnCostConfig.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SpawnCostConfig.java new file mode 100644 index 000000000..e14305d42 --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SpawnCostConfig.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3.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.world.entity.EntityType; + + +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_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SpawnEntryTemplate.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SpawnEntryTemplate.java new file mode 100644 index 000000000..4b730f00f --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SpawnEntryTemplate.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3.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.world.entity.EntityType; +import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; + + +public class SpawnEntryTemplate implements ObjectTemplate { + @Value("type") + @Default + private EntityType type = null; + + @Value("weight") + @Default + private Integer weight = null; + + @Value("min-group-size") + @Default + private Integer minGroupSize = null; + + @Value("max-group-size") + @Default + private Integer maxGroupSize = null; + + @Override + public SpawnerData get() { + return new SpawnerData(type, weight, minGroupSize, maxGroupSize); + } +} diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SpawnSettingsTemplate.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SpawnSettingsTemplate.java new file mode 100644 index 000000000..7613d3205 --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SpawnSettingsTemplate.java @@ -0,0 +1,49 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3.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 net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class SpawnSettingsTemplate implements ObjectTemplate { + + private static final Logger logger = LoggerFactory.getLogger(SpawnTypeConfig.class); + private static boolean used = false; + + @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(); + for(SpawnTypeConfig spawn : spawns) { + MobCategory group = spawn.getGroup(); + for(SpawnerData entry : spawn.getEntries()) { + builder.addSpawn(group, entry); + } + } + for(SpawnCostConfig cost : costs) { + builder.addMobCharge(cost.getType(), cost.getMass(), cost.getGravity()); + } + if(probability != null) { + builder.creatureGenerationProbability(probability); + } + + return builder.build(); + } +} diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SpawnTypeConfig.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SpawnTypeConfig.java new file mode 100644 index 000000000..4755a3a45 --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/SpawnTypeConfig.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3.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.SpawnerData; + + +public class SpawnTypeConfig implements ObjectTemplate { + @Value("group") + @Default + private MobCategory group = null; + + @Value("entries") + @Default + private List entries = null; + + public MobCategory getGroup() { + return group; + } + + public List getEntries() { + return entries; + } + + @Override + public SpawnTypeConfig get() { + return this; + } +} \ No newline at end of file diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/VanillaBiomeProperties.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/VanillaBiomeProperties.java new file mode 100644 index 000000000..5df5decf4 --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/VanillaBiomeProperties.java @@ -0,0 +1,164 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3.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.sounds.Music; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.npc.VillagerType; +import net.minecraft.world.level.biome.AmbientAdditionsSettings; +import net.minecraft.world.level.biome.AmbientMoodSettings; +import net.minecraft.world.level.biome.AmbientParticleSettings; +import net.minecraft.world.level.biome.Biome.TemperatureModifier; +import net.minecraft.world.level.biome.BiomeSpecialEffects.GrassColorModifier; +import net.minecraft.world.level.biome.MobSpawnSettings; + + +public class VanillaBiomeProperties implements ConfigTemplate, Properties { + @Value("colors.grass") + @Default + private Integer grassColor = null; + + @Value("colors.fog") + @Default + private Integer fogColor = null; + + @Value("colors.water") + @Default + private Integer waterColor = null; + + @Value("colors.water-fog") + @Default + private Integer waterFogColor = null; + + @Value("colors.foliage") + @Default + private Integer foliageColor = null; + + @Value("colors.sky") + @Default + private Integer skyColor = null; + + @Value("colors.modifier") + @Default + private GrassColorModifier grassColorModifier = null; + + @Value("particles") + @Default + private AmbientParticleSettings particleConfig = null; + + @Value("climate.precipitation") + @Default + private Boolean precipitation = true; + + @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 AmbientMoodSettings moodSound = null; + + @Value("sound.additions-sound") + @Default + private AmbientAdditionsSettings additionsSound = null; + + @Value("sound.music") + @Default + private Music music = null; + + @Value("spawning") + @Default + private MobSpawnSettings spawnSettings = null; + + @Value("villager-type") + @Default + private VillagerType villagerType = null; + + public Integer getFogColor() { + return fogColor; + } + + public Integer getFoliageColor() { + return foliageColor; + } + + public Integer getGrassColor() { + return grassColor; + } + + public Integer getWaterColor() { + return waterColor; + } + + public Integer getWaterFogColor() { + return waterFogColor; + } + + public Integer getSkyColor() { + return skyColor; + } + + public GrassColorModifier getGrassColorModifier() { + return grassColorModifier; + } + + public AmbientParticleSettings 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 AmbientMoodSettings getMoodSound() { + return moodSound; + } + + public AmbientAdditionsSettings getAdditionsSound() { + return additionsSound; + } + + public Music getMusic() { + return music; + } + + public MobSpawnSettings getSpawnSettings() { + return spawnSettings; + } + + public VillagerType getVillagerType() { + return villagerType; + } +} diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/VillagerTypeTemplate.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/VillagerTypeTemplate.java new file mode 100644 index 000000000..cde3b531d --- /dev/null +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/config/VillagerTypeTemplate.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.bukkit.nms.v1_21_3.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.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.npc.VillagerType; + + +public class VillagerTypeTemplate implements ObjectTemplate { + @Value("id") + @Default + private ResourceLocation id = null; + + @Override + public VillagerType get() { + return BuiltInRegistries.VILLAGER_TYPE.get(id).orElseThrow().value(); + } +} diff --git a/platforms/cli/build.gradle.kts b/platforms/cli/build.gradle.kts index 5070c047f..1d5cb6f73 100644 --- a/platforms/cli/build.gradle.kts +++ b/platforms/cli/build.gradle.kts @@ -8,7 +8,10 @@ dependencies { shadedApi(project(":common:implementation:base")) shadedApi("commons-io", "commons-io", Versions.Libraries.Internal.apacheIO) - shadedApi("com.github.Querz", "NBT", Versions.CLI.nbt) + shadedApi("com.github.Querz", "NBT", Versions.Libraries.Internal.nbt) + + shadedImplementation("info.picocli", "picocli", Versions.CLI.picocli) + annotationProcessor("info.picocli", "picocli-codegen", Versions.CLI.picocli) shadedImplementation("com.google.guava", "guava", Versions.Libraries.Internal.guava) @@ -26,6 +29,12 @@ tasks.withType { } } +tasks.withType { + doFirst { + options.compilerArgs.add("-Aproject=${project.group}/${project.name}") + } +} + application { mainClass.set(javaMainClass) } diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/CLIPlatform.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/CLIPlatform.java index ca58f1f5d..3d366d0e6 100644 --- a/platforms/cli/src/main/java/com/dfsek/terra/cli/CLIPlatform.java +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/CLIPlatform.java @@ -22,6 +22,8 @@ public class CLIPlatform extends AbstractPlatform { private final CLIWorldHandle worldHandle = new CLIWorldHandle(); private final CLIItemHandle itemHandle = new CLIItemHandle(); + private final int generationThreads = Runtime.getRuntime().availableProcessors() - 1; + public CLIPlatform() { LOGGER.info("Root directory: {}", getDataFolder().getAbsoluteFile()); load(); @@ -58,4 +60,9 @@ public class CLIPlatform extends AbstractPlatform { super.register(registry); registry.registerLoader(PlatformBiome.class, (TypeLoader) (annotatedType, o, configLoader, depthTracker) -> () -> o); } + + @Override + public int getGenerationThreads() { + return generationThreads; + } } 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 8f62528bc..363a54dbc 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 @@ -5,41 +5,74 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.seismic.type.vector.Vector2Int; import com.dfsek.terra.cli.world.CLIWorld; +import picocli.CommandLine; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; -public final class TerraCLI { - private static final Logger LOGGER = LoggerFactory.getLogger(TerraCLI.class); - public static void main(String... args) { +//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.") + private int size = 2; + + @Option(names = { "-p", "--pack"}, description = "Config pack to use.") + private String pack = "OVERWORLD"; + + @Option(names = { "--seed"}, description = "Seed for world generation.") + private long seed = 0; + + @Option(names = { "--max-height"}, description = "Maximum height of the world.") + private int maxHeight = 320; + + @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.") + private boolean noSave = false; + + @Override + public Integer call() { + Logger LOGGER = LoggerFactory.getLogger(TerraCLI.class); LOGGER.info("Starting Terra CLI..."); CLIPlatform platform = new CLIPlatform(); platform.getEventManager().callEvent(new PlatformInitializationEvent()); - ConfigPack generate = platform.getConfigRegistry().getByID("OVERWORLD").orElseThrow(); // TODO: make this a cli argument + ConfigPack generate = platform.getConfigRegistry().getByID(pack).orElseThrow(); - CLIWorld world = new CLIWorld(2, 2, 384, -64, generate); + CLIWorld world = new CLIWorld(size, seed, maxHeight, minHeight, generate, noSave); world.generate(); - world.serialize().parallel().forEach(mcaFile -> { - Vector2Int pos = mcaFile.getLeft(); - String name = MCAUtil.createNameFromRegionLocation(pos.getX(), pos.getZ()); - LOGGER.info("Writing region ({}, {}) to {}", pos.getX(), pos.getZ(), name); + if(!noSave) { + world.serialize().parallel().forEach(mcaFile -> { + Vector2Int pos = mcaFile.getLeft(); + String name = MCAUtil.createNameFromRegionLocation(pos.getX(), pos.getZ()); + LOGGER.info("Writing region ({}, {}) to {}", pos.getX(), pos.getZ(), name); - try { - MCAUtil.write(mcaFile.getRight(), name); - } catch(IOException e) { - e.printStackTrace(); - } - LOGGER.info("Wrote region to file."); - }); + try { + MCAUtil.write(mcaFile.getRight(), name); + } catch(IOException e) { + e.printStackTrace(); + } + LOGGER.info("Wrote region to file."); + }); + } LOGGER.info("Done."); - System.exit(0); + 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 a4af0d02e..4c01a8f0e 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 @@ -22,8 +22,8 @@ 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.seismic.type.vector.Vector2Int; +import com.dfsek.seismic.type.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; @@ -43,6 +43,7 @@ public class CLIWorld implements ServerWorld, NBTSerializable CPSHistory = new ArrayList<>(); int sizeChunks = size * 32; List> futures = new ArrayList<>(); final AtomicLong start = new AtomicLong(System.nanoTime()); @@ -83,7 +86,13 @@ public class CLIWorld implements ServerWorld, NBTSerializable { try { int num = amount.getAndIncrement(); - CLIChunk chunk = getChunkAt(finalX, finalZ); + CLIChunk chunk; + if (!noSave) { + chunk = getChunkAt(finalX, finalZ); + } else { + chunk = new CLIChunk(Math.floorMod(finalX, 32), Math.floorMod(finalZ, 32), this); + } + BiomeProvider cachingBiomeProvider = pack.getBiomeProvider(); chunkGenerator.generateChunkData(chunk, this, cachingBiomeProvider, finalX, finalZ); CLIProtoWorld protoWorld = new CLIProtoWorld(this, cachingBiomeProvider, finalX, finalZ); @@ -91,6 +100,7 @@ public class CLIWorld implements ServerWorld, NBTSerializable d).average().orElse(0)); } @Override diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 73d2a7d64..b8a52b02e 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -26,8 +26,8 @@ dependencies { modImplementation("net.fabricmc:fabric-loader:${Versions.Mod.fabricLoader}") - modImplementation("org.incendo", "cloud-fabric", Versions.Libraries.cloudFabric) - include("org.incendo", "cloud-fabric", Versions.Libraries.cloudFabric) + modImplementation("org.incendo", "cloud-fabric", Versions.Fabric.cloud) + include("org.incendo", "cloud-fabric", Versions.Fabric.cloud) modRuntimeOnly("net.fabricmc.fabric-api", "fabric-api", Versions.Fabric.fabricAPI) } diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json index 592d4021a..bf203275d 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -32,9 +32,9 @@ "terra.common.mixins.json" ], "depends": { - "fabricloader": ">=0.16.5", + "fabricloader": ">=0.16.10", "java": ">=21", - "minecraft": ">=1.21.1", + "minecraft": ">=1.21.4", "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 660c750af..57046330b 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 @@ -60,13 +60,13 @@ public final class BiomeUtil { } else { VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); - net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, + net.minecraft.world.biome.Biome minecraftBiome = com.dfsek.terra.mod.util.BiomeUtil.createBiome(biome, ForgeRegistries.BIOMES.getDelegateOrThrow( vanilla.getKey().orElseThrow()) .value(), vanillaBiomeProperties); - Identifier identifier = new Identifier("terra", MinecraftUtil.createBiomeID(pack, id)); + Identifier identifier = new Identifier("terra", com.dfsek.terra.mod.util.BiomeUtil.createBiomeID(pack, id)); if(ForgeRegistries.BIOMES.containsKey(identifier)) { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(ForgeRegistries.BIOMES.getHolder(identifier) @@ -83,7 +83,7 @@ public final class BiomeUtil { Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), villagerMap.getOrDefault(vanilla.getKey().orElseThrow(), VillagerType.PLAINS))); - MinecraftUtil.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/build.gradle.kts b/platforms/minestom/build.gradle.kts new file mode 100644 index 000000000..59b775220 --- /dev/null +++ b/platforms/minestom/build.gradle.kts @@ -0,0 +1,11 @@ +dependencies { + shadedApi(project(":common:implementation:base")) + shadedApi("com.github.ben-manes.caffeine", "caffeine", Versions.Libraries.caffeine) + shadedImplementation("com.google.guava", "guava", Versions.Libraries.Internal.guava) + + compileOnly("net.minestom", "minestom-snapshots", Versions.Minestom.minestom) +} + +tasks.named("jar") { + finalizedBy("installAddonsIntoDefaultJar") +} diff --git a/platforms/minestom/example/build.gradle.kts b/platforms/minestom/example/build.gradle.kts new file mode 100644 index 000000000..31d903136 --- /dev/null +++ b/platforms/minestom/example/build.gradle.kts @@ -0,0 +1,28 @@ +plugins { + application +} + +val javaMainClass = "com.dfsek.terra.minestom.TerraMinestomExample" + +dependencies { + shadedApi(project(":platforms:minestom")) + + implementation("net.minestom", "minestom-snapshots", Versions.Minestom.minestom) + implementation("org.slf4j", "slf4j-simple", Versions.Libraries.slf4j) +} + +tasks.withType { + entryCompression = ZipEntryCompression.STORED + manifest { + attributes( + "Main-Class" to javaMainClass, + ) + } +} + +application { + mainClass.set(javaMainClass) +} + +tasks.getByName("run").setProperty("workingDir", file("./run")) +addonDir(project.file("./run/terra/addons"), tasks.named("run").get()) 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 new file mode 100644 index 000000000..1cf95a226 --- /dev/null +++ b/platforms/minestom/example/src/main/java/com/dfsek/terra/minestom/TerraMinestomExample.java @@ -0,0 +1,132 @@ +package com.dfsek.terra.minestom; + +import net.kyori.adventure.text.Component; +import net.minestom.server.MinecraftServer; +import net.minestom.server.command.builder.Command; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.entity.GameMode; +import net.minestom.server.event.player.AsyncPlayerConfigurationEvent; +import net.minestom.server.event.player.PlayerSpawnEvent; +import net.minestom.server.instance.Instance; +import net.minestom.server.instance.LightingChunk; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +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 Instance instance; + private TerraMinestomWorld world; + + public void createNewInstance() { + instance = MinecraftServer.getInstanceManager().createInstanceContainer(); + instance.setChunkSupplier(LightingChunk::new); + } + + public void attachTerra() { + world = TerraMinestomWorldBuilder.from(instance) + .defaultPack() + .attach(); + } + + private void sendProgressBar(int current, int max) { + String left = "#".repeat((int) ((((float) current) / max) * 20)); + String right = ".".repeat(20 - left.length()); + int percent = (int) (((float) current) / max * 100); + String percentString = percent + "%"; + percentString = " ".repeat(4 - percentString.length()) + percentString; + String message = percentString + " |" + left + right + "| " + current + "/" + max; + logger.info(message); + } + + public void preloadWorldAndMeasure() { + int radius = 12; + int chunksLoading = (radius * 2 + 1) * (radius * 2 + 1); + AtomicInteger chunksLeft = new AtomicInteger(chunksLoading); + + long start = System.nanoTime(); + for(int x = -radius; x <= radius; x++) { + for(int z = -radius; z <= radius; z++) { + instance.loadChunk(x, z).thenAccept(chunk -> { + int left = chunksLeft.decrementAndGet(); + if(left == 0) { + long end = System.nanoTime(); + sendProgressBar(chunksLoading - left, chunksLoading); + double chunksPerSecond = chunksLoading / ((end - start) / 1000000000.0); + logger.info( + "Preloaded {} chunks in world in {}ms. That's {} Chunks/s", + chunksLoading, + (end - start) / 1000000.0, + chunksPerSecond + ); + + world.displayStats(); + } else if(left % 60 == 0) { + sendProgressBar(chunksLoading - left, chunksLoading); + } + }); + } + } + } + + public void addListeners() { + MinecraftServer.getGlobalEventHandler().addListener(AsyncPlayerConfigurationEvent.class, event -> { + event.setSpawningInstance(instance); + event.getPlayer().setRespawnPoint(new Pos(0.0, 100.0, 0.0)); + }); + + MinecraftServer.getGlobalEventHandler().addListener(PlayerSpawnEvent.class, event -> { + event.getPlayer().setGameMode(GameMode.SPECTATOR); + }); + } + + public void addScheduler() { + MinecraftServer.getSchedulerManager().buildTask(() -> world.displayStats()) + .repeat(Duration.ofSeconds(10)) + .schedule(); + } + + public void addCommands() { + MinecraftServer.getCommandManager().register(new RegenerateCommand()); + } + + public void bind() { + logger.info("Starting server on port 25565"); + 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() { + super("regenerate"); + setDefaultExecutor((sender, context) -> regenerate()); + } + + private void regenerate() { + instance.sendMessage(Component.text("Regenerating world")); + createNewInstance(); + attachTerra(); + preloadWorldAndMeasure(); + MinecraftServer.getConnectionManager().getOnlinePlayers().forEach(player -> + player.setInstance(instance, new Pos(0, 100, 0)) + ); + } + } +} 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 new file mode 100644 index 000000000..27c70b253 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/MinestomAdapter.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.minestom; + +import com.dfsek.seismic.type.vector.Vector3; + +import net.minestom.server.coordinate.Point; +import net.minestom.server.coordinate.Pos; + + +public class MinestomAdapter { + public static Vector3 adapt(Point point) { + return Vector3.of(point.x(), point.y(), point.z()); + } + + public static Pos adapt(Vector3 vector) { + return new Pos(vector.getX(), vector.getY(), vector.getZ()); + } +} 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 new file mode 100644 index 000000000..78ac5ff18 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/MinestomPlatform.java @@ -0,0 +1,93 @@ +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); + 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.getUniqueId()); + }); + } + }); + + 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/api/BlockEntityFactory.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/BlockEntityFactory.java new file mode 100644 index 000000000..c5fd33ca1 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/BlockEntityFactory.java @@ -0,0 +1,16 @@ +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; + + +/** + * 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. + */ +public interface BlockEntityFactory { + @Nullable BlockEntity createBlockEntity(BlockVec position); +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/EntityFactory.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/EntityFactory.java new file mode 100644 index 000000000..5cfbecd8d --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/EntityFactory.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.minestom.api; + + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.EntityType; + + +/** + * Allows adding AI to generated entities using custom entity types + */ +public interface EntityFactory { + Entity createEntity(EntityType type); +} 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 new file mode 100644 index 000000000..a4c146359 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiome.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.minestom.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; + + public MinestomBiome(Biome biome) { this.biome = biome; } + + @Override + public Biome 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 new file mode 100644 index 000000000..9cb3eb960 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiomeLoader.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.minestom.biome; + +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.minestom.server.MinecraftServer; +import net.minestom.server.registry.DynamicRegistry; +import net.minestom.server.utils.NamespaceID; +import net.minestom.server.world.biome.Biome; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.AnnotatedType; + + +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 { + String id = (String) o; + NamespaceID biomeID = NamespaceID.from(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); + } +} 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 new file mode 100644 index 000000000..dbcbf2833 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/DefaultBlockEntityFactory.java @@ -0,0 +1,14 @@ +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; + + +public class DefaultBlockEntityFactory implements BlockEntityFactory { + @Override + public BlockEntity createBlockEntity(BlockVec position) { + return null; + } +} 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 new file mode 100644 index 000000000..01bad55fa --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java @@ -0,0 +1,98 @@ +package com.dfsek.terra.minestom.block; + +import com.dfsek.terra.api.block.BlockType; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.block.state.properties.Property; + +import net.minestom.server.instance.block.Block; + +import java.util.HashMap; +import java.util.Objects; +import java.util.stream.Collectors; + + +public class MinestomBlockState implements BlockState { + private final Block block; + + public MinestomBlockState(Block block) { + if(block == null) { + this.block = Block.AIR; + } else { + this.block = block; + } + } + + public MinestomBlockState(String data) { + if(!data.contains("[")) { + block = Block.fromNamespaceId(data); + return; + } + + String[] split = data.split("\\["); + String namespaceId = split[0]; + String properties = split[1].substring(0, split[1].length() - 1); + Block block = Block.fromNamespaceId(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 + public boolean matches(BlockState other) { + return ((MinestomBlockState) other).block.compare(block); + } + + @Override + public > boolean has(Property property) { + return false; + } + + @Override + public > T get(Property property) { + return null; + } + + @Override + public > BlockState set(Property property, T value) { + return null; + } + + @Override + public BlockType getBlockType() { + return new MinestomBlockType(block); + } + + @Override + public String getAsString(boolean properties) { + String name = block.namespace().asString(); + if(!properties || block.properties().isEmpty()) { + return name; + } + + name += "[" + block.properties().entrySet().stream().map(entry -> entry.getKey() + "=" + entry.getValue()).collect( + Collectors.joining(",")) + "]"; + + return name; + } + + @Override + public boolean isAir() { + return block.isAir(); + } + + @Override + public Object getHandle() { + return block; + } + + @Override + public int hashCode() { + return Objects.hashCode(block.id()); + } +} 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 new file mode 100644 index 000000000..8e4bd4360 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockType.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.minestom.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; + + public MinestomBlockType(Block block) { + this.block = block; + } + + @Override + public BlockState getDefaultState() { + return new MinestomBlockState(block); + } + + @Override + public boolean isSolid() { + return block.isSolid(); + } + + @Override + public boolean isWater() { + return block.isLiquid(); + } + + @Override + public Object getHandle() { + return block; + } + + @Override + public int hashCode() { + return block.id(); + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof MinestomBlockType other) { + return block.id() == other.block.id(); + } + 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 new file mode 100644 index 000000000..ed9ad8622 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/CachedChunk.java @@ -0,0 +1,58 @@ +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; + + +public class CachedChunk implements ProtoChunk { + private final int minHeight; + private final int maxHeight; + 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; + } + } + } + } + + public void writeRelative(UnitModifier modifier) { + modifier.setAllRelative((x, y, z) -> blocks[x][y][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; + } + + @Override + public @NotNull BlockState getBlock(int x, int y, int z) { + return new MinestomBlockState(blocks[x][y - minHeight][z]); + } + + @Override + public Object getHandle() { + return blocks; + } + + @Override + public int getMaxHeight() { + return maxHeight; + } +} 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 new file mode 100644 index 000000000..018c82c72 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/GeneratedChunkCache.java @@ -0,0 +1,49 @@ +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; +import net.minestom.server.world.DimensionType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class GeneratedChunkCache { + private static final Logger log = LoggerFactory.getLogger(GeneratedChunkCache.class); + private final LoadingCache, CachedChunk> cache; + private final DimensionType dimensionType; + private final ChunkGenerator generator; + private final ServerWorld world; + private final BiomeProvider biomeProvider; + + public GeneratedChunkCache(DimensionType dimensionType, ChunkGenerator generator, ServerWorld world) { + 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())); + } + + private CachedChunk generateChunk(int x, int z) { + CachedChunk chunk = new CachedChunk(dimensionType.minY(), dimensionType.maxY()); + generator.generateChunkData(chunk, world, biomeProvider, x, z); + return chunk; + } + + public void displayStats() { + CacheStats stats = cache.stats(); + log.info("Avg load time: {}ms | Hit rate: {}% | Load Count: {}", stats.averageLoadPenalty(), stats.hitRate() * 100, + stats.loadCount()); + } + + public CachedChunk at(int x, int z) { + return cache.get(Pair.of(x, 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 new file mode 100644 index 000000000..fdcf01aa7 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/TerraMinestomChunk.java @@ -0,0 +1,51 @@ +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; + + +public class TerraMinestomChunk implements Chunk { + private net.minestom.server.instance.Chunk delegate; + private final ServerWorld world; + + public TerraMinestomChunk(net.minestom.server.instance.Chunk delegate, ServerWorld world) { + this.delegate = delegate; + this.world = world; + } + + @Override + public void setBlock(int x, int y, int z, BlockState data, boolean physics) { + delegate.setBlock(x, y, z, (Block) data.getHandle()); + } + + @Override + public @NotNull BlockState getBlock(int x, int y, int z) { + return new MinestomBlockState(delegate.getBlock(x, y, z)); + } + + @Override + public int getX() { + return delegate.getChunkX(); + } + + @Override + public int getZ() { + return delegate.getChunkZ(); + } + + @Override + public ServerWorld getWorld() { + return world; + } + + @Override + public Object getHandle() { + return delegate; + } +} 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 new file mode 100644 index 000000000..23226fc99 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DefaultEntityFactory.java @@ -0,0 +1,14 @@ +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; + + +public class DefaultEntityFactory implements EntityFactory { + @Override + public Entity createEntity(EntityType type) { + return new Entity(type); + } +} 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 new file mode 100644 index 000000000..43179f730 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DeferredMinestomEntity.java @@ -0,0 +1,68 @@ +package com.dfsek.terra.minestom.entity; + +import com.dfsek.terra.api.entity.Entity; +import com.dfsek.terra.api.entity.EntityType; +import com.dfsek.seismic.type.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; + private double x; + private double y; + private double z; + private TerraMinestomWorld world; + + public DeferredMinestomEntity(double x, double y, double z, EntityType type, TerraMinestomWorld world) { + this.x = x; + this.y = y; + this.z = z; + this.type = type; + this.world = world; + } + + @Override + public Vector3 position() { + return Vector3.of(x, y, z); + } + + public Pos pos() { + return new Pos(x, y, z); + } + + @Override + public void position(Vector3 position) { + x = position.getX(); + y = position.getY(); + z = position.getZ(); + } + + @Override + public void world(ServerWorld world) { + this.world = (TerraMinestomWorld) world; + } + + @Override + public ServerWorld world() { + return world; + } + + @Override + public Object getHandle() { + return this; + } + + public void spawn() { + int chunkX = (int) x >> 4; + int chunkZ = (int) z >> 4; + + if(!world.getHandle().isChunkLoaded(chunkX, chunkZ)) { + return; + } + + MinestomEntity.spawn(x, y, z, type, world); + } +} 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 new file mode 100644 index 000000000..055d16153 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntity.java @@ -0,0 +1,55 @@ +package com.dfsek.terra.minestom.entity; + +import com.dfsek.terra.api.entity.EntityType; +import com.dfsek.seismic.type.vector.Vector3; +import com.dfsek.terra.api.world.ServerWorld; + +import com.dfsek.terra.minestom.MinestomAdapter; +import com.dfsek.terra.minestom.world.TerraMinestomWorld; + +import net.minestom.server.coordinate.Pos; +import net.minestom.server.entity.Entity; +import net.minestom.server.instance.Instance; + + +public class MinestomEntity implements com.dfsek.terra.api.entity.Entity { + private final Entity delegate; + private final TerraMinestomWorld world; + + public MinestomEntity(Entity delegate, TerraMinestomWorld world) { + this.delegate = delegate; + this.world = world; + } + + @Override + public Vector3 position() { + return MinestomAdapter.adapt(delegate.getPosition()); + } + + @Override + public void position(Vector3 position) { + delegate.teleport(MinestomAdapter.adapt(position)); + } + + @Override + public void world(ServerWorld world) { + delegate.setInstance(((TerraMinestomWorld) world).getHandle()); + } + + @Override + public ServerWorld world() { + return world; + } + + @Override + 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 new file mode 100644 index 000000000..60fbac5d9 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntityType.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.minestom.entity; + + +import net.minestom.server.entity.EntityType; + + +public class MinestomEntityType implements com.dfsek.terra.api.entity.EntityType { + private final EntityType delegate; + + public MinestomEntityType(String id) { + delegate = EntityType.fromNamespaceId(id); + } + + @Override + public EntityType getHandle() { + return delegate; + } +} 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 new file mode 100644 index 000000000..0ef720b31 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomEnchantment.java @@ -0,0 +1,51 @@ +package com.dfsek.terra.minestom.item; + +import com.dfsek.terra.api.inventory.ItemStack; +import com.dfsek.terra.api.inventory.item.Enchantment; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.item.Material; +import net.minestom.server.utils.NamespaceID; + +import java.util.Objects; + + +public class MinestomEnchantment implements Enchantment { + private final net.minestom.server.item.enchant.Enchantment delegate; + private final String id; + + public MinestomEnchantment(net.minestom.server.item.enchant.Enchantment delegate) { + this.delegate = delegate; + id = Objects.requireNonNull(delegate.registry()).raw(); + } + + public MinestomEnchantment(String id) { + this.delegate = MinecraftServer.getEnchantmentRegistry().get(NamespaceID.from(id)); + this.id = id; + } + + @Override + public boolean canEnchantItem(ItemStack itemStack) { + return delegate.supportedItems().contains((Material) itemStack.getType().getHandle()); + } + + @Override + public boolean conflictsWith(Enchantment other) { + return delegate.exclusiveSet().contains(NamespaceID.from(((MinestomEnchantment) other).id)); + } + + @Override + public String getID() { + return id; + } + + @Override + public int getMaxLevel() { + return delegate.maxLevel(); + } + + @Override + public net.minestom.server.item.enchant.Enchantment getHandle() { + return delegate; + } +} 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 new file mode 100644 index 000000000..c31983ed3 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemHandle.java @@ -0,0 +1,28 @@ +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; + + +public class MinestomItemHandle implements ItemHandle { + @Override + public Item createItem(String data) { + return new MinestomMaterial(data); + } + + @Override + public Enchantment getEnchantment(String id) { + return new MinestomEnchantment(id); + } + + @Override + public Set getEnchantments() { + 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 new file mode 100644 index 000000000..861a9549c --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemMeta.java @@ -0,0 +1,31 @@ +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; + + +public class MinestomItemMeta implements ItemMeta { + private final HashMap enchantments; + + public MinestomItemMeta(HashMap enchantments) { + this.enchantments = enchantments; + } + + @Override + public void addEnchantment(Enchantment enchantment, int level) { + enchantments.put(enchantment, level); + } + + @Override + public Map getEnchantments() { + return enchantments; + } + + @Override + public Object getHandle() { + return 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 new file mode 100644 index 000000000..2b488a8c8 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemStack.java @@ -0,0 +1,72 @@ +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.item.ItemComponent; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.component.EnchantmentList; +import net.minestom.server.registry.DynamicRegistry; +import net.minestom.server.registry.DynamicRegistry.Key; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Objects; + + +public class MinestomItemStack implements com.dfsek.terra.api.inventory.ItemStack { + private ItemStack base; + + public MinestomItemStack(net.minestom.server.item.@NotNull ItemStack base) { + this.base = base; + } + + @Override + public Object getHandle() { + return base; + } + + @Override + public int getAmount() { + return base.amount(); + } + + @Override + public void setAmount(int i) { + base = base.withAmount(i); + } + + @Override + public Item getType() { + return new MinestomMaterial(base.material()); + } + + @Override + public ItemMeta getItemMeta() { + HashMap enchantments = new HashMap<>(); + EnchantmentList enchantmentList = base.get(ItemComponent.ENCHANTMENTS); + if(enchantmentList != null) { + enchantmentList.enchantments().forEach((enchantmentKey, integer) -> { + enchantments.put( + new MinestomEnchantment(Objects.requireNonNull(MinecraftServer.getEnchantmentRegistry().get(enchantmentKey))), integer); + }); + } + return new MinestomItemMeta(enchantments); + } + + @Override + public void setItemMeta(ItemMeta meta) { + HashMap, Integer> enchantments = new HashMap<>(); + DynamicRegistry registry = MinecraftServer.getEnchantmentRegistry(); + meta.getEnchantments().forEach((key, value) -> { + MinestomEnchantment enchantment = (MinestomEnchantment) key; + enchantments.put(registry.getKey(enchantment.getHandle()), value); + }); + + EnchantmentList list = new EnchantmentList(enchantments); + base = base.with(ItemComponent.ENCHANTMENTS, list); + } +} 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 new file mode 100644 index 000000000..6bd0a1908 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomMaterial.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.minestom.item; + +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; + + public MinestomMaterial(Material delegate) { + this.delegate = delegate; + } + + public MinestomMaterial(String id) { + this.delegate = Material.fromNamespaceId(id); + } + + @Override + public ItemStack newItemStack(int amount) { + return new MinestomItemStack(net.minestom.server.item.ItemStack.builder(delegate).amount(amount).build()); + } + + @Override + public double getMaxDurability() { + return 0; + } + + @Override + public Material getHandle() { + return delegate; + } +} 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 new file mode 100644 index 000000000..81529db48 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomChunkGeneratorWrapper.java @@ -0,0 +1,68 @@ +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 org.jetbrains.annotations.NotNull; + + +public class MinestomChunkGeneratorWrapper implements Generator, GeneratorWrapper { + private final GeneratedChunkCache cache; + private ChunkGenerator generator; + private final TerraMinestomWorld world; + private ConfigPack pack; + + public MinestomChunkGeneratorWrapper(ChunkGenerator generator, TerraMinestomWorld world, ConfigPack pack) { + this.generator = generator; + this.world = world; + this.pack = pack; + this.cache = new GeneratedChunkCache(world.getDimensionType(), generator, world); + } + + public ChunkGenerator getGenerator() { + return generator; + } + + @Override + public void generate(@NotNull GenerationUnit unit) { + Point start = unit.absoluteStart(); + int x = start.chunkX(); + int z = start.chunkZ(); + CachedChunk chunk = cache.at(x, z); + chunk.writeRelative(unit.modifier()); + + unit.fork(setter -> { + MinestomProtoWorld protoWorld = new MinestomProtoWorld(cache, x, z, world, setter); + + for(GenerationStage stage : world.getPack().getStages()) { + stage.populate(protoWorld); + } + }); + } + + public ConfigPack getPack() { + return pack; + } + + public void setPack(ConfigPack pack) { + this.pack = pack; + this.generator = pack.getGeneratorProvider().newInstance(pack); + } + + public void displayStats() { + cache.displayStats(); + } + + @Override + public ChunkGenerator getHandle() { + return generator; + } +} 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 new file mode 100644 index 000000000..65ec22654 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomProtoWorld.java @@ -0,0 +1,111 @@ +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.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; + private final int x; + private final int z; + private final TerraMinestomWorld world; + private final Setter modifier; + + public MinestomProtoWorld(GeneratedChunkCache cache, int x, int z, TerraMinestomWorld world, Setter modifier) { + this.cache = cache; + this.x = x; + this.z = z; + this.world = world; + this.modifier = modifier; + } + + @Override + public int centerChunkX() { + return x; + } + + @Override + public int centerChunkZ() { + return z; + } + + @Override + public ServerWorld getWorld() { + return world; + } + + @Override + public void setBlockState(int x, int y, int z, BlockState data, boolean physics) { + modifier.setBlock(x, y, z, (Block) data.getHandle()); + } + + @Override + public Entity spawnEntity(double x, double y, double z, EntityType entityType) { + TerraMinestomWorld world = this.world; + DeferredMinestomEntity entity = new DeferredMinestomEntity(x, y, z, entityType, world); + world.enqueue(entity.pos(), (chunk) -> entity.spawn()); + return entity; + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + int chunkX = x >> 4; + int chunkZ = z >> 4; + CachedChunk chunk = cache.at(chunkX, chunkZ); + return chunk.getBlock(x & 15, y, z & 15); + } + + @Override + public BlockEntity getBlockEntity(int x, int y, int z) { + return world.getBlockEntity(x, y, z); + } + + @Override + public ChunkGenerator getGenerator() { + return world.getGenerator(); + } + + @Override + public BiomeProvider getBiomeProvider() { + return world.getBiomeProvider(); + } + + @Override + public ConfigPack getPack() { + return world.getPack(); + } + + @Override + public long getSeed() { + return world.getSeed(); + } + + @Override + public int getMaxHeight() { + return world.getMaxHeight(); + } + + @Override + public int getMinHeight() { + return world.getMinHeight(); + } + + @Override + public Object getHandle() { + return world; + } +} 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 new file mode 100644 index 000000000..98429ab6d --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomWorldHandle.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.minestom.world; + +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); + + @Override + public @NotNull BlockState createBlockState(@NotNull String data) { + return new MinestomBlockState(data); + } + + @Override + public @NotNull BlockState air() { + return AIR; + } + + @Override + public @NotNull EntityType getEntity(@NotNull String id) { + return new MinestomEntityType(id); + } +} 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 new file mode 100644 index 000000000..4f4aef091 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorld.java @@ -0,0 +1,130 @@ +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; +import net.minestom.server.instance.Instance; +import net.minestom.server.instance.block.Block; +import net.minestom.server.world.DimensionType; + +import java.util.function.Consumer; + + +public final class TerraMinestomWorld implements ServerWorld, WorldProperties { + private final Instance instance; + private final ConfigPack pack; + private final long seed; + private final DimensionType dimensionType; + private final MinestomChunkGeneratorWrapper wrapper; + private final EntityFactory entityFactory; + private final BlockEntityFactory blockEntityFactory; + + public TerraMinestomWorld(Instance instance, ConfigPack pack, long seed, EntityFactory entityFactory, + BlockEntityFactory blockEntityFactory) { + this.instance = instance; + this.pack = pack; + this.seed = seed; + + this.dimensionType = MinecraftServer.getDimensionTypeRegistry().get(instance.getDimensionType()); + this.blockEntityFactory = blockEntityFactory; + + this.wrapper = new MinestomChunkGeneratorWrapper(pack.getGeneratorProvider().newInstance(pack), this, pack); + this.entityFactory = entityFactory; + + instance.setGenerator(this.wrapper); + } + + @Override + public Chunk getChunkAt(int x, int z) { + return null; + } + + @Override + public void setBlockState(int x, int y, int z, BlockState data, boolean physics) { + instance.setBlock(x, y, z, (Block) data.getHandle()); + } + + @Override + public Entity spawnEntity(double x, double y, double z, EntityType entityType) { + return MinestomEntity.spawn(x, y, z, entityType, this); + } + + public void displayStats() { + wrapper.displayStats(); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + return new MinestomBlockState(instance.getBlock(x, y, z)); + } + + @Override + public BlockEntity getBlockEntity(int x, int y, int z) { + return blockEntityFactory.createBlockEntity(new BlockVec(x, y, z)); + } + + @Override + public ChunkGenerator getGenerator() { + return wrapper.getGenerator(); + } + + @Override + public BiomeProvider getBiomeProvider() { + return pack.getBiomeProvider(); + } + + @Override + public ConfigPack getPack() { + return pack; + } + + @Override + public long getSeed() { + return seed; + } + + @Override + public int getMaxHeight() { + return dimensionType.maxY(); + } + + @Override + public int getMinHeight() { + return dimensionType.minY(); + } + + @Override + public Instance getHandle() { + return instance; + } + + public DimensionType getDimensionType() { + return dimensionType; + } + + public EntityFactory getEntityFactory() { + return entityFactory; + } + + public void enqueue(Point position, Consumer action) { + instance.loadChunk(position.chunkX(), position.chunkZ()).thenAccept(action); + } +} 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/world/TerraMinestomWorldBuilder.java new file mode 100644 index 000000000..46ae1691c --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorldBuilder.java @@ -0,0 +1,75 @@ +package com.dfsek.terra.minestom.world; + +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; + + +public class TerraMinestomWorldBuilder { + private final Instance instance; + private ConfigPack pack; + private long seed = new Random().nextLong(); + private EntityFactory entityFactory = new DefaultEntityFactory(); + private BlockEntityFactory blockEntityFactory = new DefaultBlockEntityFactory(); + + private TerraMinestomWorldBuilder(Instance instance) { this.instance = 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(); + + return this; + } + + public TerraMinestomWorldBuilder findPack(Function, ConfigPack> fn) { + this.pack = fn.apply(MinestomPlatform.getInstance().getConfigRegistry()); + return this; + } + + public TerraMinestomWorldBuilder defaultPack() { + return this.packById("OVERWORLD"); + } + + public TerraMinestomWorldBuilder seed(long seed) { + this.seed = seed; + return this; + } + + public TerraMinestomWorldBuilder entityFactory(EntityFactory factory) { + this.entityFactory = factory; + return this; + } + + public TerraMinestomWorldBuilder blockEntityFactory(BlockEntityFactory factory) { + this.blockEntityFactory = factory; + return this; + } + + public TerraMinestomWorld attach() { + return new TerraMinestomWorld(instance, pack, seed, entityFactory, blockEntityFactory); + } +} 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 09681f6b6..47b4299a9 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 @@ -27,8 +27,8 @@ 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 +60,15 @@ 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 -> { + PresetUtil.createDefault(pack, this, configPacksInMetaPack.contains(pack.getID())).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 457566444..8962f585f 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 @@ -29,7 +29,7 @@ public class BiomeParticleConfigTemplate implements ObjectTemplate> { @Override public EntityType get() { - return Registries.ENTITY_TYPE.get(id); + return Registries.ENTITY_TYPE.getEntry(id).orElseThrow().value(); } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/MonsterSettingsConfig.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/MonsterSettingsConfig.java new file mode 100644 index 000000000..4f5740e3c --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/MonsterSettingsConfig.java @@ -0,0 +1,48 @@ +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 com.dfsek.terra.api.util.range.Range; + + +public class MonsterSettingsConfig 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/SpawnEntryTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnEntryTemplate.java index 4fdf390d9..e5b048fba 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnEntryTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnEntryTemplate.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 SpawnEntryTemplate implements ObjectTemplate { @Value("type") @@ -16,16 +18,12 @@ public class SpawnEntryTemplate 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; @Override public SpawnEntry get() { - return new SpawnEntry(type, weight, minGroupSize, maxGroupSize); + return new SpawnEntry(type, weight, groupSize.getMin(), groupSize.getMax()); } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java index 5c49c4d29..68f059335 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java @@ -51,7 +51,7 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties { @Value("climate.precipitation") @Default - private Boolean precipitation = true; + private Boolean precipitation = null; @Value("climate.temperature") @Default 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..e58d22df4 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaWorldProperties.java @@ -0,0 +1,171 @@ +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.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 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 68e7a518f..b4b95416e 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 @@ -15,6 +15,6 @@ public class VillagerTypeTemplate implements ObjectTemplate { @Override public VillagerType get() { - return Registries.VILLAGER_TYPE.get(id); + return Registries.VILLAGER_TYPE.getEntry(id).orElseThrow().value(); } } 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 46f5601de..026758996 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 @@ -35,11 +35,9 @@ import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeAccess; import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.GenerationStep.Carver; 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; @@ -68,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; @@ -95,20 +94,15 @@ 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.getTopY() - 1)); + RegistryEntry registryEntry = region.getBiome(chunkPos.getStartPos().withY(region.getTopYInclusive() - 1)); ChunkRandom chunkRandom = new ChunkRandom(new CheckedRandom(RandomSeed.getSeed())); chunkRandom.setPopulationSeed(region.getSeed(), chunkPos.getStartX(), chunkPos.getStartZ()); SpawnHelper.populateEntities(region, registryEntry, chunkPos, chunkRandom); } } - @Override - public int getWorldHeight() { - return settings.value().generationShapeConfig().height(); - } - @Override public CompletableFuture populateNoise(Blender blender, NoiseConfig noiseConfig, StructureAccessor structureAccessor, Chunk chunk) { @@ -163,23 +157,32 @@ 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) { WorldProperties properties = MinecraftAdapter.adapt(height, SeedHack.getSeed(noiseConfig.getMultiNoiseSampler())); BiomeProvider biomeProvider = pack.getBiomeProvider(); int min = height.getBottomY(); - for(int y = height.getTopY() - 1; y >= min; y--) { + for(int y = height.getTopYInclusive() - 1; y >= min; y--) { if(heightmap .getBlockPredicate() .test((BlockState) delegate.getBlock(properties, x, y, z, biomeProvider))) return y + 1; @@ -192,15 +195,15 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun BlockState[] array = new BlockState[height.getHeight()]; WorldProperties properties = MinecraftAdapter.adapt(height, SeedHack.getSeed(noiseConfig.getMultiNoiseSampler())); BiomeProvider biomeProvider = pack.getBiomeProvider(); - for(int y = height.getTopY() - 1; y >= height.getBottomY(); y--) { + for(int y = height.getTopYInclusive() - 1; y >= height.getBottomY(); y--) { array[y - height.getBottomY()] = (BlockState) delegate.getBlock(properties, x, y, z, biomeProvider); } return new VerticalBlockSample(height.getBottomY(), array); } @Override - public void getDebugHudText(List text, NoiseConfig noiseConfig, BlockPos pos) { - + public void appendDebugHudText(List text, NoiseConfig noiseConfig, BlockPos pos) { + // no op } public ConfigPack getPack() { @@ -215,10 +218,11 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun logger.debug("Loading world with config pack {}", pack.getID()); } + @Override - public void carve(ChunkRegion chunkRegion, long seed, NoiseConfig noiseConfig, BiomeAccess world, StructureAccessor structureAccessor, - Chunk chunk, Carver carverStep) { - // no op + public void carve(ChunkRegion chunkRegion, long seed, NoiseConfig noiseConfig, BiomeAccess biomeAccess, + StructureAccessor structureAccessor, Chunk chunk) { + //no op } @Override @@ -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..97be6fc49 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 @@ -21,6 +21,7 @@ import com.mojang.serialization.MapCodec; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeSource; +import net.minecraft.world.biome.source.util.MultiNoiseUtil; import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,10 +62,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/MinecraftItemHandle.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftItemHandle.java index c9ef02f37..5c34eb82c 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftItemHandle.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftItemHandle.java @@ -24,6 +24,7 @@ import net.minecraft.command.argument.ItemStackArgumentType; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryWrapper.Impl; +import net.minecraft.resource.featuretoggle.FeatureSet; import net.minecraft.util.Identifier; import java.util.Optional; @@ -43,14 +44,19 @@ public class MinecraftItemHandle implements ItemHandle { public Item createItem(String data) { try { return (Item) new ItemStackArgumentType(new CommandRegistryAccess() { + @Override + public FeatureSet getEnabledFeatures() { + return FeatureSet.empty(); + } + @Override public Stream>> streamAllRegistryKeys() { return CommonPlatform.get().getServer().getRegistryManager().streamAllRegistryKeys(); } @Override - public Optional> getOptionalWrapper(RegistryKey> registryRef) { - return Optional.of(CommonPlatform.get().getServer().getRegistryManager().getWrapperOrThrow(registryRef)); + public Optional> getOptional(RegistryKey> registryRef) { + return Optional.of(CommonPlatform.get().getServer().getRegistryManager().getOrThrow(registryRef)); } }).parse(new StringReader(data)).getItem(); } catch(CommandSyntaxException e) { @@ -60,7 +66,7 @@ public class MinecraftItemHandle implements ItemHandle { @Override public Enchantment getEnchantment(String id) { - return (Enchantment) (Object) (CommonPlatform.get().enchantmentRegistry().get(Identifier.tryParse(id))); + return (Enchantment) (Object) (CommonPlatform.get().enchantmentRegistry().getEntry(Identifier.tryParse(id))); } @Override 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 c36744d18..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,14 +41,7 @@ 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.getReadOnlyWrapper(), data, true) + net.minecraft.block.BlockState state = BlockArgumentParser.block(Registries.BLOCK, data, true) .blockState(); if(state == null) throw new IllegalArgumentException("Invalid data: " + data); return (BlockState) state; @@ -64,18 +57,9 @@ 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); - return (EntityType) Registries.ENTITY_TYPE.get(identifier); + return (EntityType) Registries.ENTITY_TYPE.getEntry(identifier).orElseThrow().value(); } } 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..cd096cb82 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/generalize/ServerWorldMixin.java @@ -0,0 +1,62 @@ +package com.dfsek.terra.mod.mixin.generalize; + + +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldGenerationProgressListener; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.random.RandomSequencesState; +import net.minecraft.util.profiler.Profiler; +import net.minecraft.village.raid.RaidManager; +import net.minecraft.world.MutableWorldProperties; +import net.minecraft.world.World; +import net.minecraft.world.dimension.DimensionOptions; +import net.minecraft.world.dimension.DimensionType; +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; +import java.util.function.Supplier; + + +@Mixin(ServerWorld.class) +public abstract class ServerWorldMixin extends World { + public ServerWorldMixin(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, RegistryKey worldKey, DimensionOptions dimensionOptions, WorldGenerationProgressListener worldGenerationProgressListener, 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); + } + + @Redirect(method = "", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/village/raid/RaidManager;nameFor(Lnet/minecraft/registry/entry/RegistryEntry;)" + + "Ljava/lang/String;")) + public String nameForProxy(RegistryEntry dimensionTypeEntry) { + RegistryEntry entry = dimensionTypeEntry; + if(this.getRegistryKey() == World.END) { + Registry dimensionTypeRegistry = getRegistryManager().getOrThrow(RegistryKeys.DIMENSION_TYPE); + entry = dimensionTypeRegistry.getEntry(dimensionTypeRegistry.get(DimensionTypes.THE_NETHER)); + + } + return RaidManager.nameFor(entry); + } +} 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 15e8fab34..5900bbb8f 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 @@ -54,8 +54,8 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity { public abstract void setEntityType(net.minecraft.entity.EntityType entityType, Random random); public EntityType terra$getSpawnedType() { - return (EntityType) Registries.ENTITY_TYPE.get( - Identifier.tryParse(((MobSpawnerLogicAccessor) getLogic()).getSpawnEntry().getNbt().getString("id"))); + return (EntityType) Registries.ENTITY_TYPE.getEntry( + Identifier.tryParse(((MobSpawnerLogicAccessor) getLogic()).getSpawnEntry().getNbt().getString("id"))).orElseThrow(); } public void terra$setSpawnedType(@NotNull EntityType creatureType) { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/PropertyMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/PropertyMixin.java index 4cb1b4858..33f75afe6 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/PropertyMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/PropertyMixin.java @@ -9,6 +9,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import java.util.Collection; +import java.util.List; import com.dfsek.terra.api.block.state.properties.Property; @@ -24,7 +25,7 @@ public abstract class PropertyMixin { private String name; @Shadow - public abstract Collection getValues(); + public abstract List getValues(); @Intrinsic public Collection terra$values() { 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 005822f69..1fa3d19b3 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 @@ -49,9 +49,6 @@ public abstract class WorldChunkMixin { @Nullable public abstract net.minecraft.block.BlockState setBlockState(BlockPos pos, net.minecraft.block.BlockState state, boolean moved); - @Shadow - public abstract TickSchedulers getTickSchedulers(); - public void terra$setBlock(int x, int y, int z, BlockState data, boolean physics) { BlockPos blockPos = new BlockPos(x, y, z); setBlockState(blockPos, (net.minecraft.block.BlockState) data, false); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java index b9a6dd14c..5e5403834 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java @@ -48,6 +48,6 @@ public abstract class ProtoChunkMixin { } public int terra$getMaxHeight() { - return getHeightLimitView().getTopY(); + return getHeightLimitView().getTopYInclusive(); } } 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 0b2f47017..dfe6d8d96 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 @@ -24,7 +24,7 @@ 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.seismic.type.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.mod.util.MinecraftAdapter; @@ -33,7 +33,7 @@ import com.dfsek.terra.mod.util.MinecraftAdapter; @Implements(@Interface(iface = com.dfsek.terra.api.entity.Entity.class, prefix = "terra$")) public abstract class EntityMixin { @Shadow - public net.minecraft.world.World world; + private net.minecraft.world.World world; @Shadow private BlockPos blockPos; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java index 76121f64b..7837c626a 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java @@ -19,7 +19,7 @@ package com.dfsek.terra.mod.mixin.implementations.terra.inventory.item; import net.minecraft.component.ComponentChanges; import net.minecraft.component.ComponentMap; -import net.minecraft.component.ComponentMapImpl; +import net.minecraft.component.MergedComponentMap; import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; @@ -37,7 +37,7 @@ import com.dfsek.terra.api.inventory.item.ItemMeta; public abstract class ItemStackMixin { @Shadow @Final - private ComponentMapImpl components; + private MergedComponentMap components; @Shadow public abstract int getCount(); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java index 70a62ae79..b0ca554a3 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java @@ -18,6 +18,7 @@ package com.dfsek.terra.mod.mixin.implementations.terra.world; import net.minecraft.block.FluidBlock; +import net.minecraft.entity.SpawnReason; import net.minecraft.fluid.Fluid; import net.minecraft.util.collection.BoundedRegionArray; import net.minecraft.util.math.BlockPos; @@ -99,7 +100,7 @@ public abstract class ChunkRegionMixin { } public int terraWorld$getMaxHeight() { - return world.getTopY(); + return world.getTopYInclusive(); } @Intrinsic(displace = true) @@ -125,7 +126,7 @@ public abstract class ChunkRegionMixin { } public Entity terraWorld$spawnEntity(double x, double y, double z, EntityType entityType) { - net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(world); + net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(world, SpawnReason.CHUNK_GENERATION); entity.setPos(x, y, z); ((ChunkRegion) (Object) this).spawnEntity(entity); return (Entity) entity; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java index f9a5bd1ea..d618ee656 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java @@ -17,6 +17,7 @@ package com.dfsek.terra.mod.mixin.implementations.terra.world; +import net.minecraft.entity.SpawnReason; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; import org.spongepowered.asm.mixin.Implements; @@ -42,7 +43,7 @@ import com.dfsek.terra.mod.util.MinecraftUtil; @Implements(@Interface(iface = ServerWorld.class, prefix = "terra$")) public abstract class ServerWorldMixin { public Entity terra$spawnEntity(double x, double y, double z, EntityType entityType) { - net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(null); + net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(null, SpawnReason.CHUNK_GENERATION); entity.setPos(x, y, z); ((net.minecraft.server.world.ServerWorld) (Object) this).spawnEntity(entity); return (Entity) entity; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/invoke/BiomeInvoker.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/invoke/BiomeInvoker.java new file mode 100644 index 000000000..b3aa4792b --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/invoke/BiomeInvoker.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.mod.mixin.invoke; + +import net.minecraft.world.biome.Biome; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + + +@Mixin(Biome.class) +public interface BiomeInvoker { + @Invoker("getDefaultGrassColor") + int invokeGetDefaultGrassColor(); +} 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 680c1833c..0fa4006cc 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 @@ -1,10 +1,16 @@ package com.dfsek.terra.mod.mixin.lifecycle; +import net.minecraft.registry.CombinedDynamicRegistries; import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registry; +import net.minecraft.registry.Registry.PendingTagLoad; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.ReloadableRegistries; +import net.minecraft.registry.ServerDynamicRegistryType; +import net.minecraft.resource.ResourceManager; +import net.minecraft.resource.featuretoggle.FeatureSet; import net.minecraft.server.DataPackContents; +import net.minecraft.server.command.CommandManager; import net.minecraft.world.biome.Biome; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -16,6 +22,12 @@ 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; + @Mixin(DataPackContents.class) public class DataPackContentsMixin { @@ -26,12 +38,17 @@ public class DataPackContentsMixin { /* * #refresh populates all tags in the registries */ - @Inject(method = "refresh()V", at = @At("RETURN")) - private void injectReload(CallbackInfo ci) { - DynamicRegistryManager.Immutable dynamicRegistryManager = this.reloadableRegistries.getRegistryManager(); - TagUtil.registerWorldPresetTags(dynamicRegistryManager.get(RegistryKeys.WORLD_PRESET)); + @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, + CommandManager.RegistrationEnvironment environment, int functionPermissionLevel, + Executor prepareExecutor, + Executor applyExecutor, CallbackInfoReturnable> cir) { + DynamicRegistryManager.Immutable dynamicRegistryManager = dynamicRegistries.getCombinedRegistryManager(); + TagUtil.registerWorldPresetTags(dynamicRegistryManager.getOrThrow(RegistryKeys.WORLD_PRESET)); - Registry biomeRegistry = dynamicRegistryManager.get(RegistryKeys.BIOME); + Registry biomeRegistry = dynamicRegistryManager.getOrThrow(RegistryKeys.BIOME); TagUtil.registerBiomeTags(biomeRegistry); MinecraftUtil.registerFlora(biomeRegistry); } 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 new file mode 100644 index 000000000..a5b406bf7 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/BiomeUtil.java @@ -0,0 +1,98 @@ +package com.dfsek.terra.mod.util; + +import net.minecraft.registry.Registries; +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 java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +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 { + public static final Map> + TERRA_BIOME_MAP = new HashMap<>(); + + public static Biome createBiome(Biome vanilla, VanillaBiomeProperties vanillaBiomeProperties) { + BiomeEffects.Builder effects = new BiomeEffects.Builder(); + + net.minecraft.world.biome.Biome.Builder builder = new Builder(); + + effects.waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor())) + .waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor())) + .fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor())) + .skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor())) + .grassColorModifier( + Objects.requireNonNullElse(vanillaBiomeProperties.getGrassColorModifier(), vanilla.getEffects().getGrassColorModifier())) + .grassColor(Objects.requireNonNullElse(vanillaBiomeProperties.getGrassColor(), + vanilla.getEffects().getGrassColor().orElseGet(() -> ((BiomeInvoker) ((Object) vanilla)).invokeGetDefaultGrassColor()))) + .foliageColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFoliageColor(), vanilla.getFoliageColor())); + + if(vanillaBiomeProperties.getParticleConfig() == null) { + vanilla.getEffects().getParticleConfig().ifPresent(effects::particleConfig); + } else { + effects.particleConfig(vanillaBiomeProperties.getParticleConfig()); + } + + if(vanillaBiomeProperties.getLoopSound() == null) { + vanilla.getEffects().getLoopSound().ifPresent(effects::loopSound); + } else { + effects.loopSound(Registries.SOUND_EVENT.getEntry(vanillaBiomeProperties.getLoopSound())); + } + + if(vanillaBiomeProperties.getMoodSound() == null) { + vanilla.getEffects().getMoodSound().ifPresent(effects::moodSound); + } else { + effects.moodSound(vanillaBiomeProperties.getMoodSound()); + } + + if(vanillaBiomeProperties.getAdditionsSound() == null) { + vanilla.getEffects().getAdditionsSound().ifPresent(effects::additionsSound); + } else { + effects.additionsSound(vanillaBiomeProperties.getAdditionsSound()); + } + + if(vanillaBiomeProperties.getMusic() == null) { + vanilla.getEffects().getMusic().ifPresent(effects::music); + } else { + effects.music(vanillaBiomeProperties.getMusic()); + } + + builder.precipitation(Objects.requireNonNullElse(vanillaBiomeProperties.getPrecipitation(), vanilla.hasPrecipitation())); + + builder.temperature(Objects.requireNonNullElse(vanillaBiomeProperties.getTemperature(), vanilla.getTemperature())); + + builder.downfall(Objects.requireNonNullElse(vanillaBiomeProperties.getDownfall(), + ((BiomeAccessor) ((Object) vanilla)).getWeather().downfall())); + + builder.temperatureModifier(Objects.requireNonNullElse(vanillaBiomeProperties.getTemperatureModifier(), + ((BiomeAccessor) ((Object) vanilla)).getWeather().temperatureModifier())); + + builder.spawnSettings(Objects.requireNonNullElse(vanillaBiomeProperties.getSpawnSettings(), vanilla.getSpawnSettings())); + + return builder + .effects(effects.build()) + .generationSettings(new GenerationSettings.Builder().build()) + .build(); + } + + public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) { + return pack.getID() + .toLowerCase() + "/" + biomeID.getNamespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); + } + + public static Map> getTerraBiomeMap() { + return Map.copyOf(TERRA_BIOME_MAP); + } +} 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..34b6f44bc --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/DimensionUtil.java @@ -0,0 +1,73 @@ +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(), + 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 25ca7e4c5..24ab38971 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 @@ -18,9 +18,12 @@ package com.dfsek.terra.mod.util; 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.seismic.type.vector.Vector3; import com.dfsek.terra.api.world.info.WorldProperties; @@ -39,7 +42,7 @@ public final class MinecraftAdapter { @Override public int getMaxHeight() { - return height.getTopY(); + return height.getTopYInclusive(); } @Override @@ -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 692d0da5a..cef3c33c5 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,24 +25,25 @@ 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; public final class MinecraftUtil { public static final Logger logger = LoggerFactory.getLogger(MinecraftUtil.class); - public static final Map> - TERRA_BIOME_MAP = new HashMap<>(); private MinecraftUtil() { } public static Optional> getEntry(Registry registry, Identifier identifier) { - return registry.getOrEmpty(identifier) - .flatMap(registry::getKey) - .flatMap(registry::getEntry); + return registry.getOptionalValue(identifier) + .flatMap(id -> Optional.ofNullable(registry.getEntry(id))); } public static BlockEntity createState(WorldAccess worldAccess, BlockPos pos) { @@ -63,117 +58,57 @@ public final class MinecraftUtil { return null; } - public static void registerFlora(Registry biomes) { + 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 void registerFlora(Registry biomeRegistry) { logger.info("Injecting flora into Terra biomes..."); - TERRA_BIOME_MAP - .forEach((vb, terraBiomes) -> - biomes.getOrEmpty(vb) - .ifPresentOrElse(vanilla -> terraBiomes - .forEach(tb -> biomes.getOrEmpty(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))); - + 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); + }); + } + }); } - public static Map> getTerraBiomeMap() { - return Map.copyOf(TERRA_BIOME_MAP); + 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 registerKey(Identifier identifier) { + public static RegistryKey registerBiomeKey(Identifier identifier) { return RegistryKey.of(RegistryKeys.BIOME, identifier); } - public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla, - VanillaBiomeProperties vanillaBiomeProperties) { - GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); - - BiomeEffects.Builder effects = new BiomeEffects.Builder(); - - net.minecraft.world.biome.Biome.Builder builder = new Builder(); - - effects.waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor())) - .waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor())) - .fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor())) - .skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor())) - .grassColorModifier( - Objects.requireNonNullElse(vanillaBiomeProperties.getGrassColorModifier(), - vanilla.getEffects().getGrassColorModifier())); - - if(vanillaBiomeProperties.getFoliageColor() == null) { - vanilla.getEffects().getFoliageColor().ifPresent(effects::foliageColor); - } else { - effects.foliageColor(vanillaBiomeProperties.getFoliageColor()); - } - - if(vanillaBiomeProperties.getGrassColor() == null) { - vanilla.getEffects().getGrassColor().ifPresent(effects::grassColor); - } else { - effects.grassColor(vanillaBiomeProperties.getGrassColor()); - } - - if(vanillaBiomeProperties.getParticleConfig() == null) { - vanilla.getEffects().getParticleConfig().ifPresent(effects::particleConfig); - } else { - effects.particleConfig(vanillaBiomeProperties.getParticleConfig()); - } - - if(vanillaBiomeProperties.getLoopSound() == null) { - vanilla.getEffects().getLoopSound().ifPresent(effects::loopSound); - } else { - effects.loopSound(Registries.SOUND_EVENT.getEntry(vanillaBiomeProperties.getLoopSound())); - } - - if(vanillaBiomeProperties.getMoodSound() == null) { - vanilla.getEffects().getMoodSound().ifPresent(effects::moodSound); - } else { - effects.moodSound(vanillaBiomeProperties.getMoodSound()); - } - - if(vanillaBiomeProperties.getAdditionsSound() == null) { - vanilla.getEffects().getAdditionsSound().ifPresent(effects::additionsSound); - } else { - effects.additionsSound(vanillaBiomeProperties.getAdditionsSound()); - } - - if(vanillaBiomeProperties.getMusic() == null) { - vanilla.getEffects().getMusic().ifPresent(effects::music); - } else { - effects.music(vanillaBiomeProperties.getMusic()); - } - - builder.precipitation(Objects.requireNonNullElse(vanillaBiomeProperties.getPrecipitation(), vanilla.hasPrecipitation())); - - builder.temperature(Objects.requireNonNullElse(vanillaBiomeProperties.getTemperature(), vanilla.getTemperature())); - - builder.downfall(Objects.requireNonNullElse(vanillaBiomeProperties.getDownfall(), - ((BiomeAccessor) ((Object) vanilla)).getWeather().downfall())); - - builder.temperatureModifier(Objects.requireNonNullElse(vanillaBiomeProperties.getTemperatureModifier(), - ((BiomeAccessor) ((Object) vanilla)).getWeather().temperatureModifier())); - - builder.spawnSettings(Objects.requireNonNullElse(vanillaBiomeProperties.getSpawnSettings(), vanilla.getSpawnSettings())); - - return builder - .effects(effects.build()) - .generationSettings(generationSettings.build()) - .build(); - } - - public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) { - return pack.getID() - .toLowerCase() + "/" + biomeID.getNamespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); + 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 32c19a405..f18c93632 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,73 +21,173 @@ 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.range.ConstantRange; import com.dfsek.terra.api.util.generic.pair.Pair; 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) { Registry dimensionTypeRegistry = platform.dimensionTypeRegistry(); Registry chunkGeneratorSettingsRegistry = platform.chunkGeneratorSettingsRegistry(); Registry multiNoiseBiomeSourceParameterLists = platform.multiNoiseBiomeSourceParameterListRegistry(); - RegistryEntry overworldDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.OVERWORLD).orElseThrow(); - RegistryEntry overworld = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.OVERWORLD) - .orElseThrow(); - - 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(DimensionTypes.THE_NETHER).orElseThrow(); - RegistryEntry.Reference reference = multiNoiseBiomeSourceParameterLists.getEntry( - MultiNoiseBiomeSourceParameterLists.NETHER).orElseThrow(); - RegistryEntry registryEntry2 = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER) - .orElseThrow(); + HashMap, DimensionOptions> dimensionMap = new HashMap<>(); - RegistryEntry registryEntry3 = dimensionTypeRegistry.getEntry(DimensionTypes.THE_END).orElseThrow(); - RegistryEntry registryEntry4 = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.END) - .orElseThrow(); + insertCustom(platform, "minecraft:overworld", pack, dimensionTypeRegistry, chunkGeneratorSettingsRegistry, dimensionMap); - 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().getReadOnlyWrapper()), 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); + }); + + 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) { + 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; + + DimensionType dimensionType = DimensionUtil.createDimension(vanillaWorldProperties, defaultDimension, platform); + RegistryKey dimensionTypeRegistryKey = MinecraftUtil.registerDimensionTypeKey( + Identifier.of("terra", pack.getID().toLowerCase( + Locale.ROOT))); + + Registry.registerReference(dimensionTypeRegistry, dimensionTypeRegistryKey, dimensionType); + + 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 36ed6afea..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 @@ -1,8 +1,8 @@ package com.dfsek.terra.mod.util; -import com.google.common.collect.ImmutableMap; import net.minecraft.registry.Registry; import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.tag.TagGroupLoader.RegistryTags; import net.minecraft.registry.tag.TagKey; import net.minecraft.registry.tag.WorldPresetTags; import net.minecraft.world.biome.Biome; @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public final class TagUtil { @@ -24,37 +25,44 @@ public final class TagUtil { } private static Map, List>> tagsToMutableMap(Registry registry) { - return registry - .streamTagsAndEntries() - .collect(HashMap::new, - (map, pair) -> - map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())), - HashMap::putAll); + return registry.streamTags().collect(HashMap::new, + (map, tag) -> map.put(tag.getTag(), tag.stream().collect(Collectors.toList())), + HashMap::putAll); } 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.clearTags(); - registry.populateTags(ImmutableMap.copyOf(collect)); + registry.startTagReload(new RegistryTags<>(registry.getKey(), collect)).apply(); + + + if(logger.isDebugEnabled()) { + registry.streamEntries() + .map(e -> e.registryKey().getValue() + ": " + + e.streamTags().reduce("", (s, t) -> t.id() + ", " + s, String::concat)) + .forEach(logger::debug); + } } public static void registerBiomeTags(Registry registry) { logger.info("Doing biome tag garbage...."); Map, List>> collect = tagsToMutableMap(registry); - MinecraftUtil + BiomeUtil .getTerraBiomeMap() .forEach((vb, terraBiomes) -> MinecraftUtil @@ -90,8 +98,7 @@ public final class TagUtil { tb))), () -> logger.error("No vanilla biome: {}", vb))); - registry.clearTags(); - registry.populateTags(ImmutableMap.copyOf(collect)); + registry.startTagReload(new RegistryTags<>(registry.getKey(), collect)).apply(); if(logger.isDebugEnabled()) { registry.streamEntries() 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 e25cb7da4..2b1d1de15 100644 --- a/platforms/mixin-common/src/main/resources/terra.common.mixins.json +++ b/platforms/mixin-common/src/main/resources/terra.common.mixins.json @@ -10,7 +10,7 @@ "access.StructureAccessorAccessor", "access.VillagerTypeAccessor", "fix.BeeMoveGoalsUnsynchronizedRandomAccessFix", - "fix.NetherFossilOptimization", + "generalize.ServerWorldMixin", "implementations.compat.GenerationSettingsFloraFeaturesMixin", "implementations.terra.BiomeMixin", "implementations.terra.HandleImplementationMixin", @@ -36,6 +36,7 @@ "implementations.terra.inventory.meta.ItemStackMetaMixin", "implementations.terra.world.ChunkRegionMixin", "implementations.terra.world.ServerWorldMixin", + "invoke.BiomeInvoker", "invoke.FluidBlockInvoker", "lifecycle.DataPackContentsMixin" ], diff --git a/platforms/mixin-lifecycle/build.gradle.kts b/platforms/mixin-lifecycle/build.gradle.kts index b7d209b7f..35461fc0a 100644 --- a/platforms/mixin-lifecycle/build.gradle.kts +++ b/platforms/mixin-lifecycle/build.gradle.kts @@ -15,7 +15,7 @@ dependencies { minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}") mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2") - modImplementation("org.incendo", "cloud-fabric", Versions.Libraries.cloudFabric) { + modImplementation("org.incendo", "cloud-fabric", Versions.Fabric.cloud) { exclude("net.fabricmc") exclude("net.fabricmc.fabric-api") } 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 391842311..552a36f0b 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,8 +3,12 @@ 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.enchantment.Enchantment; +import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; @@ -23,7 +27,7 @@ import java.util.stream.Stream; import com.dfsek.terra.addon.EphemeralAddon; import com.dfsek.terra.api.addon.BaseAddon; -import com.dfsek.terra.lifecycle.util.BiomeUtil; +import com.dfsek.terra.lifecycle.util.LifecycleBiomeUtil; import com.dfsek.terra.mod.CommonPlatform; import com.dfsek.terra.mod.ModPlatform; import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; @@ -36,9 +40,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("ca.spottedleaf.moonrise.common.util.MoonriseCommon", "WORKER_THREADS", "Moonrise"); + } if (generationThreads == 0) { + generationThreads = 1; + } CommonPlatform.initialize(this); load(); } @@ -55,6 +67,10 @@ 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() { return server; @@ -67,12 +83,10 @@ 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) { - BiomeUtil.registerBiomes(server.getRegistryManager().get(RegistryKeys.BIOME)); + LifecycleBiomeUtil.registerBiomes(server.getRegistryManager().getOrThrow(RegistryKeys.BIOME)); server.reloadResources(server.getDataPackManager().getEnabledIds()).exceptionally(throwable -> { LOGGER.warn("Failed to execute reload", throwable); return null; diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/CreateWorldScreenMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/CreateWorldScreenMixin.java new file mode 100644 index 000000000..61f385939 --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/CreateWorldScreenMixin.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.lifecycle.mixin.lifecycle; + + +import com.dfsek.terra.api.Platform; + +import com.dfsek.terra.mod.CommonPlatform; + +import com.dfsek.terra.mod.ModPlatform; + +import net.minecraft.client.gui.screen.world.CreateWorldScreen; +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.CallbackInfo; + +import static com.dfsek.terra.lifecycle.util.LifecycleUtil.initialized; + + +@Mixin(CreateWorldScreen.class) +public class CreateWorldScreenMixin { + @Inject(method = "onCloseScreen()V", at = @At("HEAD")) + public void onClose(CallbackInfo ci) { + ModPlatform platform = CommonPlatform.get(); + platform.getRawConfigRegistry().clear(); + initialized = false; + } +} 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 0f04c0963..2526079ed 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,5 +1,8 @@ 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; @@ -34,6 +37,8 @@ public class MinecraftServerMixin { @Inject(method = "shutdown()V", at = @At("RETURN")) private void injectShutdown(CallbackInfo ci) { + ModPlatform platform = CommonPlatform.get(); + platform.getRawConfigRegistry().clear(); initialized = false; } } 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 739c084f3..c04e0fad7 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 @@ -39,8 +39,7 @@ public class RegistryLoaderMixin { private static Logger LOGGER; @Redirect( - method = "load(Lnet/minecraft/registry/RegistryLoader$RegistryLoadable;Lnet/minecraft/registry/DynamicRegistryManager;" + - "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", 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 89490ef41..98aa4d27f 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 @@ -1,7 +1,8 @@ package com.dfsek.terra.lifecycle.mixin.lifecycle; -import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.CombinedDynamicRegistries; import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.ServerDynamicRegistryType; import net.minecraft.server.SaveLoading; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -18,13 +19,11 @@ public class SaveLoadingMixin { "Ljava/util/concurrent/CompletableFuture;", at = @At( value = "INVOKE", - target = "Lnet/minecraft/registry/RegistryLoader;loadFromResource(Lnet/minecraft/resource/ResourceManager;" + - "Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)" + - "Lnet/minecraft/registry/DynamicRegistryManager$Immutable;"), + 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 DynamicRegistryManager grabManager(DynamicRegistryManager registryManager) { - MinecraftUtil.registerFlora(registryManager.get(RegistryKeys.BIOME)); - return registryManager; + 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/BiomeUtil.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleBiomeUtil.java similarity index 83% rename from platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java rename to platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleBiomeUtil.java index b32e12935..a408d6844 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleBiomeUtil.java @@ -1,5 +1,7 @@ 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; @@ -22,10 +24,10 @@ import com.dfsek.terra.mod.mixin.access.VillagerTypeAccessor; import com.dfsek.terra.mod.util.MinecraftUtil; -public final class BiomeUtil { - private static final Logger logger = LoggerFactory.getLogger(BiomeUtil.class); +public final class LifecycleBiomeUtil { + private static final Logger logger = LoggerFactory.getLogger(LifecycleBiomeUtil.class); - private BiomeUtil() { + private LifecycleBiomeUtil() { } @@ -51,21 +53,21 @@ public final class BiomeUtil { if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) { - ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(registry.getEntry(vanilla).orElseThrow()); + ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(registry.getEntry(registry.get(vanilla))); } else { VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); - net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, Objects.requireNonNull(registry.get(vanilla)), + net.minecraft.world.biome.Biome minecraftBiome = BiomeUtil.createBiome(Objects.requireNonNull(registry.get(vanilla)), vanillaBiomeProperties); - Identifier identifier = Identifier.of("terra", MinecraftUtil.createBiomeID(pack, id)); + Identifier identifier = Identifier.of("terra", BiomeUtil.createBiomeID(pack, id)); if(registry.containsId(identifier)) { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(MinecraftUtil.getEntry(registry, identifier) .orElseThrow()); } else { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(Registry.registerReference(registry, - MinecraftUtil.registerKey(identifier) + MinecraftUtil.registerBiomeKey(identifier) .getValue(), minecraftBiome)); } @@ -76,7 +78,7 @@ public final class BiomeUtil { Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), villagerMap.getOrDefault(vanilla, VillagerType.PLAINS))); - MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier); + BiomeUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier); } } 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 9ba81f864..3ad78901b 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 @@ -20,7 +20,7 @@ public final class LifecycleUtil { public static void initialize(MutableRegistry biomeMutableRegistry, MutableRegistry worldPresetMutableRegistry) { CommonPlatform.get().getEventManager().callEvent(new PlatformInitializationEvent()); - BiomeUtil.registerBiomes(biomeMutableRegistry); + LifecycleBiomeUtil.registerBiomes(biomeMutableRegistry); CommonPlatform.get().registerWorldTypes( (id, preset) -> Registry.register(worldPresetMutableRegistry, RegistryKey.of(RegistryKeys.WORLD_PRESET, id), preset)); } 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 2e4708bd4..0646899cf 100644 --- a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -1,23 +1,24 @@ { - "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" - ], - "client": [ - ], - "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" + ], + "client": [ + "lifecycle.CreateWorldScreenMixin" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "terra.lifecycle.refmap.json" } \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index c5bed6f73..86bb41bfb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -21,6 +21,7 @@ includeImmediateChildren(file("platforms"), "platform") includeImmediateChildren(file("platforms/bukkit/nms"), "Bukkit NMS") include(":platforms:bukkit:common") +include(":platforms:minestom:example") pluginManagement { repositories {