From f8a602790a72c1ec14bf65f6ad5a565ed72b88cf Mon Sep 17 00:00:00 2001 From: Browsit <80560008+Browsit@users.noreply.github.com> Date: Wed, 20 Jul 2022 08:28:58 -0400 Subject: [PATCH 001/161] Update BUG_REPORT.md --- .github/ISSUE_TEMPLATE/BUG_REPORT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/BUG_REPORT.md b/.github/ISSUE_TEMPLATE/BUG_REPORT.md index d074cff47..e5c4b0d4a 100644 --- a/.github/ISSUE_TEMPLATE/BUG_REPORT.md +++ b/.github/ISSUE_TEMPLATE/BUG_REPORT.md @@ -43,7 +43,7 @@ assignees: "" is Terra that is causing the issue. - [ ] I have checked that this is an issue with Terra and not an issue with the pack I am using. - + - [ ] I have attached a copy of the `latest.log` file - [ ] I have filled out and provided all the appropriate information. From 43adf056c39cc4e49b2f2542f5bf794454915261 Mon Sep 17 00:00:00 2001 From: Browsit <80560008+Browsit@users.noreply.github.com> Date: Wed, 20 Jul 2022 22:27:22 -0400 Subject: [PATCH 002/161] Fix type mismatch Just pulled the master branch and got the error: `C:\Users\{owner}\IdeaProjects\Terra\buildSrc\src\main\kotlin\DistributionConfig.kt: (49, 39): Type mismatch: inferred type is Path! but URI! was expected` --- buildSrc/src/main/kotlin/DistributionConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/DistributionConfig.kt b/buildSrc/src/main/kotlin/DistributionConfig.kt index 6c743e9e8..2cc7cab02 100644 --- a/buildSrc/src/main/kotlin/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/DistributionConfig.kt @@ -44,7 +44,7 @@ fun Project.configureDistribution() { doLast { // https://github.com/johnrengelman/shadow/issues/111 - val dest = tasks.named("shadowJar").get().archiveFile.get().asFile.toPath() + val dest = tasks.named("shadowJar").get().archiveFile.get().asFile.toURI() FileSystems.newFileSystem(dest, mapOf("create" to "false"), null).use { fs -> forSubProjects(":common:addons") { From 829696ccc82dabf7e4da33c47c844af089ed4852 Mon Sep 17 00:00:00 2001 From: Browsit <80560008+Browsit@users.noreply.github.com> Date: Thu, 21 Jul 2022 02:35:38 -0400 Subject: [PATCH 003/161] Use jar URI prefix Fixes `Path component should be '/'` on Windows --- buildSrc/src/main/kotlin/DistributionConfig.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/DistributionConfig.kt b/buildSrc/src/main/kotlin/DistributionConfig.kt index 2cc7cab02..24750233f 100644 --- a/buildSrc/src/main/kotlin/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/DistributionConfig.kt @@ -1,6 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import java.io.File import java.io.FileWriter +import java.net.URI import java.net.URL import java.nio.file.FileSystems import java.nio.file.Files @@ -44,7 +45,7 @@ fun Project.configureDistribution() { doLast { // https://github.com/johnrengelman/shadow/issues/111 - val dest = tasks.named("shadowJar").get().archiveFile.get().asFile.toURI() + val dest = URI.create("jar:" + tasks.named("shadowJar").get().archiveFile.get().asFile.toURI()) FileSystems.newFileSystem(dest, mapOf("create" to "false"), null).use { fs -> forSubProjects(":common:addons") { From befc0c66368c6e4d140d7036901fa0f0a28543a0 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Tue, 6 Sep 2022 10:15:01 -0400 Subject: [PATCH 004/161] Fix an oopsie in the code of conduct with weird list formatting --- CODE_OF_CONDUCT.md | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index d0f7e32c0..f6c1d9b1f 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -318,8 +318,7 @@ members: - discord: [@solonovamax#6983](https://discord.com/channels/@me/566146322273402881)* - github: [@solonovamax](https://github.com/solonovamax) - - - email: [solonovamax@12oclockpoint.com](mailto:solonovamax@12oclockpoint.com) + - email: [solonovamax@12oclockpoint.com](mailto:solonovamax@12oclockpoint.com) - dfsek - discord: [@dfsek#4208](https://discord.com/channels/@me/378350362236682240)* @@ -401,32 +400,27 @@ issue on this github repo, or contact a member of the global moderation team. ## License and Attribution This set of guidelines is distributed under a -[Creative Commons Attribution-ShareAlike license](https://creativecommons.org/licenses/by-sa/3.0/) -. +[Creative Commons Attribution-ShareAlike license](https://creativecommons.org/licenses/by-sa/3.0/). These guidelines have been adapted from -[Mozilla's Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/) -, which were adapted from: +[Mozilla's Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/), +which were adapted from: - Mozilla's original Community Participation Guidelines - The [Ubuntu Code of Conduct](https://ubuntu.com/community/code-of-conduct) -- +- Mozilla's [View Source Conference Code of Conduct](https://viewsourceconf.org/berlin-2016/code-of-conduct/) +- The [Rust Language Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct) -Mozilla's [View Source Conference Code of Conduct](https://viewsourceconf.org/berlin-2016/code-of-conduct/) +which in turn were based on +[Stumptown Syndicate's Citizen Code of Conduct](http://citizencodeofconduct.org/), +along with some adapted text from the +[LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) +and the +[WisCon code of conduct](http://wiscon.net/policies/anti-harassment/code-of-conduct/). -- And - the [Rust Language Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct) - -which in turn were based -on [Stumptown Syndicate's Citizen Code of Conduct](http://citizencodeofconduct.org/) -, along with some adapted text from -the [LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) and -the [WisCon code of conduct](http://wiscon.net/policies/anti-harassment/code-of-conduct/) -. - -It was then modified by solonovamax with various inclusions from -the [LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) and -a few other sources. +It was then modified by solonovamax with various inclusions from the +[LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) +and several other sources. ## Notes @@ -443,7 +437,6 @@ people are not comfortable using [neopronouns](https://www.mypronouns.org/neopronouns). But if someone refuses to use your more common pronouns, you should report them to us. Additionally, you may not ask people to use unreasonable pronouns, such as ' -acab/acabself', 'that/bitch', 'ur/mom', or -'dream/dreamself' (pronouns related to real people, eg. the minecraft youtuber ' -dreamwastaken'). Doing so will be considered mockery of individuals who use +acab/acabself', 'that/bitch', 'ur/mom', or anything else that may be considered +disrectful. Doing so will be considered mockery of individuals who use non-standard pronouns and is very disrespectful. \ No newline at end of file From f1290b36d804320dfd2c95b2215d372779b019cf Mon Sep 17 00:00:00 2001 From: solonovamax Date: Tue, 6 Sep 2022 10:40:43 -0400 Subject: [PATCH 005/161] Fix more weird list formatting in code of conduct --- CODE_OF_CONDUCT.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f6c1d9b1f..583baa61b 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -315,18 +315,15 @@ Terra has a global moderation team which is currently comprised of the following members: - solonovamax - - - discord: [@solonovamax#6983](https://discord.com/channels/@me/566146322273402881)* + - discord: [@solonovamax#6983](https://discord.com/channels/@me/566146322273402881)* - github: [@solonovamax](https://github.com/solonovamax) - email: [solonovamax@12oclockpoint.com](mailto:solonovamax@12oclockpoint.com) - dfsek - - - discord: [@dfsek#4208](https://discord.com/channels/@me/378350362236682240)* + - discord: [@dfsek#4208](https://discord.com/channels/@me/378350362236682240)* - github: [@dfsek](https://github.com/dfsek) - email: [dfsek@protonmail.com](mailto:dfsek@protonmail.com) - duplex (duplexsystem) - - - discord: [@Duplex#0797](https://discord.com/channels/@me/356822848641171456)* + - discord: [@Duplex#0797](https://discord.com/channels/@me/356822848641171456)* - github: [@duplexsystem](https://github.com/duplexsystem) - email: [duplexsys@protonmail.com](mailto:duplexsys@protonmail.com) From e8fa5514cca97411cf8a1cd657d19b4703b85311 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Tue, 6 Sep 2022 10:42:05 -0400 Subject: [PATCH 006/161] Clean up language in code of conduct's license & attribution section --- CODE_OF_CONDUCT.md | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 583baa61b..98ac590d7 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -399,25 +399,15 @@ issue on this github repo, or contact a member of the global moderation team. This set of guidelines is distributed under a [Creative Commons Attribution-ShareAlike license](https://creativecommons.org/licenses/by-sa/3.0/). -These guidelines have been adapted from -[Mozilla's Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/), -which were adapted from: +These guidelines have been adapted with modifications from the following sources: -- Mozilla's original Community Participation Guidelines +- [Mozilla's Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/) - The [Ubuntu Code of Conduct](https://ubuntu.com/community/code-of-conduct) - Mozilla's [View Source Conference Code of Conduct](https://viewsourceconf.org/berlin-2016/code-of-conduct/) - The [Rust Language Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct) - -which in turn were based on -[Stumptown Syndicate's Citizen Code of Conduct](http://citizencodeofconduct.org/), -along with some adapted text from the -[LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) -and the -[WisCon code of conduct](http://wiscon.net/policies/anti-harassment/code-of-conduct/). - -It was then modified by solonovamax with various inclusions from the -[LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) -and several other sources. +- The [Stumptown Syndicate's Citizen Code of Conduct](http://citizencodeofconduct.org/) +- The [LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) +- The [WisCon code of conduct](http://wiscon.net/policies/anti-harassment/code-of-conduct/) ## Notes From eb9685c734e42b762a7fb3de89fa2c917a0e7255 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 7 Nov 2022 17:31:41 -0700 Subject: [PATCH 007/161] fix #378 --- .../dfsek/terra/bukkit/handles/BukkitWorldHandle.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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 33e2f6708..563a3b66e 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 @@ -52,7 +52,12 @@ public class BukkitWorldHandle implements WorldHandle { @Override public @NotNull EntityType getEntity(@NotNull String id) { if(!id.startsWith("minecraft:")) throw new IllegalArgumentException("Invalid entity identifier " + id); - return new BukkitEntityType(org.bukkit.entity.EntityType.valueOf(id.toUpperCase(Locale.ROOT).substring(10))); + String entityID = id.toUpperCase(Locale.ROOT).substring(10); + + return new BukkitEntityType(switch(entityID) { + case "END_CRYSTAL" -> org.bukkit.entity.EntityType.ENDER_CRYSTAL; + case "ENDER_CRYSTAL" -> throw new IllegalArgumentException("Invalid entity identifier " + id); // make sure this issue can't happen the other way around. + default -> org.bukkit.entity.EntityType.valueOf(entityID); + }); } - } From 1306dad7760061006d1dff2220366799f725a173 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 7 Nov 2022 17:49:49 -0700 Subject: [PATCH 008/161] implement beardification on Bukkit (closes #370) --- .../com/dfsek/terra/bukkit/BukkitAddon.java | 8 +++ .../config/PreLoadCompatibilityOptions.java | 60 +++++++++++++++++++ .../v1_19_R1/NMSChunkGeneratorDelegate.java | 49 ++++++++++++++- .../terra/bukkit/nms/v1_19_R1/Reflection.java | 11 ++++ 4 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/config/PreLoadCompatibilityOptions.java 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 ac215b83e..ee6249eb5 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 @@ -5,8 +5,10 @@ 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; @@ -21,6 +23,12 @@ public class BukkitAddon implements BaseAddon { @Override public void initialize() { + terraBukkitPlugin.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> event.getPack().getContext().put(event.loadTemplate(new PreLoadCompatibilityOptions()))) + .global(); + terraBukkitPlugin.getEventManager() .getHandler(FunctionalEventHandler.class) .register(this, ConfigurationLoadEvent.class) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/config/PreLoadCompatibilityOptions.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/config/PreLoadCompatibilityOptions.java new file mode 100644 index 000000000..c9c4de3f4 --- /dev/null +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/config/PreLoadCompatibilityOptions.java @@ -0,0 +1,60 @@ +/* + * This file is part of Terra. + * + * Terra is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Terra is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Terra. If not, see . + */ + +package com.dfsek.terra.bukkit.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; + + +@SuppressWarnings("FieldMayBeFinal") +public class PreLoadCompatibilityOptions implements ConfigTemplate, Properties { + @Value("minecraft.use-vanilla-biomes") + @Default + private boolean vanillaBiomes = false; + + @Value("minecraft.beard.enable") + @Default + private boolean beard = true; + + @Value("minecraft.beard.threshold") + @Default + private double beardThreshold = 0.5; + + @Value("minecraft.beard.air-threshold") + @Default + private double airThreshold = -0.5; + + public boolean useVanillaBiomes() { + return vanillaBiomes; + } + + public boolean isBeard() { + return beard; + } + + public double getBeardThreshold() { + return beardThreshold; + } + + public double getAirThreshold() { + return airThreshold; + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSChunkGeneratorDelegate.java index 81933be0f..a0ba7e718 100644 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSChunkGeneratorDelegate.java @@ -1,5 +1,9 @@ package com.dfsek.terra.bukkit.nms.v1_19_R1; +import com.dfsek.terra.bukkit.config.PreLoadCompatibilityOptions; + +import com.dfsek.terra.bukkit.world.BukkitWorldProperties; + import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; @@ -10,14 +14,21 @@ import net.minecraft.core.SectionPos; import net.minecraft.server.level.WorldGenRegion; import net.minecraft.util.RandomSource; import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.NoiseColumn; import net.minecraft.world.level.StructureManager; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeManager; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; 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; +import net.minecraft.world.level.levelgen.DensityFunction.FunctionContext; +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; @@ -103,7 +114,43 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { public @NotNull CompletableFuture fillFromNoise(@NotNull Executor executor, @NotNull Blender blender, @NotNull RandomState noiseConfig, @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk) { - return vanilla.fillFromNoise(executor, blender, noiseConfig, structureAccessor, chunk); + return vanilla.fillFromNoise(executor, blender, noiseConfig, structureAccessor, chunk) + .thenApply(c -> { + LevelAccessor level = Reflection.STRUCTURE_MANAGER.getLevel(structureAccessor); + BiomeProvider biomeProvider = pack.getBiomeProvider(); + PreLoadCompatibilityOptions compatibilityOptions = pack.getContext().get(PreLoadCompatibilityOptions.class); + if(compatibilityOptions.isBeard()) { + beard(structureAccessor, chunk, new BukkitWorldProperties(level.getMinecraftWorld().getWorld()), biomeProvider, compatibilityOptions); + } + return c; + }); + } + + private void beard(StructureManager structureAccessor, ChunkAccess chunk, WorldProperties world, BiomeProvider biomeProvider, + PreLoadCompatibilityOptions compatibilityOptions) { + Beardifier structureWeightSampler = Beardifier.forStructuresInChunk(structureAccessor, chunk.getPos()); + double threshold = compatibilityOptions.getBeardThreshold(); + double airThreshold = compatibilityOptions.getAirThreshold(); + int xi = chunk.getPos().x << 4; + int zi = chunk.getPos().z << 4; + for(int x = 0; x < 16; x++) { + for(int z = 0; z < 16; z++) { + int depth = 0; + for(int y = world.getMaxHeight(); y >= world.getMinHeight(); y--) { + double noise = structureWeightSampler.compute(new SinglePointContext(x + xi, y, z + zi)); + if(noise > threshold) { + chunk.setBlockState(new BlockPos(x, y, z), (BlockState) delegate + .getPalette(x + xi, y, z + zi, world, biomeProvider) + .get(depth, x + xi, y, z + zi, world.getSeed()), false); + depth++; + } else if(noise < airThreshold) { + chunk.setBlockState(new BlockPos(x, y, z), Blocks.AIR.defaultBlockState(), false); + } else { + depth = 0; + } + } + } + } } @Override diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Reflection.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Reflection.java index 8fa9a0b01..b704952d5 100644 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Reflection.java +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Reflection.java @@ -1,14 +1,18 @@ package com.dfsek.terra.bukkit.nms.v1_19_R1; import net.minecraft.core.MappedRegistry; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.StructureManager; 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.Proxies; public class Reflection { public static final MappedRegistryProxy MAPPED_REGISTRY; + public static final StructureManagerProxy STRUCTURE_MANAGER; static { ReflectionRemapper reflectionRemapper = ReflectionRemapper.forReobfMappingsInPaperJar(); @@ -16,6 +20,7 @@ public class Reflection { Reflection.class.getClassLoader()); MAPPED_REGISTRY = reflectionProxyFactory.reflectionProxy(MappedRegistryProxy.class); + STRUCTURE_MANAGER = reflectionProxyFactory.reflectionProxy(StructureManagerProxy.class); } @@ -24,4 +29,10 @@ public class Reflection { @FieldSetter("frozen") void setFrozen(MappedRegistry instance, boolean frozen); } + + @Proxies(StructureManager.class) + public interface StructureManagerProxy { + @FieldGetter("level") + LevelAccessor getLevel(StructureManager instance); + } } From 72e5ac76e6ceb7a68c4a03719422128ba8b624f8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 9 Nov 2022 18:48:09 -0700 Subject: [PATCH 009/161] update paper dev bundle to 1.19.2 --- buildSrc/src/main/kotlin/Versions.kt | 3 ++- platforms/bukkit/build.gradle.kts | 4 ++-- platforms/bukkit/nms/v1_19_R1/build.gradle.kts | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 28ca98ca0..80fd1c961 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -50,8 +50,9 @@ object Versions { object Bukkit { const val paper = "1.18.2-R0.1-SNAPSHOT" const val paperLib = "1.0.5" - const val minecraft = "1.19" + const val minecraft = "1.19.2" const val reflectionRemapper = "0.1.0-SNAPSHOT" + const val paperDevBundle = "1.19.2-R0.1-SNAPSHOT" } object Sponge { diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index ee85af57a..f099cb4e3 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -29,11 +29,11 @@ tasks { } runServer { - minecraftVersion("1.19") + minecraftVersion(Versions.Bukkit.minecraft) dependsOn(shadowJar) pluginJars(shadowJar.get().archiveFile) } } -addonDir(project.file("./target/server/paper/plugins/Terra/addons"), tasks.named("runServer").get()) +addonDir(project.file("./run/plugins/Terra/addons"), tasks.named("runServer").get()) diff --git a/platforms/bukkit/nms/v1_19_R1/build.gradle.kts b/platforms/bukkit/nms/v1_19_R1/build.gradle.kts index e40d548dc..96f9038d8 100644 --- a/platforms/bukkit/nms/v1_19_R1/build.gradle.kts +++ b/platforms/bukkit/nms/v1_19_R1/build.gradle.kts @@ -6,7 +6,7 @@ repositories { dependencies { api(project(":platforms:bukkit:common")) - paperDevBundle("1.19-R0.1-SNAPSHOT") + paperDevBundle(Versions.Bukkit.paperDevBundle) implementation("xyz.jpenilla", "reflection-remapper", "0.1.0-SNAPSHOT") } From 547f4884aa5e7b750d150c98a67b9c916821d8c7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 9 Nov 2022 18:52:36 -0700 Subject: [PATCH 010/161] fix beard --- .../bukkit/nms/v1_19_R1/NMSChunkGeneratorDelegate.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSChunkGeneratorDelegate.java index a0ba7e718..c35bae020 100644 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSChunkGeneratorDelegate.java @@ -4,6 +4,8 @@ import com.dfsek.terra.bukkit.config.PreLoadCompatibilityOptions; import com.dfsek.terra.bukkit.world.BukkitWorldProperties; +import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; + import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; @@ -139,9 +141,9 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { for(int y = world.getMaxHeight(); y >= world.getMinHeight(); y--) { double noise = structureWeightSampler.compute(new SinglePointContext(x + xi, y, z + zi)); if(noise > threshold) { - chunk.setBlockState(new BlockPos(x, y, z), (BlockState) delegate + chunk.setBlockState(new BlockPos(x, y, z), ((CraftBlockData) ((BukkitBlockState) delegate .getPalette(x + xi, y, z + zi, world, biomeProvider) - .get(depth, x + xi, y, z + zi, world.getSeed()), false); + .get(depth, x + xi, y, z + zi, world.getSeed())).getHandle()).getState(), false); depth++; } else if(noise < airThreshold) { chunk.setBlockState(new BlockPos(x, y, z), Blocks.AIR.defaultBlockState(), false); From 12845a6004030022d041dde849374952e4515c28 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 15 Nov 2022 19:17:14 -0700 Subject: [PATCH 011/161] update version --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index de1b02560..1d057add0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.2.0")) -versionProjects(":common:implementation", version("6.2.0")) -versionProjects(":platforms", version("6.2.0")) +versionProjects(":common:api", version("6.2.1")) +versionProjects(":common:implementation", version("6.2.1")) +versionProjects(":platforms", version("6.2.1")) allprojects { From 9b75410ea7c462c760ec2fda30d29a3b2ded7e2b Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 15 Nov 2022 21:09:16 -0700 Subject: [PATCH 012/161] configure bukkit resource config properly --- build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle.kts b/build.gradle.kts index 1d057add0..20122663d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -42,6 +42,7 @@ afterEvaluate { forImmediateSubProjects(":platforms") { configureDistribution() } + project(":platforms:bukkit:common").configureDistribution() forSubProjects(":common:addons") { apply(plugin = "com.github.johnrengelman.shadow") From bc324df7caabf96ccc6ae8ebdbae22c0b1f5df14 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 6 Aug 2022 22:15:15 +1000 Subject: [PATCH 013/161] Working state for pipeline implementation --- .../biome/pipeline/BiomePipelineAddon.java | 14 +- .../biome/pipeline/BiomePipelineColumn.java | 4 +- .../config/BiomePipelineTemplate.java | 45 ++-- .../config/BiomeProviderTemplate.java | 37 --- ...teLoader.java => PipelineBiomeLoader.java} | 14 +- .../config/SamplerSourceTemplate.java | 10 +- .../biome/pipeline/config/SourceTemplate.java | 4 +- .../pipeline/config/stage/StageTemplate.java | 2 +- .../stage/expander/ExpanderStageTemplate.java | 9 +- .../mutator/BorderListMutatorTemplate.java | 13 +- .../stage/mutator/BorderMutatorTemplate.java | 11 +- .../mutator/ReplaceListMutatorTemplate.java | 13 +- .../stage/mutator/ReplaceMutatorTemplate.java | 11 +- .../stage/mutator/SmoothMutatorTemplate.java | 7 +- .../pipeline/expand/FractalExpander.java | 27 --- .../pipeline/mutator/BorderListMutator.java | 67 ------ .../biome/pipeline/mutator/BorderMutator.java | 66 ------ .../biome/pipeline/mutator/SmoothMutator.java | 46 ---- .../reimplementation/BiomeChunkImpl.java | 215 ++++++++++++++++++ .../PipelineBiomeProvider.java | 112 +++++++++ .../reimplementation/PipelineImpl.java | 82 +++++++ .../reimplementation/SeededVector.java | 19 ++ .../reimplementation/StringBiome.java | 40 ++++ .../reimplementation/api/BiomeChunk.java | 10 + .../reimplementation/api/Expander.java | 29 +++ .../reimplementation/api/Pipeline.java | 16 ++ .../pipeline/reimplementation/api/Source.java | 11 + .../pipeline/reimplementation/api/Stage.java | 15 ++ .../api/biome/DelegatedBiome.java | 40 ++++ .../api/biome/EphemeralBiomeDelegate.java | 51 +++++ .../api/biome/PipelineBiome.java | 35 +++ .../api/biome/SelfDelegate.java | 40 ++++ .../source/SamplerSource.java | 27 +++ .../reimplementation/source/SingleSource.java | 27 +++ .../stage/expander/DebugExpander.java | 20 ++ .../stage/expander/FractalExpander.java | 37 +++ .../stage/mutators/BorderListMutator.java | 86 +++++++ .../stage/mutators/BorderMutator.java | 81 +++++++ .../stage/mutators}/ReplaceListMutator.java | 42 ++-- .../stage/mutators}/ReplaceMutator.java | 34 +-- .../stage/mutators/SmoothMutator.java | 56 +++++ .../biome/pipeline/source/SamplerSource.java | 33 --- .../biome/pipeline/stages/MutatorStage.java | 3 +- 43 files changed, 1172 insertions(+), 389 deletions(-) delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/{BiomeDelegateLoader.java => PipelineBiomeLoader.java} (62%) delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/BiomeChunkImpl.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineBiomeProvider.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineImpl.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/SeededVector.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/StringBiome.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/BiomeChunk.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Expander.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Pipeline.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Source.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Stage.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/DelegatedBiome.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/EphemeralBiomeDelegate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/PipelineBiome.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/SelfDelegate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/source/SamplerSource.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/source/SingleSource.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/expander/DebugExpander.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/expander/FractalExpander.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderListMutator.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderMutator.java rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{mutator => reimplementation/stage/mutators}/ReplaceListMutator.java (50%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{mutator => reimplementation/stage/mutators}/ReplaceMutator.java (51%) create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/SmoothMutator.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SamplerSource.java 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 42aa95b0e..f57020660 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 @@ -11,10 +11,8 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; 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.config.BiomePipelineTemplate; +import com.dfsek.terra.addons.biome.pipeline.config.PipelineBiomeLoader; import com.dfsek.terra.addons.biome.pipeline.config.SamplerSourceTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.expander.ExpanderStageTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderListMutatorTemplate; @@ -22,7 +20,9 @@ import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderMutatorT 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.reimplementation.api.Source; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; @@ -39,7 +39,7 @@ 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<>() { @@ -63,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); }) @@ -83,7 +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)); }); } } 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 609d22ee1..a66c8da27 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; @@ -17,7 +17,7 @@ class BiomePipelineColumn implements Column { private final int z; private final Biome biome; - protected BiomePipelineColumn(BiomeProvider biomeProvider, int min, int max, int x, int z, long seed) { + public BiomePipelineColumn(BiomeProvider biomeProvider, int min, int max, int x, int z, long seed) { this.min = min; this.max = max; this.x = x; 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 e35d621e2..1324f50e0 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 @@ -10,45 +10,50 @@ 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.reimplementation.PipelineBiomeProvider; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.PipelineImpl; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Source; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; 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 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. - - 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; + 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("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; + @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; + @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, 10), 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 1412485fe..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-2021 Polyhedral Development - * - * The Terra 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/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/PipelineBiomeLoader.java similarity index 62% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeDelegateLoader.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java index c416e4804..5a5e4beb9 100644 --- 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/PipelineBiomeLoader.java @@ -8,25 +8,25 @@ import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; -import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.world.biome.Biome; -public class BiomeDelegateLoader implements TypeLoader { +public class PipelineBiomeLoader implements TypeLoader { private final Registry biomeRegistry; - public BiomeDelegateLoader(Registry biomeRegistry) { + public PipelineBiomeLoader(Registry biomeRegistry) { this.biomeRegistry = biomeRegistry; } @Override - public BiomeDelegate load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) + public PipelineBiome load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) throws LoadException { - if(c.equals("SELF")) return BiomeDelegate.self(); + if(c.equals("SELF")) return PipelineBiome.self(); return biomeRegistry .getByID((String) c) - .map(BiomeDelegate::from) - .orElseGet(() -> BiomeDelegate.ephemeral((String) c)); + .map(PipelineBiome::from) + .orElseGet(() -> PipelineBiome.ephemeral((String) c)); } } 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 index 2ba70b608..8fe5f7310 100644 --- 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 @@ -10,9 +10,9 @@ 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.addons.biome.pipeline.reimplementation.api.Source; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.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; @@ -25,10 +25,10 @@ public class SamplerSourceTemplate extends SourceTemplate { @Value("biomes") @Description("The biomes to be distributed.") - private @Meta ProbabilityCollection<@Meta BiomeDelegate> biomes; + private @Meta ProbabilityCollection<@Meta PipelineBiome> biomes; @Override - public BiomeSource get() { + public Source 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 index c80ec0cee..a7908fa6f 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java @@ -9,9 +9,9 @@ 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; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Source; -public abstract class SourceTemplate implements ObjectTemplate { +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 ba4bee85d..d84756bf4 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 @@ -11,7 +11,7 @@ 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.reimplementation.api.Stage; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; 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 8f66315ef..0693bd6e2 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/expander/ExpanderStageTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/expander/ExpanderStageTemplate.java @@ -7,15 +7,14 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.expander; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; import com.dfsek.terra.addons.biome.pipeline.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.reimplementation.api.Expander; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.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 index fcf523e44..09b126da2 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java @@ -11,11 +11,10 @@ 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.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators.BorderListMutator; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; @@ -29,14 +28,14 @@ public class BorderListMutatorTemplate extends StageTemplate { private @Meta String defaultReplace; @Value("default-to") - private @Meta ProbabilityCollection<@Meta BiomeDelegate> defaultTo; + private @Meta ProbabilityCollection<@Meta PipelineBiome> defaultTo; @Value("replace") - private @Meta Map<@Meta BiomeDelegate, @Meta ProbabilityCollection<@Meta BiomeDelegate>> replace; + private @Meta Map<@Meta PipelineBiome, @Meta ProbabilityCollection<@Meta PipelineBiome>> replace; @Override public Stage get() { - return new MutatorStage(new BorderListMutator(replace, from, defaultReplace, noise, defaultTo)); + return new BorderListMutator(replace, from, defaultReplace, noise, defaultTo); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java index 4db9e4e99..9e2d3530d 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java @@ -9,11 +9,10 @@ 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.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators.BorderMutator; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; @@ -27,10 +26,10 @@ public class BorderMutatorTemplate extends StageTemplate { private @Meta String replace; @Value("to") - private @Meta ProbabilityCollection<@Meta BiomeDelegate> to; + private @Meta ProbabilityCollection<@Meta PipelineBiome> to; @Override public Stage get() { - return new MutatorStage(new BorderMutator(from, replace, noise, to)); + return new BorderMutator(from, replace, noise, to); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java index 5713b3ff0..d30dabb54 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java @@ -11,11 +11,10 @@ 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.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators.ReplaceListMutator; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; @@ -26,13 +25,13 @@ public class ReplaceListMutatorTemplate extends StageTemplate { private @Meta String defaultFrom; @Value("default-to") - private @Meta ProbabilityCollection<@Meta BiomeDelegate> defaultTo; + private @Meta ProbabilityCollection<@Meta PipelineBiome> defaultTo; @Value("to") - private @Meta Map<@Meta BiomeDelegate, @Meta ProbabilityCollection<@Meta BiomeDelegate>> replace; + private @Meta Map<@Meta PipelineBiome, @Meta ProbabilityCollection<@Meta PipelineBiome>> replace; @Override public Stage get() { - return new MutatorStage(new ReplaceListMutator(replace, defaultFrom, defaultTo, noise)); + return new ReplaceListMutator(replace, defaultFrom, defaultTo, noise); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java index dae592e2b..8431ba0e9 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java @@ -9,11 +9,10 @@ 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.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators.ReplaceMutator; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; @@ -24,10 +23,10 @@ public class ReplaceMutatorTemplate extends StageTemplate { private @Meta String from; @Value("to") - private @Meta ProbabilityCollection<@Meta BiomeDelegate> to; + private @Meta ProbabilityCollection<@Meta PipelineBiome> to; @Override public Stage get() { - return new MutatorStage(new ReplaceMutator(from, to, noise)); + return new ReplaceMutator(from, to, noise); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java index b26dce902..6a60c7f2c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java @@ -7,15 +7,14 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; -import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.mutator.SmoothMutator; -import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators.SmoothMutator; public class SmoothMutatorTemplate extends StageTemplate { @Override public Stage get() { - return new MutatorStage(new SmoothMutator(noise)); + return new SmoothMutator(noise); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java deleted file mode 100644 index 50d36a5c4..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-2021 Polyhedral Development - * - * The Terra 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 59f6dd9b4..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-2021 Polyhedral Development - * - * The Terra 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 5755719f4..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-2021 Polyhedral Development - * - * The Terra 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/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 4785216e8..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-2021 Polyhedral Development - * - * The Terra 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/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/BiomeChunkImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/BiomeChunkImpl.java new file mode 100644 index 000000000..36ffe591e --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/BiomeChunkImpl.java @@ -0,0 +1,215 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation; + +import net.jafama.FastMath; + +import java.util.List; + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.BiomeChunk; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Expander; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; + + +public class BiomeChunkImpl implements BiomeChunk { + + private PipelineBiome[][] biomes; + private final SeededVector worldOrigin; + private final int chunkOriginArrayIndex; + + public BiomeChunkImpl(SeededVector worldOrigin, PipelineImpl pipeline) { + + this.worldOrigin = worldOrigin; + this.chunkOriginArrayIndex = pipeline.getChunkOriginArrayIndex(); + + int size = pipeline.getArraySize(); + + int expanderCount = pipeline.getExpanderCount(); + int expansionsApplied = 0; + + // Allocate working arrays + this.biomes = new PipelineBiome[size][size]; + PipelineBiome[][] lookupArray = new PipelineBiome[size][size]; + // A second lookup array is required such that stage application doesn't affect lookups, otherwise application may cascade + + // Construct working grid + int gridOrigin = 0; + int gridInterval = calculateGridInterval(expanderCount, expansionsApplied); + int gridSize = (size / gridInterval); + gridSize += expanderCount > 0 ? 1 : 0; // Add an extra border if expansion occurs + + // Fill working grid with initial cells + for(int gridX = 0; gridX < gridSize; gridX++) { + for(int gridZ = 0; gridZ < gridSize; gridZ++) { + int xIndex = gridOrigin + gridX * gridInterval; + int zIndex = gridOrigin + gridZ * gridInterval; + biomes[xIndex][zIndex] = pipeline.getSource().get(worldOrigin.seed(), xIndexToWorldCoordinate(xIndex), zIndexToWorldCoordinate(zIndex)); + } + } + + for(Stage stage : pipeline.getStages()) { + if(stage instanceof Expander) { + // Shrink working grid size, the expander will fill in null cells (as a result of shrinking the grid) during mutation + expansionsApplied++; + gridInterval = calculateGridInterval(expanderCount, expansionsApplied); + gridSize = expandSize(gridSize); + } + + int stageReadDistance = stage.maxRelativeReadDistance(); + if(stageReadDistance > 0) { + // Discard edges such that adjacent lookups are only ran on valid cells + gridSize = contractBordersFromSize(gridSize, stageReadDistance); + gridOrigin += stageReadDistance * gridInterval; + } + + // Cycle arrays, the previously populated array is swapped to be used for lookups, and the result of the stage application + // overwrites the previous lookup array. This saves having to allocate a new array copy each time + PipelineBiome[][] tempArray = biomes; + biomes = lookupArray; + lookupArray = tempArray; + + // Apply stage to working grid + for(int gridZ = 0; gridZ < gridSize; gridZ = gridZ + 1) { + for(int gridX = 0; gridX < gridSize; gridX = gridX + 1) { + int xIndex = gridOrigin + gridX * gridInterval; + int zIndex = gridOrigin + gridZ * gridInterval; + biomes[xIndex][zIndex] = stage.apply(new ViewPoint(this, gridInterval, gridX, gridZ, xIndex, zIndex, lookupArray)); + } + } + } + } + + @Override + public PipelineBiome get(int xInChunk, int zInChunk) { + int xIndex = xInChunk + chunkOriginArrayIndex; + int zIndex = zInChunk + chunkOriginArrayIndex; + return biomes[xIndex][zIndex]; + } + + private int xIndexToWorldCoordinate(int xIndex) { + return worldOrigin.x() + xIndex - chunkOriginArrayIndex; + } + + private int zIndexToWorldCoordinate(int zIndex) { + return worldOrigin.z() + zIndex - chunkOriginArrayIndex; + } + + protected static int initialSizeToArraySize(int expanderCount, int initialSize) { + int size = initialSize; + for(int i = 0; i < expanderCount; i++) { + size = expandSize(size); + } + return size; + } + + protected static int calculateChunkOriginArrayIndex(int totalExpanderCount, List stages) { + int finalGridOrigin = calculateFinalGridOrigin(totalExpanderCount, stages); + int initialGridInterval = calculateGridInterval(totalExpanderCount, 0); + + // Round the final grid origin up to the nearest multiple of initialGridInterval, such that each + // chunk samples points on the same overall grid. + // Without this, shared chunk borders (required because of adjacent cell reads) will not be identical + // because points would be sampled on grids at different offsets, resulting in artifacts at borders. + return FastMath.ceilToInt((double) finalGridOrigin / initialGridInterval) * initialGridInterval; + } + + private static int calculateFinalGridOrigin(int totalExpanderCount, List stages) { + int gridOrigin = 0; + int expansionsApplied = 0; + int gridInterval = calculateGridInterval(totalExpanderCount, expansionsApplied); + for (Stage stage : stages) { + if (stage instanceof Expander) { + expansionsApplied++; + gridInterval = calculateGridInterval(totalExpanderCount, expansionsApplied); + } + gridOrigin += stage.maxRelativeReadDistance() * gridInterval; + } + return gridOrigin; + } + + protected static int calculateChunkSize(int arraySize, int chunkOriginArrayIndex, int totalExpanderCount) { + return contractBordersFromSize(arraySize, chunkOriginArrayIndex) - (totalExpanderCount > 0 ? 1 : 0); + } + + private static int expandSize(int size) { + return size * 2 - 1; + } + + private static int contractBordersFromSize(int size, int border) { + return size - border * 2; + } + + private static int calculateGridInterval(int totalExpansions, int expansionsApplied) { + return 1 << (totalExpansions - expansionsApplied); + } + + private SeededVector getOrigin() { + return worldOrigin; + } + + /** + * Represents a point on the operating grid within the biomes array + */ + public static class ViewPoint { + private final BiomeChunkImpl chunk; + private final PipelineBiome biome; + private final int gridInterval; + private final int gridX; + private final int gridZ; + private final int xIndex; + private final int zIndex; + private final PipelineBiome[][] lookupArray; + + private ViewPoint(BiomeChunkImpl chunk, int gridInterval, int gridX, int gridZ, int xIndex, int zIndex, PipelineBiome[][] lookupArray) { + this.chunk = chunk; + this.gridInterval = gridInterval; + this.gridX = gridX; + this.gridZ = gridZ; + this.xIndex = xIndex; + this.zIndex = zIndex; + this.lookupArray = lookupArray; + this.biome = lookupArray[xIndex][zIndex]; + } + + public PipelineBiome getRelativeBiome(int x, int z) { + int lookupXIndex = this.xIndex + x * gridInterval; + int lookupZIndex = this.zIndex + z * gridInterval; + return lookupArray[lookupXIndex][lookupZIndex]; + } + + public PipelineBiome getBiome() { + return biome; + } + + /** + * @return X position of the point relative to the operating grid + */ + public int gridX() { + return gridX; + } + + /** + * @return Z position of the point relative to the operating grid + */ + public int gridZ() { + return gridZ; + } + + /** + * @return X position of the point in the world + */ + public int worldX() { + return chunk.xIndexToWorldCoordinate(xIndex); + } + + /** + * @return Z position of the point in the world + */ + public int worldZ() { + return chunk.zIndexToWorldCoordinate(zIndex); + } + + public long worldSeed() { + return chunk.getOrigin().seed(); + } + } +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineBiomeProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineBiomeProvider.java new file mode 100644 index 000000000..2134f6b7a --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineBiomeProvider.java @@ -0,0 +1,112 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation; + +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; +import net.jafama.FastMath; + +import java.util.Comparator; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.StreamSupport; + +import com.dfsek.terra.addons.biome.pipeline.BiomePipelineColumn; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.BiomeChunk; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Pipeline; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +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 PipelineBiomeProvider implements BiomeProvider { + + private final LoadingCache biomeChunkCache; + private final int chunkSize; + private final int resolution; + private final NoiseSampler mutator; + private final double noiseAmp; + private final Set biomes; + + public PipelineBiomeProvider(Pipeline pipeline, int resolution, NoiseSampler mutator, double noiseAmp) { + this.resolution = resolution; + this.mutator = mutator; + this.noiseAmp = noiseAmp; + this.chunkSize = pipeline.getChunkSize(); + this.biomeChunkCache = Caffeine.newBuilder() + .maximumSize(1024) + .build(pipeline::generateChunk); + + Set biomeSet = new HashSet<>(); + pipeline.getSource().getBiomes().forEach(biomeSet::add); + Iterable result = biomeSet; + for(Stage stage : pipeline.getStages()) { + result = stage.getBiomes(result); + } + this.biomes = new HashSet<>(); + Iterable finalResult = result; + result.forEach(pipelineBiome -> { + if(pipelineBiome.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 \"" + pipelineBiome.getID() + + "\". Ensure there is a stage to guarantee replacement of the ephemeral biome. Biomes: " + + biomeList); + } + this.biomes.add(pipelineBiome.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; + +// x *= resolution; +// z *= resolution; + + int chunkX = FastMath.floorDiv(x, chunkSize); + int chunkZ = FastMath.floorDiv(z, chunkSize); + + int chunkWorldX = chunkX * chunkSize; + int chunkWorldZ = chunkZ * chunkSize; + + int xInChunk = x - chunkWorldX; + int zInChunk = z - chunkWorldZ; + + return biomeChunkCache.get(new SeededVector(seed, chunkWorldX, chunkWorldZ)).get(xInChunk, zInChunk).getBiome(); + } + + @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; + } +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineImpl.java new file mode 100644 index 000000000..7ea1db66d --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineImpl.java @@ -0,0 +1,82 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation; + +import java.util.List; + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.BiomeChunk; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Expander; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Pipeline; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Source; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; + + +public class PipelineImpl implements Pipeline { + +// private static final Logger logger = LoggerFactory.getLogger(PipelineImpl.class); + + private final Source source; + private final List stages; + private final int chunkSize; + private final int expanderCount; + private final int arraySize; + private final int chunkOriginArrayIndex; + + public PipelineImpl(Source source, List stages, int idealChunkArraySize) { + this.source = source; + this.stages = stages; + this.expanderCount = (int) stages.stream().filter(s -> s instanceof Expander).count(); + + // Optimize for the ideal array size + int arraySize; + int chunkOriginArrayIndex; + int chunkSize; + int initialSize = 1; + while (true) { + arraySize = BiomeChunkImpl.initialSizeToArraySize(expanderCount, initialSize); + chunkOriginArrayIndex = BiomeChunkImpl.calculateChunkOriginArrayIndex(expanderCount, stages); + chunkSize = BiomeChunkImpl.calculateChunkSize(arraySize, chunkOriginArrayIndex, expanderCount); + if (chunkSize > 1 && arraySize >= idealChunkArraySize) break; + initialSize++; + } + + this.arraySize = arraySize; + this.chunkOriginArrayIndex = chunkOriginArrayIndex; + this.chunkSize = chunkSize; + + System.out.println("Initialized a new biome pipeline:"); + System.out.println("Array size: " + arraySize + " (Target: " + idealChunkArraySize + ")"); + System.out.println("Internal array origin: " + chunkOriginArrayIndex); + System.out.println("Chunk size: " + chunkSize); + } + + @Override + public BiomeChunk generateChunk(SeededVector worldCoordinates) { + return new BiomeChunkImpl(worldCoordinates, this); + } + + @Override + public int getChunkSize() { + return chunkSize; + } + + @Override + public Source getSource() { + return source; + } + + @Override + public List getStages() { + return stages; + } + + public int getExpanderCount() { + return expanderCount; + } + + public int getArraySize() { + return arraySize; + } + + public int getChunkOriginArrayIndex() { + return chunkOriginArrayIndex; + } +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/SeededVector.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/SeededVector.java new file mode 100644 index 000000000..bffbcd5a9 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/SeededVector.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation; + +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/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/StringBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/StringBiome.java new file mode 100644 index 000000000..008ce61fd --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/StringBiome.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation; + +import java.util.Optional; +import java.util.Set; + +import com.dfsek.terra.api.properties.Context; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.PlatformBiome; + +public record StringBiome(String name, String string) implements Biome { + + @Override + public Context getContext() { + return null; + } + + @Override + public String getID() { + return string; + } + + @Override + public Optional getPlatformBiome() { + return Optional.empty(); + } + + @Override + public void setPlatformBiome(PlatformBiome biome) { + } + + @Override + public int getColor() { + return 0; + } + + @Override + public Set getTags() { + return Set.of(name); + } +} \ No newline at end of file diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/BiomeChunk.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/BiomeChunk.java new file mode 100644 index 000000000..91d7ed303 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/BiomeChunk.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation.api; + + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.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/reimplementation/api/Expander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Expander.java new file mode 100644 index 000000000..a4b22114f --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Expander.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation.api; + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; + + +/** + * Resizes the internal grid of a BiomeChunk when applied, serves the purpose of + * filling in null biomes as a result of this resizing. + */ +public interface Expander extends Stage { + + PipelineBiome fillBiome(ViewPoint viewPoint); + + @Override + default int maxRelativeReadDistance() { + return 0; + } + + @Override + default PipelineBiome apply(ViewPoint viewPoint) { + PipelineBiome currentBiome = viewPoint.getBiome(); + if(currentBiome == null) { + return fillBiome(viewPoint); + } else { + return currentBiome; + } + } +} \ No newline at end of file diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Pipeline.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Pipeline.java new file mode 100644 index 000000000..d2331962f --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Pipeline.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation.api; + +import java.util.List; + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.SeededVector; + + +public interface Pipeline { + BiomeChunk generateChunk(SeededVector worldCoordinates); + + int getChunkSize(); + + Source getSource(); + + List getStages(); +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Source.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Source.java new file mode 100644 index 000000000..c095eb0dd --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Source.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation.api; + + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.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/reimplementation/api/Stage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Stage.java new file mode 100644 index 000000000..245f4f694 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Stage.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation.api; + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; + + +public interface Stage { + PipelineBiome apply(ViewPoint viewPoint); + + int maxRelativeReadDistance(); + + default Iterable getBiomes(Iterable biomes) { + return biomes; + } +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/DelegatedBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/DelegatedBiome.java new file mode 100644 index 000000000..a7dd0a666 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/DelegatedBiome.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome; + +import java.util.Set; + +import com.dfsek.terra.api.world.biome.Biome; + + +public final class DelegatedBiome implements PipelineBiome { + 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/reimplementation/api/biome/EphemeralBiomeDelegate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/EphemeralBiomeDelegate.java new file mode 100644 index 000000000..b2fcb3fe8 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/EphemeralBiomeDelegate.java @@ -0,0 +1,51 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome; + +import java.util.HashSet; +import java.util.Set; + +import com.dfsek.terra.api.world.biome.Biome; + + +final class EphemeralBiomeDelegate implements PipelineBiome { + 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/reimplementation/api/biome/PipelineBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/PipelineBiome.java new file mode 100644 index 000000000..eb288865e --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/PipelineBiome.java @@ -0,0 +1,35 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome; + +import java.util.Set; + +import com.dfsek.terra.api.registry.key.StringIdentifiable; +import com.dfsek.terra.api.world.biome.Biome; + + +public interface PipelineBiome extends StringIdentifiable { + Biome getBiome(); + + static PipelineBiome ephemeral(String id) { + return new EphemeralBiomeDelegate(id); + } + + static PipelineBiome from(Biome biome) { + return new DelegatedBiome(biome); + } + + static PipelineBiome self() { + return SelfDelegate.INSTANCE; + } + + Set getTags(); + + default boolean isEphemeral() { + return false; + } + + default boolean isSelf() { + return false; + } + + +} \ No newline at end of file diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/SelfDelegate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/SelfDelegate.java new file mode 100644 index 000000000..5c99e48d8 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/SelfDelegate.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome; + +import java.util.Collections; +import java.util.Set; + +import com.dfsek.terra.api.world.biome.Biome; + + +final class SelfDelegate implements PipelineBiome { + 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/reimplementation/source/SamplerSource.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/source/SamplerSource.java new file mode 100644 index 000000000..1312dca25 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/source/SamplerSource.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation.source; + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Source; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.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/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/source/SingleSource.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/source/SingleSource.java new file mode 100644 index 000000000..21f17fa93 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/source/SingleSource.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation.source; + +import java.util.Collections; +import java.util.Set; + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Source; + + +public class SingleSource implements Source { + + private final PipelineBiome biome; + + public SingleSource(PipelineBiome biome) { + this.biome = biome; + } + + @Override + public PipelineBiome get(long seed, int x, int z) { + return biome; + } + + @Override + public Set getBiomes() { + return Collections.singleton(biome); + } +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/expander/DebugExpander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/expander/DebugExpander.java new file mode 100644 index 000000000..29f1c97a7 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/expander/DebugExpander.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.expander; + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Expander; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; + + +public class DebugExpander implements Expander { + + private final PipelineBiome biome; + + public DebugExpander(PipelineBiome biome) { + this.biome = biome; + } + + @Override + public PipelineBiome fillBiome(ViewPoint viewPoint) { + return biome; + } +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/expander/FractalExpander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/expander/FractalExpander.java new file mode 100644 index 000000000..b043fff85 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/expander/FractalExpander.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.expander; + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Expander; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.api.noise.NoiseSampler; + + +public class FractalExpander implements Expander { + + private final NoiseSampler sampler; + + public FractalExpander(NoiseSampler sampler) { + this.sampler = sampler; + } + + @Override + public PipelineBiome fillBiome(ViewPoint viewPoint) { + + int xMod2 = viewPoint.gridX() % 2; + int zMod2 = viewPoint.gridZ() % 2; + + double roll = sampler.noise(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); + + } else if (xMod2 == 0 && zMod2 == 1) { // Pick one of 2 neighbors on Z axis randomly + return roll > 0 ? viewPoint.getRelativeBiome(0, -1) : viewPoint.getRelativeBiome(0, 1); + + } else { // Pick one of 4 corners randomly + return roll > 0 ? + roll > 0.25 ? viewPoint.getRelativeBiome(-1, 1) : viewPoint.getRelativeBiome(1, 1) : + roll > -0.25 ? viewPoint.getRelativeBiome(-1, -1) : viewPoint.getRelativeBiome(1, -1); + } + } +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderListMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderListMutator.java new file mode 100644 index 000000000..b6bcee543 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderListMutator.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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.reimplementation.stage.mutators; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Predicate; + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.util.collection.ProbabilityCollection; +import com.dfsek.terra.api.util.vector.Vector2Int; + + +public class BorderListMutator implements Stage { + private final String border; + private final NoiseSampler noiseSampler; + private final ProbabilityCollection replaceDefault; + private final String defaultReplace; + private final Map> replace; + + private final Vector2Int[] borderPoints; + + 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; + + List points = new ArrayList<>(); + for(int x = -1; x <= 1; x++) { + for(int z = -1; z <= 1; z++) { + if(x == 0 && z == 0) continue; + points.add(Vector2Int.of(x, z)); + } + } + this.borderPoints = points.toArray(new Vector2Int[0]); + + } + + @Override + public Iterable getBiomes(Iterable biomes) { + Set biomeSet = new HashSet<>(); + biomes.forEach(biomeSet::add); + biomeSet.addAll(replaceDefault.getContents().stream().filter(Predicate.not(PipelineBiome::isSelf)).toList()); + replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents())); + return biomeSet; + } + + @Override + public PipelineBiome apply(ViewPoint viewPoint) { + PipelineBiome center = viewPoint.getBiome(); + if(center.getTags().contains(defaultReplace)) { + for(Vector2Int point : borderPoints) { + 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(), + viewPoint.worldSeed()); + return replacement.isSelf() ? center : replacement; + } + PipelineBiome replacement = replaceDefault.get(noiseSampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed()); + return replacement.isSelf() ? center : replacement; + } + } + } + return center; + } + + @Override + public int maxRelativeReadDistance() { + return 1; + } +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderMutator.java new file mode 100644 index 000000000..1fb8b60a9 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderMutator.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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.reimplementation.stage.mutators; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Predicate; + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.util.collection.ProbabilityCollection; +import com.dfsek.terra.api.util.vector.Vector2Int; + + +public class BorderMutator implements Stage { + private final String border; + private final NoiseSampler noiseSampler; + private final ProbabilityCollection replace; + private final String replaceTag; + private final Vector2Int[] borderPoints; + + public BorderMutator(String border, String replaceTag, NoiseSampler noiseSampler, ProbabilityCollection replace) { + this.border = border; + this.noiseSampler = noiseSampler; + this.replace = replace; + this.replaceTag = replaceTag; + List points = new ArrayList<>(); + for(int x = -1; x <= 1; x++) { + for(int z = -1; z <= 1; z++) { + if(x == 0 && z == 0) continue; + points.add(Vector2Int.of(x, z)); + } + } + this.borderPoints = points.toArray(new Vector2Int[0]); + } + + @Override + public PipelineBiome apply(ViewPoint viewPoint) { + PipelineBiome center = viewPoint.getBiome(); + if(center.getTags().contains(replaceTag)) { + 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()); + return replacement.isSelf() ? center : replacement; + } + } + } + return center; + } + + @Override + public Iterable getBiomes(Iterable biomes) { + Set biomeSet = new HashSet<>(); + biomes.forEach(biomeSet::add); + biomeSet.addAll( + replace + .getContents() + .stream() + .filter( + Predicate.not(PipelineBiome::isSelf) + ) + .toList() + ); + return biomeSet; + } + + @Override + public int maxRelativeReadDistance() { + return 1; + } +} 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/reimplementation/stage/mutators/ReplaceListMutator.java similarity index 50% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/ReplaceListMutator.java index 51a74c285..081f0f5ed 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/ReplaceListMutator.java @@ -5,27 +5,28 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.mutator; +package com.dfsek.terra.addons.biome.pipeline.reimplementation.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.api.delegate.BiomeDelegate; -import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -public class ReplaceListMutator implements BiomeMutator { - private final Map> replace; +public class ReplaceListMutator implements Stage { + private final Map> replace; private final NoiseSampler sampler; - private final ProbabilityCollection replaceDefault; + private final ProbabilityCollection replaceDefault; private final String defaultTag; - public ReplaceListMutator(Map> replace, String defaultTag, - ProbabilityCollection replaceDefault, NoiseSampler sampler) { + public ReplaceListMutator(Map> replace, String defaultTag, + ProbabilityCollection replaceDefault, NoiseSampler sampler) { this.replace = replace; this.sampler = sampler; this.defaultTag = defaultTag; @@ -33,24 +34,29 @@ public class ReplaceListMutator implements BiomeMutator { } @Override - public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) { - BiomeDelegate center = viewPoint.getBiome(0, 0); + public PipelineBiome apply(ViewPoint viewPoint) { + PipelineBiome center = viewPoint.getBiome(); if(replace.containsKey(center)) { - BiomeDelegate biome = replace.get(center).get(sampler, x, z, seed); - return biome.isSelf() ? viewPoint.getBiome(0, 0) : biome; + PipelineBiome biome = replace.get(center).get(sampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed()); + return biome.isSelf() ? viewPoint.getBiome() : 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; + if(viewPoint.getBiome().getTags().contains(defaultTag)) { + PipelineBiome biome = replaceDefault.get(sampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed()); + return biome.isSelf() ? viewPoint.getBiome() : biome; } return center; } @Override - public Iterable getBiomes(Iterable biomes) { - Set biomeSet = new HashSet<>(); + public int maxRelativeReadDistance() { + return 0; + } + + @Override + public Iterable getBiomes(Iterable biomes) { + Set biomeSet = new HashSet<>(); - Set reject = new HashSet<>(); + Set reject = new HashSet<>(); biomes.forEach(biome -> { if(!biome.getTags().contains(defaultTag) && !replace.containsKey(biome)) { 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/reimplementation/stage/mutators/ReplaceMutator.java similarity index 51% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/ReplaceMutator.java index cec3e5e9e..a46454a2c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/ReplaceMutator.java @@ -5,42 +5,48 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.mutator; +package com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators; 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.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -public class ReplaceMutator implements BiomeMutator { +public class ReplaceMutator implements Stage { private final String replaceableTag; - private final ProbabilityCollection replace; + private final ProbabilityCollection replace; private final NoiseSampler sampler; - public ReplaceMutator(String replaceable, ProbabilityCollection replace, 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; + public PipelineBiome apply(ViewPoint viewPoint) { + if(viewPoint.getBiome().getTags().contains(replaceableTag)) { + PipelineBiome biome = replace.get(sampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed()); + return biome.isSelf() ? viewPoint.getBiome() : biome; } - return viewPoint.getBiome(0, 0); + return viewPoint.getBiome(); } @Override - public Iterable getBiomes(Iterable biomes) { - Set biomeSet = new HashSet<>(); - Set reject = new HashSet<>(); + public int maxRelativeReadDistance() { + return 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); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/SmoothMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/SmoothMutator.java new file mode 100644 index 000000000..c199daab2 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/SmoothMutator.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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.reimplementation.stage.mutators; + +import java.util.Objects; + +import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.api.noise.NoiseSampler; + + +public class SmoothMutator implements Stage { + + private final NoiseSampler sampler; + + public SmoothMutator(NoiseSampler sampler) { + this.sampler = sampler; + } + + @Override + public PipelineBiome apply(ViewPoint viewPoint) { + PipelineBiome top = viewPoint.getRelativeBiome(1, 0); + PipelineBiome bottom = viewPoint.getRelativeBiome(-1, 0); + PipelineBiome left = viewPoint.getRelativeBiome(0, 1); + PipelineBiome right = viewPoint.getRelativeBiome(0, -1); + + double roll = sampler.noise(viewPoint.worldSeed(), viewPoint.worldX(), viewPoint.worldZ()); + + boolean vert = Objects.equals(top, bottom); + boolean horiz = Objects.equals(left, right); + + if(vert && horiz) { + return roll > 0 ? + roll > 0.25 ? left : right : + roll > -0.25 ? top : bottom; + } + if(vert) { + return roll > 0 ? top : bottom; + } + if(horiz) { + return roll > 0 ? left : right; + } + return viewPoint.getBiome(); + } + + @Override + public int maxRelativeReadDistance() { + return 1; + } +} 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 deleted file mode 100644 index 62656ac17..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SamplerSource.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2020-2021 Polyhedral Development - * - * The Terra 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; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; - - -public class SamplerSource implements BiomeSource { - private final ProbabilityCollection biomes; - private final NoiseSampler sampler; - - public SamplerSource(ProbabilityCollection biomes, NoiseSampler sampler) { - this.biomes = biomes; - this.sampler = sampler; - } - - @Override - public BiomeDelegate getBiome(double x, double z, long seed) { - return biomes.get(sampler, x, z, seed); - } - - @Override - public Iterable getBiomes() { - return biomes.getContents(); - } -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java index 8a9a06aae..d5933e917 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java @@ -9,11 +9,10 @@ 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 { +public class MutatorStage implements com.dfsek.terra.addons.biome.pipeline.api.stage.Stage { private final BiomeMutator mutator; public MutatorStage(BiomeMutator mutator) { From d170b4e0fd3c67ff3c2fe4a9d723496605e4e3d4 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 7 Aug 2022 11:46:55 +1000 Subject: [PATCH 014/161] Handle resolution and biome blending --- .../biome/pipeline/config/BiomePipelineTemplate.java | 2 +- .../pipeline/reimplementation/BiomeChunkImpl.java | 6 ++++-- .../reimplementation/PipelineBiomeProvider.java | 11 ++++------- .../biome/pipeline/reimplementation/PipelineImpl.java | 8 +++++++- 4 files changed, 16 insertions(+), 11 deletions(-) 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 1324f50e0..e2859cbff 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 @@ -54,6 +54,6 @@ public class BiomePipelineTemplate implements ObjectTemplate { @Override public BiomeProvider get() { - return new PipelineBiomeProvider(new PipelineImpl(source, stages, 10), resolution, blendSampler, blendAmplitude); + return new PipelineBiomeProvider(new PipelineImpl(source, stages, resolution, 500), resolution, blendSampler, blendAmplitude); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/BiomeChunkImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/BiomeChunkImpl.java index 36ffe591e..2312357cf 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/BiomeChunkImpl.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/BiomeChunkImpl.java @@ -15,11 +15,13 @@ public class BiomeChunkImpl implements BiomeChunk { private PipelineBiome[][] biomes; private final SeededVector worldOrigin; private final int chunkOriginArrayIndex; + private final int worldCoordinateScale; public BiomeChunkImpl(SeededVector worldOrigin, PipelineImpl pipeline) { this.worldOrigin = worldOrigin; this.chunkOriginArrayIndex = pipeline.getChunkOriginArrayIndex(); + this.worldCoordinateScale = pipeline.getResolution(); int size = pipeline.getArraySize(); @@ -86,11 +88,11 @@ public class BiomeChunkImpl implements BiomeChunk { } private int xIndexToWorldCoordinate(int xIndex) { - return worldOrigin.x() + xIndex - chunkOriginArrayIndex; + return (worldOrigin.x() + xIndex - chunkOriginArrayIndex) * worldCoordinateScale; } private int zIndexToWorldCoordinate(int zIndex) { - return worldOrigin.z() + zIndex - chunkOriginArrayIndex; + return (worldOrigin.z() + zIndex - chunkOriginArrayIndex) * worldCoordinateScale; } protected static int initialSizeToArraySize(int expanderCount, int initialSize) { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineBiomeProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineBiomeProvider.java index 2134f6b7a..e5ddca9e8 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineBiomeProvider.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineBiomeProvider.java @@ -74,14 +74,11 @@ 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 /= resolution; -// z /= resolution; + x += mutator.noise(seed + 1, x, z) * noiseAmp; + z += mutator.noise(seed + 2, x, z) * noiseAmp; -// x *= resolution; -// z *= resolution; + x /= resolution; + z /= resolution; int chunkX = FastMath.floorDiv(x, chunkSize); int chunkZ = FastMath.floorDiv(z, chunkSize); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineImpl.java index 7ea1db66d..7c6be7dcc 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineImpl.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineImpl.java @@ -19,10 +19,12 @@ public class PipelineImpl implements Pipeline { private final int expanderCount; private final int arraySize; private final int chunkOriginArrayIndex; + private final int resolution; - public PipelineImpl(Source source, List stages, int idealChunkArraySize) { + public PipelineImpl(Source source, List stages, int resolution, int idealChunkArraySize) { this.source = source; this.stages = stages; + this.resolution = resolution; this.expanderCount = (int) stages.stream().filter(s -> s instanceof Expander).count(); // Optimize for the ideal array size @@ -79,4 +81,8 @@ public class PipelineImpl implements Pipeline { public int getChunkOriginArrayIndex() { return chunkOriginArrayIndex; } + + public int getResolution() { + return resolution; + } } From ee6d475ad0d06e1646be50f7c64363e94b5eb650 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 7 Aug 2022 12:03:58 +1000 Subject: [PATCH 015/161] Move reimplementation classes into main package --- .../biome/pipeline/BiomeHolderImpl.java | 94 ------------- .../addons/biome/pipeline/BiomePipeline.java | 83 ----------- .../biome/pipeline/BiomePipelineAddon.java | 28 ++-- .../biome/pipeline/BiomePipelineColumn.java | 2 +- .../biome/pipeline/BiomePipelineProvider.java | 131 ------------------ .../PipelineBiomeProvider.java | 12 +- .../{reimplementation => }/StringBiome.java | 2 +- .../addons/biome/pipeline/api/BiomeChunk.java | 10 ++ .../biome/pipeline/api/BiomeHolder.java | 26 ---- .../{reimplementation => }/api/Expander.java | 6 +- .../{reimplementation => }/api/Pipeline.java | 4 +- .../SeededVector.java | 2 +- .../addons/biome/pipeline/api/Source.java | 11 ++ .../addons/biome/pipeline/api/Stage.java | 15 ++ .../biome/DelegatedPipelineBiome.java} | 8 +- .../EphemeralPipelineBiome.java} | 8 +- .../api/biome/PipelineBiome.java | 8 +- .../biome/SelfPipelineBiome.java} | 8 +- .../pipeline/api/delegate/BiomeDelegate.java | 35 ----- .../pipeline/api/delegate/DelegatedBiome.java | 40 ------ .../pipeline/api/delegate/SelfDelegate.java | 40 ------ .../biome/pipeline/api/stage/Stage.java | 20 --- .../api/stage/type/BiomeExpander.java | 15 -- .../pipeline/api/stage/type/BiomeMutator.java | 37 ----- .../config/BiomePipelineTemplate.java | 8 +- .../pipeline/config/PipelineBiomeLoader.java | 2 +- .../{ => source}/SamplerSourceTemplate.java | 8 +- .../config/{ => source}/SourceTemplate.java | 4 +- .../pipeline/config/stage/StageTemplate.java | 2 +- .../stage/expander/ExpanderStageTemplate.java | 4 +- ...late.java => BorderListStageTemplate.java} | 10 +- ...Template.java => BorderStageTemplate.java} | 10 +- ...ate.java => ReplaceListStageTemplate.java} | 10 +- ...emplate.java => ReplaceStageTemplate.java} | 10 +- ...Template.java => SmoothStageTemplate.java} | 8 +- .../BiomeChunkImpl.java | 11 +- .../PipelineImpl.java | 21 +-- .../reimplementation/api/BiomeChunk.java | 10 -- .../pipeline/reimplementation/api/Source.java | 11 -- .../pipeline/reimplementation/api/Stage.java | 15 -- .../api/biome/EphemeralBiomeDelegate.java | 51 ------- .../stage/expander/DebugExpander.java | 20 --- .../biome/pipeline/source/BiomeSource.java | 17 --- .../source/SamplerSource.java | 6 +- .../source/SingleSource.java | 6 +- .../stage/expander/FractalExpander.java | 8 +- .../mutators/BorderListStage.java} | 14 +- .../mutators/BorderStage.java} | 12 +- .../mutators/ReplaceListStage.java} | 14 +- .../mutators/ReplaceStage.java} | 12 +- .../mutators/SmoothStage.java} | 12 +- .../biome/pipeline/stages/ExpanderStage.java | 37 ----- .../biome/pipeline/stages/MutatorStage.java | 45 ------ 53 files changed, 176 insertions(+), 867 deletions(-) delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation => }/PipelineBiomeProvider.java (89%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation => }/StringBiome.java (92%) create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeChunk.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation => }/api/Expander.java (71%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation => }/api/Pipeline.java (59%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation => api}/SeededVector.java (87%) create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Source.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation/api/biome/DelegatedBiome.java => api/biome/DelegatedPipelineBiome.java} (70%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/{delegate/EphemeralBiomeDelegate.java => biome/EphemeralPipelineBiome.java} (78%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation => }/api/biome/PipelineBiome.java (73%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation/api/biome/SelfDelegate.java => api/biome/SelfPipelineBiome.java} (72%) delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/BiomeDelegate.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/DelegatedBiome.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/SelfDelegate.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/Stage.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/type/BiomeExpander.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/type/BiomeMutator.java rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/{ => source}/SamplerSourceTemplate.java (75%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/{ => source}/SourceTemplate.java (74%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/{BorderListMutatorTemplate.java => BorderListStageTemplate.java} (71%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/{BorderMutatorTemplate.java => BorderStageTemplate.java} (68%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/{ReplaceListMutatorTemplate.java => ReplaceListStageTemplate.java} (69%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/{ReplaceMutatorTemplate.java => ReplaceStageTemplate.java} (67%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/{SmoothMutatorTemplate.java => SmoothStageTemplate.java} (60%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation => pipeline}/BiomeChunkImpl.java (95%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation => pipeline}/PipelineImpl.java (80%) delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/BiomeChunk.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Source.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Stage.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/EphemeralBiomeDelegate.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/expander/DebugExpander.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation => }/source/SamplerSource.java (74%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation => }/source/SingleSource.java (66%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation => }/stage/expander/FractalExpander.java (78%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation/stage/mutators/BorderListMutator.java => stage/mutators/BorderListStage.java} (82%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation/stage/mutators/BorderMutator.java => stage/mutators/BorderStage.java} (83%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation/stage/mutators/ReplaceListMutator.java => stage/mutators/ReplaceListStage.java} (80%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation/stage/mutators/ReplaceMutator.java => stage/mutators/ReplaceStage.java} (78%) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/{reimplementation/stage/mutators/SmoothMutator.java => stage/mutators/SmoothStage.java} (76%) delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java 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 57304011b..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-2021 Polyhedral Development - * - * The Terra 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 8a4be5d7d..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-2021 Polyhedral Development - * - * The Terra 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 f57020660..3468e168c 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 @@ -13,16 +13,16 @@ import java.util.function.Supplier; import com.dfsek.terra.addons.biome.pipeline.config.BiomePipelineTemplate; import com.dfsek.terra.addons.biome.pipeline.config.PipelineBiomeLoader; -import com.dfsek.terra.addons.biome.pipeline.config.SamplerSourceTemplate; +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.reimplementation.api.Source; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +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.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.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; @@ -71,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() 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 a66c8da27..f94493489 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 @@ -17,7 +17,7 @@ public class BiomePipelineColumn implements Column { private final int z; private final Biome biome; - public BiomePipelineColumn(BiomeProvider biomeProvider, int min, int max, int x, int z, long seed) { + protected BiomePipelineColumn(BiomeProvider biomeProvider, int min, int max, int x, int z, long seed) { this.min = min; this.max = max; this.x = x; 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 f3f4c3aa9..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) 2020-2021 Polyhedral Development - * - * The Terra 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 net.jafama.FastMath; - -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 = FastMath.floorDiv(x, pipeline.getSize()); - int fdZ = FastMath.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/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineBiomeProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java similarity index 89% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineBiomeProvider.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java index e5ddca9e8..c9a03c073 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineBiomeProvider.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation; +package com.dfsek.terra.addons.biome.pipeline; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; @@ -9,11 +9,11 @@ import java.util.HashSet; import java.util.Set; import java.util.stream.StreamSupport; -import com.dfsek.terra.addons.biome.pipeline.BiomePipelineColumn; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.BiomeChunk; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Pipeline; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +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.SeededVector; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.registry.key.StringIdentifiable; import com.dfsek.terra.api.util.Column; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/StringBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/StringBiome.java similarity index 92% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/StringBiome.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/StringBiome.java index 008ce61fd..d141ecf6e 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/StringBiome.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/StringBiome.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation; +package com.dfsek.terra.addons.biome.pipeline; import java.util.Optional; import java.util.Set; 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..4b7d60ae2 --- /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 26bb63315..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-2021 Polyhedral Development - * - * The Terra 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/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Expander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Expander.java similarity index 71% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Expander.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Expander.java index a4b22114f..3e8b9e42d 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/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.reimplementation.api; +package com.dfsek.terra.addons.biome.pipeline.api; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; /** diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Pipeline.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Pipeline.java similarity index 59% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Pipeline.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Pipeline.java index d2331962f..cb52328ce 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Pipeline.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Pipeline.java @@ -1,9 +1,7 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.api; +package com.dfsek.terra.addons.biome.pipeline.api; import java.util.List; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.SeededVector; - public interface Pipeline { BiomeChunk generateChunk(SeededVector worldCoordinates); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/SeededVector.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/SeededVector.java similarity index 87% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/SeededVector.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/SeededVector.java index bffbcd5a9..951b7e592 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/SeededVector.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/SeededVector.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation; +package com.dfsek.terra.addons.biome.pipeline.api; public record SeededVector(long seed, int x, int z) { 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..185463786 --- /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..4611968c3 --- /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.pipeline.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; + + +public interface Stage { + PipelineBiome apply(ViewPoint viewPoint); + + int maxRelativeReadDistance(); + + default Iterable getBiomes(Iterable biomes) { + return biomes; + } +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/DelegatedBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/DelegatedPipelineBiome.java similarity index 70% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/DelegatedBiome.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/DelegatedPipelineBiome.java index a7dd0a666..70c94b58e 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/DelegatedBiome.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/DelegatedPipelineBiome.java @@ -1,14 +1,14 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome; +package com.dfsek.terra.addons.biome.pipeline.api.biome; import java.util.Set; import com.dfsek.terra.api.world.biome.Biome; -public final class DelegatedBiome implements PipelineBiome { +public final class DelegatedPipelineBiome implements PipelineBiome { private final Biome biome; - public DelegatedBiome(Biome biome) { + public DelegatedPipelineBiome(Biome biome) { this.biome = biome; } @@ -24,7 +24,7 @@ public final class DelegatedBiome implements PipelineBiome { @Override public boolean equals(Object obj) { - if(!(obj instanceof DelegatedBiome that)) return false; + if(!(obj instanceof DelegatedPipelineBiome that)) return false; return that.biome.equals(this.biome); } 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/biome/EphemeralPipelineBiome.java similarity index 78% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/EphemeralBiomeDelegate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/EphemeralPipelineBiome.java index d02221f1b..44ef4a311 100644 --- 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/biome/EphemeralPipelineBiome.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.api.delegate; +package com.dfsek.terra.addons.biome.pipeline.api.biome; import java.util.HashSet; import java.util.Set; @@ -6,11 +6,11 @@ import java.util.Set; import com.dfsek.terra.api.world.biome.Biome; -final class EphemeralBiomeDelegate implements BiomeDelegate { +final class EphemeralPipelineBiome implements PipelineBiome { private final Set tags; private final String id; - public EphemeralBiomeDelegate(String id) { + public EphemeralPipelineBiome(String id) { this.id = id; tags = new HashSet<>(); tags.add(id); @@ -44,7 +44,7 @@ final class EphemeralBiomeDelegate implements BiomeDelegate { @Override public boolean equals(Object obj) { - if(!(obj instanceof EphemeralBiomeDelegate that)) return false; + if(!(obj instanceof EphemeralPipelineBiome 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/reimplementation/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 73% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/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 eb288865e..cbc4ffe90 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/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.reimplementation.api.biome; +package com.dfsek.terra.addons.biome.pipeline.api.biome; import java.util.Set; @@ -10,15 +10,15 @@ public interface PipelineBiome extends StringIdentifiable { Biome getBiome(); static PipelineBiome ephemeral(String id) { - return new EphemeralBiomeDelegate(id); + return new EphemeralPipelineBiome(id); } static PipelineBiome from(Biome biome) { - return new DelegatedBiome(biome); + return new DelegatedPipelineBiome(biome); } static PipelineBiome self() { - return SelfDelegate.INSTANCE; + return SelfPipelineBiome.INSTANCE; } Set getTags(); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/SelfDelegate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/SelfPipelineBiome.java similarity index 72% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/SelfDelegate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/SelfPipelineBiome.java index 5c99e48d8..068fa8b16 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/SelfDelegate.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.reimplementation.api.biome; +package com.dfsek.terra.addons.biome.pipeline.api.biome; import java.util.Collections; import java.util.Set; @@ -6,10 +6,10 @@ import java.util.Set; import com.dfsek.terra.api.world.biome.Biome; -final class SelfDelegate implements PipelineBiome { - public static final SelfDelegate INSTANCE = new SelfDelegate(); +final class SelfPipelineBiome implements PipelineBiome { + public static final SelfPipelineBiome INSTANCE = new SelfPipelineBiome(); - private SelfDelegate() { + private SelfPipelineBiome() { } 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 7e339285a..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 4085f6a43..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/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 60b744059..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 fb4b1007b..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-2021 Polyhedral Development - * - * The Terra 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 c3e721c08..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-2021 Polyhedral Development - * - * The Terra 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 f7cc3b7bd..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-2021 Polyhedral Development - * - * The Terra 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/BiomePipelineTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomePipelineTemplate.java index e2859cbff..b88b75a7c 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 @@ -14,10 +14,10 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.List; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.PipelineBiomeProvider; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.PipelineImpl; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Source; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.PipelineBiomeProvider; +import com.dfsek.terra.addons.biome.pipeline.pipeline.PipelineImpl; +import com.dfsek.terra.addons.biome.pipeline.api.Source; +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.terra.api.world.biome.generation.BiomeProvider; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java index 5a5e4beb9..52ed6470e 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.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/source/SamplerSourceTemplate.java similarity index 75% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SamplerSourceTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/source/SamplerSourceTemplate.java index 8fe5f7310..a054976d7 100644 --- 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/source/SamplerSourceTemplate.java @@ -5,14 +5,14 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.config; +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.reimplementation.api.Source; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.source.SamplerSource; +import com.dfsek.terra.addons.biome.pipeline.api.Source; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.source.SamplerSource; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; 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/source/SourceTemplate.java similarity index 74% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/source/SourceTemplate.java index a7908fa6f..a8e88a8ab 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/source/SourceTemplate.java @@ -5,11 +5,11 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.config; +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.reimplementation.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 d84756bf4..afed0c15e 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 @@ -11,7 +11,7 @@ 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.reimplementation.api.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; 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 0693bd6e2..a8fce25be 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 @@ -8,8 +8,8 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.expander; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Expander; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.expander.FractalExpander; +import com.dfsek.terra.addons.biome.pipeline.api.Expander; +import com.dfsek.terra.addons.biome.pipeline.stage.expander.FractalExpander; public class ExpanderStageTemplate extends StageTemplate { 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/BorderListStageTemplate.java similarity index 71% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListStageTemplate.java index 09b126da2..fb415260d 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListStageTemplate.java @@ -12,15 +12,15 @@ import com.dfsek.tectonic.api.config.template.annotations.Value; import java.util.Map; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators.BorderListMutator; +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.stage.mutators.BorderListStage; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; @SuppressWarnings("unused") -public class BorderListMutatorTemplate extends StageTemplate { +public class BorderListStageTemplate extends StageTemplate { @Value("from") private @Meta String from; @@ -36,6 +36,6 @@ public class BorderListMutatorTemplate extends StageTemplate { @Override public Stage get() { - return new BorderListMutator(replace, from, defaultReplace, noise, defaultTo); + return new BorderListStage(replace, from, defaultReplace, noise, defaultTo); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderStageTemplate.java similarity index 68% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderStageTemplate.java index 9e2d3530d..5327c211c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderStageTemplate.java @@ -10,15 +10,15 @@ 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.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators.BorderMutator; +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.stage.mutators.BorderStage; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; @SuppressWarnings("unused") -public class BorderMutatorTemplate extends StageTemplate { +public class BorderStageTemplate extends StageTemplate { @Value("from") private @Meta String from; @@ -30,6 +30,6 @@ public class BorderMutatorTemplate extends StageTemplate { @Override public Stage get() { - return new BorderMutator(from, replace, noise, to); + return new BorderStage(from, replace, noise, to); } } 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/ReplaceListStageTemplate.java similarity index 69% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListStageTemplate.java index d30dabb54..a6710286f 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListStageTemplate.java @@ -12,15 +12,15 @@ import com.dfsek.tectonic.api.config.template.annotations.Value; import java.util.Map; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators.ReplaceListMutator; +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.stage.mutators.ReplaceListStage; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; @SuppressWarnings("unused") -public class ReplaceListMutatorTemplate extends StageTemplate { +public class ReplaceListStageTemplate extends StageTemplate { @Value("default-from") private @Meta String defaultFrom; @@ -32,6 +32,6 @@ public class ReplaceListMutatorTemplate extends StageTemplate { @Override public Stage get() { - return new ReplaceListMutator(replace, defaultFrom, defaultTo, noise); + return new ReplaceListStage(replace, defaultFrom, defaultTo, noise); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceStageTemplate.java similarity index 67% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceStageTemplate.java index 8431ba0e9..5a799eeb4 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceStageTemplate.java @@ -10,15 +10,15 @@ 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.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators.ReplaceMutator; +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.stage.mutators.ReplaceStage; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; @SuppressWarnings("unused") -public class ReplaceMutatorTemplate extends StageTemplate { +public class ReplaceStageTemplate extends StageTemplate { @Value("from") private @Meta String from; @@ -27,6 +27,6 @@ public class ReplaceMutatorTemplate extends StageTemplate { @Override public Stage get() { - return new ReplaceMutator(from, to, noise); + return new ReplaceStage(from, to, noise); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothStageTemplate.java similarity index 60% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothStageTemplate.java index 6a60c7f2c..50a7aa5b9 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothStageTemplate.java @@ -8,13 +8,13 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators.SmoothMutator; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.stage.mutators.SmoothStage; -public class SmoothMutatorTemplate extends StageTemplate { +public class SmoothStageTemplate extends StageTemplate { @Override public Stage get() { - return new SmoothMutator(noise); + return new SmoothStage(noise); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/BiomeChunkImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/BiomeChunkImpl.java similarity index 95% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/BiomeChunkImpl.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/BiomeChunkImpl.java index 2312357cf..b5f5b770f 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/BiomeChunkImpl.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/BiomeChunkImpl.java @@ -1,13 +1,14 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation; +package com.dfsek.terra.addons.biome.pipeline.pipeline; import net.jafama.FastMath; import java.util.List; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.BiomeChunk; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Expander; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.api.SeededVector; +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; public class BiomeChunkImpl implements BiomeChunk { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/PipelineImpl.java similarity index 80% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineImpl.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/PipelineImpl.java index 7c6be7dcc..318ac8933 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/PipelineImpl.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/PipelineImpl.java @@ -1,12 +1,13 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation; +package com.dfsek.terra.addons.biome.pipeline.pipeline; import java.util.List; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.BiomeChunk; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Expander; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Pipeline; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Source; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.SeededVector; +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 { @@ -70,19 +71,19 @@ public class PipelineImpl implements Pipeline { return stages; } - public int getExpanderCount() { + protected int getExpanderCount() { return expanderCount; } - public int getArraySize() { + protected int getArraySize() { return arraySize; } - public int getChunkOriginArrayIndex() { + protected int getChunkOriginArrayIndex() { return chunkOriginArrayIndex; } - public int getResolution() { + protected int getResolution() { return resolution; } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/BiomeChunk.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/BiomeChunk.java deleted file mode 100644 index 91d7ed303..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/BiomeChunk.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.api; - - -import com.dfsek.terra.addons.biome.pipeline.reimplementation.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/reimplementation/api/Source.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Source.java deleted file mode 100644 index c095eb0dd..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Source.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.api; - - -import com.dfsek.terra.addons.biome.pipeline.reimplementation.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/reimplementation/api/Stage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Stage.java deleted file mode 100644 index 245f4f694..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/Stage.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.api; - -import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; - - -public interface Stage { - PipelineBiome apply(ViewPoint viewPoint); - - int maxRelativeReadDistance(); - - default Iterable getBiomes(Iterable biomes) { - return biomes; - } -} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/EphemeralBiomeDelegate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/EphemeralBiomeDelegate.java deleted file mode 100644 index b2fcb3fe8..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/api/biome/EphemeralBiomeDelegate.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome; - -import java.util.HashSet; -import java.util.Set; - -import com.dfsek.terra.api.world.biome.Biome; - - -final class EphemeralBiomeDelegate implements PipelineBiome { - 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/reimplementation/stage/expander/DebugExpander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/expander/DebugExpander.java deleted file mode 100644 index 29f1c97a7..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/expander/DebugExpander.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.expander; - -import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Expander; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; - - -public class DebugExpander implements Expander { - - private final PipelineBiome biome; - - public DebugExpander(PipelineBiome biome) { - this.biome = biome; - } - - @Override - public PipelineBiome fillBiome(ViewPoint viewPoint) { - return biome; - } -} 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 d56151f07..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-2021 Polyhedral Development - * - * The Terra 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/reimplementation/source/SamplerSource.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SamplerSource.java similarity index 74% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/source/SamplerSource.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SamplerSource.java index 1312dca25..eca41806b 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/source/SamplerSource.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SamplerSource.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.source; +package com.dfsek.terra.addons.biome.pipeline.source; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Source; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.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.api.noise.NoiseSampler; 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/reimplementation/source/SingleSource.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SingleSource.java similarity index 66% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/source/SingleSource.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SingleSource.java index 21f17fa93..6dcab0d3c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/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.reimplementation.source; +package com.dfsek.terra.addons.biome.pipeline.source; import java.util.Collections; import java.util.Set; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Source; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.api.Source; public class SingleSource implements Source { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/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 78% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/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 b043fff85..5c94b8943 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/expander/FractalExpander.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/expander/FractalExpander.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.expander; +package com.dfsek.terra.addons.biome.pipeline.stage.expander; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Expander; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.api.Expander; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.noise.NoiseSampler; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderListMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderListStage.java similarity index 82% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderListMutator.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderListStage.java index b6bcee543..b814806d6 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderListMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderListStage.java @@ -5,7 +5,7 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.stage.mutators; import java.util.ArrayList; import java.util.HashSet; @@ -14,15 +14,15 @@ import java.util.Map; import java.util.Set; import java.util.function.Predicate; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.util.vector.Vector2Int; -public class BorderListMutator implements Stage { +public class BorderListStage implements Stage { private final String border; private final NoiseSampler noiseSampler; private final ProbabilityCollection replaceDefault; @@ -31,8 +31,8 @@ public class BorderListMutator implements Stage { private final Vector2Int[] borderPoints; - public BorderListMutator(Map> replace, String border, String defaultReplace, - NoiseSampler noiseSampler, ProbabilityCollection replaceDefault) { + public BorderListStage(Map> replace, String border, String defaultReplace, + NoiseSampler noiseSampler, ProbabilityCollection replaceDefault) { this.border = border; this.noiseSampler = noiseSampler; this.replaceDefault = replaceDefault; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderStage.java similarity index 83% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderMutator.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderStage.java index 1fb8b60a9..08e6bb366 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/BorderMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderStage.java @@ -5,7 +5,7 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.stage.mutators; import java.util.ArrayList; import java.util.HashSet; @@ -13,22 +13,22 @@ import java.util.List; import java.util.Set; import java.util.function.Predicate; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.util.vector.Vector2Int; -public class BorderMutator implements Stage { +public class BorderStage implements Stage { private final String border; private final NoiseSampler noiseSampler; private final ProbabilityCollection replace; private final String replaceTag; private final Vector2Int[] borderPoints; - public BorderMutator(String border, String replaceTag, NoiseSampler noiseSampler, ProbabilityCollection replace) { + public BorderStage(String border, String replaceTag, NoiseSampler noiseSampler, ProbabilityCollection replace) { this.border = border; this.noiseSampler = noiseSampler; this.replace = replace; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/ReplaceListMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceListStage.java similarity index 80% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/ReplaceListMutator.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceListStage.java index 081f0f5ed..79b2c585c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/ReplaceListMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceListStage.java @@ -5,28 +5,28 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.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.reimplementation.BiomeChunkImpl.ViewPoint; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -public class ReplaceListMutator implements Stage { +public class ReplaceListStage implements Stage { 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) { + public ReplaceListStage(Map> replace, String defaultTag, + ProbabilityCollection replaceDefault, NoiseSampler sampler) { this.replace = replace; this.sampler = sampler; this.defaultTag = defaultTag; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/ReplaceMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceStage.java similarity index 78% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/ReplaceMutator.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceStage.java index a46454a2c..df1c3be1e 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/ReplaceMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceStage.java @@ -5,25 +5,25 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.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.reimplementation.BiomeChunkImpl.ViewPoint; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -public class ReplaceMutator implements Stage { +public class ReplaceStage implements Stage { private final String replaceableTag; private final ProbabilityCollection replace; private final NoiseSampler sampler; - public ReplaceMutator(String replaceable, ProbabilityCollection replace, NoiseSampler sampler) { + public ReplaceStage(String replaceable, ProbabilityCollection replace, NoiseSampler sampler) { this.replaceableTag = replaceable; this.replace = replace; this.sampler = sampler; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/SmoothMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/SmoothStage.java similarity index 76% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/SmoothMutator.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/SmoothStage.java index c199daab2..2129ab2fc 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/reimplementation/stage/mutators/SmoothMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/SmoothStage.java @@ -5,21 +5,21 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.reimplementation.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.stage.mutators; import java.util.Objects; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.BiomeChunkImpl.ViewPoint; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.reimplementation.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.noise.NoiseSampler; -public class SmoothMutator implements Stage { +public class SmoothStage implements Stage { private final NoiseSampler sampler; - public SmoothMutator(NoiseSampler sampler) { + public SmoothStage(NoiseSampler sampler) { this.sampler = sampler; } 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 e99c13e6b..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-2021 Polyhedral Development - * - * The Terra 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 d5933e917..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2020-2021 Polyhedral Development - * - * The Terra 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.type.BiomeMutator; - - -public class MutatorStage implements com.dfsek.terra.addons.biome.pipeline.api.stage.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 - } -} From 5c58bd54a37c9ebdccba4d58e49586921bb10d01 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 7 Aug 2022 12:23:51 +1000 Subject: [PATCH 016/161] Ephemeral -> Placeholder --- .../addons/biome/pipeline/PipelineBiomeProvider.java | 6 +++--- .../addons/biome/pipeline/api/biome/PipelineBiome.java | 6 +++--- ...ipelineBiome.java => PlaceholderPipelineBiome.java} | 10 +++++----- .../biome/pipeline/api/biome/SelfPipelineBiome.java | 2 +- .../biome/pipeline/config/PipelineBiomeLoader.java | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) rename common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/{EphemeralPipelineBiome.java => PlaceholderPipelineBiome.java} (70%) diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java index c9a03c073..86a74051b 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java @@ -48,7 +48,7 @@ public class PipelineBiomeProvider implements BiomeProvider { this.biomes = new HashSet<>(); Iterable finalResult = result; result.forEach(pipelineBiome -> { - if(pipelineBiome.isEphemeral()) { + if(pipelineBiome.isPlaceholder()) { StringBuilder biomeList = new StringBuilder("\n"); StreamSupport.stream(finalResult.spliterator(), false) @@ -59,8 +59,8 @@ public class PipelineBiomeProvider implements BiomeProvider { .append(':') .append(delegate.getClass().getCanonicalName()) .append('\n')); - throw new IllegalArgumentException("Biome Pipeline leaks ephemeral biome \"" + pipelineBiome.getID() + - "\". Ensure there is a stage to guarantee replacement of the ephemeral biome. Biomes: " + + throw new IllegalArgumentException("Biome Pipeline leaks placeholder biome \"" + pipelineBiome.getID() + + "\". Ensure there is a stage to guarantee replacement of the placeholder biome. Biomes: " + biomeList); } this.biomes.add(pipelineBiome.getBiome()); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PipelineBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PipelineBiome.java index cbc4ffe90..df9cb4fc0 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PipelineBiome.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PipelineBiome.java @@ -9,8 +9,8 @@ import com.dfsek.terra.api.world.biome.Biome; public interface PipelineBiome extends StringIdentifiable { Biome getBiome(); - static PipelineBiome ephemeral(String id) { - return new EphemeralPipelineBiome(id); + static PipelineBiome placeholder(String id) { + return new PlaceholderPipelineBiome(id); } static PipelineBiome from(Biome biome) { @@ -23,7 +23,7 @@ public interface PipelineBiome extends StringIdentifiable { Set getTags(); - default boolean isEphemeral() { + default boolean isPlaceholder() { return false; } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/EphemeralPipelineBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PlaceholderPipelineBiome.java similarity index 70% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/EphemeralPipelineBiome.java rename to common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PlaceholderPipelineBiome.java index 44ef4a311..6ea7659be 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/EphemeralPipelineBiome.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PlaceholderPipelineBiome.java @@ -6,11 +6,11 @@ import java.util.Set; import com.dfsek.terra.api.world.biome.Biome; -final class EphemeralPipelineBiome implements PipelineBiome { +final class PlaceholderPipelineBiome implements PipelineBiome { private final Set tags; private final String id; - public EphemeralPipelineBiome(String id) { + public PlaceholderPipelineBiome(String id) { this.id = id; tags = new HashSet<>(); tags.add(id); @@ -19,7 +19,7 @@ final class EphemeralPipelineBiome implements PipelineBiome { @Override public Biome getBiome() { - throw new UnsupportedOperationException("Cannot get biome from ephemeral delegate"); + throw new UnsupportedOperationException("Cannot get raw biome from placeholder pipeline biome"); } @Override @@ -33,7 +33,7 @@ final class EphemeralPipelineBiome implements PipelineBiome { } @Override - public boolean isEphemeral() { + public boolean isPlaceholder() { return true; } @@ -44,7 +44,7 @@ final class EphemeralPipelineBiome implements PipelineBiome { @Override public boolean equals(Object obj) { - if(!(obj instanceof EphemeralPipelineBiome that)) return false; + if(!(obj instanceof PlaceholderPipelineBiome 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/biome/SelfPipelineBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/SelfPipelineBiome.java index 068fa8b16..53cf59c71 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/SelfPipelineBiome.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/SelfPipelineBiome.java @@ -24,7 +24,7 @@ final class SelfPipelineBiome implements PipelineBiome { } @Override - public boolean isEphemeral() { + public boolean isPlaceholder() { return true; } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java index 52ed6470e..799a7a0b1 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java @@ -27,6 +27,6 @@ public class PipelineBiomeLoader implements TypeLoader { return biomeRegistry .getByID((String) c) .map(PipelineBiome::from) - .orElseGet(() -> PipelineBiome.ephemeral((String) c)); + .orElseGet(() -> PipelineBiome.placeholder((String) c)); } } From 3522b5f17c16bcface810b46e4faaed189a5d5d4 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 7 Aug 2022 12:30:22 +1000 Subject: [PATCH 017/161] Remove test class from source --- .../addons/biome/pipeline/StringBiome.java | 40 ------------------- 1 file changed, 40 deletions(-) delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/StringBiome.java diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/StringBiome.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/StringBiome.java deleted file mode 100644 index d141ecf6e..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/StringBiome.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.dfsek.terra.addons.biome.pipeline; - -import java.util.Optional; -import java.util.Set; - -import com.dfsek.terra.api.properties.Context; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.biome.PlatformBiome; - -public record StringBiome(String name, String string) implements Biome { - - @Override - public Context getContext() { - return null; - } - - @Override - public String getID() { - return string; - } - - @Override - public Optional getPlatformBiome() { - return Optional.empty(); - } - - @Override - public void setPlatformBiome(PlatformBiome biome) { - } - - @Override - public int getColor() { - return 0; - } - - @Override - public Set getTags() { - return Set.of(name); - } -} \ No newline at end of file From 57cbea4000dc5198724dec8c9a075fa9fc78d006 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 7 Aug 2022 14:53:13 +1000 Subject: [PATCH 018/161] Replace sout with logger debug calls --- .../biome/pipeline/pipeline/PipelineImpl.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/PipelineImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/PipelineImpl.java index 318ac8933..9805c7b40 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/PipelineImpl.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/PipelineImpl.java @@ -1,18 +1,21 @@ package com.dfsek.terra.addons.biome.pipeline.pipeline; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.util.List; -import com.dfsek.terra.addons.biome.pipeline.api.SeededVector; 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.SeededVector; import com.dfsek.terra.addons.biome.pipeline.api.Source; import com.dfsek.terra.addons.biome.pipeline.api.Stage; public class PipelineImpl implements Pipeline { -// private static final Logger logger = LoggerFactory.getLogger(PipelineImpl.class); + private static final Logger logger = LoggerFactory.getLogger(PipelineImpl.class); private final Source source; private final List stages; @@ -45,10 +48,10 @@ public class PipelineImpl implements Pipeline { this.chunkOriginArrayIndex = chunkOriginArrayIndex; this.chunkSize = chunkSize; - System.out.println("Initialized a new biome pipeline:"); - System.out.println("Array size: " + arraySize + " (Target: " + idealChunkArraySize + ")"); - System.out.println("Internal array origin: " + chunkOriginArrayIndex); - System.out.println("Chunk size: " + chunkSize); + logger.debug("Initialized a new biome pipeline:"); + logger.debug("Array size: {} (Target: {})", arraySize, idealChunkArraySize); + logger.debug("Internal array origin: {}", chunkOriginArrayIndex); + logger.debug("Chunk size: {}", chunkSize); } @Override From 6cdef5d4ad2c03c3277e90512a60a59fffc19ad7 Mon Sep 17 00:00:00 2001 From: Astrash Date: Wed, 16 Nov 2022 14:09:04 +1100 Subject: [PATCH 019/161] Move pipeline reimplementation to separate addon --- .../LICENSE | 0 .../biome-provider-pipeline-2/README.md | 12 +++++++++ .../build.gradle.kts | 2 +- .../pipeline/v2}/BiomePipelineAddon.java | 26 +++++++++---------- .../pipeline/v2}/BiomePipelineColumn.java | 2 +- .../pipeline/v2}/PipelineBiomeProvider.java | 12 ++++----- .../biome/pipeline/v2/api/BiomeChunk.java | 10 +++++++ .../biome/pipeline/v2}/api/Expander.java | 6 ++--- .../biome/pipeline/v2}/api/Pipeline.java | 2 +- .../biome/pipeline/v2}/api/SeededVector.java | 2 +- .../addons/biome/pipeline/v2/api/Source.java | 11 ++++++++ .../addons/biome/pipeline/v2}/api/Stage.java | 6 ++--- .../v2}/api/biome/DelegatedPipelineBiome.java | 2 +- .../pipeline/v2}/api/biome/PipelineBiome.java | 2 +- .../api/biome/PlaceholderPipelineBiome.java | 2 +- .../v2}/api/biome/SelfPipelineBiome.java | 2 +- .../v2}/config/BiomePipelineTemplate.java | 10 +++---- .../v2}/config/PipelineBiomeLoader.java | 4 +-- .../config/source/SamplerSourceTemplate.java | 8 +++--- .../v2}/config/source/SourceTemplate.java | 4 +-- .../v2}/config/stage/StageTemplate.java | 4 +-- .../stage/expander/ExpanderStageTemplate.java | 8 +++--- .../mutator/BorderListStageTemplate.java | 10 +++---- .../stage/mutator/BorderStageTemplate.java | 10 +++---- .../mutator/ReplaceListStageTemplate.java | 10 +++---- .../stage/mutator/ReplaceStageTemplate.java | 10 +++---- .../stage/mutator/SmoothStageTemplate.java | 8 +++--- .../pipeline/v2}/pipeline/BiomeChunkImpl.java | 13 +++++----- .../pipeline/v2}/pipeline/PipelineImpl.java | 14 +++++----- .../pipeline/v2}/source/SamplerSource.java | 6 ++--- .../pipeline/v2}/source/SingleSource.java | 6 ++--- .../v2}/stage/expander/FractalExpander.java | 10 +++---- .../v2}/stage/mutators/BorderListStage.java | 10 +++---- .../v2}/stage/mutators/BorderStage.java | 10 +++---- .../v2}/stage/mutators/ReplaceListStage.java | 10 +++---- .../v2}/stage/mutators/ReplaceStage.java | 10 +++---- .../v2}/stage/mutators/SmoothStage.java | 10 +++---- .../src/main/resources/terra.addon.yml | 4 +-- .../addons/biome-provider-pipeline/README.md | 7 ----- .../addons/biome/pipeline/api/BiomeChunk.java | 10 ------- .../addons/biome/pipeline/api/Source.java | 11 -------- 41 files changed, 160 insertions(+), 156 deletions(-) rename common/addons/{biome-provider-pipeline => biome-provider-pipeline-2}/LICENSE (100%) create mode 100644 common/addons/biome-provider-pipeline-2/README.md rename common/addons/{biome-provider-pipeline => biome-provider-pipeline-2}/build.gradle.kts (93%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/BiomePipelineAddon.java (77%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/BiomePipelineColumn.java (96%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/PipelineBiomeProvider.java (91%) create mode 100644 common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/BiomeChunk.java rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/api/Expander.java (74%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/api/Pipeline.java (79%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/api/SeededVector.java (89%) create mode 100644 common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Source.java rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/api/Stage.java (52%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/api/biome/DelegatedPipelineBiome.java (92%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/api/biome/PipelineBiome.java (92%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/api/biome/PlaceholderPipelineBiome.java (94%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/api/biome/SelfPipelineBiome.java (92%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/config/BiomePipelineTemplate.java (86%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/config/PipelineBiomeLoader.java (89%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/config/source/SamplerSourceTemplate.java (77%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/config/source/SourceTemplate.java (74%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/config/stage/StageTemplate.java (85%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/config/stage/expander/ExpanderStageTemplate.java (56%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/config/stage/mutator/BorderListStageTemplate.java (73%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/config/stage/mutator/BorderStageTemplate.java (68%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/config/stage/mutator/ReplaceListStageTemplate.java (72%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/config/stage/mutator/ReplaceStageTemplate.java (66%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/config/stage/mutator/SmoothStageTemplate.java (56%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/pipeline/BiomeChunkImpl.java (95%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/pipeline/PipelineImpl.java (85%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/source/SamplerSource.java (78%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/source/SingleSource.java (70%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/stage/expander/FractalExpander.java (77%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/stage/mutators/BorderListStage.java (90%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/stage/mutators/BorderStage.java (88%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/stage/mutators/ReplaceListStage.java (88%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/stage/mutators/ReplaceStage.java (84%) rename common/addons/{biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline => biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2}/stage/mutators/SmoothStage.java (80%) rename common/addons/{biome-provider-pipeline => biome-provider-pipeline-2}/src/main/resources/terra.addon.yml (72%) delete mode 100644 common/addons/biome-provider-pipeline/README.md delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeChunk.java delete mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Source.java diff --git a/common/addons/biome-provider-pipeline/LICENSE b/common/addons/biome-provider-pipeline-2/LICENSE similarity index 100% rename from common/addons/biome-provider-pipeline/LICENSE rename to common/addons/biome-provider-pipeline-2/LICENSE diff --git a/common/addons/biome-provider-pipeline-2/README.md b/common/addons/biome-provider-pipeline-2/README.md new file mode 100644 index 000000000..d1d216dfd --- /dev/null +++ b/common/addons/biome-provider-pipeline-2/README.md @@ -0,0 +1,12 @@ +# 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/build.gradle.kts b/common/addons/biome-provider-pipeline-2/build.gradle.kts similarity index 93% rename from common/addons/biome-provider-pipeline/build.gradle.kts rename to common/addons/biome-provider-pipeline-2/build.gradle.kts index 2629ac476..8ca2e3b81 100644 --- a/common/addons/biome-provider-pipeline/build.gradle.kts +++ b/common/addons/biome-provider-pipeline-2/build.gradle.kts @@ -1,4 +1,4 @@ -version = version("1.0.1") +version = version("1.0.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) 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-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineAddon.java similarity index 77% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineAddon.java index 3468e168c..66c1a7908 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineAddon.java @@ -5,24 +5,24 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline; +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.config.BiomePipelineTemplate; -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.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.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.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.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.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; 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-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineColumn.java similarity index 96% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineColumn.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineColumn.java index f94493489..9b3e1391a 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineColumn.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineColumn.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline; +package com.dfsek.terra.addons.biome.pipeline.v2; import java.util.function.Consumer; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java similarity index 91% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java index 86a74051b..9748741a8 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java @@ -1,5 +1,10 @@ -package com.dfsek.terra.addons.biome.pipeline; +package com.dfsek.terra.addons.biome.pipeline.v2; +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.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; import net.jafama.FastMath; @@ -9,11 +14,6 @@ import java.util.HashSet; import java.util.Set; import java.util.stream.StreamSupport; -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.SeededVector; -import com.dfsek.terra.addons.biome.pipeline.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.registry.key.StringIdentifiable; import com.dfsek.terra.api.util.Column; diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/BiomeChunk.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/BiomeChunk.java new file mode 100644 index 000000000..818652f59 --- /dev/null +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/BiomeChunk.java @@ -0,0 +1,10 @@ +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/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Expander.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Expander.java similarity index 74% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Expander.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Expander.java index 3e8b9e42d..177e74694 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Expander.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Expander.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.addons.biome.pipeline.api; +package com.dfsek.terra.addons.biome.pipeline.v2.api; -import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; -import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; /** 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-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Pipeline.java similarity index 79% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Pipeline.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Pipeline.java index cb52328ce..cfb9ee9a8 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Pipeline.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Pipeline.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.api; +package com.dfsek.terra.addons.biome.pipeline.v2.api; import java.util.List; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/SeededVector.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/SeededVector.java similarity index 89% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/SeededVector.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/SeededVector.java index 951b7e592..6581ca50c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/SeededVector.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/SeededVector.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.api; +package com.dfsek.terra.addons.biome.pipeline.v2.api; public record SeededVector(long seed, int x, int z) { diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Source.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Source.java new file mode 100644 index 000000000..bfb135653 --- /dev/null +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Source.java @@ -0,0 +1,11 @@ +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/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Stage.java similarity index 52% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Stage.java index 4611968c3..ee2c75e89 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Stage.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.addons.biome.pipeline.api; +package com.dfsek.terra.addons.biome.pipeline.v2.api; -import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; -import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl.ViewPoint; +import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; public interface Stage { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/DelegatedPipelineBiome.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/DelegatedPipelineBiome.java similarity index 92% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/DelegatedPipelineBiome.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/DelegatedPipelineBiome.java index 70c94b58e..978e68b06 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/DelegatedPipelineBiome.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/DelegatedPipelineBiome.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.api.biome; +package com.dfsek.terra.addons.biome.pipeline.v2.api.biome; import java.util.Set; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PipelineBiome.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PipelineBiome.java similarity index 92% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PipelineBiome.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PipelineBiome.java index df9cb4fc0..ccde84022 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PipelineBiome.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PipelineBiome.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.api.biome; +package com.dfsek.terra.addons.biome.pipeline.v2.api.biome; import java.util.Set; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PlaceholderPipelineBiome.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PlaceholderPipelineBiome.java similarity index 94% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PlaceholderPipelineBiome.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PlaceholderPipelineBiome.java index 6ea7659be..87bd67120 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/PlaceholderPipelineBiome.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PlaceholderPipelineBiome.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.api.biome; +package com.dfsek.terra.addons.biome.pipeline.v2.api.biome; import java.util.HashSet; import java.util.Set; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/SelfPipelineBiome.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/SelfPipelineBiome.java similarity index 92% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/SelfPipelineBiome.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/SelfPipelineBiome.java index 53cf59c71..80583c1cb 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/biome/SelfPipelineBiome.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/SelfPipelineBiome.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.api.biome; +package com.dfsek.terra.addons.biome.pipeline.v2.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/config/BiomePipelineTemplate.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/BiomePipelineTemplate.java similarity index 86% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomePipelineTemplate.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/BiomePipelineTemplate.java index b88b75a7c..52ee4292d 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-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/BiomePipelineTemplate.java @@ -5,7 +5,7 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.config; +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; @@ -14,10 +14,10 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.List; -import com.dfsek.terra.addons.biome.pipeline.PipelineBiomeProvider; -import com.dfsek.terra.addons.biome.pipeline.pipeline.PipelineImpl; -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.v2.PipelineBiomeProvider; +import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.PipelineImpl; +import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; +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; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/PipelineBiomeLoader.java similarity index 89% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/PipelineBiomeLoader.java index 799a7a0b1..5e7a08578 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/PipelineBiomeLoader.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.pipeline.config; +package com.dfsek.terra.addons.biome.pipeline.v2.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.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.v2.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/source/SamplerSourceTemplate.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SamplerSourceTemplate.java similarity index 77% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/source/SamplerSourceTemplate.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SamplerSourceTemplate.java index a054976d7..dbfb1ef31 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/source/SamplerSourceTemplate.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SamplerSourceTemplate.java @@ -5,14 +5,14 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.config.source; +package com.dfsek.terra.addons.biome.pipeline.v2.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.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.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.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; 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/source/SourceTemplate.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SourceTemplate.java similarity index 74% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/source/SourceTemplate.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SourceTemplate.java index a8e88a8ab..ba61f8940 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/source/SourceTemplate.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SourceTemplate.java @@ -5,11 +5,11 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.config.source; +package com.dfsek.terra.addons.biome.pipeline.v2.config.source; 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.v2.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-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/StageTemplate.java similarity index 85% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageTemplate.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/StageTemplate.java index afed0c15e..c1cea771e 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-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/StageTemplate.java @@ -5,13 +5,13 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.config.stage; +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.api.Stage; +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; 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-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/expander/ExpanderStageTemplate.java similarity index 56% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/expander/ExpanderStageTemplate.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/expander/ExpanderStageTemplate.java index a8fce25be..312880d3b 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-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/expander/ExpanderStageTemplate.java @@ -5,11 +5,11 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.config.stage.expander; +package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.expander; -import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.api.Expander; -import com.dfsek.terra.addons.biome.pipeline.stage.expander.FractalExpander; +import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate; +import com.dfsek.terra.addons.biome.pipeline.v2.api.Expander; +import com.dfsek.terra.addons.biome.pipeline.v2.stage.expander.FractalExpander; public class ExpanderStageTemplate extends StageTemplate { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListStageTemplate.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderListStageTemplate.java similarity index 73% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListStageTemplate.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderListStageTemplate.java index fb415260d..57d5c7deb 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListStageTemplate.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderListStageTemplate.java @@ -5,16 +5,16 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; +package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator; import com.dfsek.tectonic.api.config.template.annotations.Value; import java.util.Map; -import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -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.stage.mutators.BorderListStage; +import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate; +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.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/BorderStageTemplate.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderStageTemplate.java similarity index 68% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderStageTemplate.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderStageTemplate.java index 5327c211c..605eeb9f4 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderStageTemplate.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderStageTemplate.java @@ -5,14 +5,14 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; +package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -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.stage.mutators.BorderStage; +import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate; +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.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/ReplaceListStageTemplate.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceListStageTemplate.java similarity index 72% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListStageTemplate.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceListStageTemplate.java index a6710286f..be9ade61c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListStageTemplate.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceListStageTemplate.java @@ -5,16 +5,16 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; +package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator; import com.dfsek.tectonic.api.config.template.annotations.Value; import java.util.Map; -import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -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.stage.mutators.ReplaceListStage; +import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate; +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.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/ReplaceStageTemplate.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceStageTemplate.java similarity index 66% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceStageTemplate.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceStageTemplate.java index 5a799eeb4..6f273a294 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceStageTemplate.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceStageTemplate.java @@ -5,14 +5,14 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; +package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -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.stage.mutators.ReplaceStage; +import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate; +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.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/SmoothStageTemplate.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/SmoothStageTemplate.java similarity index 56% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothStageTemplate.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/SmoothStageTemplate.java index 50a7aa5b9..a13e441af 100644 --- 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-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/SmoothStageTemplate.java @@ -5,11 +5,11 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; +package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator; -import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; -import com.dfsek.terra.addons.biome.pipeline.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.stage.mutators.SmoothStage; +import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate; +import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.SmoothStage; public class SmoothStageTemplate extends StageTemplate { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/BiomeChunkImpl.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java similarity index 95% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/BiomeChunkImpl.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java index b5f5b770f..cf739fa77 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/BiomeChunkImpl.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java @@ -1,15 +1,14 @@ -package com.dfsek.terra.addons.biome.pipeline.pipeline; +package com.dfsek.terra.addons.biome.pipeline.v2.pipeline; +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 net.jafama.FastMath; import java.util.List; -import com.dfsek.terra.addons.biome.pipeline.api.SeededVector; -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; - public class BiomeChunkImpl implements BiomeChunk { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/PipelineImpl.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/PipelineImpl.java similarity index 85% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/PipelineImpl.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/PipelineImpl.java index 9805c7b40..a01091d2e 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/PipelineImpl.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/PipelineImpl.java @@ -1,16 +1,16 @@ -package com.dfsek.terra.addons.biome.pipeline.pipeline; +package com.dfsek.terra.addons.biome.pipeline.v2.pipeline; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; -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.SeededVector; -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.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; public class PipelineImpl implements Pipeline { 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-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SamplerSource.java similarity index 78% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SamplerSource.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SamplerSource.java index eca41806b..f6d66b9e2 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-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SamplerSource.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.addons.biome.pipeline.source; +package com.dfsek.terra.addons.biome.pipeline.v2.source; -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.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; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SingleSource.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SingleSource.java similarity index 70% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SingleSource.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SingleSource.java index 6dcab0d3c..b2c0ee8db 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SingleSource.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SingleSource.java @@ -1,10 +1,10 @@ -package com.dfsek.terra.addons.biome.pipeline.source; +package com.dfsek.terra.addons.biome.pipeline.v2.source; import java.util.Collections; import java.util.Set; -import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; -import com.dfsek.terra.addons.biome.pipeline.api.Source; +import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.biome.pipeline.v2.api.Source; public class SingleSource implements Source { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/expander/FractalExpander.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/expander/FractalExpander.java similarity index 77% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/expander/FractalExpander.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/expander/FractalExpander.java index 5c94b8943..c82743ba4 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/expander/FractalExpander.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/expander/FractalExpander.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.addons.biome.pipeline.stage.expander; +package com.dfsek.terra.addons.biome.pipeline.v2.stage.expander; -import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; -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.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; @@ -15,7 +15,7 @@ public class FractalExpander implements Expander { } @Override - public PipelineBiome fillBiome(ViewPoint viewPoint) { + public PipelineBiome fillBiome(BiomeChunkImpl.ViewPoint viewPoint) { int xMod2 = viewPoint.gridX() % 2; int zMod2 = viewPoint.gridZ() % 2; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderListStage.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderListStage.java similarity index 90% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderListStage.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderListStage.java index b814806d6..2587bc792 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderListStage.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderListStage.java @@ -5,7 +5,7 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators; import java.util.ArrayList; import java.util.HashSet; @@ -14,9 +14,9 @@ import java.util.Map; import java.util.Set; import java.util.function.Predicate; -import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; -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.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.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.util.vector.Vector2Int; @@ -60,7 +60,7 @@ public class BorderListStage implements Stage { } @Override - public PipelineBiome apply(ViewPoint viewPoint) { + public PipelineBiome apply(BiomeChunkImpl.ViewPoint viewPoint) { PipelineBiome center = viewPoint.getBiome(); if(center.getTags().contains(defaultReplace)) { for(Vector2Int point : borderPoints) { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderStage.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderStage.java similarity index 88% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderStage.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderStage.java index 08e6bb366..274ef1ff9 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/BorderStage.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderStage.java @@ -5,7 +5,7 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators; import java.util.ArrayList; import java.util.HashSet; @@ -13,9 +13,9 @@ import java.util.List; import java.util.Set; import java.util.function.Predicate; -import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; -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.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.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.util.vector.Vector2Int; @@ -44,7 +44,7 @@ public class BorderStage implements Stage { } @Override - public PipelineBiome apply(ViewPoint viewPoint) { + public PipelineBiome apply(BiomeChunkImpl.ViewPoint viewPoint) { PipelineBiome center = viewPoint.getBiome(); if(center.getTags().contains(replaceTag)) { for(Vector2Int point : borderPoints) { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceListStage.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceListStage.java similarity index 88% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceListStage.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceListStage.java index 79b2c585c..372127546 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceListStage.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceListStage.java @@ -5,16 +5,16 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.v2.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.pipeline.BiomeChunkImpl.ViewPoint; -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.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.api.util.collection.ProbabilityCollection; @@ -34,7 +34,7 @@ public class ReplaceListStage implements Stage { } @Override - public PipelineBiome apply(ViewPoint viewPoint) { + public PipelineBiome apply(BiomeChunkImpl.ViewPoint viewPoint) { PipelineBiome center = viewPoint.getBiome(); if(replace.containsKey(center)) { PipelineBiome biome = replace.get(center).get(sampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed()); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceStage.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceStage.java similarity index 84% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceStage.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceStage.java index df1c3be1e..b7a2fd684 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/ReplaceStage.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceStage.java @@ -5,15 +5,15 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators; import java.util.HashSet; import java.util.Set; import java.util.stream.Stream; -import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; -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.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.api.util.collection.ProbabilityCollection; @@ -30,7 +30,7 @@ public class ReplaceStage implements Stage { } @Override - public PipelineBiome apply(ViewPoint viewPoint) { + public PipelineBiome apply(BiomeChunkImpl.ViewPoint viewPoint) { if(viewPoint.getBiome().getTags().contains(replaceableTag)) { PipelineBiome biome = replace.get(sampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed()); return biome.isSelf() ? viewPoint.getBiome() : biome; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/SmoothStage.java b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/SmoothStage.java similarity index 80% rename from common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/SmoothStage.java rename to common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/SmoothStage.java index 2129ab2fc..92bbee433 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stage/mutators/SmoothStage.java +++ b/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/SmoothStage.java @@ -5,13 +5,13 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.pipeline.stage.mutators; +package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators; import java.util.Objects; -import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl.ViewPoint; -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.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; @@ -24,7 +24,7 @@ public class SmoothStage implements Stage { } @Override - public PipelineBiome apply(ViewPoint viewPoint) { + public PipelineBiome apply(BiomeChunkImpl.ViewPoint viewPoint) { PipelineBiome top = viewPoint.getRelativeBiome(1, 0); PipelineBiome bottom = viewPoint.getRelativeBiome(-1, 0); PipelineBiome left = viewPoint.getRelativeBiome(0, 1); diff --git a/common/addons/biome-provider-pipeline/src/main/resources/terra.addon.yml b/common/addons/biome-provider-pipeline-2/src/main/resources/terra.addon.yml similarity index 72% rename from common/addons/biome-provider-pipeline/src/main/resources/terra.addon.yml rename to common/addons/biome-provider-pipeline-2/src/main/resources/terra.addon.yml index abd2555a5..fbb711152 100644 --- a/common/addons/biome-provider-pipeline/src/main/resources/terra.addon.yml +++ b/common/addons/biome-provider-pipeline-2/src/main/resources/terra.addon.yml @@ -1,10 +1,10 @@ schema-version: 1 contributors: - Terra contributors -id: biome-provider-pipeline +id: biome-provider-pipeline-2 version: @VERSION@ entrypoints: - - "com.dfsek.terra.addons.biome.pipeline.BiomePipelineAddon" + - "com.dfsek.terra.addons.biome.pipeline.v2.BiomePipelineAddon" website: issues: https://github.com/PolyhedralDev/Terra/issues source: https://github.com/PolyhedralDev/Terra diff --git a/common/addons/biome-provider-pipeline/README.md b/common/addons/biome-provider-pipeline/README.md deleted file mode 100644 index 9e55109a7..000000000 --- a/common/addons/biome-provider-pipeline/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# biome-provider-pipeline - -Implements the Biome Pipeline, a procedural biome provider that uses a series -of "stages" to apply "mutations" to a 2D grid of biomes. - -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/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 deleted file mode 100644 index 4b7d60ae2..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeChunk.java +++ /dev/null @@ -1,10 +0,0 @@ -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/Source.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Source.java deleted file mode 100644 index 185463786..000000000 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Source.java +++ /dev/null @@ -1,11 +0,0 @@ -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 From c1c85174ed8080438ad0219d29b2b41119bfcf81 Mon Sep 17 00:00:00 2001 From: Astrash Date: Wed, 16 Nov 2022 14:13:16 +1100 Subject: [PATCH 020/161] Re-add original pipeline implementation --- common/addons/biome-provider-pipeline/LICENSE | 21 +++ .../addons/biome-provider-pipeline/README.md | 7 + .../biome-provider-pipeline/build.gradle.kts | 12 ++ .../biome/pipeline/BiomeHolderImpl.java | 94 +++++++++++++ .../addons/biome/pipeline/BiomePipeline.java | 83 +++++++++++ .../biome/pipeline/BiomePipelineAddon.java | 89 ++++++++++++ .../biome/pipeline/BiomePipelineColumn.java | 71 ++++++++++ .../biome/pipeline/BiomePipelineProvider.java | 131 ++++++++++++++++++ .../biome/pipeline/api/BiomeHolder.java | 26 ++++ .../pipeline/api/delegate/BiomeDelegate.java | 35 +++++ .../pipeline/api/delegate/DelegatedBiome.java | 40 ++++++ .../api/delegate/EphemeralBiomeDelegate.java | 51 +++++++ .../pipeline/api/delegate/SelfDelegate.java | 40 ++++++ .../biome/pipeline/api/stage/Stage.java | 20 +++ .../api/stage/type/BiomeExpander.java | 15 ++ .../pipeline/api/stage/type/BiomeMutator.java | 37 +++++ .../pipeline/config/BiomeDelegateLoader.java | 32 +++++ .../config/BiomePipelineTemplate.java | 54 ++++++++ .../config/BiomeProviderTemplate.java | 37 +++++ .../config/SamplerSourceTemplate.java | 34 +++++ .../biome/pipeline/config/SourceTemplate.java | 17 +++ .../pipeline/config/stage/StageTemplate.java | 23 +++ .../stage/expander/ExpanderStageTemplate.java | 21 +++ .../mutator/BorderListMutatorTemplate.java | 42 ++++++ .../stage/mutator/BorderMutatorTemplate.java | 36 +++++ .../mutator/ReplaceListMutatorTemplate.java | 38 +++++ .../stage/mutator/ReplaceMutatorTemplate.java | 33 +++++ .../stage/mutator/SmoothMutatorTemplate.java | 21 +++ .../pipeline/expand/FractalExpander.java | 27 ++++ .../pipeline/mutator/BorderListMutator.java | 67 +++++++++ .../biome/pipeline/mutator/BorderMutator.java | 66 +++++++++ .../pipeline/mutator/ReplaceListMutator.java | 72 ++++++++++ .../pipeline/mutator/ReplaceMutator.java | 57 ++++++++ .../biome/pipeline/mutator/SmoothMutator.java | 46 ++++++ .../biome/pipeline/source/BiomeSource.java | 17 +++ .../biome/pipeline/source/SamplerSource.java | 33 +++++ .../biome/pipeline/stages/ExpanderStage.java | 37 +++++ .../biome/pipeline/stages/MutatorStage.java | 46 ++++++ .../src/main/resources/terra.addon.yml | 12 ++ 39 files changed, 1640 insertions(+) create mode 100644 common/addons/biome-provider-pipeline/LICENSE create mode 100644 common/addons/biome-provider-pipeline/README.md create mode 100644 common/addons/biome-provider-pipeline/build.gradle.kts create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineColumn.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/BiomeDelegate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/DelegatedBiome.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/EphemeralBiomeDelegate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/SelfDelegate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/Stage.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/type/BiomeExpander.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/type/BiomeMutator.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeDelegateLoader.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomePipelineTemplate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SamplerSourceTemplate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageTemplate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/expander/ExpanderStageTemplate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SamplerSource.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java create mode 100644 common/addons/biome-provider-pipeline/src/main/resources/terra.addon.yml diff --git a/common/addons/biome-provider-pipeline/LICENSE b/common/addons/biome-provider-pipeline/LICENSE new file mode 100644 index 000000000..64c1cd516 --- /dev/null +++ b/common/addons/biome-provider-pipeline/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2021 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/README.md b/common/addons/biome-provider-pipeline/README.md new file mode 100644 index 000000000..9e55109a7 --- /dev/null +++ b/common/addons/biome-provider-pipeline/README.md @@ -0,0 +1,7 @@ +# biome-provider-pipeline + +Implements the Biome Pipeline, a procedural biome provider that uses a series +of "stages" to apply "mutations" to a 2D grid of biomes. + +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 new file mode 100644 index 000000000..2629ac476 --- /dev/null +++ b/common/addons/biome-provider-pipeline/build.gradle.kts @@ -0,0 +1,12 @@ +version = version("1.0.1") + +dependencies { + compileOnlyApi(project(":common:addons:manifest-addon-loader")) + + implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) + testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) +} + +tasks.named("shadowJar") { + relocate("net.jafama", "com.dfsek.terra.addons.biome.pipeline.lib.jafama") +} \ 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 new file mode 100644 index 000000000..57304011b --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 new file mode 100644 index 000000000..8a4be5d7d --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 new file mode 100644 index 000000000..42aa95b0e --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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.tectonic.api.config.template.object.ObjectTemplate; + +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.config.BiomePipelineTemplate; +import com.dfsek.terra.addons.biome.pipeline.config.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.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"), 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); + }) + .failThrough(); + platform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(addon, ConfigPackPostLoadEvent.class) + .then(event -> { + Registry biomeRegistry = event.getPack().getRegistry(Biome.class); + event.getPack().applyLoader(BiomeDelegate.class, new BiomeDelegateLoader(biomeRegistry)); + }); + } +} 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 new file mode 100644 index 000000000..609d22ee1 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineColumn.java @@ -0,0 +1,71 @@ +package com.dfsek.terra.addons.biome.pipeline; + +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; + + +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/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java new file mode 100644 index 000000000..f3f4c3aa9 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 net.jafama.FastMath; + +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 = FastMath.floorDiv(x, pipeline.getSize()); + int fdZ = FastMath.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/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 new file mode 100644 index 000000000..26bb63315 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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/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 new file mode 100644 index 000000000..7e339285a --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/BiomeDelegate.java @@ -0,0 +1,35 @@ +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 new file mode 100644 index 000000000..4085f6a43 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/DelegatedBiome.java @@ -0,0 +1,40 @@ +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 new file mode 100644 index 000000000..d02221f1b --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/EphemeralBiomeDelegate.java @@ -0,0 +1,51 @@ +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 new file mode 100644 index 000000000..60b744059 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/delegate/SelfDelegate.java @@ -0,0 +1,40 @@ +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 new file mode 100644 index 000000000..fb4b1007b --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/Stage.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 new file mode 100644 index 000000000..c3e721c08 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/type/BiomeExpander.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 new file mode 100644 index 000000000..f7cc3b7bd --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/stage/type/BiomeMutator.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 new file mode 100644 index 000000000..c416e4804 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeDelegateLoader.java @@ -0,0 +1,32 @@ +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 new file mode 100644 index 000000000..e35d621e2 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomePipelineTemplate.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 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.api.config.meta.Meta; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + + +@SuppressWarnings({ "FieldMayBeFinal", "unused" }) +public class BiomePipelineTemplate extends BiomeProviderTemplate { + @Value("pipeline.initial-size") + @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. + + 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; + + @Value("pipeline.source") + @Description("The Biome Source to use for initial population of biomes.") + private @Meta BiomeSource 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); + } +} 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 new file mode 100644 index 000000000..1412485fe --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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/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 new file mode 100644 index 000000000..2ba70b608 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SamplerSourceTemplate.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 new file mode 100644 index 000000000..c80ec0cee --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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/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 new file mode 100644 index 000000000..ba4bee85d --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageTemplate.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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; + +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.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/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 new file mode 100644 index 000000000..8f66315ef --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/expander/ExpanderStageTemplate.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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.expander; + +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.expand.FractalExpander; +import com.dfsek.terra.addons.biome.pipeline.stages.ExpanderStage; + + +public class ExpanderStageTemplate extends StageTemplate { + @Override + public Stage get() { + return new ExpanderStage(new FractalExpander(noise)); + } +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java new file mode 100644 index 000000000..fcf523e44 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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/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 new file mode 100644 index 000000000..4db9e4e99 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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/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 new file mode 100644 index 000000000..5713b3ff0 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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/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 new file mode 100644 index 000000000..dae592e2b --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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/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 new file mode 100644 index 000000000..b26dce902 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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/expand/FractalExpander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java new file mode 100644 index 000000000..50d36a5c4 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 new file mode 100644 index 000000000..59f6dd9b4 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 new file mode 100644 index 000000000..5755719f4 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 new file mode 100644 index 000000000..51a74c285 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 new file mode 100644 index 000000000..cec3e5e9e --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 new file mode 100644 index 000000000..4785216e8 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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/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 new file mode 100644 index 000000000..d56151f07 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 new file mode 100644 index 000000000..62656ac17 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/SamplerSource.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.util.collection.ProbabilityCollection; + + +public class SamplerSource implements BiomeSource { + private final ProbabilityCollection biomes; + private final NoiseSampler sampler; + + public SamplerSource(ProbabilityCollection biomes, NoiseSampler sampler) { + this.biomes = biomes; + this.sampler = sampler; + } + + @Override + public BiomeDelegate getBiome(double x, double z, long seed) { + return biomes.get(sampler, x, z, seed); + } + + @Override + public Iterable getBiomes() { + return biomes.getContents(); + } +} 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 new file mode 100644 index 000000000..e99c13e6b --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 new file mode 100644 index 000000000..8a9a06aae --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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-pipeline/src/main/resources/terra.addon.yml b/common/addons/biome-provider-pipeline/src/main/resources/terra.addon.yml new file mode 100644 index 000000000..abd2555a5 --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/resources/terra.addon.yml @@ -0,0 +1,12 @@ +schema-version: 1 +contributors: + - Terra contributors +id: biome-provider-pipeline +version: @VERSION@ +entrypoints: + - "com.dfsek.terra.addons.biome.pipeline.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 From 02d3445dd9c3aeb975af99882ec4fe667ceff6db Mon Sep 17 00:00:00 2001 From: Astrash Date: Wed, 16 Nov 2022 14:22:14 +1100 Subject: [PATCH 021/161] Include deprecation notice for pipeline v1 --- .../terra/addons/biome/pipeline/BiomePipelineAddon.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 42aa95b0e..4aabd44d0 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java @@ -8,6 +8,8 @@ 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; @@ -39,6 +41,8 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider; public class BiomePipelineAddon implements AddonInitializer { + private static final Logger logger = LoggerFactory.getLogger(BiomePipelineAddon.class); + public static final TypeKey>> SOURCE_REGISTRY_KEY = new TypeKey<>() { }; @@ -85,5 +89,7 @@ public class BiomePipelineAddon implements AddonInitializer { Registry biomeRegistry = event.getPack().getRegistry(Biome.class); event.getPack().applyLoader(BiomeDelegate.class, new BiomeDelegateLoader(biomeRegistry)); }); + + 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-2 addon for future pack development instead."); } } From 1f7c4ee4e78d29be4c8bcd2f29059c0dff25a142 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 16 Nov 2022 14:02:34 -0700 Subject: [PATCH 022/161] rename from "2" to "v2" --- .../LICENSE | 0 .../README.md | 0 .../build.gradle.kts | 0 .../terra/addons/biome/pipeline/v2/BiomePipelineAddon.java | 0 .../terra/addons/biome/pipeline/v2/BiomePipelineColumn.java | 0 .../terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java | 0 .../dfsek/terra/addons/biome/pipeline/v2/api/BiomeChunk.java | 0 .../com/dfsek/terra/addons/biome/pipeline/v2/api/Expander.java | 0 .../com/dfsek/terra/addons/biome/pipeline/v2/api/Pipeline.java | 0 .../dfsek/terra/addons/biome/pipeline/v2/api/SeededVector.java | 0 .../com/dfsek/terra/addons/biome/pipeline/v2/api/Source.java | 0 .../com/dfsek/terra/addons/biome/pipeline/v2/api/Stage.java | 0 .../biome/pipeline/v2/api/biome/DelegatedPipelineBiome.java | 0 .../terra/addons/biome/pipeline/v2/api/biome/PipelineBiome.java | 0 .../biome/pipeline/v2/api/biome/PlaceholderPipelineBiome.java | 0 .../addons/biome/pipeline/v2/api/biome/SelfPipelineBiome.java | 0 .../addons/biome/pipeline/v2/config/BiomePipelineTemplate.java | 0 .../addons/biome/pipeline/v2/config/PipelineBiomeLoader.java | 0 .../biome/pipeline/v2/config/source/SamplerSourceTemplate.java | 0 .../addons/biome/pipeline/v2/config/source/SourceTemplate.java | 0 .../addons/biome/pipeline/v2/config/stage/StageTemplate.java | 0 .../v2/config/stage/expander/ExpanderStageTemplate.java | 0 .../v2/config/stage/mutator/BorderListStageTemplate.java | 0 .../pipeline/v2/config/stage/mutator/BorderStageTemplate.java | 0 .../v2/config/stage/mutator/ReplaceListStageTemplate.java | 0 .../pipeline/v2/config/stage/mutator/ReplaceStageTemplate.java | 0 .../pipeline/v2/config/stage/mutator/SmoothStageTemplate.java | 0 .../terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java | 0 .../terra/addons/biome/pipeline/v2/pipeline/PipelineImpl.java | 0 .../terra/addons/biome/pipeline/v2/source/SamplerSource.java | 0 .../terra/addons/biome/pipeline/v2/source/SingleSource.java | 0 .../biome/pipeline/v2/stage/expander/FractalExpander.java | 0 .../biome/pipeline/v2/stage/mutators/BorderListStage.java | 0 .../addons/biome/pipeline/v2/stage/mutators/BorderStage.java | 0 .../biome/pipeline/v2/stage/mutators/ReplaceListStage.java | 0 .../addons/biome/pipeline/v2/stage/mutators/ReplaceStage.java | 0 .../addons/biome/pipeline/v2/stage/mutators/SmoothStage.java | 0 .../src/main/resources/terra.addon.yml | 2 +- .../dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java | 2 +- 39 files changed, 2 insertions(+), 2 deletions(-) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/LICENSE (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/README.md (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/build.gradle.kts (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineAddon.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineColumn.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/BiomeChunk.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Expander.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Pipeline.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/SeededVector.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Source.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Stage.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/DelegatedPipelineBiome.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PipelineBiome.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PlaceholderPipelineBiome.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/SelfPipelineBiome.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/BiomePipelineTemplate.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/PipelineBiomeLoader.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SamplerSourceTemplate.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SourceTemplate.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/StageTemplate.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/expander/ExpanderStageTemplate.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderListStageTemplate.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderStageTemplate.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceListStageTemplate.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceStageTemplate.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/SmoothStageTemplate.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/PipelineImpl.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SamplerSource.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SingleSource.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/expander/FractalExpander.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderListStage.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderStage.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceListStage.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceStage.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/SmoothStage.java (100%) rename common/addons/{biome-provider-pipeline-2 => biome-provider-pipeline-v2}/src/main/resources/terra.addon.yml (91%) diff --git a/common/addons/biome-provider-pipeline-2/LICENSE b/common/addons/biome-provider-pipeline-v2/LICENSE similarity index 100% rename from common/addons/biome-provider-pipeline-2/LICENSE rename to common/addons/biome-provider-pipeline-v2/LICENSE diff --git a/common/addons/biome-provider-pipeline-2/README.md b/common/addons/biome-provider-pipeline-v2/README.md similarity index 100% rename from common/addons/biome-provider-pipeline-2/README.md rename to common/addons/biome-provider-pipeline-v2/README.md diff --git a/common/addons/biome-provider-pipeline-2/build.gradle.kts b/common/addons/biome-provider-pipeline-v2/build.gradle.kts similarity index 100% rename from common/addons/biome-provider-pipeline-2/build.gradle.kts rename to common/addons/biome-provider-pipeline-v2/build.gradle.kts diff --git a/common/addons/biome-provider-pipeline-2/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 similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineAddon.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineAddon.java diff --git a/common/addons/biome-provider-pipeline-2/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 similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineColumn.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/BiomePipelineColumn.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java diff --git a/common/addons/biome-provider-pipeline-2/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 similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/BiomeChunk.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/BiomeChunk.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Expander.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Expander.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Expander.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Expander.java diff --git a/common/addons/biome-provider-pipeline-2/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 similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Pipeline.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Pipeline.java diff --git a/common/addons/biome-provider-pipeline-2/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 similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/SeededVector.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/SeededVector.java diff --git a/common/addons/biome-provider-pipeline-2/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 similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Source.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Source.java diff --git a/common/addons/biome-provider-pipeline-2/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 similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Stage.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/Stage.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/DelegatedPipelineBiome.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/DelegatedPipelineBiome.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/DelegatedPipelineBiome.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/DelegatedPipelineBiome.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PipelineBiome.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PipelineBiome.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PipelineBiome.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PipelineBiome.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PlaceholderPipelineBiome.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PlaceholderPipelineBiome.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PlaceholderPipelineBiome.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/PlaceholderPipelineBiome.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/SelfPipelineBiome.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/SelfPipelineBiome.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/SelfPipelineBiome.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/api/biome/SelfPipelineBiome.java diff --git a/common/addons/biome-provider-pipeline-2/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 similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/BiomePipelineTemplate.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/BiomePipelineTemplate.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/PipelineBiomeLoader.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/PipelineBiomeLoader.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/PipelineBiomeLoader.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/PipelineBiomeLoader.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SamplerSourceTemplate.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SamplerSourceTemplate.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SamplerSourceTemplate.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SamplerSourceTemplate.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SourceTemplate.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SourceTemplate.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SourceTemplate.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/source/SourceTemplate.java diff --git a/common/addons/biome-provider-pipeline-2/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 similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/StageTemplate.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/StageTemplate.java diff --git a/common/addons/biome-provider-pipeline-2/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 similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/expander/ExpanderStageTemplate.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/expander/ExpanderStageTemplate.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderListStageTemplate.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderListStageTemplate.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderListStageTemplate.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderListStageTemplate.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderStageTemplate.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderStageTemplate.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderStageTemplate.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/BorderStageTemplate.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceListStageTemplate.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceListStageTemplate.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceListStageTemplate.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceListStageTemplate.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceStageTemplate.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceStageTemplate.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceStageTemplate.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/ReplaceStageTemplate.java diff --git a/common/addons/biome-provider-pipeline-2/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 similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/SmoothStageTemplate.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/config/stage/mutator/SmoothStageTemplate.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/PipelineImpl.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/PipelineImpl.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/PipelineImpl.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/PipelineImpl.java diff --git a/common/addons/biome-provider-pipeline-2/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 similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SamplerSource.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SamplerSource.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SingleSource.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SingleSource.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SingleSource.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/source/SingleSource.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/expander/FractalExpander.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/expander/FractalExpander.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/expander/FractalExpander.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/expander/FractalExpander.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderListStage.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderListStage.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderListStage.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderListStage.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderStage.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderStage.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderStage.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/BorderStage.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceListStage.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceListStage.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceListStage.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceListStage.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceStage.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceStage.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceStage.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/ReplaceStage.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/SmoothStage.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/SmoothStage.java similarity index 100% rename from common/addons/biome-provider-pipeline-2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/SmoothStage.java rename to common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/stage/mutators/SmoothStage.java diff --git a/common/addons/biome-provider-pipeline-2/src/main/resources/terra.addon.yml b/common/addons/biome-provider-pipeline-v2/src/main/resources/terra.addon.yml similarity index 91% rename from common/addons/biome-provider-pipeline-2/src/main/resources/terra.addon.yml rename to common/addons/biome-provider-pipeline-v2/src/main/resources/terra.addon.yml index fbb711152..f800574ca 100644 --- a/common/addons/biome-provider-pipeline-2/src/main/resources/terra.addon.yml +++ b/common/addons/biome-provider-pipeline-v2/src/main/resources/terra.addon.yml @@ -1,7 +1,7 @@ schema-version: 1 contributors: - Terra contributors -id: biome-provider-pipeline-2 +id: biome-provider-pipeline-v2 version: @VERSION@ entrypoints: - "com.dfsek.terra.addons.biome.pipeline.v2.BiomePipelineAddon" 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 4aabd44d0..6765ab3c3 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 @@ -90,6 +90,6 @@ public class BiomePipelineAddon implements AddonInitializer { event.getPack().applyLoader(BiomeDelegate.class, new BiomeDelegateLoader(biomeRegistry)); }); - 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-2 addon for future pack development instead."); + 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."); } } From 35802675320b2975469757e532499e03134a0e53 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 12 Aug 2022 11:08:16 +1000 Subject: [PATCH 023/161] Image library initial implementation *Moves the BufferedImage loader into the library, rather than being a loader implemented in common/implementation --- common/addons/library-image/build.gradle.kts | 8 +++ .../terra/addons/image/ImageLibraryAddon.java | 49 +++++++++++++++++++ .../image}/config/BufferedImageLoader.java | 19 +------ .../ClosestColorConverterTemplate.java | 16 ++++++ .../converter/ColorConverterTemplate.java | 9 ++++ .../ExactColorConverterTemplate.java | 18 +++++++ .../config/picker/ColorPickerTemplate.java | 17 +++++++ .../picker/SingleColorPickerTemplate.java | 18 +++++++ .../picker/TileColorPickerTemplate.java | 13 +++++ .../converter/ClosestMatchColorConverter.java | 39 +++++++++++++++ .../image/converter/ColorConverter.java | 8 +++ .../image/converter/ExactColorConverter.java | 31 ++++++++++++ .../mapping/BiomeDefinedColorMapping.java | 38 ++++++++++++++ .../image/converter/mapping/ColorMapping.java | 8 +++ .../addons/image/picker/ColorPicker.java | 15 ++++++ .../image/picker/SimpleColorPicker.java | 26 ++++++++++ .../addons/image/picker/TileColorPicker.java | 24 +++++++++ .../image/picker/transform/Alignment.java | 30 ++++++++++++ .../picker/transform/ImageTransformation.java | 11 +++++ .../terra/addons/image/util/ColorUtil.java | 30 ++++++++++++ .../terra/addons/image/util/MapUtil.java | 23 +++++++++ .../src/main/resources/terra.addon.yml | 12 +++++ .../terra/config/pack/ConfigPackImpl.java | 5 +- 23 files changed, 445 insertions(+), 22 deletions(-) create mode 100644 common/addons/library-image/build.gradle.kts create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java rename common/{implementation/base/src/main/java/com/dfsek/terra/config/loaders => addons/library-image/src/main/java/com/dfsek/terra/addons/image}/config/BufferedImageLoader.java (58%) create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ClosestColorConverterTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ColorConverterTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ExactColorConverterTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/ColorPickerTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/SingleColorPickerTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/TileColorPickerTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ColorConverter.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/BiomeDefinedColorMapping.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/ColorMapping.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/ColorPicker.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/SimpleColorPicker.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/TileColorPicker.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/Alignment.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/ImageTransformation.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MapUtil.java create mode 100644 common/addons/library-image/src/main/resources/terra.addon.yml diff --git a/common/addons/library-image/build.gradle.kts b/common/addons/library-image/build.gradle.kts new file mode 100644 index 000000000..6f5d40074 --- /dev/null +++ b/common/addons/library-image/build.gradle.kts @@ -0,0 +1,8 @@ +version = version("1.0.0") + +dependencies { + compileOnlyApi(project(":common:addons:manifest-addon-loader")) + + implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) + testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) +} 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 new file mode 100644 index 000000000..020740059 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java @@ -0,0 +1,49 @@ +package com.dfsek.terra.addons.image; + +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import java.awt.image.BufferedImage; +import java.util.function.Supplier; + +import com.dfsek.terra.addons.image.config.BufferedImageLoader; +import com.dfsek.terra.addons.image.config.picker.SingleColorPickerTemplate; +import com.dfsek.terra.addons.image.config.picker.TileColorPickerTemplate; +import com.dfsek.terra.addons.image.picker.ColorPicker; +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; + + +public class ImageLibraryAddon implements AddonInitializer { + + public static final TypeKey>> COLOR_PICKER_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(10) + .then(event -> { + event.getPack().applyLoader(BufferedImage.class, new BufferedImageLoader(event.getPack().getLoader())); + }) + .then(event -> { + CheckedRegistry>> colorPickerRegistry = event.getPack().getOrCreateRegistry( + COLOR_PICKER_REGISTRY_KEY); + colorPickerRegistry.register(addon.key("SINGLE"), SingleColorPickerTemplate::new); + colorPickerRegistry.register(addon.key("TILED"), TileColorPickerTemplate::new); + }); + } +} diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/BufferedImageLoader.java similarity index 58% rename from common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/BufferedImageLoader.java index 98f24842c..d31bce66d 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/BufferedImageLoader.java @@ -1,21 +1,4 @@ -/* - * 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.loaders.config; +package com.dfsek.terra.addons.image.config; import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ClosestColorConverterTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ClosestColorConverterTemplate.java new file mode 100644 index 000000000..61aca4b79 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ClosestColorConverterTemplate.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.addons.image.config.converter; + +import com.dfsek.terra.addons.image.converter.ClosestMatchColorConverter; +import com.dfsek.terra.addons.image.converter.ColorConverter; +import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; + + +public abstract class ClosestColorConverterTemplate implements ColorConverterTemplate { + + protected abstract ColorMapping getMapping(); + + @Override + public ColorConverter get() { + return new ClosestMatchColorConverter(getMapping().get()); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ColorConverterTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ColorConverterTemplate.java new file mode 100644 index 000000000..c0cf7a7d5 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ColorConverterTemplate.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.addons.image.config.converter; + +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.image.converter.ColorConverter; + + +public interface ColorConverterTemplate extends ObjectTemplate> { +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ExactColorConverterTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ExactColorConverterTemplate.java new file mode 100644 index 000000000..6c0a8df28 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ExactColorConverterTemplate.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.image.config.converter; + +import com.dfsek.terra.addons.image.converter.ColorConverter; +import com.dfsek.terra.addons.image.converter.ExactColorConverter; +import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; + + +public abstract class ExactColorConverterTemplate implements ColorConverterTemplate { + + protected abstract ColorMapping getMapping(); + + protected abstract T getFallback(); + + @Override + public ColorConverter get() { + return new ExactColorConverter(getMapping().get(), getFallback()); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/ColorPickerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/ColorPickerTemplate.java new file mode 100644 index 000000000..d0ff0940a --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/ColorPickerTemplate.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.addons.image.config.picker; + +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.picker.ColorPicker; +import com.dfsek.terra.addons.image.picker.transform.Alignment; + + +public abstract class ColorPickerTemplate implements ObjectTemplate { + + @Value("align") + @Default + protected Alignment alignment = Alignment.NONE; + +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/SingleColorPickerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/SingleColorPickerTemplate.java new file mode 100644 index 000000000..1fb10e5b9 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/SingleColorPickerTemplate.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.image.config.picker; + +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.addons.image.picker.ColorPicker; +import com.dfsek.terra.addons.image.picker.SimpleColorPicker; + + +public class SingleColorPickerTemplate extends ColorPickerTemplate { + + @Value("fallback") + private int fallback; + + @Override + public ColorPicker get() { + return new SimpleColorPicker(fallback, alignment); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/TileColorPickerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/TileColorPickerTemplate.java new file mode 100644 index 000000000..1ee59b32e --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/TileColorPickerTemplate.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.addons.image.config.picker; + +import com.dfsek.terra.addons.image.picker.ColorPicker; +import com.dfsek.terra.addons.image.picker.TileColorPicker; + + +public class TileColorPickerTemplate extends ColorPickerTemplate { + + @Override + public ColorPicker get() { + return new TileColorPicker(alignment); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java new file mode 100644 index 000000000..80bf1cee4 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java @@ -0,0 +1,39 @@ +package com.dfsek.terra.addons.image.converter; + +import java.util.Map; + +import com.dfsek.terra.addons.image.util.ColorUtil; + +public class ClosestMatchColorConverter implements ColorConverter { + + private final Map map; + + private final Integer[] colors; + + public ClosestMatchColorConverter(Map map) { + this.map = map; + this.colors = map.keySet().toArray(new Integer[0]); + } + + @Override + public T apply(Integer color) { + int closest = 0; + int smallestDistance = Integer.MAX_VALUE; + for(int compare : colors) { + int distance = ColorUtil.distance(color, compare); + if(distance == 0) { + closest = compare; + break; + } else if(distance < smallestDistance) { + smallestDistance = distance; + closest = compare; + } + } + return map.get(closest); + } + + @Override + public Iterable getEntries() { + return map.values(); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ColorConverter.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ColorConverter.java new file mode 100644 index 000000000..bb5a87613 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ColorConverter.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.addons.image.converter; + +import java.util.function.Function; + + +public interface ColorConverter extends Function { + Iterable getEntries(); +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java new file mode 100644 index 000000000..1258a762b --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.addons.image.converter; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + + +public class ExactColorConverter implements ColorConverter { + private final Map map; + + private final T fallback; + + public ExactColorConverter(Map map, T fallback) { + this.map = map; + this.fallback = fallback; + } + + @Override + public T apply(Integer color) { + T lookup = map.get(color); + if(lookup != null) return lookup; + return fallback; + } + + @Override + public Iterable getEntries() { + Set entries = new HashSet<>(map.values()); + entries.add(fallback); + return entries; + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/BiomeDefinedColorMapping.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/BiomeDefinedColorMapping.java new file mode 100644 index 000000000..469596577 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/BiomeDefinedColorMapping.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.addons.image.converter.mapping; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Function; +import java.util.stream.Collectors; + +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.world.biome.Biome; + + +public class BiomeDefinedColorMapping implements ColorMapping { + + Registry biomeRegistry; + + Function converter; + + public BiomeDefinedColorMapping(Registry biomeRegistry, Function converter) { + this.biomeRegistry = biomeRegistry; + this.converter = converter; + } + + @Override + public Map get() { + Map colorMap = new HashSet<>(biomeRegistry.entries()).stream().collect(Collectors.toMap(b -> b, Biome::getColor)); + Map output = new HashMap<>(); + colorMap.forEach(((biome, color) -> { + if(!output.containsKey(color)) { + output.put(color, biome); + } else { + throw new IllegalArgumentException(String.format("Biome %s has same color as %s: %x", biome.getID(), output.get(color).getID(), color)); + } + })); + return output.entrySet().stream().collect(Collectors.toMap(Entry::getKey, e -> converter.apply(e.getValue()))); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/ColorMapping.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/ColorMapping.java new file mode 100644 index 000000000..6fc586a84 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/ColorMapping.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.addons.image.converter.mapping; + +import java.util.Map; +import java.util.function.Supplier; + + +public interface ColorMapping extends Supplier> { +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/ColorPicker.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/ColorPicker.java new file mode 100644 index 000000000..7db4ef6f4 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/ColorPicker.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.addons.image.picker; + +import java.awt.image.BufferedImage; + +@FunctionalInterface +public interface ColorPicker { + + /** + * @param image Lookup image + * @param x World x coordinate + * @param z World z coordinate + * @return Integer representing a web color + */ + Integer apply(BufferedImage image, int x, int z); +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/SimpleColorPicker.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/SimpleColorPicker.java new file mode 100644 index 000000000..66b75bb37 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/SimpleColorPicker.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.addons.image.picker; + +import java.awt.image.BufferedImage; + +import com.dfsek.terra.addons.image.picker.transform.ImageTransformation; + + +public class SimpleColorPicker implements ColorPicker { + + private final Integer fallback; + + private final ImageTransformation transformation; + + public SimpleColorPicker(int fallbackColor, ImageTransformation transformation) { + this.fallback = fallbackColor; + this.transformation = transformation; + } + + @Override + public Integer apply(BufferedImage image, int x, int z) { + x = transformation.transformX(image, x); + z = transformation.transformZ(image, z); + if(x < 0 || z < 0 || x >= image.getWidth() || z >= image.getHeight()) return fallback; + return image.getRGB(x, z); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/TileColorPicker.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/TileColorPicker.java new file mode 100644 index 000000000..a70c03869 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/TileColorPicker.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.addons.image.picker; + +import net.jafama.FastMath; + +import java.awt.image.BufferedImage; + +import com.dfsek.terra.addons.image.picker.transform.ImageTransformation; + + +public class TileColorPicker implements ColorPicker { + + private final ImageTransformation transformation; + + public TileColorPicker(ImageTransformation transformation) { + this.transformation = transformation; + } + + @Override + public Integer apply(BufferedImage image, int x, int z) { + x = transformation.transformX(image, x); + z = transformation.transformZ(image, z); + return image.getRGB(FastMath.floorMod(x, image.getWidth()), FastMath.floorMod(z, image.getHeight())); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/Alignment.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/Alignment.java new file mode 100644 index 000000000..1441f3479 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/Alignment.java @@ -0,0 +1,30 @@ +package com.dfsek.terra.addons.image.picker.transform; + +import java.awt.image.BufferedImage; + + +public enum Alignment implements ImageTransformation { + + NONE() { + @Override + public int transformX(BufferedImage image, int x) { + return x; + } + + @Override + public int transformZ(BufferedImage image, int z) { + return z; + } + }, + CENTER { + @Override + public int transformX(BufferedImage image, int x) { + return x + image.getWidth() / 2; + } + + @Override + public int transformZ(BufferedImage image, int z) { + return z + image.getHeight() / 2; + } + }; +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/ImageTransformation.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/ImageTransformation.java new file mode 100644 index 000000000..45a17acb7 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/ImageTransformation.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.addons.image.picker.transform; + +import java.awt.image.BufferedImage; + + +public interface ImageTransformation { + + int transformX(BufferedImage image, int x); + + int transformZ(BufferedImage image, int z); +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java new file mode 100644 index 000000000..202231c24 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java @@ -0,0 +1,30 @@ +package com.dfsek.terra.addons.image.util; + +import net.jafama.FastMath; + + +public class ColorUtil { + + private ColorUtil() {} + + public static int distance(int a, int b) { + return FastMath.abs(getRed(a) - getRed(b)) + FastMath.abs(getGreen(a) - getGreen(b)) + FastMath.abs(getBlue(a) - getBlue(b)); + } + + public static int getRed(int rgb) { + return rgb >> 16 & 255; + } + + public static int getGreen(int rgb) { + return rgb >> 8 & 255; + } + + public static int getBlue(int rgb) { + return rgb >> 0 & 255; + } + + public static int getAlpha(int rgb) { + return rgb >> 24 & 255; + } + +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MapUtil.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MapUtil.java new file mode 100644 index 000000000..03421f527 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MapUtil.java @@ -0,0 +1,23 @@ +package com.dfsek.terra.addons.image.util; + +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + + +public class MapUtil { + + private MapUtil() {} + + /** + * Utility method for converting config keys into integers, + * used because Tectonic does not accept non string keys. + */ + public static Map convertKeysToInt(Map map) { + return map.entrySet().stream() + .collect(Collectors.toMap( + e -> Integer.decode(e.getKey()), + Entry::getValue + )); + } +} diff --git a/common/addons/library-image/src/main/resources/terra.addon.yml b/common/addons/library-image/src/main/resources/terra.addon.yml new file mode 100644 index 000000000..c664c3df4 --- /dev/null +++ b/common/addons/library-image/src/main/resources/terra.addon.yml @@ -0,0 +1,12 @@ +schema-version: 1 +contributors: + - Terra contributors +id: library-image +version: @VERSION@ +entrypoints: + - "com.dfsek.terra.addons.image.ImageLibraryAddon" +website: + issues: https://github.com/PolyhedralDev/Terra/issues + source: https://github.com/PolyhedralDev/Terra + docs: https://terra.polydev.org +license: MIT License 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 84f2fb382..3bcc1682e 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 @@ -32,7 +32,6 @@ import org.jetbrains.annotations.NotNull; 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; @@ -82,7 +81,6 @@ import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorPr 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; import com.dfsek.terra.config.preprocessor.MetaMapPreprocessor; import com.dfsek.terra.config.preprocessor.MetaNumberPreprocessor; @@ -282,8 +280,7 @@ public class ConfigPackImpl implements ConfigPack { @Override public void register(TypeRegistry registry) { - registry.registerLoader(ConfigType.class, configTypeRegistry) - .registerLoader(BufferedImage.class, new BufferedImageLoader(loader)); + registry.registerLoader(ConfigType.class, configTypeRegistry); registryMap.forEach(registry::registerLoader); shortcuts.forEach(registry::registerLoader); // overwrite with delegated shortcuts if present } From 03ab46372346b6cc82e6b80c1a290e6bf2a2d9d4 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 12 Aug 2022 11:10:42 +1000 Subject: [PATCH 024/161] Rewrite the image biome provider to use the image library --- .../biome-provider-image/build.gradle.kts | 1 + .../biome/image/ImageBiomeProvider.java | 54 ++++--------------- .../biome/image/ImageBiomeProviderAddon.java | 29 +++++++++- .../{ => config}/ImageProviderTemplate.java | 28 +++++----- .../ClosestBiomeColorConverterTemplate.java | 19 +++++++ .../ExactBiomeColorConverterTemplate.java | 27 ++++++++++ .../DefinedBiomeColorMappingTemplate.java | 22 ++++++++ .../src/main/resources/terra.addon.yml | 4 +- 8 files changed, 124 insertions(+), 60 deletions(-) rename common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/{ => config}/ImageProviderTemplate.java (62%) create mode 100644 common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ClosestBiomeColorConverterTemplate.java create mode 100644 common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java create mode 100644 common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/mapping/DefinedBiomeColorMappingTemplate.java diff --git a/common/addons/biome-provider-image/build.gradle.kts b/common/addons/biome-provider-image/build.gradle.kts index 15145b578..3819ba485 100644 --- a/common/addons/biome-provider-image/build.gradle.kts +++ b/common/addons/biome-provider-image/build.gradle.kts @@ -2,6 +2,7 @@ version = version("1.0.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:library-image")) implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) } 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 aa2f647bb..56e6b07d5 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java @@ -7,34 +7,28 @@ package com.dfsek.terra.addons.biome.image; -import net.jafama.FastMath; - -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.converter.ColorConverter; +import com.dfsek.terra.addons.image.picker.ColorPicker; 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) { + private final ColorConverter colorConverter; + + private final ColorPicker colorPicker; + + public ImageBiomeProvider(BufferedImage image, ColorConverter colorConverter, ColorPicker colorPicker, int resolution) { this.image = image; 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 FastMath.abs(a.getRed() - b.getRed()) + FastMath.abs(a.getGreen() - b.getGreen()) + FastMath.abs(a.getBlue() - b.getBlue()); + this.colorConverter = colorConverter; + this.colorPicker = colorPicker; } @Override @@ -45,15 +39,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(colorPicker.apply(image, x, z)); } @Override @@ -63,24 +49,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(FastMath.floorMod(x - image.getWidth() / 2, image.getWidth()), - FastMath.floorMod(z - image.getHeight() / 2, image.getHeight()))); - } - }, - NONE { - @Override - public Color getColor(BufferedImage image, int x, int z) { - return new Color(image.getRGB(FastMath.floorMod(x, image.getWidth()), FastMath.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 5db8dd51f..9fbc19665 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 @@ -11,6 +11,13 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; 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; @@ -27,6 +34,12 @@ 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; @@ -38,11 +51,23 @@ 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(); } 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/config/ImageProviderTemplate.java similarity index 62% rename from common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java rename to common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/ImageProviderTemplate.java index 6bb683eca..e7c56d157 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/ImageProviderTemplate.java @@ -5,7 +5,7 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.image; +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; @@ -13,33 +13,33 @@ 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.addons.biome.image.ImageBiomeProvider; +import com.dfsek.terra.addons.image.converter.ColorConverter; +import com.dfsek.terra.addons.image.picker.ColorPicker; 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; - } + @Value("image") + private BufferedImage image; + + @Value("mode") + private ColorPicker colorPicker; + + @Value("biomes") + private ColorConverter colorConverter; @Override public BiomeProvider get() { - return new ImageBiomeProvider(new HashSet<>(biomes.entries()), image, resolution, align); + return new ImageBiomeProvider(image, colorConverter, colorPicker, resolution); } } diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ClosestBiomeColorConverterTemplate.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ClosestBiomeColorConverterTemplate.java new file mode 100644 index 000000000..09006d420 --- /dev/null +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ClosestBiomeColorConverterTemplate.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.addons.biome.image.config.converter; + +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.addons.image.config.converter.ClosestColorConverterTemplate; +import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; +import com.dfsek.terra.api.world.biome.Biome; + + +public class ClosestBiomeColorConverterTemplate extends ClosestColorConverterTemplate { + + @Value("match") + private ColorMapping match; + + @Override + protected ColorMapping getMapping() { + return match; + } +} diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java new file mode 100644 index 000000000..bacd61c52 --- /dev/null +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.addons.biome.image.config.converter; + +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.addons.image.config.converter.ExactColorConverterTemplate; +import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; +import com.dfsek.terra.api.world.biome.Biome; + + +public class ExactBiomeColorConverterTemplate extends ExactColorConverterTemplate { + + @Value("match") + private ColorMapping match; + + @Value("fallback") + private Biome fallback; + + @Override + protected ColorMapping getMapping() { + return match; + } + + @Override + protected Biome getFallback() { + return fallback; + } +} diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/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 new file mode 100644 index 000000000..57eefc8d4 --- /dev/null +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/mapping/DefinedBiomeColorMappingTemplate.java @@ -0,0 +1,22 @@ +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; + +import java.util.Map; + +import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; +import com.dfsek.terra.addons.image.util.MapUtil; +import com.dfsek.terra.api.world.biome.Biome; + + +public class DefinedBiomeColorMappingTemplate implements ObjectTemplate> { + + @Value("map") + Map map; + + @Override + public ColorMapping get() { + return () -> MapUtil.convertKeysToInt(map); + } +} 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.+" From 329d94ba9c9cac2c224e3131dc63e5ffc5bdc9ae Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 12 Aug 2022 11:40:56 +1000 Subject: [PATCH 025/161] Move image sampler to separate addon --- .../dfsek/terra/addons/noise/NoiseAddon.java | 3 -- common/addons/config-noise-image/LICENSE | 21 +++++++++ .../config-noise-image/build.gradle.kts | 13 +++++ .../addons/noise/image}/ImageSampler.java | 2 +- .../addons/noise/image/ImageSamplerAddon.java | 47 +++++++++++++++++++ .../image/config}/ImageSamplerTemplate.java | 5 +- .../src/main/resources/terra.addon.yml | 14 ++++++ 7 files changed, 99 insertions(+), 6 deletions(-) create mode 100644 common/addons/config-noise-image/LICENSE create mode 100644 common/addons/config-noise-image/build.gradle.kts rename common/addons/{config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers => config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image}/ImageSampler.java (97%) create mode 100644 common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSamplerAddon.java rename common/addons/{config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates => config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config}/ImageSamplerTemplate.java (82%) create mode 100644 common/addons/config-noise-image/src/main/resources/terra.addon.yml 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 06bf082b9..5f634d112 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 @@ -18,7 +18,6 @@ import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.addons.noise.config.templates.BinaryArithmeticTemplate; 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.noise.CellularNoiseTemplate; @@ -93,8 +92,6 @@ public class NoiseAddon implements AddonInitializer { noiseRegistry.register(addon.key("SCALE"), ScaleNormalizerTemplate::new); noiseRegistry.register(addon.key("POSTERIZATION"), PosterizationNormalizerTemplate::new); - noiseRegistry.register(addon.key("IMAGE"), ImageSamplerTemplate::new); - noiseRegistry.register(addon.key("DOMAIN_WARP"), DomainWarpTemplate::new); noiseRegistry.register(addon.key("FBM"), BrownianMotionTemplate::new); diff --git a/common/addons/config-noise-image/LICENSE b/common/addons/config-noise-image/LICENSE new file mode 100644 index 000000000..64c1cd516 --- /dev/null +++ b/common/addons/config-noise-image/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2021 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/config-noise-image/build.gradle.kts b/common/addons/config-noise-image/build.gradle.kts new file mode 100644 index 000000000..668538541 --- /dev/null +++ b/common/addons/config-noise-image/build.gradle.kts @@ -0,0 +1,13 @@ +version = version("1.0.0") + +dependencies { + compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:library-image")) + compileOnlyApi(project(":common:addons:config-noise-function")) + implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) + testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) +} + +tasks.named("shadowJar") { + relocate("net.jafama", "com.dfsek.terra.addons.noise.image.lib.jafama") +} \ No newline at end of file diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java similarity index 97% rename from common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java rename to common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java index 5016d7954..a523a2af5 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java +++ b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java @@ -5,7 +5,7 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.noise.samplers; +package com.dfsek.terra.addons.noise.image; import net.jafama.FastMath; diff --git a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSamplerAddon.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSamplerAddon.java new file mode 100644 index 000000000..a67f1e4eb --- /dev/null +++ b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSamplerAddon.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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.image; + +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import java.util.function.Supplier; + +import com.dfsek.terra.addons.manifest.api.AddonInitializer; +import com.dfsek.terra.addons.noise.NoiseAddon; +import com.dfsek.terra.addons.noise.image.config.ImageSamplerTemplate; +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.NoiseSampler; +import com.dfsek.terra.api.registry.CheckedRegistry; + + +public class ImageSamplerAddon implements AddonInitializer { + + @Inject + private Platform platform; + + @Inject + private BaseAddon addon; + + @Override + public void initialize() { + platform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(addon, ConfigPackPreLoadEvent.class) + .priority(502) + .then(event -> { + CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry( + NoiseAddon.NOISE_SAMPLER_TOKEN); + noiseRegistry.register(addon.key("IMAGE"), ImageSamplerTemplate::new); + }) + .failThrough(); + } +} 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-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java similarity index 82% rename from common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java rename to common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java index 4aaf2d511..36e65db57 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java +++ b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java @@ -5,13 +5,14 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.noise.config.templates; +package com.dfsek.terra.addons.noise.image.config; import com.dfsek.tectonic.api.config.template.annotations.Value; import java.awt.image.BufferedImage; -import com.dfsek.terra.addons.noise.samplers.ImageSampler; +import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; +import com.dfsek.terra.addons.noise.image.ImageSampler; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; diff --git a/common/addons/config-noise-image/src/main/resources/terra.addon.yml b/common/addons/config-noise-image/src/main/resources/terra.addon.yml new file mode 100644 index 000000000..355449217 --- /dev/null +++ b/common/addons/config-noise-image/src/main/resources/terra.addon.yml @@ -0,0 +1,14 @@ +schema-version: 1 +contributors: + - Terra contributors +id: config-noise-image +version: @VERSION@ +entrypoints: + - "com.dfsek.terra.addons.noise.image.ImageSamplerAddon" +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.+" From 274f864d6a9ad7eb893432d0cc9a344b3b388009 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 12 Aug 2022 12:34:00 +1000 Subject: [PATCH 026/161] Move channels into image lib --- .../addons/noise/image/ImageSampler.java | 35 +--------------- .../image/config/ImageSamplerTemplate.java | 3 +- .../terra/addons/image/util/ColorUtil.java | 42 ++++++++++++++++++- 3 files changed, 44 insertions(+), 36 deletions(-) diff --git a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java index a523a2af5..90de1dac7 100644 --- a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java +++ b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java @@ -11,6 +11,7 @@ import net.jafama.FastMath; import java.awt.image.BufferedImage; +import com.dfsek.terra.addons.image.util.ColorUtil.Channel; import com.dfsek.terra.api.noise.NoiseSampler; @@ -38,38 +39,4 @@ public class ImageSampler implements NoiseSampler { 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-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java index 36e65db57..023fcb11c 100644 --- a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java +++ b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java @@ -11,6 +11,7 @@ import com.dfsek.tectonic.api.config.template.annotations.Value; import java.awt.image.BufferedImage; +import com.dfsek.terra.addons.image.util.ColorUtil.Channel; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; import com.dfsek.terra.addons.noise.image.ImageSampler; import com.dfsek.terra.api.config.meta.Meta; @@ -27,7 +28,7 @@ public class ImageSamplerTemplate extends SamplerTemplate { private @Meta double frequency; @Value("channel") - private ImageSampler.@Meta Channel channel; + private @Meta Channel channel; @Override public NoiseSampler get() { diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java index 202231c24..b562587a8 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java @@ -8,7 +8,9 @@ public class ColorUtil { private ColorUtil() {} public static int distance(int a, int b) { - return FastMath.abs(getRed(a) - getRed(b)) + FastMath.abs(getGreen(a) - getGreen(b)) + FastMath.abs(getBlue(a) - getBlue(b)); + return FastMath.abs(getRed(a) - getRed(b)) + + FastMath.abs(getGreen(a) - getGreen(b)) + + FastMath.abs(getBlue(a) - getBlue(b)); } public static int getRed(int rgb) { @@ -27,4 +29,42 @@ public class ColorUtil { return rgb >> 24 & 255; } + public static int getGrayscale(int rgb) { + return (getRed(rgb) + getGreen(rgb) + getBlue(rgb)) / 3; + } + + public enum Channel { + RED { + @Override + public int getChannel(int rgb) { + return getRed(rgb); + } + }, + GREEN { + @Override + public int getChannel(int rgb) { + return getGreen(rgb); + } + }, + BLUE { + @Override + public int getChannel(int rgb) { + return getBlue(rgb); + } + }, + GRAYSCALE { + @Override + public int getChannel(int rgb) { + return getGrayscale(rgb); + } + }, + ALPHA { + @Override + public int getChannel(int rgb) { + return getAlpha(rgb); + } + }; + + public abstract int getChannel(int rgb); + } } From 4334b16ded54e7a1f4b983ad1d33d896c3ec6d34 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 12 Aug 2022 12:34:27 +1000 Subject: [PATCH 027/161] Use color pickers in image sampler --- .../dfsek/terra/addons/noise/image/ImageSampler.java | 12 ++++++------ .../noise/image/config/ImageSamplerTemplate.java | 6 +++++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java index 90de1dac7..9f9da6a7f 100644 --- a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java +++ b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java @@ -7,10 +7,9 @@ package com.dfsek.terra.addons.noise.image; -import net.jafama.FastMath; - import java.awt.image.BufferedImage; +import com.dfsek.terra.addons.image.picker.ColorPicker; import com.dfsek.terra.addons.image.util.ColorUtil.Channel; import com.dfsek.terra.api.noise.NoiseSampler; @@ -21,17 +20,18 @@ public class ImageSampler implements NoiseSampler { private final double frequency; - public ImageSampler(BufferedImage image, Channel channel, double frequency) { + private final ColorPicker colorPicker; + + public ImageSampler(BufferedImage image, ColorPicker colorPicker, Channel channel, double frequency) { this.image = image; this.channel = channel; this.frequency = frequency; + this.colorPicker = colorPicker; } @Override public double noise(long seed, double x, double y) { - return ((channel.getChannel(image.getRGB(FastMath.floorMod(FastMath.floorToInt(x * frequency), image.getWidth()), - FastMath.floorMod(FastMath.floorToInt(y * frequency), image.getHeight()))) / 255D) - 0.5) * - 2; + return channel.getChannel(colorPicker.apply(image, (int) (x * frequency), (int) (y * frequency))) / 255D * 2 - 1; } @Override diff --git a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java index 023fcb11c..bdbc366ef 100644 --- a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java +++ b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java @@ -11,6 +11,7 @@ import com.dfsek.tectonic.api.config.template.annotations.Value; import java.awt.image.BufferedImage; +import com.dfsek.terra.addons.image.picker.ColorPicker; import com.dfsek.terra.addons.image.util.ColorUtil.Channel; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; import com.dfsek.terra.addons.noise.image.ImageSampler; @@ -24,6 +25,9 @@ public class ImageSamplerTemplate extends SamplerTemplate { @Value("image") private @Meta BufferedImage image; + @Value("mode") + private @Meta ColorPicker colorPicker; + @Value("frequency") private @Meta double frequency; @@ -32,6 +36,6 @@ public class ImageSamplerTemplate extends SamplerTemplate { @Override public NoiseSampler get() { - return new ImageSampler(image, channel, frequency); + return new ImageSampler(image, colorPicker, channel, frequency); } } From f1bf3990c114e03e5429541499aba64ce0ed6816 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 12 Aug 2022 12:45:08 +1000 Subject: [PATCH 028/161] Bump image provider major version --- common/addons/biome-provider-image/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/addons/biome-provider-image/build.gradle.kts b/common/addons/biome-provider-image/build.gradle.kts index 3819ba485..20685a679 100644 --- a/common/addons/biome-provider-image/build.gradle.kts +++ b/common/addons/biome-provider-image/build.gradle.kts @@ -1,4 +1,4 @@ -version = version("1.0.0") +version = version("2.0.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) From 68875cc17bd4bbe78dcdc3af06afb5723182732f Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 12 Aug 2022 12:46:21 +1000 Subject: [PATCH 029/161] Bump config-noise-function major version * Removed IMAGE sampler --- common/addons/config-noise-function/build.gradle.kts | 2 +- .../config-noise-image/src/main/resources/terra.addon.yml | 1 + .../src/main/resources/terra.addon.yml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/common/addons/config-noise-function/build.gradle.kts b/common/addons/config-noise-function/build.gradle.kts index f51d5e878..91002e3b5 100644 --- a/common/addons/config-noise-function/build.gradle.kts +++ b/common/addons/config-noise-function/build.gradle.kts @@ -1,6 +1,6 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -version = version("1.0.0") +version = version("2.0.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) diff --git a/common/addons/config-noise-image/src/main/resources/terra.addon.yml b/common/addons/config-noise-image/src/main/resources/terra.addon.yml index 355449217..8716d6749 100644 --- a/common/addons/config-noise-image/src/main/resources/terra.addon.yml +++ b/common/addons/config-noise-image/src/main/resources/terra.addon.yml @@ -12,3 +12,4 @@ website: license: MIT License depends: library-image: "1.+" + config-noise-function: "2.+" diff --git a/common/addons/terrascript-function-sampler/src/main/resources/terra.addon.yml b/common/addons/terrascript-function-sampler/src/main/resources/terra.addon.yml index 635814c2c..938987d93 100644 --- a/common/addons/terrascript-function-sampler/src/main/resources/terra.addon.yml +++ b/common/addons/terrascript-function-sampler/src/main/resources/terra.addon.yml @@ -12,4 +12,4 @@ website: license: MIT License depends: structure-terrascript-loader: "1.+" - config-noise-function: "1.+" \ No newline at end of file + config-noise-function: "2.+" \ No newline at end of file From c491ac5b2481f5a493af32d7eacba60178a1cb1b Mon Sep 17 00:00:00 2001 From: Astrash Date: Thu, 24 Nov 2022 13:55:16 +1100 Subject: [PATCH 030/161] ColorUtil.Channel getChannel() -> from() --- .../dfsek/terra/addons/noise/image/ImageSampler.java | 2 +- .../com/dfsek/terra/addons/image/util/ColorUtil.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java index 9f9da6a7f..275b1ead9 100644 --- a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java +++ b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java @@ -31,7 +31,7 @@ public class ImageSampler implements NoiseSampler { @Override public double noise(long seed, double x, double y) { - return channel.getChannel(colorPicker.apply(image, (int) (x * frequency), (int) (y * frequency))) / 255D * 2 - 1; + return channel.from(colorPicker.apply(image, (int) (x * frequency), (int) (y * frequency))) / 255D * 2 - 1; } @Override diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java index b562587a8..d65d39735 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java @@ -36,35 +36,35 @@ public class ColorUtil { public enum Channel { RED { @Override - public int getChannel(int rgb) { + public int from(int rgb) { return getRed(rgb); } }, GREEN { @Override - public int getChannel(int rgb) { + public int from(int rgb) { return getGreen(rgb); } }, BLUE { @Override - public int getChannel(int rgb) { + public int from(int rgb) { return getBlue(rgb); } }, GRAYSCALE { @Override - public int getChannel(int rgb) { + public int from(int rgb) { return getGrayscale(rgb); } }, ALPHA { @Override - public int getChannel(int rgb) { + public int from(int rgb) { return getAlpha(rgb); } }; - public abstract int getChannel(int rgb); + public abstract int from(int rgb); } } From 4e225a6592622e7f8b476abbd8dad667e9703350 Mon Sep 17 00:00:00 2001 From: Astrash Date: Thu, 24 Nov 2022 13:55:36 +1100 Subject: [PATCH 031/161] Add utility methods for zero-ing color channels --- .../terra/addons/image/util/ColorUtil.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java index d65d39735..f138fb374 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java @@ -33,38 +33,93 @@ public class ColorUtil { return (getRed(rgb) + getGreen(rgb) + getBlue(rgb)) / 3; } + public static int getChannel(int rgb, Channel channel) { + return channel.from(rgb); + } + + public static int zeroRed(int rgb) { + return rgb & ~0x00FF0000; + } + + public static int zeroGreen(int rgb) { + return rgb & ~0x0000FF00; + } + + public static int zeroBlue(int rgb) { + return rgb & ~0x000000FF; + } + + public static int zeroAlpha(int rgb) { + return rgb & ~0xFF000000; + } + + public static int zeroGrayscale(int rgb) { + return rgb & ~0x00FFFFFF; + } + + public static int zeroChannel(int rgb, Channel channel) { + return channel.zero(rgb); + } + public enum Channel { RED { @Override public int from(int rgb) { return getRed(rgb); } + + @Override + public int zero(int rgb) { + return zeroRed(rgb); + } }, GREEN { @Override public int from(int rgb) { return getGreen(rgb); } + + @Override + public int zero(int rgb) { + return zeroGreen(rgb); + } }, BLUE { @Override public int from(int rgb) { return getBlue(rgb); } + + @Override + public int zero(int rgb) { + return zeroBlue(rgb); + } }, GRAYSCALE { @Override public int from(int rgb) { return getGrayscale(rgb); } + + @Override + public int zero(int rgb) { + return zeroGrayscale(rgb); + } }, ALPHA { @Override public int from(int rgb) { return getAlpha(rgb); } + + @Override + public int zero(int rgb) { + return zeroAlpha(rgb); + } }; public abstract int from(int rgb); + + public abstract int zero(int rgb); } } From 64c2a41d193f27d515e3291a5e313934a4fcc7ba Mon Sep 17 00:00:00 2001 From: Astrash Date: Thu, 24 Nov 2022 13:56:11 +1100 Subject: [PATCH 032/161] Ignore alpha channel by default with ExactColorConverter --- .../converter/ExactBiomeColorConverterTemplate.java | 10 ++++++++++ .../converter/ExactColorConverterTemplate.java | 4 +++- .../addons/image/converter/ExactColorConverter.java | 13 ++++++++++--- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java index bacd61c52..ed64a1d61 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java @@ -1,5 +1,6 @@ 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; import com.dfsek.terra.addons.image.config.converter.ExactColorConverterTemplate; @@ -14,6 +15,10 @@ public class ExactBiomeColorConverterTemplate extends ExactColorConverterTemplat @Value("fallback") private Biome fallback; + + @Value("ignore-alpha") + @Default + private boolean ignoreAlpha = true; @Override protected ColorMapping getMapping() { @@ -24,4 +29,9 @@ public class ExactBiomeColorConverterTemplate extends ExactColorConverterTemplat protected Biome getFallback() { return fallback; } + + @Override + protected boolean ignoreAlpha() { + return ignoreAlpha; + } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ExactColorConverterTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ExactColorConverterTemplate.java index 6c0a8df28..17d2fd37d 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ExactColorConverterTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ExactColorConverterTemplate.java @@ -11,8 +11,10 @@ public abstract class ExactColorConverterTemplate implements ColorConverterTe protected abstract T getFallback(); + protected abstract boolean ignoreAlpha(); + @Override public ColorConverter get() { - return new ExactColorConverter(getMapping().get(), getFallback()); + return new ExactColorConverter(getMapping().get(), getFallback(), ignoreAlpha()); } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java index 1258a762b..f263a596a 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java @@ -4,22 +4,29 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import com.dfsek.terra.addons.image.util.ColorUtil; + public class ExactColorConverter implements ColorConverter { private final Map map; private final T fallback; - public ExactColorConverter(Map map, T fallback) { + private final boolean ignoreAlpha; + + public ExactColorConverter(Map map, T fallback, boolean ignoreAlpha) { this.map = map; this.fallback = fallback; + this.ignoreAlpha = ignoreAlpha; } @Override public T apply(Integer color) { + if (ignoreAlpha) { + color = ColorUtil.zeroAlpha(color); + } T lookup = map.get(color); - if(lookup != null) return lookup; - return fallback; + return lookup != null ? lookup : fallback; } @Override From 8670c4cdf35b834183cbd1f698af18393a5f72b8 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 25 Nov 2022 10:17:56 +1100 Subject: [PATCH 033/161] ColorPicker -> ColorSampler --- .../biome/image/ImageBiomeProvider.java | 13 +++++------ .../image/config/ImageProviderTemplate.java | 11 +++------- .../addons/noise/image/ImageSampler.java | 14 +++++------- .../image/config/ImageSamplerTemplate.java | 11 +++------- .../terra/addons/image/ImageLibraryAddon.java | 14 ++++++------ .../config/picker/ColorPickerTemplate.java | 17 -------------- .../picker/SingleColorPickerTemplate.java | 18 --------------- .../picker/TileColorPickerTemplate.java | 13 ----------- .../config/sampler/ColorSamplerTemplate.java | 22 +++++++++++++++++++ .../sampler/SingleColorSamplerTemplate.java | 17 ++++++++++++++ .../sampler/TileColorSamplerTemplate.java | 13 +++++++++++ .../addons/image/picker/ColorPicker.java | 15 ------------- .../addons/image/sampler/ColorSampler.java | 12 ++++++++++ .../SimpleColorSampler.java} | 13 ++++++----- .../TileColorSampler.java} | 13 ++++++----- .../transform/Alignment.java | 2 +- .../transform/ImageTransformation.java | 2 +- 17 files changed, 105 insertions(+), 115 deletions(-) delete mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/ColorPickerTemplate.java delete mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/SingleColorPickerTemplate.java delete mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/TileColorPickerTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/TileColorSamplerTemplate.java delete mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/ColorPicker.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/ColorSampler.java rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/{picker/SimpleColorPicker.java => sampler/SimpleColorSampler.java} (55%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/{picker/TileColorPicker.java => sampler/TileColorSampler.java} (52%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/{picker => sampler}/transform/Alignment.java (91%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/{picker => sampler}/transform/ImageTransformation.java (76%) 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 56e6b07d5..c9d787003 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java @@ -7,28 +7,25 @@ package com.dfsek.terra.addons.biome.image; -import java.awt.image.BufferedImage; import java.util.Optional; import com.dfsek.terra.addons.image.converter.ColorConverter; -import com.dfsek.terra.addons.image.picker.ColorPicker; +import com.dfsek.terra.addons.image.sampler.ColorSampler; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; public class ImageBiomeProvider implements BiomeProvider { - private final BufferedImage image; private final int resolution; private final ColorConverter colorConverter; - private final ColorPicker colorPicker; + private final ColorSampler colorSampler; - public ImageBiomeProvider(BufferedImage image, ColorConverter colorConverter, ColorPicker colorPicker, int resolution) { - this.image = image; + public ImageBiomeProvider(ColorConverter colorConverter, ColorSampler colorSampler, int resolution) { this.resolution = resolution; this.colorConverter = colorConverter; - this.colorPicker = colorPicker; + this.colorSampler = colorSampler; } @Override @@ -39,7 +36,7 @@ public class ImageBiomeProvider implements BiomeProvider { public Biome getBiome(int x, int z) { x /= resolution; z /= resolution; - return colorConverter.apply(colorPicker.apply(image, x, z)); + return colorConverter.apply(colorSampler.apply(x, z)); } @Override diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/ImageProviderTemplate.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/ImageProviderTemplate.java index e7c56d157..1ce2b5ecb 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/ImageProviderTemplate.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/ImageProviderTemplate.java @@ -12,11 +12,9 @@ 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 com.dfsek.terra.addons.biome.image.ImageBiomeProvider; import com.dfsek.terra.addons.image.converter.ColorConverter; -import com.dfsek.terra.addons.image.picker.ColorPicker; +import com.dfsek.terra.addons.image.sampler.ColorSampler; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; @@ -30,16 +28,13 @@ public class ImageProviderTemplate implements ObjectTemplate { private int resolution = 1; @Value("image") - private BufferedImage image; - - @Value("mode") - private ColorPicker colorPicker; + private ColorSampler colorSampler; @Value("biomes") private ColorConverter colorConverter; @Override public BiomeProvider get() { - return new ImageBiomeProvider(image, colorConverter, colorPicker, resolution); + return new ImageBiomeProvider(colorConverter, colorSampler, resolution); } } diff --git a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java index 275b1ead9..3f162dba6 100644 --- a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java +++ b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java @@ -7,31 +7,27 @@ package com.dfsek.terra.addons.noise.image; -import java.awt.image.BufferedImage; - -import com.dfsek.terra.addons.image.picker.ColorPicker; +import com.dfsek.terra.addons.image.sampler.ColorSampler; import com.dfsek.terra.addons.image.util.ColorUtil.Channel; import com.dfsek.terra.api.noise.NoiseSampler; public class ImageSampler implements NoiseSampler { - private final BufferedImage image; private final Channel channel; private final double frequency; - private final ColorPicker colorPicker; + private final ColorSampler colorSampler; - public ImageSampler(BufferedImage image, ColorPicker colorPicker, Channel channel, double frequency) { - this.image = image; + public ImageSampler(ColorSampler colorSampler, Channel channel, double frequency) { this.channel = channel; this.frequency = frequency; - this.colorPicker = colorPicker; + this.colorSampler = colorSampler; } @Override public double noise(long seed, double x, double y) { - return channel.from(colorPicker.apply(image, (int) (x * frequency), (int) (y * frequency))) / 255D * 2 - 1; + return channel.from(colorSampler.apply((int) (x * frequency), (int) (y * frequency))) / 255D * 2 - 1; } @Override diff --git a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java index bdbc366ef..60ac77e0c 100644 --- a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java +++ b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java @@ -9,9 +9,7 @@ package com.dfsek.terra.addons.noise.image.config; import com.dfsek.tectonic.api.config.template.annotations.Value; -import java.awt.image.BufferedImage; - -import com.dfsek.terra.addons.image.picker.ColorPicker; +import com.dfsek.terra.addons.image.sampler.ColorSampler; import com.dfsek.terra.addons.image.util.ColorUtil.Channel; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; import com.dfsek.terra.addons.noise.image.ImageSampler; @@ -23,10 +21,7 @@ import com.dfsek.terra.api.noise.NoiseSampler; public class ImageSamplerTemplate extends SamplerTemplate { @Value("image") - private @Meta BufferedImage image; - - @Value("mode") - private @Meta ColorPicker colorPicker; + private @Meta ColorSampler colorSampler; @Value("frequency") private @Meta double frequency; @@ -36,6 +31,6 @@ public class ImageSamplerTemplate extends SamplerTemplate { @Override public NoiseSampler get() { - return new ImageSampler(image, colorPicker, channel, frequency); + return new ImageSampler(colorSampler, channel, frequency); } } 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 020740059..b360ef756 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 @@ -6,9 +6,9 @@ import java.awt.image.BufferedImage; import java.util.function.Supplier; import com.dfsek.terra.addons.image.config.BufferedImageLoader; -import com.dfsek.terra.addons.image.config.picker.SingleColorPickerTemplate; -import com.dfsek.terra.addons.image.config.picker.TileColorPickerTemplate; -import com.dfsek.terra.addons.image.picker.ColorPicker; +import com.dfsek.terra.addons.image.config.sampler.SingleColorSamplerTemplate; +import com.dfsek.terra.addons.image.config.sampler.TileColorSamplerTemplate; +import com.dfsek.terra.addons.image.sampler.ColorSampler; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; @@ -21,7 +21,7 @@ import com.dfsek.terra.api.util.reflection.TypeKey; public class ImageLibraryAddon implements AddonInitializer { - public static final TypeKey>> COLOR_PICKER_REGISTRY_KEY = new TypeKey<>() { + public static final TypeKey>> COLOR_PICKER_REGISTRY_KEY = new TypeKey<>() { }; @Inject @@ -40,10 +40,10 @@ public class ImageLibraryAddon implements AddonInitializer { event.getPack().applyLoader(BufferedImage.class, new BufferedImageLoader(event.getPack().getLoader())); }) .then(event -> { - CheckedRegistry>> colorPickerRegistry = event.getPack().getOrCreateRegistry( + CheckedRegistry>> colorSamplerRegistry = event.getPack().getOrCreateRegistry( COLOR_PICKER_REGISTRY_KEY); - colorPickerRegistry.register(addon.key("SINGLE"), SingleColorPickerTemplate::new); - colorPickerRegistry.register(addon.key("TILED"), TileColorPickerTemplate::new); + colorSamplerRegistry.register(addon.key("SINGLE"), SingleColorSamplerTemplate::new); + colorSamplerRegistry.register(addon.key("TILED"), TileColorSamplerTemplate::new); }); } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/ColorPickerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/ColorPickerTemplate.java deleted file mode 100644 index d0ff0940a..000000000 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/ColorPickerTemplate.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dfsek.terra.addons.image.config.picker; - -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.picker.ColorPicker; -import com.dfsek.terra.addons.image.picker.transform.Alignment; - - -public abstract class ColorPickerTemplate implements ObjectTemplate { - - @Value("align") - @Default - protected Alignment alignment = Alignment.NONE; - -} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/SingleColorPickerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/SingleColorPickerTemplate.java deleted file mode 100644 index 1fb10e5b9..000000000 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/SingleColorPickerTemplate.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dfsek.terra.addons.image.config.picker; - -import com.dfsek.tectonic.api.config.template.annotations.Value; - -import com.dfsek.terra.addons.image.picker.ColorPicker; -import com.dfsek.terra.addons.image.picker.SimpleColorPicker; - - -public class SingleColorPickerTemplate extends ColorPickerTemplate { - - @Value("fallback") - private int fallback; - - @Override - public ColorPicker get() { - return new SimpleColorPicker(fallback, alignment); - } -} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/TileColorPickerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/TileColorPickerTemplate.java deleted file mode 100644 index 1ee59b32e..000000000 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/picker/TileColorPickerTemplate.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dfsek.terra.addons.image.config.picker; - -import com.dfsek.terra.addons.image.picker.ColorPicker; -import com.dfsek.terra.addons.image.picker.TileColorPicker; - - -public class TileColorPickerTemplate extends ColorPickerTemplate { - - @Override - public ColorPicker get() { - return new TileColorPicker(alignment); - } -} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java new file mode 100644 index 000000000..90c69515e --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java @@ -0,0 +1,22 @@ +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 java.awt.image.BufferedImage; + +import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.sampler.transform.Alignment; + + +public abstract class ColorSamplerTemplate implements ObjectTemplate { + + @Value("path") + protected BufferedImage image; + + @Value("align") + @Default + protected Alignment alignment = Alignment.NONE; + +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java new file mode 100644 index 000000000..8534d46e5 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.addons.image.config.sampler; + +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.sampler.SimpleColorSampler; + + +public class SingleColorSamplerTemplate extends ColorSamplerTemplate { + @Value("fallback") + private int fallback; + + @Override + public ColorSampler get() { + return new SimpleColorSampler(image, fallback, alignment); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/TileColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/TileColorSamplerTemplate.java new file mode 100644 index 000000000..b17deaba1 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/TileColorSamplerTemplate.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.addons.image.config.sampler; + +import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.sampler.TileColorSampler; + + +public class TileColorSamplerTemplate extends ColorSamplerTemplate { + + @Override + public ColorSampler get() { + return new TileColorSampler(image, alignment); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/ColorPicker.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/ColorPicker.java deleted file mode 100644 index 7db4ef6f4..000000000 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/ColorPicker.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dfsek.terra.addons.image.picker; - -import java.awt.image.BufferedImage; - -@FunctionalInterface -public interface ColorPicker { - - /** - * @param image Lookup image - * @param x World x coordinate - * @param z World z coordinate - * @return Integer representing a web color - */ - Integer apply(BufferedImage image, int x, int z); -} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/ColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/ColorSampler.java new file mode 100644 index 000000000..b6eaade20 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/ColorSampler.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.addons.image.sampler; + +@FunctionalInterface +public interface ColorSampler { + + /** + * @param x World x coordinate + * @param z World z coordinate + * @return Integer representing a web color + */ + Integer apply(int x, int z); +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/SimpleColorPicker.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java similarity index 55% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/SimpleColorPicker.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java index 66b75bb37..4bf38cff1 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/SimpleColorPicker.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java @@ -1,23 +1,26 @@ -package com.dfsek.terra.addons.image.picker; +package com.dfsek.terra.addons.image.sampler; import java.awt.image.BufferedImage; -import com.dfsek.terra.addons.image.picker.transform.ImageTransformation; +import com.dfsek.terra.addons.image.sampler.transform.ImageTransformation; -public class SimpleColorPicker implements ColorPicker { +public class SimpleColorSampler implements ColorSampler { + + private final BufferedImage image; private final Integer fallback; private final ImageTransformation transformation; - public SimpleColorPicker(int fallbackColor, ImageTransformation transformation) { + public SimpleColorSampler(BufferedImage image, int fallbackColor, ImageTransformation transformation) { + this.image = image; this.fallback = fallbackColor; this.transformation = transformation; } @Override - public Integer apply(BufferedImage image, int x, int z) { + public Integer apply(int x, int z) { x = transformation.transformX(image, x); z = transformation.transformZ(image, z); if(x < 0 || z < 0 || x >= image.getWidth() || z >= image.getHeight()) return fallback; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/TileColorPicker.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java similarity index 52% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/TileColorPicker.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java index a70c03869..99f57ad28 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/TileColorPicker.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java @@ -1,22 +1,25 @@ -package com.dfsek.terra.addons.image.picker; +package com.dfsek.terra.addons.image.sampler; import net.jafama.FastMath; import java.awt.image.BufferedImage; -import com.dfsek.terra.addons.image.picker.transform.ImageTransformation; +import com.dfsek.terra.addons.image.sampler.transform.ImageTransformation; -public class TileColorPicker implements ColorPicker { +public class TileColorSampler implements ColorSampler { + + private final BufferedImage image; private final ImageTransformation transformation; - public TileColorPicker(ImageTransformation transformation) { + public TileColorSampler(BufferedImage image, ImageTransformation transformation) { + this.image = image; this.transformation = transformation; } @Override - public Integer apply(BufferedImage image, int x, int z) { + public Integer apply(int x, int z) { x = transformation.transformX(image, x); z = transformation.transformZ(image, z); return image.getRGB(FastMath.floorMod(x, image.getWidth()), FastMath.floorMod(z, image.getHeight())); diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/Alignment.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java similarity index 91% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/Alignment.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java index 1441f3479..c212a2ff4 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/Alignment.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.image.picker.transform; +package com.dfsek.terra.addons.image.sampler.transform; import java.awt.image.BufferedImage; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/ImageTransformation.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java similarity index 76% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/ImageTransformation.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java index 45a17acb7..da3f7c0c1 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/picker/transform/ImageTransformation.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.image.picker.transform; +package com.dfsek.terra.addons.image.sampler.transform; import java.awt.image.BufferedImage; From 4fdef98bd95f9795697cc5793e36e47fe784c9d7 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 25 Nov 2022 14:10:07 +1100 Subject: [PATCH 034/161] Use generic key mapping function --- .../DefinedBiomeColorMappingTemplate.java | 3 ++- .../dfsek/terra/addons/image/util/MapUtil.java | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/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 index 57eefc8d4..3a1a0891b 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/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 @@ -17,6 +17,7 @@ public class DefinedBiomeColorMappingTemplate implements ObjectTemplate get() { - return () -> MapUtil.convertKeysToInt(map); + var map = MapUtil.mapKeys(this.map, Integer::decode); + return () -> map; } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MapUtil.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MapUtil.java index 03421f527..7fa1040ce 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MapUtil.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MapUtil.java @@ -2,6 +2,7 @@ package com.dfsek.terra.addons.image.util; import java.util.Map; import java.util.Map.Entry; +import java.util.function.Function; import java.util.stream.Collectors; @@ -10,14 +11,15 @@ public class MapUtil { private MapUtil() {} /** - * Utility method for converting config keys into integers, - * used because Tectonic does not accept non string keys. + * Utility method for applying transformations on a map's keys. */ - public static Map convertKeysToInt(Map map) { - return map.entrySet().stream() - .collect(Collectors.toMap( - e -> Integer.decode(e.getKey()), - Entry::getValue - )); + public static Map mapKeys(Map map, Function mappingFunction) { + return map + .entrySet() + .stream() + .collect(Collectors.toMap( + e -> mappingFunction.apply(e.getKey()), + Entry::getValue + )); } } From b3f072d6897c6508831f1735470b6f8a09eeb186 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 25 Nov 2022 14:11:16 +1100 Subject: [PATCH 035/161] Properly ignore alpha of lookup map --- .../terra/addons/image/converter/ExactColorConverter.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java index f263a596a..99188f379 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java @@ -5,6 +5,7 @@ import java.util.Map; import java.util.Set; import com.dfsek.terra.addons.image.util.ColorUtil; +import com.dfsek.terra.addons.image.util.MapUtil; public class ExactColorConverter implements ColorConverter { @@ -15,6 +16,9 @@ public class ExactColorConverter implements ColorConverter { private final boolean ignoreAlpha; public ExactColorConverter(Map map, T fallback, boolean ignoreAlpha) { + if (ignoreAlpha) { + map = MapUtil.mapKeys(map, ColorUtil::zeroAlpha); + } this.map = map; this.fallback = fallback; this.ignoreAlpha = ignoreAlpha; From e9db14f52cbe186604e29ce012c4a50d231739a2 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 25 Nov 2022 14:35:26 +1100 Subject: [PATCH 036/161] Wrap BufferedImage access --- .../terra/addons/image/ImageLibraryAddon.java | 6 +-- .../image/config/BufferedImageLoader.java | 33 --------------- .../addons/image/config/ImageLoader.java | 41 +++++++++++++++++++ .../config/sampler/ColorSamplerTemplate.java | 5 +-- .../image/image/BufferedImageWrapper.java | 28 +++++++++++++ .../dfsek/terra/addons/image/image/Image.java | 9 ++++ .../image/sampler/SimpleColorSampler.java | 7 ++-- .../image/sampler/TileColorSampler.java | 7 ++-- .../image/sampler/transform/Alignment.java | 10 ++--- .../transform/ImageTransformation.java | 6 +-- 10 files changed, 97 insertions(+), 55 deletions(-) delete mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/BufferedImageLoader.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/BufferedImageWrapper.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/Image.java 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 b360ef756..40a35fc70 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 @@ -2,12 +2,12 @@ package com.dfsek.terra.addons.image; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import java.awt.image.BufferedImage; import java.util.function.Supplier; -import com.dfsek.terra.addons.image.config.BufferedImageLoader; +import com.dfsek.terra.addons.image.config.ImageLoader; import com.dfsek.terra.addons.image.config.sampler.SingleColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.TileColorSamplerTemplate; +import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.sampler.ColorSampler; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; @@ -37,7 +37,7 @@ public class ImageLibraryAddon implements AddonInitializer { .register(addon, ConfigPackPreLoadEvent.class) .priority(10) .then(event -> { - event.getPack().applyLoader(BufferedImage.class, new BufferedImageLoader(event.getPack().getLoader())); + event.getPack().applyLoader(Image.class, new ImageLoader(event.getPack().getLoader())); }) .then(event -> { CheckedRegistry>> colorSamplerRegistry = event.getPack().getOrCreateRegistry( diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/BufferedImageLoader.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/BufferedImageLoader.java deleted file mode 100644 index d31bce66d..000000000 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/BufferedImageLoader.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.dfsek.terra.addons.image.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 javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.lang.reflect.AnnotatedType; - -import com.dfsek.terra.api.config.Loader; - - -public class BufferedImageLoader implements TypeLoader { - private final Loader files; - - public BufferedImageLoader(Loader files) { - this.files = files; - } - - @Override - public BufferedImage load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) - throws LoadException { - try { - return ImageIO.read(files.get((String) c)); - } catch(IOException e) { - throw new LoadException("Unable to load image", e, depthTracker); - } - } -} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java new file mode 100644 index 000000000..15cbe4c52 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java @@ -0,0 +1,41 @@ +package com.dfsek.terra.addons.image.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 org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.imageio.ImageIO; +import java.io.IOException; +import java.lang.reflect.AnnotatedType; + +import com.dfsek.terra.addons.image.image.BufferedImageWrapper; +import com.dfsek.terra.addons.image.image.Image; +import com.dfsek.terra.api.config.Loader; + + +public class ImageLoader implements TypeLoader { + + private static final Logger logger = LoggerFactory.getLogger(ImageLoader.class); + + private final Loader files; + + public ImageLoader(Loader files) { + this.files = files; + } + + @Override + public Image load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) + throws LoadException { + try { + return new BufferedImageWrapper(ImageIO.read(files.get((String) c))); + } catch(IllegalArgumentException e) { + throw new LoadException("Unable to load image (image might be too large?)", e, depthTracker); + } catch(IOException e) { + throw new LoadException("Unable to load image", e, depthTracker); + } + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java index 90c69515e..1dfe84152 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java @@ -4,8 +4,7 @@ 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.awt.image.BufferedImage; - +import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.sampler.ColorSampler; import com.dfsek.terra.addons.image.sampler.transform.Alignment; @@ -13,7 +12,7 @@ import com.dfsek.terra.addons.image.sampler.transform.Alignment; public abstract class ColorSamplerTemplate implements ObjectTemplate { @Value("path") - protected BufferedImage image; + protected Image image; @Value("align") @Default diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/BufferedImageWrapper.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/BufferedImageWrapper.java new file mode 100644 index 000000000..16df31a74 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/BufferedImageWrapper.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.addons.image.image; + +import java.awt.image.BufferedImage; + + +public class BufferedImageWrapper implements Image { + + private final BufferedImage image; + + public BufferedImageWrapper(BufferedImage image) { + this.image = image; + } + + @Override + public int getRGB(int x, int y) { + return image.getRGB(x, y); + } + + @Override + public int getWidth() { + return image.getWidth(); + } + + @Override + public int getHeight() { + return image.getHeight(); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/Image.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/Image.java new file mode 100644 index 000000000..f8eb83793 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/Image.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.addons.image.image; + +public interface Image { + int getRGB(int x, int y); + + int getWidth(); + + int getHeight(); +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java index 4bf38cff1..dbff9cb47 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java @@ -1,19 +1,18 @@ package com.dfsek.terra.addons.image.sampler; -import java.awt.image.BufferedImage; - +import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.sampler.transform.ImageTransformation; public class SimpleColorSampler implements ColorSampler { - private final BufferedImage image; + private final Image image; private final Integer fallback; private final ImageTransformation transformation; - public SimpleColorSampler(BufferedImage image, int fallbackColor, ImageTransformation transformation) { + public SimpleColorSampler(Image image, ColorSampler fallback, ImageTransformation transformation) { this.image = image; this.fallback = fallbackColor; this.transformation = transformation; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java index 99f57ad28..19812a3db 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java @@ -2,18 +2,17 @@ package com.dfsek.terra.addons.image.sampler; import net.jafama.FastMath; -import java.awt.image.BufferedImage; - +import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.sampler.transform.ImageTransformation; public class TileColorSampler implements ColorSampler { - private final BufferedImage image; + private final Image image; private final ImageTransformation transformation; - public TileColorSampler(BufferedImage image, ImageTransformation transformation) { + public TileColorSampler(Image image, ImageTransformation transformation) { this.image = image; this.transformation = transformation; } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java index c212a2ff4..474772a0a 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java @@ -1,29 +1,29 @@ package com.dfsek.terra.addons.image.sampler.transform; -import java.awt.image.BufferedImage; +import com.dfsek.terra.addons.image.image.Image; public enum Alignment implements ImageTransformation { NONE() { @Override - public int transformX(BufferedImage image, int x) { + public int transformX(Image image, int x) { return x; } @Override - public int transformZ(BufferedImage image, int z) { + public int transformZ(Image image, int z) { return z; } }, CENTER { @Override - public int transformX(BufferedImage image, int x) { + public int transformX(Image image, int x) { return x + image.getWidth() / 2; } @Override - public int transformZ(BufferedImage image, int z) { + public int transformZ(Image image, int z) { return z + image.getHeight() / 2; } }; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java index da3f7c0c1..5a22e6a05 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java @@ -1,11 +1,11 @@ package com.dfsek.terra.addons.image.sampler.transform; -import java.awt.image.BufferedImage; +import com.dfsek.terra.addons.image.image.Image; public interface ImageTransformation { - int transformX(BufferedImage image, int x); + int transformX(Image image, int x); - int transformZ(BufferedImage image, int z); + int transformZ(Image image, int z); } From 5c916f77580dd3996a7aa63d15d79e182638e263 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 25 Nov 2022 14:36:28 +1100 Subject: [PATCH 037/161] Add rotate color sampler --- .../terra/addons/image/ImageLibraryAddon.java | 4 ++++ .../sampler/ConstantColorSamplerTemplate.java | 18 ++++++++++++++ .../sampler/RotateColorSamplerTemplate.java | 23 ++++++++++++++++++ .../image/sampler/RotateColorSampler.java | 24 +++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ConstantColorSamplerTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/RotateColorSamplerTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/RotateColorSampler.java 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 40a35fc70..31bb32ac4 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 @@ -5,6 +5,8 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.function.Supplier; import com.dfsek.terra.addons.image.config.ImageLoader; +import com.dfsek.terra.addons.image.config.sampler.RotateColorSamplerTemplate; +import com.dfsek.terra.addons.image.config.sampler.ConstantColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.SingleColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.TileColorSamplerTemplate; import com.dfsek.terra.addons.image.image.Image; @@ -44,6 +46,8 @@ public class ImageLibraryAddon implements AddonInitializer { COLOR_PICKER_REGISTRY_KEY); colorSamplerRegistry.register(addon.key("SINGLE"), SingleColorSamplerTemplate::new); colorSamplerRegistry.register(addon.key("TILED"), TileColorSamplerTemplate::new); + colorSamplerRegistry.register(addon.key("COLOR"), ConstantColorSamplerTemplate::new); + colorSamplerRegistry.register(addon.key("ROTATE"), RotateColorSamplerTemplate::new); }); } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ConstantColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ConstantColorSamplerTemplate.java new file mode 100644 index 000000000..2e3269daf --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ConstantColorSamplerTemplate.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.image.config.sampler; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.image.sampler.ColorSampler; + + +public class ConstantColorSamplerTemplate implements ObjectTemplate { + + @Value("color") + private int color; + + @Override + public ColorSampler get() { + return ((x, z) -> color); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/RotateColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/RotateColorSamplerTemplate.java new file mode 100644 index 000000000..b7fcc4dc4 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/RotateColorSamplerTemplate.java @@ -0,0 +1,23 @@ +package com.dfsek.terra.addons.image.config.sampler; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.jafama.FastMath; + +import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.sampler.RotateColorSampler; + + +public class RotateColorSamplerTemplate implements ObjectTemplate { + + @Value("image") + private ColorSampler sampler; + + @Value("angle") + private double angle; + + @Override + public ColorSampler get() { + return new RotateColorSampler(sampler, FastMath.toRadians(angle)); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/RotateColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/RotateColorSampler.java new file mode 100644 index 000000000..f7e511617 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/RotateColorSampler.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.addons.image.sampler; + +import net.jafama.FastMath; + + +public class RotateColorSampler implements ColorSampler { + + private final ColorSampler sampler; + + private final double radians; + + public RotateColorSampler(ColorSampler sampler, double radians) { + this.sampler = sampler; + this.radians = radians; + } + + @Override + public Integer apply(int x, int z) { + return sampler.apply( + (int) (x * FastMath.cos(radians) - z * FastMath.sin(radians)), + (int) (z * FastMath.cos(radians) + x * FastMath.sin(radians)) + ); + } +} From b771e108b64f8d794004f2391362ba99a5e2dc6f Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 25 Nov 2022 14:39:12 +1100 Subject: [PATCH 038/161] Use color sampler as fallback instead of constant --- .../image/config/sampler/SingleColorSamplerTemplate.java | 2 +- .../terra/addons/image/sampler/SimpleColorSampler.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java index 8534d46e5..6a4cf4521 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java @@ -8,7 +8,7 @@ import com.dfsek.terra.addons.image.sampler.SimpleColorSampler; public class SingleColorSamplerTemplate extends ColorSamplerTemplate { @Value("fallback") - private int fallback; + private ColorSampler fallback; @Override public ColorSampler get() { diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java index dbff9cb47..9291ae2db 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java @@ -8,13 +8,13 @@ public class SimpleColorSampler implements ColorSampler { private final Image image; - private final Integer fallback; + private final ColorSampler fallback; private final ImageTransformation transformation; public SimpleColorSampler(Image image, ColorSampler fallback, ImageTransformation transformation) { this.image = image; - this.fallback = fallbackColor; + this.fallback = fallback; this.transformation = transformation; } @@ -22,7 +22,7 @@ public class SimpleColorSampler implements ColorSampler { public Integer apply(int x, int z) { x = transformation.transformX(image, x); z = transformation.transformZ(image, z); - if(x < 0 || z < 0 || x >= image.getWidth() || z >= image.getHeight()) return fallback; + if(x < 0 || z < 0 || x >= image.getWidth() || z >= image.getHeight()) return fallback.apply(x, z); return image.getRGB(x, z); } } From 878bede60ba3f1694b315bf320e8be48c9f54a67 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 25 Nov 2022 14:39:41 +1100 Subject: [PATCH 039/161] Name changes --- .../config/converter/ExactBiomeColorConverterTemplate.java | 2 +- .../java/com/dfsek/terra/addons/image/ImageLibraryAddon.java | 4 ++-- .../image/config/sampler/SingleColorSamplerTemplate.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java index ed64a1d61..dd9b60182 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java @@ -13,7 +13,7 @@ public class ExactBiomeColorConverterTemplate extends ExactColorConverterTemplat @Value("match") private ColorMapping match; - @Value("fallback") + @Value("else") private Biome fallback; @Value("ignore-alpha") 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 31bb32ac4..c90c503c8 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 @@ -44,8 +44,8 @@ public class ImageLibraryAddon implements AddonInitializer { .then(event -> { CheckedRegistry>> colorSamplerRegistry = event.getPack().getOrCreateRegistry( COLOR_PICKER_REGISTRY_KEY); - colorSamplerRegistry.register(addon.key("SINGLE"), SingleColorSamplerTemplate::new); - colorSamplerRegistry.register(addon.key("TILED"), TileColorSamplerTemplate::new); + colorSamplerRegistry.register(addon.key("SINGLE_IMAGE"), SingleColorSamplerTemplate::new); + colorSamplerRegistry.register(addon.key("TILED_IMAGE"), TileColorSamplerTemplate::new); colorSamplerRegistry.register(addon.key("COLOR"), ConstantColorSamplerTemplate::new); colorSamplerRegistry.register(addon.key("ROTATE"), RotateColorSamplerTemplate::new); }); diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java index 6a4cf4521..f65b55082 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java @@ -7,7 +7,7 @@ import com.dfsek.terra.addons.image.sampler.SimpleColorSampler; public class SingleColorSamplerTemplate extends ColorSamplerTemplate { - @Value("fallback") + @Value("outside-image") private ColorSampler fallback; @Override From a97273f358242d29ed3e44a7eca231ec58d0f83c Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 26 Nov 2022 14:05:39 +1100 Subject: [PATCH 040/161] Skip color dist calc if exact match --- .../addons/image/converter/ClosestMatchColorConverter.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java index 80bf1cee4..a95e2ee83 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java @@ -20,11 +20,12 @@ public class ClosestMatchColorConverter implements ColorConverter { int closest = 0; int smallestDistance = Integer.MAX_VALUE; for(int compare : colors) { - int distance = ColorUtil.distance(color, compare); - if(distance == 0) { + if(color == compare) { closest = compare; break; - } else if(distance < smallestDistance) { + } + int distance = ColorUtil.distance(color, compare); + if(distance < smallestDistance) { smallestDistance = distance; closest = compare; } From f246c8ada3efea87062f7b84f211600ce153afe5 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 26 Nov 2022 14:14:15 +1100 Subject: [PATCH 041/161] Put image based color samplers in own packages --- .../terra/addons/image/ImageLibraryAddon.java | 8 ++++---- .../sampler/SingleColorSamplerTemplate.java | 17 ----------------- .../sampler/TileColorSamplerTemplate.java | 13 ------------- .../ImageColorSamplerTemplate.java} | 6 +++--- .../image/SingleImageColorSamplerTemplate.java | 17 +++++++++++++++++ .../image/TileImageColorSamplerTemplate.java | 13 +++++++++++++ .../SingleImageColorSampler.java} | 9 +++++---- .../TileImageColorSampler.java} | 9 +++++---- .../{ => image}/transform/Alignment.java | 2 +- .../transform/ImageTransformation.java | 2 +- 10 files changed, 49 insertions(+), 47 deletions(-) delete mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java delete mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/TileColorSamplerTemplate.java rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/{ColorSamplerTemplate.java => image/ImageColorSamplerTemplate.java} (67%) create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/SingleImageColorSamplerTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/TileImageColorSamplerTemplate.java rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/{SimpleColorSampler.java => image/SingleImageColorSampler.java} (63%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/{TileColorSampler.java => image/TileImageColorSampler.java} (61%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/{ => image}/transform/Alignment.java (90%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/{ => image}/transform/ImageTransformation.java (74%) 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 c90c503c8..01f33c839 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 @@ -7,8 +7,8 @@ import java.util.function.Supplier; import com.dfsek.terra.addons.image.config.ImageLoader; import com.dfsek.terra.addons.image.config.sampler.RotateColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.ConstantColorSamplerTemplate; -import com.dfsek.terra.addons.image.config.sampler.SingleColorSamplerTemplate; -import com.dfsek.terra.addons.image.config.sampler.TileColorSamplerTemplate; +import com.dfsek.terra.addons.image.config.sampler.image.SingleImageColorSamplerTemplate; +import com.dfsek.terra.addons.image.config.sampler.image.TileImageColorSamplerTemplate; import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.sampler.ColorSampler; import com.dfsek.terra.addons.manifest.api.AddonInitializer; @@ -44,8 +44,8 @@ public class ImageLibraryAddon implements AddonInitializer { .then(event -> { CheckedRegistry>> colorSamplerRegistry = event.getPack().getOrCreateRegistry( COLOR_PICKER_REGISTRY_KEY); - colorSamplerRegistry.register(addon.key("SINGLE_IMAGE"), SingleColorSamplerTemplate::new); - colorSamplerRegistry.register(addon.key("TILED_IMAGE"), TileColorSamplerTemplate::new); + colorSamplerRegistry.register(addon.key("SINGLE_IMAGE"), SingleImageColorSamplerTemplate::new); + colorSamplerRegistry.register(addon.key("TILED_IMAGE"), TileImageColorSamplerTemplate::new); colorSamplerRegistry.register(addon.key("COLOR"), ConstantColorSamplerTemplate::new); colorSamplerRegistry.register(addon.key("ROTATE"), RotateColorSamplerTemplate::new); }); diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java deleted file mode 100644 index f65b55082..000000000 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/SingleColorSamplerTemplate.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dfsek.terra.addons.image.config.sampler; - -import com.dfsek.tectonic.api.config.template.annotations.Value; - -import com.dfsek.terra.addons.image.sampler.ColorSampler; -import com.dfsek.terra.addons.image.sampler.SimpleColorSampler; - - -public class SingleColorSamplerTemplate extends ColorSamplerTemplate { - @Value("outside-image") - private ColorSampler fallback; - - @Override - public ColorSampler get() { - return new SimpleColorSampler(image, fallback, alignment); - } -} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/TileColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/TileColorSamplerTemplate.java deleted file mode 100644 index b17deaba1..000000000 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/TileColorSamplerTemplate.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dfsek.terra.addons.image.config.sampler; - -import com.dfsek.terra.addons.image.sampler.ColorSampler; -import com.dfsek.terra.addons.image.sampler.TileColorSampler; - - -public class TileColorSamplerTemplate extends ColorSamplerTemplate { - - @Override - public ColorSampler get() { - return new TileColorSampler(image, alignment); - } -} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/ImageColorSamplerTemplate.java similarity index 67% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/ImageColorSamplerTemplate.java index 1dfe84152..98e61baa8 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/ImageColorSamplerTemplate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.image.config.sampler; +package com.dfsek.terra.addons.image.config.sampler.image; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -6,10 +6,10 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.sampler.ColorSampler; -import com.dfsek.terra.addons.image.sampler.transform.Alignment; +import com.dfsek.terra.addons.image.sampler.image.transform.Alignment; -public abstract class ColorSamplerTemplate implements ObjectTemplate { +public abstract class ImageColorSamplerTemplate implements ObjectTemplate { @Value("path") protected Image image; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/SingleImageColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/SingleImageColorSamplerTemplate.java new file mode 100644 index 000000000..e6ae59e24 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/SingleImageColorSamplerTemplate.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.addons.image.config.sampler.image; + +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.sampler.image.SingleImageColorSampler; + + +public class SingleImageColorSamplerTemplate extends ImageColorSamplerTemplate { + @Value("outside-image") + private ColorSampler fallback; + + @Override + public ColorSampler get() { + return new SingleImageColorSampler(image, fallback, alignment); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/TileImageColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/TileImageColorSamplerTemplate.java new file mode 100644 index 000000000..759559c21 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/TileImageColorSamplerTemplate.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.addons.image.config.sampler.image; + +import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.sampler.image.TileImageColorSampler; + + +public class TileImageColorSamplerTemplate extends ImageColorSamplerTemplate { + + @Override + public ColorSampler get() { + return new TileImageColorSampler(image, alignment); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/SingleImageColorSampler.java similarity index 63% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/SingleImageColorSampler.java index 9291ae2db..e470a1a9f 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/SingleImageColorSampler.java @@ -1,10 +1,11 @@ -package com.dfsek.terra.addons.image.sampler; +package com.dfsek.terra.addons.image.sampler.image; import com.dfsek.terra.addons.image.image.Image; -import com.dfsek.terra.addons.image.sampler.transform.ImageTransformation; +import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.sampler.image.transform.ImageTransformation; -public class SimpleColorSampler implements ColorSampler { +public class SingleImageColorSampler implements ColorSampler { private final Image image; @@ -12,7 +13,7 @@ public class SimpleColorSampler implements ColorSampler { private final ImageTransformation transformation; - public SimpleColorSampler(Image image, ColorSampler fallback, ImageTransformation transformation) { + public SingleImageColorSampler(Image image, ColorSampler fallback, ImageTransformation transformation) { this.image = image; this.fallback = fallback; this.transformation = transformation; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/TileImageColorSampler.java similarity index 61% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/TileImageColorSampler.java index 19812a3db..7d035eff4 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/TileImageColorSampler.java @@ -1,18 +1,19 @@ -package com.dfsek.terra.addons.image.sampler; +package com.dfsek.terra.addons.image.sampler.image; import net.jafama.FastMath; import com.dfsek.terra.addons.image.image.Image; -import com.dfsek.terra.addons.image.sampler.transform.ImageTransformation; +import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.sampler.image.transform.ImageTransformation; -public class TileColorSampler implements ColorSampler { +public class TileImageColorSampler implements ColorSampler { private final Image image; private final ImageTransformation transformation; - public TileColorSampler(Image image, ImageTransformation transformation) { + public TileImageColorSampler(Image image, ImageTransformation transformation) { this.image = image; this.transformation = transformation; } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/transform/Alignment.java similarity index 90% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/transform/Alignment.java index 474772a0a..43674b2e9 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/transform/Alignment.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.image.sampler.transform; +package com.dfsek.terra.addons.image.sampler.image.transform; import com.dfsek.terra.addons.image.image.Image; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/transform/ImageTransformation.java similarity index 74% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/transform/ImageTransformation.java index 5a22e6a05..bc9ae5143 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/transform/ImageTransformation.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.image.sampler.transform; +package com.dfsek.terra.addons.image.sampler.image.transform; import com.dfsek.terra.addons.image.image.Image; From 6b7fb822026e43cd529cd0396ef1055e5c5d2764 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 26 Nov 2022 14:21:02 +1100 Subject: [PATCH 042/161] Put mutator color samplers in their own packages --- .../dfsek/terra/addons/image/ImageLibraryAddon.java | 2 +- .../sampler/mutate/MutateColorSamplerTemplate.java | 13 +++++++++++++ .../{ => mutate}/RotateColorSamplerTemplate.java | 10 +++------- .../sampler/{ => mutate}/RotateColorSampler.java | 3 ++- 4 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/MutateColorSamplerTemplate.java rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/{ => mutate}/RotateColorSamplerTemplate.java (50%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/{ => mutate}/RotateColorSampler.java (83%) 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 01f33c839..9793958c4 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 @@ -5,7 +5,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.function.Supplier; import com.dfsek.terra.addons.image.config.ImageLoader; -import com.dfsek.terra.addons.image.config.sampler.RotateColorSamplerTemplate; +import com.dfsek.terra.addons.image.config.sampler.mutate.RotateColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.ConstantColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.image.SingleImageColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.image.TileImageColorSamplerTemplate; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/MutateColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/MutateColorSamplerTemplate.java new file mode 100644 index 000000000..35f5f137c --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/MutateColorSamplerTemplate.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.addons.image.config.sampler.mutate; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.image.sampler.ColorSampler; + + +public abstract class MutateColorSamplerTemplate implements ObjectTemplate { + + @Value("image") + protected ColorSampler sampler; +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/RotateColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/RotateColorSamplerTemplate.java similarity index 50% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/RotateColorSamplerTemplate.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/RotateColorSamplerTemplate.java index b7fcc4dc4..3122d3c34 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/RotateColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/RotateColorSamplerTemplate.java @@ -1,17 +1,13 @@ -package com.dfsek.terra.addons.image.config.sampler; +package com.dfsek.terra.addons.image.config.sampler.mutate; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import net.jafama.FastMath; import com.dfsek.terra.addons.image.sampler.ColorSampler; -import com.dfsek.terra.addons.image.sampler.RotateColorSampler; +import com.dfsek.terra.addons.image.sampler.mutate.RotateColorSampler; -public class RotateColorSamplerTemplate implements ObjectTemplate { - - @Value("image") - private ColorSampler sampler; +public class RotateColorSamplerTemplate extends MutateColorSamplerTemplate { @Value("angle") private double angle; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/RotateColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/mutate/RotateColorSampler.java similarity index 83% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/RotateColorSampler.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/mutate/RotateColorSampler.java index f7e511617..92e99f59d 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/RotateColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/mutate/RotateColorSampler.java @@ -1,5 +1,6 @@ -package com.dfsek.terra.addons.image.sampler; +package com.dfsek.terra.addons.image.sampler.mutate; +import com.dfsek.terra.addons.image.sampler.ColorSampler; import net.jafama.FastMath; From 7b0185ba7c153ee35bb65d47aa87aeef0ccb3237 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 26 Nov 2022 14:22:08 +1100 Subject: [PATCH 043/161] Add translate color sampler --- .../terra/addons/image/ImageLibraryAddon.java | 4 +++- .../mutate/TranslateColorSamplerTemplate.java | 21 +++++++++++++++++++ .../sampler/mutate/TranslateColorSampler.java | 21 +++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/TranslateColorSamplerTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/mutate/TranslateColorSampler.java 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 9793958c4..433606eec 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 @@ -5,10 +5,11 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.function.Supplier; import com.dfsek.terra.addons.image.config.ImageLoader; -import com.dfsek.terra.addons.image.config.sampler.mutate.RotateColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.ConstantColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.image.SingleImageColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.image.TileImageColorSamplerTemplate; +import com.dfsek.terra.addons.image.config.sampler.mutate.RotateColorSamplerTemplate; +import com.dfsek.terra.addons.image.config.sampler.mutate.TranslateColorSamplerTemplate; import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.sampler.ColorSampler; import com.dfsek.terra.addons.manifest.api.AddonInitializer; @@ -48,6 +49,7 @@ public class ImageLibraryAddon implements AddonInitializer { colorSamplerRegistry.register(addon.key("TILED_IMAGE"), TileImageColorSamplerTemplate::new); colorSamplerRegistry.register(addon.key("COLOR"), ConstantColorSamplerTemplate::new); colorSamplerRegistry.register(addon.key("ROTATE"), RotateColorSamplerTemplate::new); + colorSamplerRegistry.register(addon.key("TRANSLATE"), TranslateColorSamplerTemplate::new); }); } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/TranslateColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/TranslateColorSamplerTemplate.java new file mode 100644 index 000000000..7141c8ad8 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/TranslateColorSamplerTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.image.config.sampler.mutate; + +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.sampler.mutate.TranslateColorSampler; + + +public class TranslateColorSamplerTemplate extends MutateColorSamplerTemplate { + + @Value("x") + private int translateX; + + @Value("z") + private int translateZ; + + @Override + public ColorSampler get() { + return new TranslateColorSampler(sampler, translateX, translateZ); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/mutate/TranslateColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/mutate/TranslateColorSampler.java new file mode 100644 index 000000000..8f9c35fa8 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/mutate/TranslateColorSampler.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.image.sampler.mutate; + +import com.dfsek.terra.addons.image.sampler.ColorSampler; + + +public class TranslateColorSampler implements ColorSampler { + + private final ColorSampler sampler; + private final int translateX, translateZ; + + public TranslateColorSampler(ColorSampler sampler, int translateX, int translateZ) { + this.sampler = sampler; + this.translateX = translateX; + this.translateZ = translateZ; + } + + @Override + public Integer apply(int x, int z) { + return sampler.apply(x - translateX, z - translateZ); + } +} From 95992cc49bd716b74812cb4f0c2c74e426157f73 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 26 Nov 2022 14:43:15 +1100 Subject: [PATCH 044/161] Don't apply align to single image fallback --- .../image/sampler/image/SingleImageColorSampler.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/SingleImageColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/SingleImageColorSampler.java index e470a1a9f..08e8c6e89 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/SingleImageColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/SingleImageColorSampler.java @@ -21,9 +21,9 @@ public class SingleImageColorSampler implements ColorSampler { @Override public Integer apply(int x, int z) { - x = transformation.transformX(image, x); - z = transformation.transformZ(image, z); - if(x < 0 || z < 0 || x >= image.getWidth() || z >= image.getHeight()) return fallback.apply(x, z); - return image.getRGB(x, z); + var nx = transformation.transformX(image, x); + var nz = transformation.transformZ(image, z); + if(nx < 0 || nz < 0 || nx >= image.getWidth() || nz >= image.getHeight()) return fallback.apply(x, z); + return image.getRGB(nx, nz); } } From 1b5095dd363aefc80990a79eefdc131a4658a93e Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 26 Nov 2022 19:18:58 +1100 Subject: [PATCH 045/161] Refactor Noise3d palettes to support multiple slant methods --- .../NoiseChunkGenerator3DAddon.java | 20 ++- ...NoiseChunkGeneratorPackConfigTemplate.java | 12 +- .../config/palette/BiomePaletteTemplate.java | 39 ++---- .../config/palette/PaletteInfo.java | 22 ---- .../config/palette/SlantLayer.java | 42 ------- .../palette/slant/SlantLayerTemplate.java | 27 ++++ .../generation/NoiseChunkGenerator3D.java | 10 +- .../generation/math/PaletteUtil.java | 33 ++--- .../palette/BiomePaletteInfo.java | 20 +++ .../chunkgenerator/palette/PaletteHolder.java | 46 +++++++ .../palette/PaletteHolderBuilder.java | 45 ------- .../chunkgenerator/palette/SlantHolder.java | 64 ---------- .../palette/slant/MultipleSlantHolder.java | 47 +++++++ .../palette/slant/SingleSlantHolder.java | 24 ++++ .../palette/slant/SlantHolder.java | 116 ++++++++++++++++++ .../palette/slant/SlantHolderImpl.java | 38 ++++++ 16 files changed, 369 insertions(+), 236 deletions(-) delete mode 100644 common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/PaletteInfo.java delete mode 100644 common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SlantLayer.java create mode 100644 common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/slant/SlantLayerTemplate.java create mode 100644 common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/BiomePaletteInfo.java delete mode 100644 common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolderBuilder.java delete mode 100644 common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolder.java create mode 100644 common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/MultipleSlantHolder.java create mode 100644 common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/SingleSlantHolder.java create mode 100644 common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/SlantHolder.java create mode 100644 common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/SlantHolderImpl.java 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 06450b613..ce1ec9650 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 @@ -11,9 +11,10 @@ import com.dfsek.terra.addons.chunkgenerator.config.NoiseChunkGeneratorPackConfi import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties; import com.dfsek.terra.addons.chunkgenerator.config.palette.BiomePaletteTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.palette.PaletteInfo; -import com.dfsek.terra.addons.chunkgenerator.config.palette.SlantLayer; +import com.dfsek.terra.addons.chunkgenerator.config.palette.slant.SlantLayerTemplate; import com.dfsek.terra.addons.chunkgenerator.generation.NoiseChunkGenerator3D; +import com.dfsek.terra.addons.chunkgenerator.palette.BiomePaletteInfo; +import com.dfsek.terra.addons.chunkgenerator.palette.slant.SlantHolder; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; @@ -36,15 +37,20 @@ public class NoiseChunkGenerator3DAddon implements AddonInitializer { @Override public void initialize() { - PropertyKey paletteInfoPropertyKey = Context.create(PaletteInfo.class); + PropertyKey paletteInfoPropertyKey = Context.create(BiomePaletteInfo.class); PropertyKey noisePropertiesPropertyKey = Context.create(BiomeNoiseProperties.class); platform.getEventManager() .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) .priority(1000) .then(event -> { + + event.getPack().applyLoader(SlantHolder.CalculationMethod.class, + (type, o, loader, depthTracker) -> SlantHolder.CalculationMethod.valueOf((String) o)); + NoiseChunkGeneratorPackConfigTemplate config = event.loadTemplate(new NoiseChunkGeneratorPackConfigTemplate()); - + event.getPack().getContext().put(config); + event.getPack() .getOrCreateRegistry(ChunkGeneratorProvider.class) .register(addon.key("NOISE_3D"), @@ -53,7 +59,7 @@ public class NoiseChunkGenerator3DAddon implements AddonInitializer { config.getVerticalRes(), noisePropertiesPropertyKey, paletteInfoPropertyKey)); event.getPack() - .applyLoader(SlantLayer.class, SlantLayer::new); + .applyLoader(SlantHolder.Layer.class, SlantLayerTemplate::new); }) .failThrough(); @@ -62,8 +68,10 @@ public class NoiseChunkGenerator3DAddon implements AddonInitializer { .register(addon, ConfigurationLoadEvent.class) .then(event -> { if(event.is(Biome.class)) { + NoiseChunkGeneratorPackConfigTemplate config = event.getPack().getContext().get(NoiseChunkGeneratorPackConfigTemplate.class); + event.getLoadedObject(Biome.class).getContext().put(paletteInfoPropertyKey, - event.load(new BiomePaletteTemplate(platform)).get()); + event.load(new BiomePaletteTemplate(platform, config.getSlantCalculationMethod())).get()); event.getLoadedObject(Biome.class).getContext().put(noisePropertiesPropertyKey, event.load(new BiomeNoiseConfigTemplate()).get()); } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/NoiseChunkGeneratorPackConfigTemplate.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/NoiseChunkGeneratorPackConfigTemplate.java index e636ae400..db9922980 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/NoiseChunkGeneratorPackConfigTemplate.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/NoiseChunkGeneratorPackConfigTemplate.java @@ -4,10 +4,12 @@ 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.chunkgenerator.palette.slant.SlantHolder; import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.properties.Properties; -public class NoiseChunkGeneratorPackConfigTemplate implements ConfigTemplate { +public class NoiseChunkGeneratorPackConfigTemplate implements ConfigTemplate, Properties { @Value("blend.terrain.elevation") @Default private @Meta int elevationBlend = 4; @@ -20,6 +22,10 @@ public class NoiseChunkGeneratorPackConfigTemplate implements ConfigTemplate { @Default private @Meta int verticalRes = 2; + @Value("slant.calculation-method") + @Default + private SlantHolder.@Meta CalculationMethod slantCalculationMethod = SlantHolder.CalculationMethod.Derivative; + public int getElevationBlend() { return elevationBlend; } @@ -31,4 +37,8 @@ public class NoiseChunkGeneratorPackConfigTemplate implements ConfigTemplate { public int getVerticalRes() { return verticalRes; } + + public SlantHolder.CalculationMethod getSlantCalculationMethod() { + return slantCalculationMethod; + } } 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 f1f0f804a..f872794c9 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 @@ -15,25 +15,23 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.TreeMap; import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; -import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolderBuilder; -import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder; +import com.dfsek.terra.addons.chunkgenerator.palette.BiomePaletteInfo; +import com.dfsek.terra.addons.chunkgenerator.palette.slant.SlantHolder; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.world.chunk.generation.util.Palette; -public class BiomePaletteTemplate implements ObjectTemplate { +public class BiomePaletteTemplate implements ObjectTemplate { private final Platform platform; @Value("slant") @Default @Description("The slant palettes to use in this biome.") - private @Meta List<@Meta SlantLayer> slant = Collections.emptyList(); + private @Meta List slantLayers = Collections.emptyList(); @Value("slant-depth") @Default @@ -63,27 +61,16 @@ public class BiomePaletteTemplate implements ObjectTemplate { @Default private @Meta boolean updatePalette = false; - public BiomePaletteTemplate(Platform platform) { this.platform = platform; } + private final SlantHolder.CalculationMethod slantCalculationMethod; + + public BiomePaletteTemplate(Platform platform, SlantHolder.CalculationMethod slantCalculationMethod) { + this.platform = platform; + this.slantCalculationMethod = slantCalculationMethod; + } @Override - public PaletteInfo get() { - PaletteHolderBuilder builder = new PaletteHolderBuilder(); - for(Map layer : palettes) { - for(Entry entry : layer.entrySet()) { - builder.add(entry.getValue(), entry.getKey()); - } - } - - TreeMap slantLayers = new TreeMap<>(); - double minThreshold = Double.MAX_VALUE; - - for(SlantLayer layer : slant) { - double threshold = layer.getThreshold(); - if(threshold < minThreshold) minThreshold = threshold; - slantLayers.put(threshold, layer.getPalette()); - } - - return new PaletteInfo(builder.build(), SlantHolder.of(slantLayers, minThreshold), oceanPalette, seaLevel, slantDepth, - updatePalette); + public BiomePaletteInfo get() { + return new BiomePaletteInfo(PaletteHolder.of(palettes), SlantHolder.of(slantLayers, slantDepth, slantCalculationMethod), + oceanPalette, seaLevel, updatePalette); } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/PaletteInfo.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/PaletteInfo.java deleted file mode 100644 index caf3c4802..000000000 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/PaletteInfo.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2020-2021 Polyhedral Development - * - * The Terra 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.chunkgenerator.config.palette; - -import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; -import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder; -import com.dfsek.terra.api.properties.Properties; -import com.dfsek.terra.api.world.chunk.generation.util.Palette; - - -public record PaletteInfo(PaletteHolder paletteHolder, - SlantHolder slantHolder, - Palette ocean, - int seaLevel, - int maxSlantDepth, - boolean updatePaletteWhenCarving) implements Properties { -} diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SlantLayer.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SlantLayer.java deleted file mode 100644 index d63cbbb46..000000000 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SlantLayer.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dfsek.terra.addons.chunkgenerator.config.palette; - -import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; - -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; -import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolderBuilder; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.world.chunk.generation.util.Palette; - - -public class SlantLayer implements ObjectTemplate { - @Value("threshold") - private @Meta double threshold; - - @Value("palette") - private @Meta List<@Meta Map<@Meta Palette, @Meta Integer>> palettes; - - @Override - public SlantLayer get() { - return this; - } - - public double getThreshold() { - return threshold; - } - - public PaletteHolder getPalette() { - PaletteHolderBuilder builder = new PaletteHolderBuilder(); - for(Map layer : palettes) { - for(Entry entry : layer.entrySet()) { - builder.add(entry.getValue(), entry.getKey()); - } - } - - return builder.build(); - } -} diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/slant/SlantLayerTemplate.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/slant/SlantLayerTemplate.java new file mode 100644 index 000000000..5a4fd646d --- /dev/null +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/slant/SlantLayerTemplate.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.addons.chunkgenerator.config.palette.slant; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import java.util.List; +import java.util.Map; + +import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; +import com.dfsek.terra.addons.chunkgenerator.palette.slant.SlantHolder; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class SlantLayerTemplate implements ObjectTemplate { + + @Value("threshold") + private @Meta double threshold; + + @Value("palette") + private @Meta List<@Meta Map<@Meta Palette, @Meta Integer>> palettes; + + @Override + public SlantHolder.Layer get() { + return new SlantHolder.Layer(PaletteHolder.of(palettes), threshold); + } +} 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 fcb8d3fe2..f0f6de8e3 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 @@ -12,7 +12,7 @@ import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties; -import com.dfsek.terra.addons.chunkgenerator.config.palette.PaletteInfo; +import com.dfsek.terra.addons.chunkgenerator.palette.BiomePaletteInfo; import com.dfsek.terra.addons.chunkgenerator.generation.math.PaletteUtil; import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.LazilyEvaluatedInterpolator; import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D; @@ -40,13 +40,13 @@ public class NoiseChunkGenerator3D implements ChunkGenerator { private final int carverHorizontalResolution; private final int carverVerticalResolution; - private final PropertyKey paletteInfoPropertyKey; + private final PropertyKey paletteInfoPropertyKey; private final PropertyKey noisePropertiesKey; public NoiseChunkGenerator3D(ConfigPack pack, Platform platform, int elevationBlend, int carverHorizontalResolution, int carverVerticalResolution, PropertyKey noisePropertiesKey, - PropertyKey paletteInfoPropertyKey) { + PropertyKey paletteInfoPropertyKey) { this.platform = platform; this.air = platform.getWorldHandle().air(); this.carverHorizontalResolution = carverHorizontalResolution; @@ -97,7 +97,7 @@ public class NoiseChunkGenerator3D implements ChunkGenerator { for(int y = world.getMaxHeight() - 1; y >= world.getMinHeight(); y--) { Biome biome = biomeColumn.get(y); - PaletteInfo paletteInfo = biome.getContext().get(paletteInfoPropertyKey); + BiomePaletteInfo paletteInfo = biome.getContext().get(paletteInfoPropertyKey); int sea = paletteInfo.seaLevel(); Palette seaPalette = paletteInfo.ocean(); @@ -131,7 +131,7 @@ public class NoiseChunkGenerator3D implements ChunkGenerator { Biome biome = biomeProvider.getBiome(x, y, z, world.getSeed()); Sampler3D sampler = samplerCache.get(x, z, world, biomeProvider); - PaletteInfo paletteInfo = biome.getContext().get(paletteInfoPropertyKey); + BiomePaletteInfo paletteInfo = biome.getContext().get(paletteInfoPropertyKey); int fdX = FastMath.floorMod(x, 16); int fdZ = FastMath.floorMod(z, 16); diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/PaletteUtil.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/PaletteUtil.java index d649cf4f2..ebeabaf23 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/PaletteUtil.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/PaletteUtil.java @@ -7,40 +7,23 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math; -import com.dfsek.terra.addons.chunkgenerator.config.palette.PaletteInfo; +import com.dfsek.terra.addons.chunkgenerator.palette.BiomePaletteInfo; import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D; -import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder; +import com.dfsek.terra.addons.chunkgenerator.palette.slant.SlantHolder; import com.dfsek.terra.api.world.chunk.generation.util.Palette; public final class PaletteUtil { - /** - * Derivative constant. - */ - private static final double DERIVATIVE_DIST = 0.55; - public static Palette getPalette(int x, int y, int z, Sampler3D sampler, PaletteInfo paletteInfo, int depth) { - SlantHolder slant = paletteInfo.slantHolder(); - if(!slant.isEmpty() && depth <= paletteInfo.maxSlantDepth()) { - double slope = derivative(sampler, x, y, z); - if(slope > slant.getMinSlope()) { - return slant.getPalette(slope).getPalette(y); + public static Palette getPalette(int x, int y, int z, Sampler3D sampler, BiomePaletteInfo paletteInfo, int depth) { + SlantHolder slantHolder = paletteInfo.slantHolder(); + if(slantHolder.isAboveDepth(depth)) { + double slant = slantHolder.calculateSlant(sampler, x, y, z); + if(slantHolder.isInSlantThreshold(slant)) { + return slantHolder.getPalette(slant).getPalette(y); } } return paletteInfo.paletteHolder().getPalette(y); } - - public static double derivative(Sampler3D sampler, double x, double y, double z) { - double baseSample = sampler.sample(x, y, z); - - double xVal1 = (sampler.sample(x + DERIVATIVE_DIST, y, z) - baseSample) / DERIVATIVE_DIST; - double xVal2 = (sampler.sample(x - DERIVATIVE_DIST, y, z) - baseSample) / DERIVATIVE_DIST; - double zVal1 = (sampler.sample(x, y, z + DERIVATIVE_DIST) - baseSample) / DERIVATIVE_DIST; - double zVal2 = (sampler.sample(x, y, z - DERIVATIVE_DIST) - baseSample) / DERIVATIVE_DIST; - double yVal1 = (sampler.sample(x, y + DERIVATIVE_DIST, z) - baseSample) / DERIVATIVE_DIST; - double yVal2 = (sampler.sample(x, y - DERIVATIVE_DIST, z) - baseSample) / DERIVATIVE_DIST; - - return Math.sqrt(((xVal2 - xVal1) * (xVal2 - xVal1)) + ((zVal2 - zVal1) * (zVal2 - zVal1)) + ((yVal2 - yVal1) * (yVal2 - yVal1))); - } } \ No newline at end of file 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 new file mode 100644 index 000000000..a75eeef5f --- /dev/null +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/BiomePaletteInfo.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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.chunkgenerator.palette; + +import com.dfsek.terra.addons.chunkgenerator.palette.slant.SlantHolder; +import com.dfsek.terra.api.properties.Properties; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public record BiomePaletteInfo(PaletteHolder paletteHolder, + SlantHolder slantHolder, + Palette ocean, + int seaLevel, + boolean updatePaletteWhenCarving) implements Properties { +} 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 2451d063c..fcd48f4a8 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 @@ -7,6 +7,13 @@ package com.dfsek.terra.addons.chunkgenerator.palette; +import net.jafama.FastMath; + +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.TreeMap; + import com.dfsek.terra.api.world.chunk.generation.util.Palette; @@ -27,4 +34,43 @@ public class PaletteHolder { : palettes[palettes.length - 1] : palettes[0]; } + + public static PaletteHolder of(List> palettes) { + PaletteHolderBuilder builder = new PaletteHolderBuilder(); + for(Map layer : palettes) { + for(Entry entry : layer.entrySet()) { + builder.add(entry.getValue(), entry.getKey()); + } + } + return builder.build(); + } + + private static class PaletteHolderBuilder { + private final TreeMap paletteMap = new TreeMap<>(); + + public PaletteHolderBuilder add(int y, Palette palette) { + paletteMap.put(y, palette); + return this; + } + + public PaletteHolder build() { + + int min = FastMath.min(paletteMap.keySet().stream().min(Integer::compareTo).orElse(0), 0); + int max = FastMath.max(paletteMap.keySet().stream().max(Integer::compareTo).orElse(255), 255); + + Palette[] palettes = new Palette[paletteMap.lastKey() + 1 - min]; + for(int y = min; y <= FastMath.max(paletteMap.lastKey(), max); y++) { + Palette d = null; + for(Entry e : paletteMap.entrySet()) { + if(e.getKey() >= y) { + d = e.getValue(); + break; + } + } + if(d == null) throw new IllegalArgumentException("No palette for Y=" + y); + palettes[y - min] = d; + } + return new PaletteHolder(palettes, -min); + } + } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolderBuilder.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolderBuilder.java deleted file mode 100644 index 693939c75..000000000 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolderBuilder.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2020-2021 Polyhedral Development - * - * The Terra 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.chunkgenerator.palette; - -import net.jafama.FastMath; - -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<>(); - - public PaletteHolderBuilder add(int y, Palette palette) { - paletteMap.put(y, palette); - return this; - } - - public PaletteHolder build() { - - int min = FastMath.min(paletteMap.keySet().stream().min(Integer::compareTo).orElse(0), 0); - int max = FastMath.max(paletteMap.keySet().stream().max(Integer::compareTo).orElse(255), 255); - - Palette[] palettes = new Palette[paletteMap.lastKey() + 1 - min]; - for(int y = min; y <= FastMath.max(paletteMap.lastKey(), max); y++) { - Palette d = null; - for(Map.Entry e : paletteMap.entrySet()) { - if(e.getKey() >= y) { - d = e.getValue(); - break; - } - } - if(d == null) throw new IllegalArgumentException("No palette for Y=" + y); - palettes[y - min] = d; - } - return new PaletteHolder(palettes, -min); - } -} diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolder.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolder.java deleted file mode 100644 index 6ceacee24..000000000 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolder.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2020-2021 Polyhedral Development - * - * The Terra 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.chunkgenerator.palette; - - -import java.util.Map.Entry; -import java.util.TreeMap; - - -public class SlantHolder { - private final TreeMap layers; - private final double minSlope; - - private SlantHolder(TreeMap layers, double minSlope) { - this.layers = layers; - this.minSlope = minSlope; - } - - public static SlantHolder of(TreeMap layers, double minSlope) { - if(layers.size() == 1) { - Entry firstEntry = layers.firstEntry(); - return new Single(firstEntry.getValue(), minSlope); - } - return new SlantHolder(layers, minSlope); - } - - public boolean isEmpty() { - return layers.isEmpty(); - } - - public PaletteHolder getPalette(double slope) { - return layers.floorEntry(slope).getValue(); - } - - public double getMinSlope() { - return minSlope; - } - - private static final class Single extends SlantHolder { - - private final PaletteHolder layers; - - public Single(PaletteHolder layers, double minSlope) { - super(of(minSlope, layers), minSlope); - this.layers = layers; - } - - private static TreeMap of(double v, PaletteHolder layer) { - TreeMap map = new TreeMap<>(); - map.put(v, layer); - return map; - } - - @Override - public PaletteHolder getPalette(double slope) { - return layers; - } - } -} 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 new file mode 100644 index 000000000..928edb2c2 --- /dev/null +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/MultipleSlantHolder.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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.chunkgenerator.palette.slant; + + +import java.util.List; +import java.util.NavigableMap; +import java.util.TreeMap; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; + + +public class MultipleSlantHolder extends SlantHolderImpl { + private final NavigableMap layers; + private final double slantThreshold; + + MultipleSlantHolder(List slant, int slantDepth, CalculationMethod calculationMethod) { + super(slantDepth, calculationMethod); + NavigableMap layers = new TreeMap<>(slant.stream().collect(Collectors.toMap(SlantHolder.Layer::threshold, SlantHolder.Layer::palette))); + Stream thresholds = layers.keySet().stream(); + double slantThreshold = floorToThreshold ? + thresholds.min(Double::compare).orElseThrow() : + thresholds.max(Double::compare).orElseThrow(); + this.layers = layers; + this.slantThreshold = slantThreshold; + } + + @Override + protected double getSlantThreshold() { + return slantThreshold; + } + + @Override + public PaletteHolder getPalette(double slant) { + return (floorToThreshold ? + layers.floorEntry(slant) : + layers.ceilingEntry(slant) + ).getValue(); + } +} diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/SingleSlantHolder.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/SingleSlantHolder.java new file mode 100644 index 000000000..fdc9b27cb --- /dev/null +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/SingleSlantHolder.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.addons.chunkgenerator.palette.slant; + +import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; + + +final class SingleSlantHolder extends SlantHolderImpl { + + private final SlantHolder.Layer layer; + + public SingleSlantHolder(SlantHolder.Layer layer, int slantDepth, CalculationMethod calculationMethod) { + super(slantDepth, calculationMethod); + this.layer = layer; + } + + @Override + public PaletteHolder getPalette(double slant) { + return layer.palette(); + } + + @Override + protected double getSlantThreshold() { + return layer.threshold(); + } +} diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/SlantHolder.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/SlantHolder.java new file mode 100644 index 000000000..e70670977 --- /dev/null +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/SlantHolder.java @@ -0,0 +1,116 @@ +package com.dfsek.terra.addons.chunkgenerator.palette.slant; + +import java.util.List; + +import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D; +import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; +import com.dfsek.terra.api.util.vector.Vector3; + + +public interface SlantHolder { + + static SlantHolder of(List layers, int slantDepth, CalculationMethod calculationMethod) { + if(layers.isEmpty()) { + return EMPTY; + } else if(layers.size() == 1) { + return new SingleSlantHolder(layers.get(0), slantDepth, calculationMethod); + } + return new MultipleSlantHolder(layers, slantDepth, calculationMethod); + } + + double calculateSlant(Sampler3D sampler, double x, double y, double z); + + boolean isAboveDepth(int depth); + + boolean isInSlantThreshold(double slant); + + PaletteHolder getPalette(double slant); + + record Layer(PaletteHolder palette, double threshold) { + } + + enum CalculationMethod { + DotProduct { + private static final Vector3 DOT_PRODUCT_DIRECTION = Vector3.of(0, 1, 0); + + private static final Vector3[] DOT_PRODUCT_SAMPLE_POINTS = { + Vector3.of(0, 0, -DERIVATIVE_DIST), + Vector3.of(0, 0, DERIVATIVE_DIST), + Vector3.of(0, -DERIVATIVE_DIST, 0), + Vector3.of(0, DERIVATIVE_DIST, 0), + Vector3.of(-DERIVATIVE_DIST, 0, 0), + Vector3.of(DERIVATIVE_DIST, 0, 0) + }; + + @Override + public double slant(Sampler3D sampler, double x, double y, double z) { + 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)); + } + return DOT_PRODUCT_DIRECTION.dot(normalApproximation.normalize()); + } + + @Override + public boolean floorToThreshold() { + return false; + } + }, + + Derivative { + @Override + public double slant(Sampler3D sampler, double x, double y, double z) { + double baseSample = sampler.sample(x, y, z); + + double xVal1 = (sampler.sample(x + DERIVATIVE_DIST, y, z) - baseSample) / DERIVATIVE_DIST; + double xVal2 = (sampler.sample(x - DERIVATIVE_DIST, y, z) - baseSample) / DERIVATIVE_DIST; + double zVal1 = (sampler.sample(x, y, z + DERIVATIVE_DIST) - baseSample) / DERIVATIVE_DIST; + double zVal2 = (sampler.sample(x, y, z - DERIVATIVE_DIST) - baseSample) / DERIVATIVE_DIST; + double yVal1 = (sampler.sample(x, y + DERIVATIVE_DIST, z) - baseSample) / DERIVATIVE_DIST; + double yVal2 = (sampler.sample(x, y - DERIVATIVE_DIST, z) - baseSample) / DERIVATIVE_DIST; + + return Math.sqrt(((xVal2 - xVal1) * (xVal2 - xVal1)) + ((zVal2 - zVal1) * (zVal2 - zVal1)) + ((yVal2 - yVal1) * (yVal2 - yVal1))); + } + + @Override + public boolean floorToThreshold() { + return true; + } + }; + + private static final double DERIVATIVE_DIST = 0.55; + + public abstract double slant(Sampler3D sampler, double x, double y, double z); + + /* + * Controls whether palettes should be applied before or after their respective thresholds. + * + * If true, slant values will map to the palette of the next floor threshold, otherwise they + * will map to the ceiling. + */ + public abstract boolean floorToThreshold(); + } + + SlantHolder EMPTY = new SlantHolder() { + @Override + public double calculateSlant(Sampler3D sampler, double x, double y, double z) { + throw new UnsupportedOperationException("Empty holder should not calculate slant"); + } + + @Override + public boolean isAboveDepth(int depth) { + return false; + } + + @Override + public boolean isInSlantThreshold(double slant) { + return false; + } + + @Override + public PaletteHolder getPalette(double slant) { + throw new UnsupportedOperationException("Empty holder cannot return a palette"); + } + }; +} diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/SlantHolderImpl.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/SlantHolderImpl.java new file mode 100644 index 000000000..e7261b88e --- /dev/null +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/SlantHolderImpl.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.addons.chunkgenerator.palette.slant; + +import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D; + + +public abstract class SlantHolderImpl implements SlantHolder { + private final SlantHolder.CalculationMethod calculationMethod; + + private final int slantDepth; + + protected final boolean floorToThreshold; + + protected SlantHolderImpl(int slantDepth, CalculationMethod calculationMethod) { + this.floorToThreshold = calculationMethod.floorToThreshold(); + this.calculationMethod = calculationMethod; + this.slantDepth = slantDepth; + } + + protected abstract double getSlantThreshold(); + + @Override + public final double calculateSlant(Sampler3D sampler, double x, double y, double z) { + return calculationMethod.slant(sampler, x, y, z); + } + + @Override + public final boolean isAboveDepth(int depth) { + return depth <= slantDepth; + } + + @Override + public final boolean isInSlantThreshold(double slant) { + return (floorToThreshold ? + slant > getSlantThreshold() : + slant < getSlantThreshold() + ); + } +} From bae2af80c82bbf974e094eef1ae8239e7fdc7a94 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 14 Dec 2022 18:28:25 -0700 Subject: [PATCH 046/161] update platform versions to 1.19.3 --- buildSrc/src/main/kotlin/Versions.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 09b2244af..0b101e569 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -4,7 +4,7 @@ object Versions { const val paralithic = "0.7.0" const val strata = "1.1.1" - const val cloud = "1.7.0" + const val cloud = "1.8.0" const val slf4j = "1.7.36" const val log4j_slf4j_impl = "2.14.1" @@ -19,19 +19,19 @@ object Versions { object Fabric { const val fabricLoader = "0.14.8" - const val fabricAPI = "0.57.0+1.19" + const val fabricAPI = "0.69.1+1.19.3" } object Quilt { - const val quiltLoader = "0.17.0" - const val fabricApi = "2.0.0-beta.4+0.57.0-1.19" + const val quiltLoader = "0.17.8" + const val fabricApi = "5.0.0-alpha.5+0.68.1-1.19.3" } object Mod { const val mixin = "0.11.2+mixin.0.8.5" - const val minecraft = "1.19" - const val yarn = "$minecraft+build.1" + const val minecraft = "1.19.3" + const val yarn = "$minecraft+build.3" const val fabricLoader = "0.14.2" const val architecuryLoom = "0.12.0.290" @@ -43,7 +43,7 @@ object Versions { } object Forge { - const val forge = "${Mod.minecraft}-41.0.63" + const val forge = "${Mod.minecraft}-44.0.18" const val burningwave = "12.53.0" } @@ -52,7 +52,7 @@ object Versions { const val paperLib = "1.0.5" const val minecraft = "1.19.2" const val reflectionRemapper = "0.1.0-SNAPSHOT" - const val paperDevBundle = "1.19.2-R0.1-SNAPSHOT" + const val paperDevBundle = "1.19.3-R0.1-SNAPSHOT" } object Sponge { From 8955e4bb8199068bed8c30f3c34e1867a61d1e97 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 14 Dec 2022 19:14:16 -0700 Subject: [PATCH 047/161] begin working on fabric 1.19.3 --- .../java/com/dfsek/terra/forge/ForgeEntryPoint.java | 2 +- .../java/com/dfsek/terra/forge/util/BiomeUtil.java | 2 +- .../main/java/com/dfsek/terra/mod/ModPlatform.java | 8 +++++--- .../dfsek/terra/mod/config/EntityTypeTemplate.java | 2 +- .../dfsek/terra/mod/config/ProtoPlatformBiome.java | 4 ++-- .../terra/mod/config/VillagerTypeTemplate.java | 2 +- .../main/java/com/dfsek/terra/mod/data/Codecs.java | 7 ++++--- .../generation/MinecraftChunkGeneratorWrapper.java | 2 +- .../terra/mod/generation/TerraBiomeSource.java | 9 +++++---- .../dfsek/terra/mod/handle/MinecraftItemHandle.java | 2 +- .../terra/mod/handle/MinecraftWorldHandle.java | 2 +- .../block/entity/MobSpawnerBlockEntityMixin.java | 2 +- .../terra/block/state/BlockStateMixin.java | 2 +- .../terra/inventory/meta/EnchantmentMixin.java | 5 +++-- .../terra/inventory/meta/ItemStackMetaMixin.java | 2 +- .../mod/mixin/lifecycle/DataPackContentsMixin.java | 10 ++++++---- .../com/dfsek/terra/mod/util/MinecraftUtil.java | 13 ++++++++----- .../java/com/dfsek/terra/mod/util/PresetUtil.java | 2 +- .../main/java/com/dfsek/terra/mod/util/TagUtil.java | 8 ++++---- .../terra/lifecycle/mixin/NoiseConfigMixin.java | 2 +- .../dfsek/terra/lifecycle/mixin/RegistryMixin.java | 2 +- .../com/dfsek/terra/lifecycle/util/BiomeUtil.java | 2 +- .../dfsek/terra/lifecycle/util/RegistryUtil.java | 2 +- 23 files changed, 52 insertions(+), 42 deletions(-) diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java index b342e5a11..8bf758ef7 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java @@ -18,7 +18,7 @@ package com.dfsek.terra.forge; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.IEventBus; 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 177a63f8e..aacae6001 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 @@ -2,7 +2,7 @@ package com.dfsek.terra.forge.util; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.village.VillagerType; import net.minecraftforge.registries.ForgeRegistries; 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 4a6efa188..71a466567 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 @@ -5,13 +5,15 @@ import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; +import net.minecraft.registry.BuiltinRegistries; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.sound.BiomeAdditionsSound; import net.minecraft.sound.BiomeMoodSound; import net.minecraft.sound.MusicSound; import net.minecraft.sound.SoundEvent; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.village.VillagerType; import net.minecraft.world.biome.Biome.Precipitation; import net.minecraft.world.biome.Biome.TemperatureModifier; @@ -92,9 +94,9 @@ public abstract class ModPlatform extends AbstractPlatform { .registerLoader(VillagerType.class, VillagerTypeTemplate::new); } - private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { + private ProtoPlatformBiome parseBiome(DynamicRegistryManager registryManager, String id, DepthTracker tracker) throws LoadException { Identifier identifier = Identifier.tryParse(id); - if(BuiltinRegistries.BIOME.get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. + if(registryManager.get(RegistryKeys.BIOME).get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. return new ProtoPlatformBiome(identifier); } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/EntityTypeTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/EntityTypeTemplate.java index d2e46764d..98af99ec4 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/EntityTypeTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/EntityTypeTemplate.java @@ -5,7 +5,7 @@ import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import net.minecraft.entity.EntityType; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; public class EntityTypeTemplate implements ObjectTemplate> { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java index f9524ef58..080689c3c 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java @@ -17,9 +17,9 @@ package com.dfsek.terra.mod.config; +import net.minecraft.registry.RegistryKey; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryKey; +import net.minecraft.registry.Registry; import net.minecraft.world.biome.Biome; import java.util.Objects; 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 f8cce4832..d807f3b93 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 @@ -4,7 +4,7 @@ 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.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.village.VillagerType; 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 5f5dd615a..9a45d7ebf 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 @@ -2,8 +2,9 @@ package com.dfsek.terra.mod.data; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.util.dynamic.RegistryOps; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryOps; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import com.dfsek.terra.api.config.ConfigPack; @@ -35,7 +36,7 @@ public final class Codecs { id))))); public static final Codec TERRA_BIOME_SOURCE = RecordCodecBuilder - .create(instance -> instance.group(RegistryOps.createRegistryCodec(Registry.BIOME_KEY) + .create(instance -> instance.group(RegistryOps.getEntryCodec(RegistryKeys.BIOME) .fieldOf("biome_registry") .stable() .forGetter(TerraBiomeSource::getBiomeRegistry), 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 5742120d6..739c47b94 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 @@ -27,7 +27,7 @@ import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.random.CheckedRandom; import net.minecraft.util.math.random.ChunkRandom; import net.minecraft.util.math.random.RandomSeed; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.util.registry.RegistryEntry; import net.minecraft.world.ChunkRegion; import net.minecraft.world.HeightLimitView; 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 5730cee80..31e1b0c7f 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 @@ -18,8 +18,9 @@ package com.dfsek.terra.mod.generation; import com.mojang.serialization.Codec; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryEntry; +import net.minecraft.registry.Registry; +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.MultiNoiseSampler; import org.slf4j.Logger; @@ -45,7 +46,7 @@ public class TerraBiomeSource extends BiomeSource { .stream(pack.getBiomeProvider() .getBiomes() .spliterator(), false) - .map(b -> biomes.getOrCreateEntry(((ProtoPlatformBiome) b.getPlatformBiome()).getDelegate()))); + .map(b -> biomes.entryOf(((ProtoPlatformBiome) b.getPlatformBiome()).getDelegate()))); this.biomeRegistry = biomes; this.pack = pack; @@ -58,7 +59,7 @@ 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 noiseSampler) { return biomeRegistry .entryOf(((ProtoPlatformBiome) pack .getBiomeProvider() 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 5d26b6c43..49f8216c5 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 @@ -22,7 +22,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.command.CommandRegistryAccess; import net.minecraft.command.argument.ItemStackArgumentType; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import java.util.Set; import java.util.stream.Collectors; 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 13eef4b2d..81107bfd7 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 @@ -21,7 +21,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.block.Blocks; import net.minecraft.command.argument.BlockArgumentParser; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import org.jetbrains.annotations.NotNull; import com.dfsek.terra.api.block.state.BlockState; 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 f28c27a62..961fd48cd 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 @@ -23,7 +23,7 @@ import net.minecraft.block.entity.BlockEntityType; import net.minecraft.block.entity.MobSpawnerBlockEntity; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.world.MobSpawnerLogic; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Implements; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java index 636a3f721..58f24945b 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java @@ -6,7 +6,7 @@ import com.mojang.serialization.MapCodec; import net.minecraft.block.AbstractBlock.AbstractBlockState; import net.minecraft.block.Block; import net.minecraft.state.State; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Intrinsic; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java index d5394870c..48f3ab53d 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java @@ -18,7 +18,8 @@ package com.dfsek.terra.mod.mixin.implementations.terra.inventory.meta; import net.minecraft.enchantment.Enchantment; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKeys; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @@ -48,6 +49,6 @@ public abstract class EnchantmentMixin { } public String terra$getID() { - return Objects.requireNonNull(Registry.ENCHANTMENT.getId((Enchantment) (Object) this)).toString(); + return Objects.requireNonNull(RegistryKeys.ENCHANTMENT.getId((Enchantment) (Object) this)).toString(); } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java index 39974ed26..2df082068 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java @@ -20,7 +20,7 @@ package com.dfsek.terra.mod.mixin.implementations.terra.inventory.meta; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtList; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Intrinsic; 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 a9ecb9354..5222db0a7 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,8 +1,10 @@ package com.dfsek.terra.mod.mixin.lifecycle; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKeys; import net.minecraft.server.DataPackContents; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -20,9 +22,9 @@ public class DataPackContentsMixin { */ @Inject(method = "refresh(Lnet/minecraft/util/registry/DynamicRegistryManager;)V", at = @At("RETURN")) private void injectReload(DynamicRegistryManager dynamicRegistryManager, CallbackInfo ci) { - TagUtil.registerWorldPresetTags(dynamicRegistryManager.get(Registry.WORLD_PRESET_KEY)); + TagUtil.registerWorldPresetTags(dynamicRegistryManager.get(RegistryKeys.WORLD_PRESET)); - Registry biomeRegistry = dynamicRegistryManager.get(Registry.BIOME_KEY); + Registry biomeRegistry = dynamicRegistryManager.get(RegistryKeys.BIOME); TagUtil.registerBiomeTags(biomeRegistry); MinecraftUtil.registerFlora(biomeRegistry); } 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 69f91e6f6..cae38ca6f 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,11 +3,13 @@ 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.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.registry.Registry; -import net.minecraft.util.registry.RegistryEntry; -import net.minecraft.util.registry.RegistryKey; +import net.minecraft.registry.Registry; import net.minecraft.world.WorldAccess; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Builder; @@ -23,6 +25,7 @@ import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.function.Function; import com.dfsek.terra.api.block.entity.BlockEntity; import com.dfsek.terra.api.block.entity.Container; @@ -46,7 +49,7 @@ public final class MinecraftUtil { public static Optional> getEntry(Registry registry, Identifier identifier) { return registry.getOrEmpty(identifier) .flatMap(registry::getKey) - .map(registry::getOrCreateEntry); + .flatMap(registry::getEntry); } public static BlockEntity createState(WorldAccess worldAccess, BlockPos pos) { @@ -91,7 +94,7 @@ public final class MinecraftUtil { } public static RegistryKey registerKey(Identifier identifier) { - return RegistryKey.of(Registry.BIOME_KEY, identifier); + return RegistryKey.of(RegistryKeys.BIOME, identifier); } public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla, 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 f4fd942c8..e89740ff1 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 @@ -4,7 +4,7 @@ import net.minecraft.structure.StructureSet; import net.minecraft.util.Identifier; import net.minecraft.util.math.noise.DoublePerlinNoiseSampler.NoiseParameters; import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.util.registry.RegistryEntry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.MultiNoiseBiomeSource; 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 8edf50afc..81289fdfb 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,10 +1,10 @@ package com.dfsek.terra.mod.util; import com.google.common.collect.ImmutableMap; -import net.minecraft.tag.TagKey; -import net.minecraft.tag.WorldPresetTags; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryEntry; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.Registry; +import net.minecraft.registry.tag.TagKey; +import net.minecraft.registry.tag.WorldPresetTags; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.WorldPreset; import org.slf4j.Logger; diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java index 2793aa500..504a6709e 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java @@ -1,7 +1,7 @@ package com.dfsek.terra.lifecycle.mixin; import net.minecraft.util.math.noise.DoublePerlinNoiseSampler; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.noise.NoiseConfig; diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java index 8e2c12c70..31fdccb2a 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java @@ -1,6 +1,6 @@ package com.dfsek.terra.lifecycle.mixin; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; 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/BiomeUtil.java index f0d3e06e6..4e55edb38 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/BiomeUtil.java @@ -2,7 +2,7 @@ package com.dfsek.terra.lifecycle.util; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.village.VillagerType; import org.slf4j.Logger; 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 9f17b89e3..1a6568453 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 @@ -1,7 +1,7 @@ package com.dfsek.terra.lifecycle.util; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import com.dfsek.terra.mod.data.Codecs; From 393a868e6a603734552501990101fc34e4d03a75 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 20:05:17 -0700 Subject: [PATCH 048/161] update MinecraftChunkGeneratorWrapper and its codec --- .../java/com/dfsek/terra/mod/data/Codecs.java | 8 ++------ .../MinecraftChunkGeneratorWrapper.java | 20 ++++++++----------- .../com/dfsek/terra/mod/util/PresetUtil.java | 2 +- 3 files changed, 11 insertions(+), 19 deletions(-) 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 9a45d7ebf..4c467bc90 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 @@ -2,7 +2,6 @@ package com.dfsek.terra.mod.data; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryOps; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; @@ -48,10 +47,6 @@ public final class Codecs { public static final Codec MINECRAFT_CHUNK_GENERATOR_WRAPPER = RecordCodecBuilder .create( instance -> instance.group( - RegistryOps.createRegistryCodec(Registry.STRUCTURE_SET_KEY) - .fieldOf("structure_registry") - .stable() - .forGetter(MinecraftChunkGeneratorWrapper::getNoiseRegistry), TERRA_BIOME_SOURCE.fieldOf("biome_source") .stable() .forGetter(MinecraftChunkGeneratorWrapper::getBiomeSource), @@ -61,6 +56,7 @@ public final class Codecs { ChunkGeneratorSettings.REGISTRY_CODEC.fieldOf("settings") .stable() .forGetter(MinecraftChunkGeneratorWrapper::getSettings) - ).apply(instance, instance.stable(MinecraftChunkGeneratorWrapper::new)) + ).apply(instance, instance.stable( + MinecraftChunkGeneratorWrapper::new)) ); } 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 739c47b94..75fd4f498 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 @@ -17,9 +17,12 @@ package com.dfsek.terra.mod.generation; +import com.dfsek.terra.mod.util.SeedHack; + import com.mojang.serialization.Codec; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.structure.StructureSet; import net.minecraft.util.Util; import net.minecraft.util.math.BlockPos; @@ -28,7 +31,6 @@ import net.minecraft.util.math.random.CheckedRandom; import net.minecraft.util.math.random.ChunkRandom; import net.minecraft.util.math.random.RandomSeed; import net.minecraft.registry.Registry; -import net.minecraft.util.registry.RegistryEntry; import net.minecraft.world.ChunkRegion; import net.minecraft.world.HeightLimitView; import net.minecraft.world.Heightmap.Type; @@ -71,15 +73,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 Registry noiseRegistry; private final RegistryEntry settings; private ChunkGenerator delegate; private ConfigPack pack; - public MinecraftChunkGeneratorWrapper(Registry noiseRegistry, TerraBiomeSource biomeSource, ConfigPack configPack, + public MinecraftChunkGeneratorWrapper(TerraBiomeSource biomeSource, ConfigPack configPack, RegistryEntry settingsSupplier) { - super(noiseRegistry, Optional.empty(), biomeSource); - this.noiseRegistry = noiseRegistry; + super(biomeSource); this.pack = configPack; this.settings = settingsSupplier; @@ -88,10 +88,6 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun this.biomeSource = biomeSource; } - public Registry getNoiseRegistry() { - return noiseRegistry; - } - @Override protected Codec getCodec() { return Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER; @@ -137,7 +133,7 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun private void beard(StructureAccessor structureAccessor, Chunk chunk, WorldProperties world, BiomeProvider biomeProvider, PreLoadCompatibilityOptions compatibilityOptions) { - StructureWeightSampler structureWeightSampler = StructureWeightSampler.method_42695(structureAccessor, chunk.getPos()); + StructureWeightSampler structureWeightSampler = StructureWeightSampler.createStructureWeightSampler(structureAccessor, chunk.getPos()); double threshold = compatibilityOptions.getBeardThreshold(); double airThreshold = compatibilityOptions.getAirThreshold(); int xi = chunk.getPos().x << 4; @@ -185,7 +181,7 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun @Override public int getHeight(int x, int z, Type heightmap, HeightLimitView height, NoiseConfig noiseConfig) { - WorldProperties properties = MinecraftAdapter.adapt(height, noiseConfig.getLegacyWorldSeed()); + 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--) { @@ -199,7 +195,7 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun @Override public VerticalBlockSample getColumnSample(int x, int z, HeightLimitView height, NoiseConfig noiseConfig) { BlockState[] array = new BlockState[height.getHeight()]; - WorldProperties properties = MinecraftAdapter.adapt(height, noiseConfig.getLegacyWorldSeed()); + WorldProperties properties = MinecraftAdapter.adapt(height, SeedHack.getSeed(noiseConfig.getMultiNoiseSampler())); BiomeProvider biomeProvider = pack.getBiomeProvider(); for(int y = height.getTopY() - 1; y >= height.getBottomY(); y--) { array[y - height.getBottomY()] = (BlockState) delegate.getBlock(properties, x, y, z, biomeProvider); 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 e89740ff1..067401adc 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 @@ -68,7 +68,7 @@ public class PresetUtil { PRESETS.add(generatorID); TerraBiomeSource biomeSource = new TerraBiomeSource(biomeRegistry, pack); - ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(structureSetRegistry, biomeSource, pack, overworld); + ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(biomeSource, pack, overworld); DimensionOptions dimensionOptions = new DimensionOptions(overworldDimensionType, generator); WorldPreset preset = new WorldPreset( From 84eab0de4a1763dc83929f2c08999cb824bcdbcf Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:03:00 -0700 Subject: [PATCH 049/161] more work on evil update --- .../com/dfsek/terra/forge/ForgePlatform.java | 9 +++- .../java/com/dfsek/terra/mod/ModPlatform.java | 8 +++- .../mixin/access/VillagerTypeAccessor.java | 2 +- .../com/dfsek/terra/mod/util/PresetUtil.java | 8 +++- .../terra/lifecycle/LifecyclePlatform.java | 23 ++++++++++- .../mixin/lifecycle/SaveLoadingMixin.java | 29 +++++++++++++ .../client/MinecraftClientMixin.java | 41 ------------------- .../lifecycle/server/ServerMainMixin.java | 40 ------------------ .../dfsek/terra/lifecycle/util/BiomeUtil.java | 24 ++++++----- .../terra/lifecycle/util/LifecycleUtil.java | 13 ++++-- .../resources/terra.lifecycle.mixins.json | 3 +- 11 files changed, 95 insertions(+), 105 deletions(-) create mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java delete mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/client/MinecraftClientMixin.java delete mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/server/ServerMainMixin.java 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 2d8b51c9a..86afe0ed3 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 @@ -21,6 +21,8 @@ import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import ca.solostudios.strata.version.Version; import net.minecraft.MinecraftVersion; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; import net.minecraft.server.MinecraftServer; import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.server.ServerLifecycleHooks; @@ -86,7 +88,7 @@ public class ForgePlatform extends ModPlatform { super.platformAddon().forEach(addons::add); - String mcVersion = MinecraftVersion.CURRENT.getReleaseTarget(); + String mcVersion = MinecraftVersion.CURRENT.getName(); try { addons.add(new EphemeralAddon(Versions.parseVersion(mcVersion), "minecraft")); } catch(ParseException e) { @@ -122,4 +124,9 @@ public class ForgePlatform extends ModPlatform { public BaseAddon getPlatformAddon() { return new ForgeAddon(this); } + + @Override + public Registry getMinecraftRegistry(RegistryKey key) { + return null; + } } 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 71a466567..74ef880b9 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 @@ -7,6 +7,8 @@ import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; import net.minecraft.registry.BuiltinRegistries; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.sound.BiomeAdditionsSound; @@ -94,9 +96,9 @@ public abstract class ModPlatform extends AbstractPlatform { .registerLoader(VillagerType.class, VillagerTypeTemplate::new); } - private ProtoPlatformBiome parseBiome(DynamicRegistryManager registryManager, String id, DepthTracker tracker) throws LoadException { + private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { Identifier identifier = Identifier.tryParse(id); - if(registryManager.get(RegistryKeys.BIOME).get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. + if(getMinecraftRegistry(RegistryKeys.BIOME).get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. return new ProtoPlatformBiome(identifier); } @@ -107,6 +109,8 @@ public abstract class ModPlatform extends AbstractPlatform { protected abstract BaseAddon getPlatformAddon(); + public abstract Registry getMinecraftRegistry(RegistryKey> key); + @Override public @NotNull WorldHandle getWorldHandle() { return worldHandle; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/VillagerTypeAccessor.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/VillagerTypeAccessor.java index 477c0647b..68ae33e35 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/VillagerTypeAccessor.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/VillagerTypeAccessor.java @@ -1,6 +1,6 @@ package com.dfsek.terra.mod.mixin.access; -import net.minecraft.util.registry.RegistryKey; +import net.minecraft.registry.RegistryKey; import net.minecraft.village.VillagerType; import net.minecraft.world.biome.Biome; import org.spongepowered.asm.mixin.Mixin; 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 067401adc..b90b6d46a 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,5 +1,8 @@ package com.dfsek.terra.mod.util; +import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.registry.BuiltinRegistries; +import net.minecraft.registry.RegistryKeys; import net.minecraft.structure.StructureSet; import net.minecraft.util.Identifier; import net.minecraft.util.math.noise.DoublePerlinNoiseSampler.NoiseParameters; @@ -30,12 +33,15 @@ 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<>(); public static Pair createDefault(ConfigPack pack) { - Registry dimensionTypeRegistry = BuiltinRegistries.DIMENSION_TYPE; + + + Registry dimensionTypeRegistry = access.; Registry chunkGeneratorSettingsRegistry = BuiltinRegistries.CHUNK_GENERATOR_SETTINGS; Registry structureSetRegistry = BuiltinRegistries.STRUCTURE_SET; Registry noiseParametersRegistry = BuiltinRegistries.NOISE_PARAMETERS; 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 f218380d7..bbe2908ea 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,6 +3,9 @@ package com.dfsek.terra.lifecycle; import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import net.minecraft.MinecraftVersion; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; import net.minecraft.server.MinecraftServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,6 +13,8 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; import com.dfsek.terra.addon.EphemeralAddon; import com.dfsek.terra.api.addon.BaseAddon; @@ -23,6 +28,8 @@ public abstract class LifecyclePlatform extends ModPlatform { private static final Logger LOGGER = LoggerFactory.getLogger(LifecyclePlatform.class); private static MinecraftServer server; + private static final AtomicReference DYNAMIC_REGISTRY_MANAGER = new AtomicReference<>(); + public LifecyclePlatform() { CommonPlatform.initialize(this); load(); @@ -49,7 +56,7 @@ public abstract class LifecyclePlatform extends ModPlatform { LOGGER.warn("Failed to execute reload", throwable); return null; }).join(); - BiomeUtil.registerBiomes(); + BiomeUtil.registerBiomes(DYNAMIC_REGISTRY_MANAGER.get()); server.getWorlds().forEach(world -> { if(world.getChunkManager().getChunkGenerator() instanceof MinecraftChunkGeneratorWrapper chunkGeneratorWrapper) { getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).ifPresent(pack -> { @@ -62,13 +69,20 @@ public abstract class LifecyclePlatform extends ModPlatform { return succeed; } + public static void addRegistryManager(DynamicRegistryManager in) { + if(DYNAMIC_REGISTRY_MANAGER.get() == null) { + DYNAMIC_REGISTRY_MANAGER.set(Objects.requireNonNull(in)); + } + throw new IllegalStateException("Already set!"); + } + @Override protected Iterable platformAddon() { List addons = new ArrayList<>(); super.platformAddon().forEach(addons::add); - String mcVersion = MinecraftVersion.CURRENT.getReleaseTarget(); + String mcVersion = MinecraftVersion.CURRENT.getName(); try { addons.add(new EphemeralAddon(Versions.parseVersion(mcVersion), "minecraft")); } catch(ParseException e) { @@ -84,5 +98,10 @@ public abstract class LifecyclePlatform extends ModPlatform { return addons; } + @Override + public Registry getMinecraftRegistry(RegistryKey> key) { + return DYNAMIC_REGISTRY_MANAGER.get().get(key); + } + protected abstract Collection getPlatformMods(); } 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 new file mode 100644 index 000000000..7e86ac154 --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.lifecycle.mixin.lifecycle; + +import com.dfsek.terra.lifecycle.util.LifecycleUtil; + +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.server.SaveLoading; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + + +@Mixin(SaveLoading.class) +public class SaveLoadingMixin { + @ModifyArg( + method = "method_42097(Lnet/minecraft/registry/DynamicRegistryManager$Immutable;" + + "Lnet/minecraft/server/SaveLoading$SaveApplierFactory;Lnet/minecraft/resource/LifecycledResourceManager;" + + "Lnet/minecraft/registry/CombinedDynamicRegistries;Lnet/minecraft/server/SaveLoading$LoadContext;" + + "Lnet/minecraft/server/DataPackContents;)Ljava/lang/Object;", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/DataPackContents;refresh(Lnet/minecraft/registry/DynamicRegistryManager;)V" + ), + index = 0 + ) + private DynamicRegistryManager redirect(DynamicRegistryManager in) { + LifecycleUtil.initialize(in); + return in; + } +} diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/client/MinecraftClientMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/client/MinecraftClientMixin.java deleted file mode 100644 index 30f092786..000000000 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/client/MinecraftClientMixin.java +++ /dev/null @@ -1,41 +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.lifecycle.mixin.lifecycle.client; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.RunArgs; -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 com.dfsek.terra.lifecycle.util.LifecycleUtil; - - -@Mixin(MinecraftClient.class) -public class MinecraftClientMixin { - @Inject(method = "", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/util/WindowProvider;createWindow" + - "(Lnet/minecraft/client/WindowSettings;Ljava/lang/String;Ljava/lang/String;)" + - "Lnet/minecraft/client/util/Window;", - // sorta arbitrary position, after mod init, before window opens - shift = At.Shift.BEFORE)) - public void injectConstructor(RunArgs args, CallbackInfo callbackInfo) { - LifecycleUtil.initialize(); - } -} diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/server/ServerMainMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/server/ServerMainMixin.java deleted file mode 100644 index e2e52bd2a..000000000 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/server/ServerMainMixin.java +++ /dev/null @@ -1,40 +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.lifecycle.mixin.lifecycle.server; - -import net.minecraft.server.Main; -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 com.dfsek.terra.lifecycle.util.LifecycleUtil; - - -@Mixin(Main.class) -public class ServerMainMixin { - @Inject(method = "main([Ljava/lang/String;)V", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/resource/ResourcePackManager;(Lnet/minecraft/resource/ResourceType;" + - "[Lnet/minecraft/resource/ResourcePackProvider;)V") - // after registry manager creation - ) - private static void injectConstructor(String[] args, CallbackInfo ci) { - LifecycleUtil.initialize(); - } -} 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/BiomeUtil.java index 4e55edb38..9ac4da738 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/BiomeUtil.java @@ -1,9 +1,10 @@ package com.dfsek.terra.lifecycle.util; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.registry.Registry; -import net.minecraft.util.registry.RegistryKey; import net.minecraft.village.VillagerType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,13 +30,14 @@ public final class BiomeUtil { } - public static void registerBiomes() { + public static void registerBiomes(DynamicRegistryManager registryManager) { + Registry biomeRegistry = registryManager.get(RegistryKeys.BIOME); logger.info("Registering biomes..."); CommonPlatform.get().getConfigRegistry().forEach(pack -> { // Register all Terra biomes. pack.getCheckedRegistry(Biome.class) - .forEach((id, biome) -> registerBiome(biome, pack, id)); + .forEach((id, biome) -> registerBiome(biome, pack, id, biomeRegistry)); }); - MinecraftUtil.registerFlora(BuiltinRegistries.BIOME); + MinecraftUtil.registerFlora(biomeRegistry); logger.info("Terra biomes registered."); } @@ -46,8 +48,8 @@ public final class BiomeUtil { * @param pack The ConfigPack this biome belongs to. */ private static void registerBiome(Biome biome, ConfigPack pack, - com.dfsek.terra.api.registry.key.RegistryKey id) { - Registry registry = BuiltinRegistries.BIOME; + com.dfsek.terra.api.registry.key.RegistryKey id, + Registry registry) { RegistryKey vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(registry); @@ -56,7 +58,7 @@ public final class BiomeUtil { } else { VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); - net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, registry.get(vanilla), + net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, Objects.requireNonNull(registry.get(vanilla)), vanillaBiomeProperties); Identifier identifier = new Identifier("terra", MinecraftUtil.createBiomeID(pack, id)); @@ -67,15 +69,15 @@ public final class BiomeUtil { .getKey() .orElseThrow()); } else { - ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(BuiltinRegistries.add(registry, + ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(Registry.registerReference(registry, MinecraftUtil.registerKey(identifier) .getValue(), minecraftBiome).getKey().orElseThrow()); } - Map villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap(); + Map, VillagerType> villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap(); - villagerMap.put(RegistryKey.of(Registry.BIOME_KEY, identifier), + villagerMap.put(RegistryKey.of(RegistryKeys.BIOME, identifier), Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), villagerMap.getOrDefault(vanilla, VillagerType.PLAINS))); 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 498de58aa..1d0fbd7d6 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 @@ -1,6 +1,10 @@ package com.dfsek.terra.lifecycle.util; -import net.minecraft.util.registry.BuiltinRegistries; +import com.dfsek.terra.lifecycle.LifecyclePlatform; + +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKeys; import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; import com.dfsek.terra.mod.CommonPlatform; @@ -11,9 +15,10 @@ public final class LifecycleUtil { } - public static void initialize() { + public static void initialize(DynamicRegistryManager registryManager) { + LifecyclePlatform.addRegistryManager(registryManager); CommonPlatform.get().getEventManager().callEvent(new PlatformInitializationEvent()); - BiomeUtil.registerBiomes(); - CommonPlatform.get().registerWorldTypes((id, preset) -> BuiltinRegistries.add(BuiltinRegistries.WORLD_PRESET, id, preset)); + BiomeUtil.registerBiomes(registryManager); + CommonPlatform.get().registerWorldTypes((id, preset) -> Registry.register(registryManager.get(RegistryKeys.WORLD_PRESET), id, preset)); } } 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 7ec5e4d95..6d01c7ced 100644 --- a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -6,13 +6,12 @@ "mixins": [ "NoiseConfigMixin", "RegistryMixin", + "lifecycle.SaveLoadingMixin", "lifecycle.MinecraftServerMixin" ], "client": [ - "lifecycle.client.MinecraftClientMixin" ], "server": [ - "lifecycle.server.ServerMainMixin" ], "injectors": { "defaultRequire": 1 From 73af05bf096390b2af541174c00b3544770b8dec Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:39:18 -0700 Subject: [PATCH 050/161] update minecraft data config templates --- .../java/com/dfsek/terra/mod/ModPlatform.java | 9 +-- .../config/BiomeAdditionsSoundTemplate.java | 3 +- .../mod/config/BiomeMoodSoundTemplate.java | 3 +- .../config/BiomeParticleConfigTemplate.java | 3 +- .../terra/mod/config/EntityTypeTemplate.java | 3 +- .../terra/mod/config/MusicSoundTemplate.java | 3 +- .../terra/mod/config/SoundEventTemplate.java | 4 +- .../mod/config/VillagerTypeTemplate.java | 3 +- .../terra/mod/handle/MinecraftItemHandle.java | 15 +++-- .../mod/handle/MinecraftWorldHandle.java | 5 +- .../entity/MobSpawnerBlockEntityMixin.java | 9 ++- .../terra/block/state/BlockStateMixin.java | 3 +- .../inventory/meta/EnchantmentMixin.java | 3 +- .../inventory/meta/ItemStackMetaMixin.java | 3 +- .../lifecycle/DataPackContentsMixin.java | 2 +- .../dfsek/terra/mod/util/MinecraftUtil.java | 2 +- .../com/dfsek/terra/mod/util/PresetUtil.java | 58 +++++++++---------- .../terra/lifecycle/LifecyclePlatform.java | 6 +- 18 files changed, 74 insertions(+), 63 deletions(-) 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 74ef880b9..4fbd61b06 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 @@ -5,10 +5,7 @@ import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; -import net.minecraft.registry.BuiltinRegistries; import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.sound.BiomeAdditionsSound; @@ -61,7 +58,7 @@ public abstract class ModPlatform extends AbstractPlatform { public void registerWorldTypes(BiConsumer registerFunction) { getRawConfigRegistry() - .forEach(pack -> PresetUtil.createDefault(pack).apply(registerFunction)); + .forEach(pack -> PresetUtil.createDefault(pack, getMinecraftRegistry()).apply(registerFunction)); } @Override @@ -98,7 +95,7 @@ public abstract class ModPlatform extends AbstractPlatform { private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { Identifier identifier = Identifier.tryParse(id); - if(getMinecraftRegistry(RegistryKeys.BIOME).get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. + if(getMinecraftRegistry().get(RegistryKeys.BIOME).get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. return new ProtoPlatformBiome(identifier); } @@ -109,7 +106,7 @@ public abstract class ModPlatform extends AbstractPlatform { protected abstract BaseAddon getPlatformAddon(); - public abstract Registry getMinecraftRegistry(RegistryKey> key); + public abstract DynamicRegistryManager getMinecraftRegistry(); @Override public @NotNull WorldHandle getWorldHandle() { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeAdditionsSoundTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeAdditionsSoundTemplate.java index e9d4a2038..4a66cf6e5 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeAdditionsSoundTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeAdditionsSoundTemplate.java @@ -3,6 +3,7 @@ package com.dfsek.terra.mod.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.minecraft.registry.Registries; import net.minecraft.sound.BiomeAdditionsSound; import net.minecraft.sound.SoundEvent; @@ -21,7 +22,7 @@ public class BiomeAdditionsSoundTemplate implements ObjectTemplate { if(sound == null || soundCultivationTicks == null || soundSpawnRange == null || soundExtraDistance == null) { return null; } else { - return new BiomeMoodSound(sound, soundCultivationTicks, soundSpawnRange, soundExtraDistance); + return new BiomeMoodSound(Registries.SOUND_EVENT.getEntry(sound), soundCultivationTicks, soundSpawnRange, soundExtraDistance); } } } 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 538a80870..a48ec5c54 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 @@ -6,6 +6,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.command.argument.ParticleEffectArgumentType; +import net.minecraft.registry.Registries; import net.minecraft.world.biome.BiomeParticleConfig; @@ -25,7 +26,7 @@ public class BiomeParticleConfigTemplate implements ObjectTemplate> { @Override public EntityType get() { - return Registry.ENTITY_TYPE.get(id); + return Registries.ENTITY_TYPE.get(id); } } 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 17745a9af..b9f563621 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 @@ -3,6 +3,7 @@ package com.dfsek.terra.mod.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.minecraft.registry.Registries; import net.minecraft.sound.MusicSound; import net.minecraft.sound.SoundEvent; @@ -29,7 +30,7 @@ public class MusicSoundTemplate implements ObjectTemplate { if(sound == null || minDelay == null || maxDelay == null || replaceCurrentMusic == null) { return null; } else { - return new MusicSound(sound, minDelay, maxDelay, replaceCurrentMusic); + return new MusicSound(Registries.SOUND_EVENT.getEntry(sound), minDelay, maxDelay, replaceCurrentMusic); } } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SoundEventTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SoundEventTemplate.java index 5e87dc21a..b5b7fe079 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SoundEventTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SoundEventTemplate.java @@ -21,9 +21,9 @@ public class SoundEventTemplate implements ObjectTemplate { if(id == null) { return null; } else if(distanceToTravel == null) { - return new SoundEvent(id); + return SoundEvent.of(id); } else { - return new SoundEvent(id, distanceToTravel); + return SoundEvent.of(id, distanceToTravel); } } } 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 d807f3b93..9aaf3362b 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java @@ -3,6 +3,7 @@ package com.dfsek.terra.mod.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import net.minecraft.registry.Registry; import net.minecraft.village.VillagerType; @@ -15,6 +16,6 @@ public class VillagerTypeTemplate implements ObjectTemplate { @Override public VillagerType get() { - return Registry.VILLAGER_TYPE.get(id); + return Registries.VILLAGER_TYPE.get(id); } } 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 49f8216c5..66582857a 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 @@ -21,6 +21,9 @@ import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.command.CommandRegistryAccess; import net.minecraft.command.argument.ItemStackArgumentType; +import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryWrapper; import net.minecraft.util.Identifier; import net.minecraft.registry.Registry; @@ -38,8 +41,12 @@ public class MinecraftItemHandle implements ItemHandle { @Override public Item createItem(String data) { try { - return (Item) new ItemStackArgumentType(new CommandRegistryAccess( - CommonPlatform.get().getServer().getRegistryManager())).parse(new StringReader(data)).getItem(); + return (Item) new ItemStackArgumentType(new CommandRegistryAccess() { + @Override + public RegistryWrapper createWrapper(RegistryKey> registryRef) { + return CommonPlatform.get().getServer().getRegistryManager().getWrapperOrThrow(registryRef); + } + }).parse(new StringReader(data)).getItem(); } catch(CommandSyntaxException e) { throw new IllegalArgumentException("Invalid item data \"" + data + "\"", e); } @@ -47,11 +54,11 @@ public class MinecraftItemHandle implements ItemHandle { @Override public Enchantment getEnchantment(String id) { - return (Enchantment) (Registry.ENCHANTMENT.get(Identifier.tryParse(id))); + return (Enchantment) (Registries.ENCHANTMENT.get(Identifier.tryParse(id))); } @Override public Set getEnchantments() { - return Registry.ENCHANTMENT.stream().map(enchantment -> (Enchantment) enchantment).collect(Collectors.toSet()); + return Registries.ENCHANTMENT.stream().map(enchantment -> (Enchantment) enchantment).collect(Collectors.toSet()); } } 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 81107bfd7..aabc38471 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 @@ -20,6 +20,7 @@ package com.dfsek.terra.mod.handle; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.block.Blocks; import net.minecraft.command.argument.BlockArgumentParser; +import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import net.minecraft.registry.Registry; import org.jetbrains.annotations.NotNull; @@ -36,7 +37,7 @@ public class MinecraftWorldHandle implements WorldHandle { @Override public @NotNull BlockState createBlockState(@NotNull String data) { try { - net.minecraft.block.BlockState state = BlockArgumentParser.block(Registry.BLOCK, data, true).blockState(); + net.minecraft.block.BlockState state = BlockArgumentParser.block(Registries.BLOCK.getReadOnlyWrapper(), data, true).blockState(); if(state == null) throw new IllegalArgumentException("Invalid data: " + data); return (BlockState) state; } catch(CommandSyntaxException e) { @@ -53,6 +54,6 @@ public class MinecraftWorldHandle implements WorldHandle { public @NotNull EntityType getEntity(@NotNull String id) { Identifier identifier = Identifier.tryParse(id); if(identifier == null) identifier = Identifier.tryParse(id); - return (EntityType) Registry.ENTITY_TYPE.get(identifier); + return (EntityType) Registries.ENTITY_TYPE.get(identifier); } } 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 961fd48cd..95fe9154c 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 @@ -21,9 +21,11 @@ import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.block.entity.MobSpawnerBlockEntity; +import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.registry.Registry; +import net.minecraft.util.math.random.Random; import net.minecraft.world.MobSpawnerLogic; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Implements; @@ -48,13 +50,16 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity { @Shadow public abstract MobSpawnerLogic getLogic(); + @Shadow + public abstract void setEntityType(net.minecraft.entity.EntityType entityType, Random random); + public EntityType terra$getSpawnedType() { - return (EntityType) Registry.ENTITY_TYPE.get( + return (EntityType) Registries.ENTITY_TYPE.get( Identifier.tryParse(((MobSpawnerLogicAccessor) getLogic()).getSpawnEntry().getNbt().getString("id"))); } public void terra$setSpawnedType(@NotNull EntityType creatureType) { - getLogic().setEntityId((net.minecraft.entity.EntityType) creatureType); + setEntityType((net.minecraft.entity.EntityType) creatureType, world.getRandom()); } public int terra$getDelay() { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java index 58f24945b..2ec3cf649 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java @@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableMap; import com.mojang.serialization.MapCodec; import net.minecraft.block.AbstractBlock.AbstractBlockState; import net.minecraft.block.Block; +import net.minecraft.registry.Registries; import net.minecraft.state.State; import net.minecraft.registry.Registry; import org.spongepowered.asm.mixin.Implements; @@ -66,7 +67,7 @@ public abstract class BlockStateMixin extends State { NbtCompound eTag = (NbtCompound) enchantment; - map.put((Enchantment) Registry.ENCHANTMENT.get(eTag.getInt("id")), eTag.getInt("lvl")); + map.put((Enchantment) Registries.ENCHANTMENT.get(eTag.getInt("id")), eTag.getInt("lvl")); }); return map; } 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 5222db0a7..d4a27e750 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 @@ -20,7 +20,7 @@ public class DataPackContentsMixin { /* * #refresh populates all tags in the registries */ - @Inject(method = "refresh(Lnet/minecraft/util/registry/DynamicRegistryManager;)V", at = @At("RETURN")) + @Inject(method = "refresh(Lnet/minecraft/registry/DynamicRegistryManager;)V", at = @At("RETURN")) private void injectReload(DynamicRegistryManager dynamicRegistryManager, CallbackInfo ci) { TagUtil.registerWorldPresetTags(dynamicRegistryManager.get(RegistryKeys.WORLD_PRESET)); 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 cae38ca6f..53f406adc 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 @@ -134,7 +134,7 @@ public final class MinecraftUtil { if(vanillaBiomeProperties.getLoopSound() == null) { vanilla.getEffects().getLoopSound().ifPresent(effects::loopSound); } else { - effects.loopSound(vanillaBiomeProperties.getLoopSound()); + effects.loopSound(Registries.SOUND_EVENT.getEntry(vanillaBiomeProperties.getLoopSound())); } if(vanillaBiomeProperties.getMoodSound() == null) { 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 b90b6d46a..b1f50f8ba 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,14 +1,10 @@ package com.dfsek.terra.mod.util; -import net.minecraft.command.CommandRegistryAccess; -import net.minecraft.registry.BuiltinRegistries; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.structure.StructureSet; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.noise.DoublePerlinNoiseSampler.NoiseParameters; -import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registry; -import net.minecraft.util.registry.RegistryEntry; +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.TheEndBiomeSource; @@ -33,40 +29,38 @@ 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<>(); - public static Pair createDefault(ConfigPack pack) { + public static Pair createDefault(ConfigPack pack, DynamicRegistryManager registryManager) { + Registry dimensionTypeRegistry = registryManager.get(RegistryKeys.DIMENSION_TYPE); + Registry chunkGeneratorSettingsRegistry = registryManager.get(RegistryKeys.CHUNK_GENERATOR_SETTINGS); + Registry biomeRegistry = registryManager.get(RegistryKeys.BIOME); - - Registry dimensionTypeRegistry = access.; - Registry chunkGeneratorSettingsRegistry = BuiltinRegistries.CHUNK_GENERATOR_SETTINGS; - Registry structureSetRegistry = BuiltinRegistries.STRUCTURE_SET; - Registry noiseParametersRegistry = BuiltinRegistries.NOISE_PARAMETERS; - Registry biomeRegistry = BuiltinRegistries.BIOME; - - RegistryEntry theNetherDimensionType = dimensionTypeRegistry.getOrCreateEntry(DimensionTypes.THE_NETHER); + RegistryEntry theNetherDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow(); RegistryEntry - netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getOrCreateEntry(ChunkGeneratorSettings.NETHER); + netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER).orElseThrow(); DimensionOptions netherDimensionOptions = new DimensionOptions(theNetherDimensionType, - new NoiseChunkGenerator(structureSetRegistry, - noiseParametersRegistry, - MultiNoiseBiomeSource.Preset.NETHER.getBiomeSource( - biomeRegistry), - netherChunkGeneratorSettings)); - RegistryEntry theEndDimensionType = dimensionTypeRegistry.getOrCreateEntry(DimensionTypes.THE_END); - RegistryEntry endChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getOrCreateEntry( - ChunkGeneratorSettings.END); + new NoiseChunkGenerator( + MultiNoiseBiomeSource.Preset.NETHER.getBiomeSource( + registryManager.createRegistryLookup() + .getOrThrow(RegistryKeys.BIOME)), + netherChunkGeneratorSettings)); + RegistryEntry theEndDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_END).orElseThrow(); + RegistryEntry endChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry( + ChunkGeneratorSettings.END).orElseThrow(); DimensionOptions endDimensionOptions = new DimensionOptions(theEndDimensionType, - new NoiseChunkGenerator(structureSetRegistry, noiseParametersRegistry, - new TheEndBiomeSource(biomeRegistry), - endChunkGeneratorSettings)); + new NoiseChunkGenerator( + TheEndBiomeSource.createVanilla( + registryManager.createRegistryLookup() + .getOrThrow(RegistryKeys.BIOME)), + endChunkGeneratorSettings)); - RegistryEntry overworldDimensionType = dimensionTypeRegistry.getOrCreateEntry(DimensionTypes.OVERWORLD); + RegistryEntry overworldDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.OVERWORLD).orElseThrow(); - RegistryEntry overworld = chunkGeneratorSettingsRegistry.getOrCreateEntry(ChunkGeneratorSettings.OVERWORLD); + RegistryEntry overworld = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.OVERWORLD) + .orElseThrow(); Identifier generatorID = Identifier.of("terra", pack.getID().toLowerCase(Locale.ROOT) + "/" + pack.getNamespace().toLowerCase( Locale.ROOT)); 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 bbe2908ea..b7916378a 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 @@ -4,8 +4,6 @@ import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import net.minecraft.MinecraftVersion; import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; import net.minecraft.server.MinecraftServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -99,8 +97,8 @@ public abstract class LifecyclePlatform extends ModPlatform { } @Override - public Registry getMinecraftRegistry(RegistryKey> key) { - return DYNAMIC_REGISTRY_MANAGER.get().get(key); + public DynamicRegistryManager getMinecraftRegistry() { + return DYNAMIC_REGISTRY_MANAGER.get(); } protected abstract Collection getPlatformMods(); From c90ca076ab0a3c9eb1e0b5891c9206c34890cd27 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:44:06 -0700 Subject: [PATCH 051/161] update platform biome delegate logic --- .../terra/mod/config/ProtoPlatformBiome.java | 7 ++++--- .../java/com/dfsek/terra/mod/data/Codecs.java | 5 +---- .../terra/mod/generation/TerraBiomeSource.java | 16 ++++------------ .../com/dfsek/terra/mod/util/PresetUtil.java | 2 +- .../dfsek/terra/lifecycle/util/BiomeUtil.java | 6 ++---- 5 files changed, 12 insertions(+), 24 deletions(-) diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java index 080689c3c..60cf1effa 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java @@ -18,6 +18,7 @@ package com.dfsek.terra.mod.config; import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.Identifier; import net.minecraft.registry.Registry; import net.minecraft.world.biome.Biome; @@ -31,7 +32,7 @@ import com.dfsek.terra.mod.util.MinecraftUtil; public class ProtoPlatformBiome implements PlatformBiome { private final Identifier identifier; - private RegistryKey delegate; + private RegistryEntry delegate; public ProtoPlatformBiome(Identifier identifier) { this.identifier = identifier; @@ -46,11 +47,11 @@ public class ProtoPlatformBiome implements PlatformBiome { return identifier; } - public RegistryKey getDelegate() { + public RegistryEntry getDelegate() { return delegate; } - public void setDelegate(RegistryKey delegate) { + public void setDelegate(RegistryEntry delegate) { this.delegate = Objects.requireNonNull(delegate); } } 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 4c467bc90..890e3e2b5 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 @@ -35,10 +35,7 @@ public final class Codecs { id))))); public static final Codec TERRA_BIOME_SOURCE = RecordCodecBuilder - .create(instance -> instance.group(RegistryOps.getEntryCodec(RegistryKeys.BIOME) - .fieldOf("biome_registry") - .stable() - .forGetter(TerraBiomeSource::getBiomeRegistry), + .create(instance -> instance.group( CONFIG_PACK.fieldOf("pack") .stable() .forGetter(TerraBiomeSource::getPack)) 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 31e1b0c7f..7ab085780 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 @@ -38,16 +38,14 @@ import com.dfsek.terra.mod.util.SeedHack; public class TerraBiomeSource extends BiomeSource { private static final Logger LOGGER = LoggerFactory.getLogger(TerraBiomeSource.class); - private final Registry biomeRegistry; private ConfigPack pack; - public TerraBiomeSource(Registry biomes, ConfigPack pack) { + public TerraBiomeSource(ConfigPack pack) { super(StreamSupport .stream(pack.getBiomeProvider() .getBiomes() .spliterator(), false) - .map(b -> biomes.entryOf(((ProtoPlatformBiome) b.getPlatformBiome()).getDelegate()))); - this.biomeRegistry = biomes; + .map(b -> ((ProtoPlatformBiome) b.getPlatformBiome()).getDelegate())); this.pack = pack; LOGGER.debug("Biomes: " + getBiomes()); @@ -60,22 +58,16 @@ public class TerraBiomeSource extends BiomeSource { @Override public RegistryEntry getBiome(int biomeX, int biomeY, int biomeZ, MultiNoiseSampler noiseSampler) { - return biomeRegistry - .entryOf(((ProtoPlatformBiome) pack + return ((ProtoPlatformBiome) pack .getBiomeProvider() .getBiome(biomeX << 2, biomeY << 2, biomeZ << 2, SeedHack.getSeed(noiseSampler)) - .getPlatformBiome()).getDelegate() - ); + .getPlatformBiome()).getDelegate(); } public BiomeProvider getProvider() { return pack.getBiomeProvider(); } - public Registry getBiomeRegistry() { - return biomeRegistry; - } - public ConfigPack getPack() { return pack; } 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 b1f50f8ba..bbe9c78f2 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 @@ -67,7 +67,7 @@ public class PresetUtil { PRESETS.add(generatorID); - TerraBiomeSource biomeSource = new TerraBiomeSource(biomeRegistry, pack); + TerraBiomeSource biomeSource = new TerraBiomeSource(pack); ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(biomeSource, pack, overworld); DimensionOptions dimensionOptions = new DimensionOptions(overworldDimensionType, generator); 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/BiomeUtil.java index 9ac4da738..b01e4d808 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/BiomeUtil.java @@ -54,7 +54,7 @@ public final class BiomeUtil { if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) { - ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(vanilla); + ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(registry.getEntry(vanilla).orElseThrow()); } else { VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); @@ -65,14 +65,12 @@ public final class BiomeUtil { if(registry.containsId(identifier)) { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(MinecraftUtil.getEntry(registry, identifier) - .orElseThrow() - .getKey() .orElseThrow()); } else { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(Registry.registerReference(registry, MinecraftUtil.registerKey(identifier) .getValue(), - minecraftBiome).getKey().orElseThrow()); + minecraftBiome)); } Map, VillagerType> villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap(); From 6255ac73797ff6b689cec6b3e375fb3eb9cc6fa1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:44:53 -0700 Subject: [PATCH 052/161] fabric compiles now --- .../java/com/dfsek/terra/lifecycle/util/RegistryUtil.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 1a6568453..6c6ee4ad6 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 @@ -1,5 +1,6 @@ package com.dfsek.terra.lifecycle.util; +import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import net.minecraft.registry.Registry; @@ -12,7 +13,7 @@ public final class RegistryUtil { } public static void register() { - Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER); - Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE); + Registry.register(Registries.CHUNK_GENERATOR, new Identifier("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER); + Registry.register(Registries.BIOME_SOURCE, new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE); } } From b10898b837594a81241c1944866ce4947ad730e4 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:46:57 -0700 Subject: [PATCH 053/161] fix RegistryMixin target class --- .../java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java index 31fdccb2a..a2d516931 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java @@ -1,5 +1,6 @@ package com.dfsek.terra.lifecycle.mixin; +import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -9,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.dfsek.terra.lifecycle.util.RegistryUtil; -@Mixin(Registry.class) +@Mixin(Registries.class) public class RegistryMixin { @Inject(method = "", at = @At("RETURN")) private static void registerTerraGenerators(CallbackInfo ci) { From cad0e4105cb0301de99577882f1a5e8f016406c5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:49:59 -0700 Subject: [PATCH 054/161] fix SaveLoadingMixin --- .../dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7e86ac154..cc3c63339 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 @@ -22,7 +22,7 @@ public class SaveLoadingMixin { ), index = 0 ) - private DynamicRegistryManager redirect(DynamicRegistryManager in) { + private static DynamicRegistryManager grabManager(DynamicRegistryManager in) { LifecycleUtil.initialize(in); return in; } From 2e0f892fff15a65eaaeb30ed2d96552102e7cae5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:53:10 -0700 Subject: [PATCH 055/161] allow registry manager to be overwritten --- .../java/com/dfsek/terra/lifecycle/LifecyclePlatform.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 b7916378a..5ff1387a3 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 @@ -68,10 +68,7 @@ public abstract class LifecyclePlatform extends ModPlatform { } public static void addRegistryManager(DynamicRegistryManager in) { - if(DYNAMIC_REGISTRY_MANAGER.get() == null) { - DYNAMIC_REGISTRY_MANAGER.set(Objects.requireNonNull(in)); - } - throw new IllegalStateException("Already set!"); + DYNAMIC_REGISTRY_MANAGER.set(Objects.requireNonNull(in)); } @Override From 5dd5c3705529a936842d87f900413d763a43d25b Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:54:30 -0700 Subject: [PATCH 056/161] fix inject parameters in NoiseConfigMixin --- .../com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java index 504a6709e..e8091826a 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java @@ -1,5 +1,6 @@ package com.dfsek.terra.lifecycle.mixin; +import net.minecraft.registry.RegistryEntryLookup; import net.minecraft.util.math.noise.DoublePerlinNoiseSampler; import net.minecraft.registry.Registry; import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; @@ -24,10 +25,10 @@ public class NoiseConfigMixin { @Final private MultiNoiseSampler multiNoiseSampler; - @Inject(method = "(Lnet/minecraft/world/gen/chunk/ChunkGeneratorSettings;Lnet/minecraft/util/registry/Registry;J)V", + @Inject(method = "(Lnet/minecraft/world/gen/chunk/ChunkGeneratorSettings;Lnet/minecraft/registry/RegistryEntryLookup;J)V", at = @At("TAIL")) - private void mapMultiNoise(ChunkGeneratorSettings chunkGeneratorSettings, - Registry noiseRegistry, long seed, CallbackInfo ci) { + private void mapMultiNoise(ChunkGeneratorSettings chunkGeneratorSettings, RegistryEntryLookup noiseParametersLookup, long seed, + CallbackInfo ci) { SeedHack.register(multiNoiseSampler, seed); } } From 764a4fa5356e1f9bfc663f4ac86c55809165b89b Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 19 Dec 2022 01:27:35 -0700 Subject: [PATCH 057/161] continue registry wrangling --- .../java/com/dfsek/terra/mod/ModPlatform.java | 12 +++- .../com/dfsek/terra/mod/util/PresetUtil.java | 17 +++-- .../terra/lifecycle/LifecyclePlatform.java | 32 +++++++-- .../mixin/lifecycle/RegistryLoaderMixin.java | 65 +++++++++++++++++++ .../mixin/lifecycle/SaveLoadingMixin.java | 29 --------- .../dfsek/terra/lifecycle/util/BiomeUtil.java | 3 +- .../terra/lifecycle/util/LifecycleUtil.java | 11 ++-- .../resources/terra.lifecycle.mixins.json | 24 +++---- 8 files changed, 127 insertions(+), 66 deletions(-) create mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java delete mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java 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 4fbd61b06..9f26738b1 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 @@ -6,6 +6,7 @@ import com.dfsek.tectonic.api.exception.LoadException; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.sound.BiomeAdditionsSound; @@ -14,13 +15,16 @@ import net.minecraft.sound.MusicSound; import net.minecraft.sound.SoundEvent; import net.minecraft.util.Identifier; import net.minecraft.village.VillagerType; +import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Precipitation; import net.minecraft.world.biome.Biome.TemperatureModifier; import net.minecraft.world.biome.BiomeEffects.GrassColorModifier; import net.minecraft.world.biome.BiomeParticleConfig; import net.minecraft.world.biome.SpawnSettings; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; +import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.WorldPreset; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -58,7 +62,7 @@ public abstract class ModPlatform extends AbstractPlatform { public void registerWorldTypes(BiConsumer registerFunction) { getRawConfigRegistry() - .forEach(pack -> PresetUtil.createDefault(pack, getMinecraftRegistry()).apply(registerFunction)); + .forEach(pack -> PresetUtil.createDefault(pack, this).apply(registerFunction)); } @Override @@ -95,7 +99,7 @@ public abstract class ModPlatform extends AbstractPlatform { private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { Identifier identifier = Identifier.tryParse(id); - if(getMinecraftRegistry().get(RegistryKeys.BIOME).get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. + if(!biomeRegistry().containsId(identifier)) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. return new ProtoPlatformBiome(identifier); } @@ -106,7 +110,9 @@ public abstract class ModPlatform extends AbstractPlatform { protected abstract BaseAddon getPlatformAddon(); - public abstract DynamicRegistryManager getMinecraftRegistry(); + public abstract Registry dimensionTypeRegistry(); + public abstract Registry biomeRegistry(); + public abstract Registry chunkGeneratorSettingsRegistry(); @Override public @NotNull WorldHandle getWorldHandle() { 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 bbe9c78f2..5c7e8ce3d 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,5 +1,7 @@ package com.dfsek.terra.mod.util; +import com.dfsek.terra.mod.ModPlatform; + import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; @@ -33,19 +35,17 @@ public class PresetUtil { private static final Logger LOGGER = LoggerFactory.getLogger(PresetUtil.class); private static final List PRESETS = new ArrayList<>(); - public static Pair createDefault(ConfigPack pack, DynamicRegistryManager registryManager) { - Registry dimensionTypeRegistry = registryManager.get(RegistryKeys.DIMENSION_TYPE); - Registry chunkGeneratorSettingsRegistry = registryManager.get(RegistryKeys.CHUNK_GENERATOR_SETTINGS); - Registry biomeRegistry = registryManager.get(RegistryKeys.BIOME); - + public static Pair createDefault(ConfigPack pack, ModPlatform platform) { + Registry dimensionTypeRegistry = platform.dimensionTypeRegistry(); + Registry chunkGeneratorSettingsRegistry = platform.chunkGeneratorSettingsRegistry(); + RegistryEntry theNetherDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow(); RegistryEntry netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER).orElseThrow(); DimensionOptions netherDimensionOptions = new DimensionOptions(theNetherDimensionType, new NoiseChunkGenerator( MultiNoiseBiomeSource.Preset.NETHER.getBiomeSource( - registryManager.createRegistryLookup() - .getOrThrow(RegistryKeys.BIOME)), + platform.biomeRegistry().getReadOnlyWrapper()), netherChunkGeneratorSettings)); RegistryEntry theEndDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_END).orElseThrow(); RegistryEntry endChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry( @@ -53,8 +53,7 @@ public class PresetUtil { DimensionOptions endDimensionOptions = new DimensionOptions(theEndDimensionType, new NoiseChunkGenerator( TheEndBiomeSource.createVanilla( - registryManager.createRegistryLookup() - .getOrThrow(RegistryKeys.BIOME)), + platform.biomeRegistry().getReadOnlyWrapper()), endChunkGeneratorSettings)); RegistryEntry overworldDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.OVERWORLD).orElseThrow(); 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 5ff1387a3..8efe9562c 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 @@ -4,7 +4,11 @@ import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import net.minecraft.MinecraftVersion; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registry; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,7 +20,6 @@ import java.util.concurrent.atomic.AtomicReference; import com.dfsek.terra.addon.EphemeralAddon; import com.dfsek.terra.api.addon.BaseAddon; -import com.dfsek.terra.lifecycle.util.BiomeUtil; import com.dfsek.terra.mod.CommonPlatform; import com.dfsek.terra.mod.ModPlatform; import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; @@ -26,7 +29,9 @@ public abstract class LifecyclePlatform extends ModPlatform { private static final Logger LOGGER = LoggerFactory.getLogger(LifecyclePlatform.class); private static MinecraftServer server; - private static final AtomicReference DYNAMIC_REGISTRY_MANAGER = new AtomicReference<>(); + private static final AtomicReference> BIOMES = new AtomicReference<>(); + private static final AtomicReference> DIMENSIONS = new AtomicReference<>(); + private static final AtomicReference> SETTINGS = new AtomicReference<>(); public LifecyclePlatform() { CommonPlatform.initialize(this); @@ -54,7 +59,6 @@ public abstract class LifecyclePlatform extends ModPlatform { LOGGER.warn("Failed to execute reload", throwable); return null; }).join(); - BiomeUtil.registerBiomes(DYNAMIC_REGISTRY_MANAGER.get()); server.getWorlds().forEach(world -> { if(world.getChunkManager().getChunkGenerator() instanceof MinecraftChunkGeneratorWrapper chunkGeneratorWrapper) { getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).ifPresent(pack -> { @@ -67,8 +71,12 @@ public abstract class LifecyclePlatform extends ModPlatform { return succeed; } - public static void addRegistryManager(DynamicRegistryManager in) { - DYNAMIC_REGISTRY_MANAGER.set(Objects.requireNonNull(in)); + public static void setRegistries(Registry biomeRegistry, + Registry dimensionTypeRegistry, + Registry chunkGeneratorSettingsRegistry) { + BIOMES.set(biomeRegistry); + DIMENSIONS.set(dimensionTypeRegistry); + SETTINGS.set(chunkGeneratorSettingsRegistry); } @Override @@ -94,8 +102,18 @@ public abstract class LifecyclePlatform extends ModPlatform { } @Override - public DynamicRegistryManager getMinecraftRegistry() { - return DYNAMIC_REGISTRY_MANAGER.get(); + public Registry dimensionTypeRegistry() { + return DIMENSIONS.get(); + } + + @Override + public Registry biomeRegistry() { + return BIOMES.get(); + } + + @Override + public Registry chunkGeneratorSettingsRegistry() { + return SETTINGS.get(); } protected abstract Collection getPlatformMods(); 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 new file mode 100644 index 000000000..14a466dd4 --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java @@ -0,0 +1,65 @@ +package com.dfsek.terra.lifecycle.mixin.lifecycle; + +import com.dfsek.terra.lifecycle.LifecyclePlatform; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.registry.MutableRegistry; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryLoader; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.WorldPreset; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; +import org.checkerframework.checker.units.qual.C; +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.function.Consumer; + +import com.dfsek.terra.lifecycle.util.LifecycleUtil; + + +@Mixin(RegistryLoader.class) +public class RegistryLoaderMixin { + @SuppressWarnings("unchecked") + @Redirect( + method = "load(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)" + + "Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", + at = @At( + value = "INVOKE", + target = "Ljava/util/List;forEach(Ljava/util/function/Consumer;)V", + ordinal = 1 // we want right after the first forEach + ) + ) + private static void grabManager(List, Object>> instance, Consumer, Object>> consumer) { + MutableRegistry biomeMutableRegistry = (MutableRegistry) + instance.stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(RegistryKeys.BIOME)) + .findFirst() + .orElseThrow(); + MutableRegistry worldPresetMutableRegistry = (MutableRegistry) + instance.stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(RegistryKeys.WORLD_PRESET)) + .findFirst() + .orElseThrow(); + MutableRegistry dimensionTypeMutableRegistry = (MutableRegistry) + instance.stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(RegistryKeys.DIMENSION_TYPE)) + .findFirst() + .orElseThrow(); + MutableRegistry chunkGeneratorSettingsMutableRegistry = (MutableRegistry) + instance.stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(RegistryKeys.CHUNK_GENERATOR_SETTINGS)) + .findFirst() + .orElseThrow(); + LifecyclePlatform.setRegistries(biomeMutableRegistry, dimensionTypeMutableRegistry, chunkGeneratorSettingsMutableRegistry); + LifecycleUtil.initialize(biomeMutableRegistry, worldPresetMutableRegistry); + instance.forEach(consumer); + } +} 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 deleted file mode 100644 index cc3c63339..000000000 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.dfsek.terra.lifecycle.mixin.lifecycle; - -import com.dfsek.terra.lifecycle.util.LifecycleUtil; - -import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.server.SaveLoading; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; - - -@Mixin(SaveLoading.class) -public class SaveLoadingMixin { - @ModifyArg( - method = "method_42097(Lnet/minecraft/registry/DynamicRegistryManager$Immutable;" + - "Lnet/minecraft/server/SaveLoading$SaveApplierFactory;Lnet/minecraft/resource/LifecycledResourceManager;" + - "Lnet/minecraft/registry/CombinedDynamicRegistries;Lnet/minecraft/server/SaveLoading$LoadContext;" + - "Lnet/minecraft/server/DataPackContents;)Ljava/lang/Object;", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/server/DataPackContents;refresh(Lnet/minecraft/registry/DynamicRegistryManager;)V" - ), - index = 0 - ) - private static DynamicRegistryManager grabManager(DynamicRegistryManager in) { - LifecycleUtil.initialize(in); - return in; - } -} 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/BiomeUtil.java index b01e4d808..633434a97 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/BiomeUtil.java @@ -30,8 +30,7 @@ public final class BiomeUtil { } - public static void registerBiomes(DynamicRegistryManager registryManager) { - Registry biomeRegistry = registryManager.get(RegistryKeys.BIOME); + public static void registerBiomes(Registry biomeRegistry) { logger.info("Registering biomes..."); CommonPlatform.get().getConfigRegistry().forEach(pack -> { // Register all Terra biomes. pack.getCheckedRegistry(Biome.class) 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 1d0fbd7d6..70291458b 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 @@ -3,22 +3,25 @@ package com.dfsek.terra.lifecycle.util; import com.dfsek.terra.lifecycle.LifecyclePlatform; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.MutableRegistry; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; import com.dfsek.terra.mod.CommonPlatform; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.WorldPreset; + public final class LifecycleUtil { private LifecycleUtil() { } - public static void initialize(DynamicRegistryManager registryManager) { - LifecyclePlatform.addRegistryManager(registryManager); + public static void initialize(MutableRegistry biomeMutableRegistry, MutableRegistry worldPresetMutableRegistry) { CommonPlatform.get().getEventManager().callEvent(new PlatformInitializationEvent()); - BiomeUtil.registerBiomes(registryManager); - CommonPlatform.get().registerWorldTypes((id, preset) -> Registry.register(registryManager.get(RegistryKeys.WORLD_PRESET), id, preset)); + BiomeUtil.registerBiomes(biomeMutableRegistry); + CommonPlatform.get().registerWorldTypes((id, preset) -> Registry.register(worldPresetMutableRegistry, id, preset)); } } 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 6d01c7ced..afc8050c2 100644 --- a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -1,20 +1,20 @@ { - "required": true, - "minVersion": "0.8", - "package": "com.dfsek.terra.lifecycle.mixin", - "compatibilityLevel": "JAVA_17", - "mixins": [ + "required" : true, + "minVersion" : "0.8", + "package" : "com.dfsek.terra.lifecycle.mixin", + "compatibilityLevel" : "JAVA_17", + "mixins" : [ "NoiseConfigMixin", "RegistryMixin", - "lifecycle.SaveLoadingMixin", - "lifecycle.MinecraftServerMixin" + "lifecycle.MinecraftServerMixin", + "lifecycle.RegistryLoaderMixin" ], - "client": [ + "client" : [ ], - "server": [ + "server" : [ ], - "injectors": { - "defaultRequire": 1 + "injectors" : { + "defaultRequire" : 1 }, - "refmap": "terra.lifecycle.refmap.json" + "refmap" : "terra.lifecycle.refmap.json" } \ No newline at end of file From 66465f27ffa32f4806bdc31a02f8086983eaf7f6 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 14:41:43 -0700 Subject: [PATCH 058/161] evil registry hacks --- .../mixin/RegistryEntryReferenceInvoker.java | 13 ++++++ .../lifecycle/mixin/SimpleRegistryMixin.java | 28 +++++++++++++ .../mixin/lifecycle/RegistryLoaderMixin.java | 40 +++++++------------ .../terra/lifecycle/util/RegistryHack.java | 5 +++ .../resources/terra.lifecycle.mixins.json | 2 + 5 files changed, 62 insertions(+), 26 deletions(-) create mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryEntryReferenceInvoker.java create mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/SimpleRegistryMixin.java create mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryHack.java diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryEntryReferenceInvoker.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryEntryReferenceInvoker.java new file mode 100644 index 000000000..d84b643cb --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryEntryReferenceInvoker.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.lifecycle.mixin; + + +import net.minecraft.registry.entry.RegistryEntry.Reference; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + + +@Mixin(Reference.class) +public interface RegistryEntryReferenceInvoker { + @Invoker("setValue") + void invokeSetValue(T value); +} diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/SimpleRegistryMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/SimpleRegistryMixin.java new file mode 100644 index 000000000..2da9f317d --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/SimpleRegistryMixin.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.lifecycle.mixin; + +import com.dfsek.terra.lifecycle.util.RegistryHack; + +import net.minecraft.registry.SimpleRegistry; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.entry.RegistryEntry.Reference; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; + + +@Mixin(SimpleRegistry.class) +public class SimpleRegistryMixin implements RegistryHack { + @Shadow + @Final + private Map> valueToEntry; + + @Override + public void terra_bind() { + valueToEntry.forEach((value, entry) -> { + //noinspection unchecked + ((RegistryEntryReferenceInvoker) entry).invokeSetValue(value); + }); + } +} 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 14a466dd4..d11095d8a 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 @@ -2,6 +2,8 @@ package com.dfsek.terra.lifecycle.mixin.lifecycle; import com.dfsek.terra.lifecycle.LifecyclePlatform; +import com.dfsek.terra.lifecycle.util.RegistryHack; + import com.mojang.datafixers.util.Pair; import net.minecraft.registry.MutableRegistry; import net.minecraft.registry.RegistryKeys; @@ -34,32 +36,18 @@ public class RegistryLoaderMixin { ) ) private static void grabManager(List, Object>> instance, Consumer, Object>> consumer) { - MutableRegistry biomeMutableRegistry = (MutableRegistry) - instance.stream() - .map(Pair::getFirst) - .filter(r -> r.getKey().equals(RegistryKeys.BIOME)) - .findFirst() - .orElseThrow(); - MutableRegistry worldPresetMutableRegistry = (MutableRegistry) - instance.stream() - .map(Pair::getFirst) - .filter(r -> r.getKey().equals(RegistryKeys.WORLD_PRESET)) - .findFirst() - .orElseThrow(); - MutableRegistry dimensionTypeMutableRegistry = (MutableRegistry) - instance.stream() - .map(Pair::getFirst) - .filter(r -> r.getKey().equals(RegistryKeys.DIMENSION_TYPE)) - .findFirst() - .orElseThrow(); - MutableRegistry chunkGeneratorSettingsMutableRegistry = (MutableRegistry) - instance.stream() - .map(Pair::getFirst) - .filter(r -> r.getKey().equals(RegistryKeys.CHUNK_GENERATOR_SETTINGS)) - .findFirst() - .orElseThrow(); - LifecyclePlatform.setRegistries(biomeMutableRegistry, dimensionTypeMutableRegistry, chunkGeneratorSettingsMutableRegistry); - LifecycleUtil.initialize(biomeMutableRegistry, worldPresetMutableRegistry); + + //LifecyclePlatform.setRegistries(biomeMutableRegistry, dimensionTypeMutableRegistry, chunkGeneratorSettingsMutableRegistry); + //LifecycleUtil.initialize(biomeMutableRegistry, worldPresetMutableRegistry); + instance.forEach(mutableRegistryObjectPair -> { + System.out.println(mutableRegistryObjectPair.getFirst()); + System.out.println(mutableRegistryObjectPair.getFirst().size()); + if(mutableRegistryObjectPair.getFirst().getKey().equals(RegistryKeys.BIOME)) { + ((RegistryHack) mutableRegistryObjectPair.getFirst()).terra_bind(); + System.out.println("BIOMES: " + mutableRegistryObjectPair.getFirst().stream().toList()); + } + //System.out.println(mutableRegistryObjectPair.getFirst().stream().toList()); + }); instance.forEach(consumer); } } diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryHack.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryHack.java new file mode 100644 index 000000000..347a13bfa --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryHack.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.lifecycle.util; + +public interface RegistryHack { + void terra_bind(); +} 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 afc8050c2..101cead1c 100644 --- a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -5,7 +5,9 @@ "compatibilityLevel" : "JAVA_17", "mixins" : [ "NoiseConfigMixin", + "RegistryEntryReferenceInvoker", "RegistryMixin", + "SimpleRegistryMixin", "lifecycle.MinecraftServerMixin", "lifecycle.RegistryLoaderMixin" ], From ee336b01a626c1036f7996321d38948ee413d9b4 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 21:14:38 -0700 Subject: [PATCH 059/161] 1.19.3 launch and enter world --- .../com/dfsek/terra/mod/util/PresetUtil.java | 3 +- .../mixin/lifecycle/RegistryLoaderMixin.java | 36 ++++++++++++++----- .../dfsek/terra/lifecycle/util/BiomeUtil.java | 1 - 3 files changed, 30 insertions(+), 10 deletions(-) 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 5c7e8ce3d..5bf790dfa 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 @@ -3,6 +3,7 @@ package com.dfsek.terra.mod.util; import com.dfsek.terra.mod.ModPlatform; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; @@ -38,7 +39,7 @@ public class PresetUtil { public static Pair createDefault(ConfigPack pack, ModPlatform platform) { Registry dimensionTypeRegistry = platform.dimensionTypeRegistry(); Registry chunkGeneratorSettingsRegistry = platform.chunkGeneratorSettingsRegistry(); - + RegistryEntry theNetherDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow(); RegistryEntry netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER).orElseThrow(); 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 d11095d8a..a891f056c 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 @@ -6,6 +6,8 @@ import com.dfsek.terra.lifecycle.util.RegistryHack; import com.mojang.datafixers.util.Pair; import net.minecraft.registry.MutableRegistry; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryLoader; import net.minecraft.world.biome.Biome; @@ -18,6 +20,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; import com.dfsek.terra.lifecycle.util.LifecycleUtil; @@ -36,18 +39,35 @@ public class RegistryLoaderMixin { ) ) private static void grabManager(List, Object>> instance, Consumer, Object>> consumer) { - - //LifecyclePlatform.setRegistries(biomeMutableRegistry, dimensionTypeMutableRegistry, chunkGeneratorSettingsMutableRegistry); - //LifecycleUtil.initialize(biomeMutableRegistry, worldPresetMutableRegistry); instance.forEach(mutableRegistryObjectPair -> { System.out.println(mutableRegistryObjectPair.getFirst()); System.out.println(mutableRegistryObjectPair.getFirst().size()); - if(mutableRegistryObjectPair.getFirst().getKey().equals(RegistryKeys.BIOME)) { - ((RegistryHack) mutableRegistryObjectPair.getFirst()).terra_bind(); - System.out.println("BIOMES: " + mutableRegistryObjectPair.getFirst().stream().toList()); - } - //System.out.println(mutableRegistryObjectPair.getFirst().stream().toList()); + }); + extractRegistry(instance, RegistryKeys.BIOME).ifPresent(biomes -> { // this redirect triggers twice, second time only with dimension registry. dont try extraction second time + MutableRegistry dimensionTypes = extractRegistry(instance, RegistryKeys.DIMENSION_TYPE).orElseThrow(); + MutableRegistry worldPresets = extractRegistry(instance, RegistryKeys.WORLD_PRESET).orElseThrow(); + MutableRegistry chunkGeneratorSettings = extractRegistry(instance, RegistryKeys.CHUNK_GENERATOR_SETTINGS).orElseThrow(); + + LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings); + LifecycleUtil.initialize(biomes, worldPresets); }); instance.forEach(consumer); } + + @SuppressWarnings("unchecked") + private static Optional> extractRegistry(List, Object>> instance, RegistryKey> key) { + List> matches = instance + .stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(key)) + .toList(); + if(matches.size() > 1) { + throw new IllegalStateException("Illegal number of registries returned: " + matches); + } else if(matches.isEmpty()) { + return Optional.empty(); + } + MutableRegistry registry = (MutableRegistry) matches.get(0); + ((RegistryHack) registry).terra_bind(); + return Optional.of(registry); + } } 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/BiomeUtil.java index 633434a97..0eadea7f4 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/BiomeUtil.java @@ -36,7 +36,6 @@ public final class BiomeUtil { pack.getCheckedRegistry(Biome.class) .forEach((id, biome) -> registerBiome(biome, pack, id, biomeRegistry)); }); - MinecraftUtil.registerFlora(biomeRegistry); logger.info("Terra biomes registered."); } From ded308c01c4aa3f3b1e72108849656cc8c9a72cf Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 21:34:44 -0700 Subject: [PATCH 060/161] add mixin to inject flora --- .../mixin/lifecycle/RegistryLoaderMixin.java | 2 +- .../mixin/lifecycle/SaveLoadingMixin.java | 32 +++++++++++++++ .../resources/terra.lifecycle.mixins.json | 41 ++++++++++--------- 3 files changed, 54 insertions(+), 21 deletions(-) create mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java 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 a891f056c..cb33c527a 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 @@ -17,6 +17,7 @@ import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.checkerframework.checker.units.qual.C; 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.Redirect; import java.util.List; @@ -28,7 +29,6 @@ import com.dfsek.terra.lifecycle.util.LifecycleUtil; @Mixin(RegistryLoader.class) public class RegistryLoaderMixin { - @SuppressWarnings("unchecked") @Redirect( method = "load(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)" + "Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", 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 new file mode 100644 index 000000000..260d3c4a2 --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.lifecycle.mixin.lifecycle; + +import com.dfsek.terra.lifecycle.util.LifecycleUtil; + +import com.dfsek.terra.mod.util.MinecraftUtil; + +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.server.SaveLoading; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + + +@Mixin(SaveLoading.class) +public class SaveLoadingMixin { + @ModifyArg( + method = "method_42097(Lnet/minecraft/registry/DynamicRegistryManager$Immutable;" + + "Lnet/minecraft/server/SaveLoading$SaveApplierFactory;Lnet/minecraft/resource/LifecycledResourceManager;" + + "Lnet/minecraft/registry/CombinedDynamicRegistries;Lnet/minecraft/server/SaveLoading$LoadContext;" + + "Lnet/minecraft/server/DataPackContents;)Ljava/lang/Object;", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/DataPackContents;refresh(Lnet/minecraft/registry/DynamicRegistryManager;)V" + ), + index = 0 + ) + private static DynamicRegistryManager grabManager(DynamicRegistryManager in) { + MinecraftUtil.registerFlora(in.get(RegistryKeys.BIOME)); + return in; + } +} 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 101cead1c..bf42757a4 100644 --- a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -1,22 +1,23 @@ { - "required" : true, - "minVersion" : "0.8", - "package" : "com.dfsek.terra.lifecycle.mixin", - "compatibilityLevel" : "JAVA_17", - "mixins" : [ - "NoiseConfigMixin", - "RegistryEntryReferenceInvoker", - "RegistryMixin", - "SimpleRegistryMixin", - "lifecycle.MinecraftServerMixin", - "lifecycle.RegistryLoaderMixin" - ], - "client" : [ - ], - "server" : [ - ], - "injectors" : { - "defaultRequire" : 1 - }, - "refmap" : "terra.lifecycle.refmap.json" + "required": true, + "minVersion": "0.8", + "package": "com.dfsek.terra.lifecycle.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "NoiseConfigMixin", + "RegistryEntryReferenceInvoker", + "RegistryMixin", + "SimpleRegistryMixin", + "lifecycle.MinecraftServerMixin", + "lifecycle.RegistryLoaderMixin", + "lifecycle.SaveLoadingMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "terra.lifecycle.refmap.json" } \ No newline at end of file From 5ded3552d3d66a546998c6b67265c76483382e7d Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 21:38:40 -0700 Subject: [PATCH 061/161] clean up sysout logging --- .../mixin/lifecycle/RegistryLoaderMixin.java | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) 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 cb33c527a..98f601b83 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 @@ -15,7 +15,10 @@ import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.WorldPreset; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.checkerframework.checker.units.qual.C; +import org.slf4j.Logger; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; @@ -29,6 +32,10 @@ import com.dfsek.terra.lifecycle.util.LifecycleUtil; @Mixin(RegistryLoader.class) public class RegistryLoaderMixin { + @Shadow + @Final + private static Logger LOGGER; + @Redirect( method = "load(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)" + "Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", @@ -39,23 +46,26 @@ public class RegistryLoaderMixin { ) ) private static void grabManager(List, Object>> instance, Consumer, Object>> consumer) { - instance.forEach(mutableRegistryObjectPair -> { - System.out.println(mutableRegistryObjectPair.getFirst()); - System.out.println(mutableRegistryObjectPair.getFirst().size()); - }); - extractRegistry(instance, RegistryKeys.BIOME).ifPresent(biomes -> { // this redirect triggers twice, second time only with dimension registry. dont try extraction second time - MutableRegistry dimensionTypes = extractRegistry(instance, RegistryKeys.DIMENSION_TYPE).orElseThrow(); - MutableRegistry worldPresets = extractRegistry(instance, RegistryKeys.WORLD_PRESET).orElseThrow(); - MutableRegistry chunkGeneratorSettings = extractRegistry(instance, RegistryKeys.CHUNK_GENERATOR_SETTINGS).orElseThrow(); - - LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings); - LifecycleUtil.initialize(biomes, worldPresets); - }); + instance.forEach(mutableRegistryObjectPair -> LOGGER.debug("{}: {} entries", + mutableRegistryObjectPair.getFirst().toString(), + mutableRegistryObjectPair.getFirst().size()) + ); + extractRegistry(instance, RegistryKeys.BIOME).ifPresent( + biomes -> { // this redirect triggers twice, second time only with dimension registry. don't try extraction second time + MutableRegistry dimensionTypes = extractRegistry(instance, RegistryKeys.DIMENSION_TYPE).orElseThrow(); + MutableRegistry worldPresets = extractRegistry(instance, RegistryKeys.WORLD_PRESET).orElseThrow(); + MutableRegistry chunkGeneratorSettings = extractRegistry(instance, + RegistryKeys.CHUNK_GENERATOR_SETTINGS).orElseThrow(); + + LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings); + LifecycleUtil.initialize(biomes, worldPresets); + }); instance.forEach(consumer); } @SuppressWarnings("unchecked") - private static Optional> extractRegistry(List, Object>> instance, RegistryKey> key) { + private static Optional> extractRegistry(List, Object>> instance, + RegistryKey> key) { List> matches = instance .stream() .map(Pair::getFirst) From 75673b5b8efce07257b742b978ce0e5d998168b8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 21:59:39 -0700 Subject: [PATCH 062/161] begin working on Forge --- .../dfsek/terra/forge/ForgeEntryPoint.java | 7 +++-- .../com/dfsek/terra/forge/ForgePlatform.java | 17 ++++++++++- .../mixin/lifecycle/NoiseConfigMixin.java | 30 ++++++++----------- .../com/dfsek/terra/forge/util/BiomeUtil.java | 24 +++++++-------- .../terra/mod/config/ProtoPlatformBiome.java | 2 +- 5 files changed, 44 insertions(+), 36 deletions(-) diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java index 8bf758ef7..36446a08d 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java @@ -17,6 +17,7 @@ package com.dfsek.terra.forge; +import net.minecraft.registry.RegistryKeys; import net.minecraft.util.Identifier; import net.minecraft.registry.Registry; import net.minecraft.world.biome.Biome; @@ -71,12 +72,12 @@ public class ForgeEntryPoint { public void registerBiomes(RegisterEvent event) { event.register(Keys.BLOCKS, helper -> sanityCheck.progress(RegistryStep.BLOCK, () -> logger.debug("Block registration detected."))); event.register(Keys.BIOMES, helper -> sanityCheck.progress(RegistryStep.BIOME, () -> initialize(helper))); - event.register(Registry.WORLD_PRESET_KEY, + event.register(RegistryKeys.WORLD_PRESET, helper -> sanityCheck.progress(RegistryStep.WORLD_TYPE, () -> TERRA_PLUGIN.registerWorldTypes(helper::register))); - event.register(Registry.CHUNK_GENERATOR_KEY, + event.register(RegistryKeys.CHUNK_GENERATOR, helper -> helper.register(new Identifier("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER)); - event.register(Registry.BIOME_SOURCE_KEY, helper -> helper.register(new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE)); + event.register(RegistryKeys.BIOME_SOURCE, helper -> helper.register(new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE)); } } 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 86afe0ed3..a2f26b753 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 @@ -21,10 +21,15 @@ import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import ca.solostudios.strata.version.Version; import net.minecraft.MinecraftVersion; +import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; @@ -126,7 +131,17 @@ public class ForgePlatform extends ModPlatform { } @Override - public Registry getMinecraftRegistry(RegistryKey key) { + public Registry dimensionTypeRegistry() { + return ForgeRegistries.DI; + } + + @Override + public Registry biomeRegistry() { return null; } + + @Override + public Registry chunkGeneratorSettingsRegistry() { + return Registries.DIM; + } } 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 1bdffca2e..8762d51ed 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,19 +1,26 @@ package com.dfsek.terra.forge.mixin.lifecycle; +import net.minecraft.registry.RegistryEntryLookup; +import net.minecraft.util.math.noise.DoublePerlinNoiseSampler; +import net.minecraft.util.math.noise.DoublePerlinNoiseSampler.NoiseParameters; import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; import net.minecraft.world.biome.source.util.MultiNoiseUtil.NoiseHypercube; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.densityfunction.DensityFunction; import net.minecraft.world.gen.noise.NoiseConfig; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import java.util.List; import com.dfsek.terra.mod.util.SeedHack; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + /** * Hack to map noise sampler to seeds @@ -22,23 +29,12 @@ import com.dfsek.terra.mod.util.SeedHack; public class NoiseConfigMixin { @Shadow @Final - private long legacyWorldSeed; + private MultiNoiseSampler multiNoiseSampler; - @Redirect(method = "(Lnet/minecraft/world/gen/chunk/ChunkGeneratorSettings;Lnet/minecraft/util/registry/Registry;J)V", - at = @At(value = "NEW", - target = "(Lnet/minecraft/world/gen/densityfunction/DensityFunction;" + - "Lnet/minecraft/world/gen/densityfunction/DensityFunction;" + - "Lnet/minecraft/world/gen/densityfunction/DensityFunction;" + - "Lnet/minecraft/world/gen/densityfunction/DensityFunction;" + - "Lnet/minecraft/world/gen/densityfunction/DensityFunction;" + - "Lnet/minecraft/world/gen/densityfunction/DensityFunction;Ljava/util/List;)" + - "Lnet/minecraft/world/biome/source/util/MultiNoiseUtil$MultiNoiseSampler;")) - private MultiNoiseSampler t(DensityFunction densityFunction, DensityFunction densityFunction2, DensityFunction densityFunction3, - DensityFunction densityFunction4, DensityFunction densityFunction5, DensityFunction densityFunction6, - List list) { - MultiNoiseSampler sampler = new MultiNoiseSampler(densityFunction, densityFunction2, densityFunction3, densityFunction4, - densityFunction5, densityFunction6, list); - SeedHack.register(sampler, legacyWorldSeed); - return sampler; + @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); } } 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 aacae6001..9c14f7d1a 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 @@ -1,9 +1,9 @@ package com.dfsek.terra.forge.util; +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.registry.BuiltinRegistries; -import net.minecraft.registry.Registry; -import net.minecraft.util.registry.RegistryKey; import net.minecraft.village.VillagerType; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegisterEvent.RegisterHelper; @@ -39,7 +39,6 @@ public final class BiomeUtil { pack.getCheckedRegistry(Biome.class) .forEach((id, biome) -> registerBiome(biome, pack, id, helper)); }); - MinecraftUtil.registerFlora(BuiltinRegistries.BIOME); logger.info("Terra biomes registered."); } @@ -52,7 +51,8 @@ public final class BiomeUtil { private static void registerBiome(Biome biome, ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey id, RegisterHelper helper) { - RegistryKey vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(BuiltinRegistries.BIOME); + RegistryEntry + vanilla = ForgeRegistries.BIOMES.getHolder(((ProtoPlatformBiome) biome.getPlatformBiome()).getHandle()).orElseThrow(); if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) { @@ -61,7 +61,7 @@ public final class BiomeUtil { VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, - ForgeRegistries.BIOMES.getDelegateOrThrow(vanilla) + ForgeRegistries.BIOMES.getDelegateOrThrow(vanilla.getKey().orElseThrow()) .value(), vanillaBiomeProperties); @@ -69,24 +69,20 @@ public final class BiomeUtil { if(ForgeRegistries.BIOMES.containsKey(identifier)) { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(ForgeRegistries.BIOMES.getHolder(identifier) - .orElseThrow() - .getKey() .orElseThrow()); } else { helper.register(MinecraftUtil.registerKey(identifier).getValue(), minecraftBiome); ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(ForgeRegistries.BIOMES.getHolder(identifier) - .orElseThrow() - .getKey() .orElseThrow()); } - Map villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap(); + Map, VillagerType> villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap(); - villagerMap.put(RegistryKey.of(Registry.BIOME_KEY, identifier), + villagerMap.put(RegistryKey.of(RegistryKeys.BIOME, identifier), Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), - villagerMap.getOrDefault(vanilla, VillagerType.PLAINS))); + villagerMap.getOrDefault(vanilla.getKey().orElseThrow(), VillagerType.PLAINS))); - MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier); + MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getKey().orElseThrow().getValue(), i -> new ArrayList<>()).add(identifier); } } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java index 60cf1effa..11bbae507 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java @@ -43,7 +43,7 @@ public class ProtoPlatformBiome implements PlatformBiome { } @Override - public Object getHandle() { + public Identifier getHandle() { return identifier; } From 8fff27fddde32f29ab064ecd4af4b2bd49812340 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 23:00:40 -0700 Subject: [PATCH 063/161] update bukkit to 1.19.3 --- buildSrc/src/main/kotlin/Versions.kt | 2 +- platforms/bukkit/build.gradle.kts | 1 + .../bukkit/nms/v1_19_R1/build.gradle.kts | 2 +- .../bukkit/nms/v1_19_R2/build.gradle.kts | 17 ++ .../bukkit/nms/v1_19_R2/AwfulBukkitHacks.java | 100 ++++++++++ .../bukkit/nms/v1_19_R2/NMSBiomeInfo.java | 10 + .../bukkit/nms/v1_19_R2/NMSBiomeInjector.java | 81 ++++++++ .../bukkit/nms/v1_19_R2/NMSBiomeProvider.java | 42 +++++ .../v1_19_R2/NMSChunkGeneratorDelegate.java | 173 ++++++++++++++++++ .../bukkit/nms/v1_19_R2/NMSInitializer.java | 15 ++ .../nms/v1_19_R2/NMSInjectListener.java | 48 +++++ .../nms/v1_19_R2/NMSWorldProperties.java | 36 ++++ .../terra/bukkit/nms/v1_19_R2/Reflection.java | 52 ++++++ .../bukkit/nms/v1_19_R2/RegistryFetcher.java | 25 +++ 14 files changed, 602 insertions(+), 2 deletions(-) create mode 100644 platforms/bukkit/nms/v1_19_R2/build.gradle.kts create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/AwfulBukkitHacks.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInfo.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInjector.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeProvider.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSChunkGeneratorDelegate.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInitializer.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInjectListener.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSWorldProperties.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/Reflection.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/RegistryFetcher.java diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 0b101e569..ee68395b9 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -50,7 +50,7 @@ object Versions { object Bukkit { const val paper = "1.18.2-R0.1-SNAPSHOT" const val paperLib = "1.0.5" - const val minecraft = "1.19.2" + const val minecraft = "1.19.3" const val reflectionRemapper = "0.1.0-SNAPSHOT" const val paperDevBundle = "1.19.3-R0.1-SNAPSHOT" } diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index f099cb4e3..d3895ad52 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -10,6 +10,7 @@ dependencies { shaded(project(":platforms:bukkit:common")) shaded(project(":platforms:bukkit:nms:v1_18_R2", configuration = "reobf")) shaded(project(":platforms:bukkit:nms:v1_19_R1", configuration = "reobf")) + shaded(project(":platforms:bukkit:nms:v1_19_R2", configuration = "reobf")) shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } diff --git a/platforms/bukkit/nms/v1_19_R1/build.gradle.kts b/platforms/bukkit/nms/v1_19_R1/build.gradle.kts index 96f9038d8..b38ee0e04 100644 --- a/platforms/bukkit/nms/v1_19_R1/build.gradle.kts +++ b/platforms/bukkit/nms/v1_19_R1/build.gradle.kts @@ -6,7 +6,7 @@ repositories { dependencies { api(project(":platforms:bukkit:common")) - paperDevBundle(Versions.Bukkit.paperDevBundle) + paperDevBundle("1.19.2-R0.1-SNAPSHOT") implementation("xyz.jpenilla", "reflection-remapper", "0.1.0-SNAPSHOT") } diff --git a/platforms/bukkit/nms/v1_19_R2/build.gradle.kts b/platforms/bukkit/nms/v1_19_R2/build.gradle.kts new file mode 100644 index 000000000..96f9038d8 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/build.gradle.kts @@ -0,0 +1,17 @@ +apply(plugin = "io.papermc.paperweight.userdev") + +repositories { + maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") +} + +dependencies { + api(project(":platforms:bukkit:common")) + paperDevBundle(Versions.Bukkit.paperDevBundle) + implementation("xyz.jpenilla", "reflection-remapper", "0.1.0-SNAPSHOT") +} + +tasks { + assemble { + dependsOn("reobfJar") + } +} \ No newline at end of file diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/AwfulBukkitHacks.java new file mode 100644 index 000000000..f7da9c45d --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/AwfulBukkitHacks.java @@ -0,0 +1,100 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import com.google.common.collect.ImmutableMap; +import com.mojang.serialization.Lifecycle; +import net.minecraft.core.Holder; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.WritableRegistry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; +import org.bukkit.NamespacedKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; +import com.dfsek.terra.registry.master.ConfigRegistry; + + +public class AwfulBukkitHacks { + private static final Logger LOGGER = LoggerFactory.getLogger(AwfulBukkitHacks.class); + + private static final Map> terraBiomeMap = new HashMap<>(); + + public static void registerBiomes(ConfigRegistry configRegistry) { + try { + LOGGER.info("Hacking biome registry..."); + WritableRegistry biomeRegistry = (WritableRegistry) RegistryFetcher.biomeRegistry(); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, false); + + 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 = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); + Biome platform = NMSBiomeInjector.createBiome(biome, Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey))); + + ResourceKey delegateKey = ResourceKey.create( + Registries.BIOME, + new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key)) + ); + + Reference holder = biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); + Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder. + + platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); + + terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location()); + + LOGGER.debug("Registered biome: " + delegateKey); + } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + throw new RuntimeException(e); + } + })); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) 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())), + HashMap::putAll); + + terraBiomeMap + .forEach((vb, terraBiomes) -> + NMSBiomeInjector.getEntry(biomeRegistry, vb).ifPresentOrElse( + vanilla -> terraBiomes.forEach( + tb -> NMSBiomeInjector.getEntry(biomeRegistry, tb).ifPresentOrElse( + terra -> { + LOGGER.debug("{} (vanilla for {}): {}", + vanilla.unwrapKey().orElseThrow().location(), + terra.unwrapKey().orElseThrow().location(), + vanilla.tags().toList()); + vanilla.tags() + .forEach(tag -> collect + .computeIfAbsent(tag, t -> new ArrayList<>()) + .add(terra)); + }, + () -> LOGGER.error("No such biome: {}", tb))), + () -> LOGGER.error("No vanilla biome: {}", vb))); + + biomeRegistry.resetTags(); + biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); + + } catch(SecurityException | IllegalArgumentException exception) { + throw new RuntimeException(exception); + } + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInfo.java new file mode 100644 index 000000000..639c9eaed --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInfo.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; + +import com.dfsek.terra.api.properties.Properties; + + +public record NMSBiomeInfo(ResourceKey biomeKey) implements Properties { +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInjector.java new file mode 100644 index 000000000..20a426949 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInjector.java @@ -0,0 +1,81 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +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 java.util.function.Function; + +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 + .precipitation(vanilla.getPrecipitation()) + .downfall(vanilla.getDownfall()) + .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_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeProvider.java new file mode 100644 index 000000000..e7b09426d --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeProvider.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import com.mojang.serialization.Codec; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Climate.Sampler; +import org.jetbrains.annotations.NotNull; + +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; + + +public class NMSBiomeProvider extends BiomeSource { + private final BiomeProvider delegate; + private final long seed; + private final Registry biomeRegistry = RegistryFetcher.biomeRegistry(); + + public NMSBiomeProvider(BiomeProvider delegate, long seed) { + super(delegate.stream() + .map(biome -> RegistryFetcher.biomeRegistry() + .getHolderOrThrow(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() + .get(NMSBiomeInfo.class) + .biomeKey()))); + this.delegate = delegate; + this.seed = seed; + } + + @Override + protected @NotNull Codec codec() { + return BiomeSource.CODEC; + } + + @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) + .getPlatformBiome()).getContext() + .get(NMSBiomeInfo.class) + .biomeKey()); + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSChunkGeneratorDelegate.java new file mode 100644 index 000000000..5faa4ba4b --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSChunkGeneratorDelegate.java @@ -0,0 +1,173 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.NoiseColumn; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.BiomeManager; +import net.minecraft.world.level.block.Blocks; +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; +import org.bukkit.craftbukkit.v1_19_R2.block.data.CraftBlockData; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; +import com.dfsek.terra.bukkit.config.PreLoadCompatibilityOptions; +import com.dfsek.terra.bukkit.world.BukkitWorldProperties; +import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; + + +public class NMSChunkGeneratorDelegate extends ChunkGenerator { + private static final Logger LOGGER = LoggerFactory.getLogger(NMSChunkGeneratorDelegate.class); + private final com.dfsek.terra.api.world.chunk.generation.ChunkGenerator delegate; + + private final ChunkGenerator vanilla; + private final ConfigPack pack; + + private final long seed; + + public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, long seed) { + super(biomeProvider); + this.delegate = pack.getGeneratorProvider().newInstance(pack); + this.vanilla = vanilla; + this.pack = pack; + this.seed = seed; + } + + @Override + protected @NotNull Codec codec() { + return ChunkGenerator.CODEC; + } + + @Override + public void applyCarvers(@NotNull WorldGenRegion chunkRegion, long seed, @NotNull RandomState noiseConfig, @NotNull BiomeManager world, + @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk, @NotNull Carving carverStep) { + // no-op + } + + @Override + public void buildSurface(@NotNull WorldGenRegion region, @NotNull StructureManager structures, @NotNull RandomState noiseConfig, + @NotNull ChunkAccess chunk) { + // no-op + } + + @Override + public void applyBiomeDecoration(@NotNull WorldGenLevel world, @NotNull ChunkAccess chunk, + @NotNull StructureManager structureAccessor) { + vanilla.applyBiomeDecoration(world, chunk, structureAccessor); + } + + @Override + public void spawnOriginalMobs(@NotNull WorldGenRegion region) { + vanilla.spawnOriginalMobs(region); + } + + @Override + public int getGenDepth() { + return vanilla.getGenDepth(); + } + + @Override + public @NotNull CompletableFuture fillFromNoise(@NotNull Executor executor, @NotNull Blender blender, + @NotNull RandomState noiseConfig, + @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk) { + return vanilla.fillFromNoise(executor, blender, noiseConfig, structureAccessor, chunk) + .thenApply(c -> { + LevelAccessor level = Reflection.STRUCTURE_MANAGER.getLevel(structureAccessor); + BiomeProvider biomeProvider = pack.getBiomeProvider(); + PreLoadCompatibilityOptions compatibilityOptions = pack.getContext().get(PreLoadCompatibilityOptions.class); + if(compatibilityOptions.isBeard()) { + beard(structureAccessor, chunk, new BukkitWorldProperties(level.getMinecraftWorld().getWorld()), biomeProvider, compatibilityOptions); + } + return c; + }); + } + + private void beard(StructureManager structureAccessor, ChunkAccess chunk, WorldProperties world, BiomeProvider biomeProvider, + PreLoadCompatibilityOptions compatibilityOptions) { + Beardifier structureWeightSampler = Beardifier.forStructuresInChunk(structureAccessor, chunk.getPos()); + double threshold = compatibilityOptions.getBeardThreshold(); + double airThreshold = compatibilityOptions.getAirThreshold(); + int xi = chunk.getPos().x << 4; + int zi = chunk.getPos().z << 4; + for(int x = 0; x < 16; x++) { + for(int z = 0; z < 16; z++) { + int depth = 0; + for(int y = world.getMaxHeight(); y >= world.getMinHeight(); y--) { + double noise = structureWeightSampler.compute(new SinglePointContext(x + xi, y, z + zi)); + if(noise > threshold) { + chunk.setBlockState(new BlockPos(x, y, z), ((CraftBlockData) ((BukkitBlockState) delegate + .getPalette(x + xi, y, z + zi, world, biomeProvider) + .get(depth, x + xi, y, z + zi, world.getSeed())).getHandle()).getState(), false); + depth++; + } else if(noise < airThreshold) { + chunk.setBlockState(new BlockPos(x, y, z), Blocks.AIR.defaultBlockState(), false); + } else { + depth = 0; + } + } + } + } + } + + @Override + public int getSeaLevel() { + return vanilla.getSeaLevel(); + } + + @Override + public int getMinY() { + return vanilla.getMinY(); + } + + @Override + public int getBaseHeight(int x, int z, @NotNull Types heightmap, @NotNull LevelHeightAccessor world, @NotNull RandomState noiseConfig) { + WorldProperties properties = new NMSWorldProperties(seed, world); + int y = properties.getMaxHeight(); + BiomeProvider biomeProvider = pack.getBiomeProvider(); + while(y >= getMinY() && !heightmap.isOpaque().test( + ((CraftBlockData) delegate.getBlock(properties, x, y - 1, z, biomeProvider).getHandle()).getState())) { + y--; + } + return y; + } + + @Override + public @NotNull NoiseColumn getBaseColumn(int x, int z, @NotNull LevelHeightAccessor world, @NotNull RandomState noiseConfig) { + /* + BlockState[] array = new BlockState[world.getHeight()]; + WorldProperties properties = new NMSWorldProperties(seed, world); + BiomeProvider biomeProvider = pack.getBiomeProvider().caching(properties); + for(int y = properties.getMaxHeight() - 1; y >= properties.getMinHeight(); y--) { + array[y - properties.getMinHeight()] = ((CraftBlockData) delegate.getBlock(properties, x, y, z, biomeProvider) + .getHandle()).getState(); + } + return new NoiseColumn(getMinY(), array); + + */ + return vanilla.getBaseColumn(x, z, world, noiseConfig); + } + + @Override + public void addDebugScreenInfo(@NotNull List text, @NotNull RandomState noiseConfig, @NotNull BlockPos pos) { + + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInitializer.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInitializer.java new file mode 100644 index 000000000..05814cfd4 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInitializer.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import org.bukkit.Bukkit; + +import com.dfsek.terra.bukkit.PlatformImpl; +import com.dfsek.terra.bukkit.nms.Initializer; + + +public class NMSInitializer implements Initializer { + @Override + public void initialize(PlatformImpl platform) { + AwfulBukkitHacks.registerBiomes(platform.getRawConfigRegistry()); + Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin()); + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInjectListener.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInjectListener.java new file mode 100644 index 000000000..015de732e --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInjectListener.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_19_R2.CraftWorld; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.world.WorldInitEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.locks.ReentrantLock; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; + + +public class NMSInjectListener implements Listener { + private static final Logger LOGGER = LoggerFactory.getLogger(NMSInjectListener.class); + private static final Set INJECTED = new HashSet<>(); + private static final ReentrantLock INJECT_LOCK = new ReentrantLock(); + + @EventHandler + public void onWorldInit(WorldInitEvent event) { + if(!INJECTED.contains(event.getWorld()) && + event.getWorld().getGenerator() instanceof BukkitChunkGeneratorWrapper bukkitChunkGeneratorWrapper) { + INJECT_LOCK.lock(); + INJECTED.add(event.getWorld()); + LOGGER.info("Preparing to take over the world: {}", event.getWorld().getName()); + CraftWorld craftWorld = (CraftWorld) event.getWorld(); + ServerLevel serverWorld = craftWorld.getHandle(); + + ConfigPack pack = bukkitChunkGeneratorWrapper.getPack(); + + ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator(); + NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed()); + + serverWorld.getChunkSource().chunkMap.generator = new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()); + + LOGGER.info("Successfully injected into world."); + + INJECT_LOCK.unlock(); + } + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSWorldProperties.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSWorldProperties.java new file mode 100644 index 000000000..cee2284d0 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSWorldProperties.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import net.minecraft.world.level.LevelHeightAccessor; + +import com.dfsek.terra.api.world.info.WorldProperties; + + +public class NMSWorldProperties implements WorldProperties { + private final long seed; + private final LevelHeightAccessor height; + + public NMSWorldProperties(long seed, LevelHeightAccessor height) { + this.seed = seed; + this.height = height; + } + + @Override + public Object getHandle() { + return height; + } + + @Override + public long getSeed() { + return seed; + } + + @Override + public int getMaxHeight() { + return height.getMaxBuildHeight(); + } + + @Override + public int getMinHeight() { + return height.getMinBuildHeight(); + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/Reflection.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/Reflection.java new file mode 100644 index 000000000..c65df8ca1 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/Reflection.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import net.minecraft.core.Holder; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.MappedRegistry; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.StructureManager; +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 java.util.Objects; + + +public class Reflection { + public static final MappedRegistryProxy MAPPED_REGISTRY; + public static final StructureManagerProxy STRUCTURE_MANAGER; + + public static final ReferenceProxy REFERENCE; + + 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); + } + + + @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); + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/RegistryFetcher.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/RegistryFetcher.java new file mode 100644 index 000000000..f0c776f48 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/RegistryFetcher.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +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.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.structure.StructureSet; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_19_R2.CraftServer; + + +public class RegistryFetcher { + private static Registry getRegistry(ResourceKey> key) { + CraftServer craftserver = (CraftServer) Bukkit.getServer(); + DedicatedServer dedicatedserver = craftserver.getServer(); + return dedicatedserver + .registryAccess() + .registryOrThrow(key); + } + + public static Registry biomeRegistry() { + return getRegistry(Registries.BIOME); + } +} From 6da3acc8a18724af83e9333a2db835d978dfdf43 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 23:49:06 -0700 Subject: [PATCH 064/161] make forge compile --- .../src/main/java/com/dfsek/terra/forge/ForgePlatform.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 a2f26b753..5cf97c381 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 @@ -132,7 +132,7 @@ public class ForgePlatform extends ModPlatform { @Override public Registry dimensionTypeRegistry() { - return ForgeRegistries.DI; + return null; } @Override @@ -142,6 +142,6 @@ public class ForgePlatform extends ModPlatform { @Override public Registry chunkGeneratorSettingsRegistry() { - return Registries.DIM; + return null; } } From 4d826c880c87b0ba448887ca08d43039ca079f25 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 23:49:15 -0700 Subject: [PATCH 065/161] update version to 6.2.2 --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 20122663d..c03a2a5be 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.2.1")) -versionProjects(":common:implementation", version("6.2.1")) -versionProjects(":platforms", version("6.2.1")) +versionProjects(":common:api", version("6.2.2")) +versionProjects(":common:implementation", version("6.2.2")) +versionProjects(":platforms", version("6.2.2")) allprojects { From 46f7c953145aa3db7735a99c96a826646c5b7011 Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 30 Jan 2023 12:57:50 +1100 Subject: [PATCH 066/161] Implement BiomeProvider#getBaseBiome in pipeline v2 --- .../addons/biome/pipeline/v2/PipelineBiomeProvider.java | 6 ++++++ 1 file changed, 6 insertions(+) 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-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java index 9748741a8..6c5b6f289 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-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java @@ -11,6 +11,7 @@ import net.jafama.FastMath; import java.util.Comparator; import java.util.HashSet; +import java.util.Optional; import java.util.Set; import java.util.stream.StreamSupport; @@ -97,6 +98,11 @@ public class PipelineBiomeProvider implements BiomeProvider { return biomes; } + @Override + public Optional getBaseBiome(int x, int z, long seed) { + return Optional.of(getBiome(x, z, seed)); + } + @Override public Column getColumn(int x, int z, long seed, int min, int max) { return new BiomePipelineColumn(this, min, max, x, z, seed); From 606315ea641e5ffe84947c1b743a1d5f07c004a9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 14 Dec 2022 18:28:25 -0700 Subject: [PATCH 067/161] update platform versions to 1.19.3 --- buildSrc/src/main/kotlin/Versions.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 09b2244af..0b101e569 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -4,7 +4,7 @@ object Versions { const val paralithic = "0.7.0" const val strata = "1.1.1" - const val cloud = "1.7.0" + const val cloud = "1.8.0" const val slf4j = "1.7.36" const val log4j_slf4j_impl = "2.14.1" @@ -19,19 +19,19 @@ object Versions { object Fabric { const val fabricLoader = "0.14.8" - const val fabricAPI = "0.57.0+1.19" + const val fabricAPI = "0.69.1+1.19.3" } object Quilt { - const val quiltLoader = "0.17.0" - const val fabricApi = "2.0.0-beta.4+0.57.0-1.19" + const val quiltLoader = "0.17.8" + const val fabricApi = "5.0.0-alpha.5+0.68.1-1.19.3" } object Mod { const val mixin = "0.11.2+mixin.0.8.5" - const val minecraft = "1.19" - const val yarn = "$minecraft+build.1" + const val minecraft = "1.19.3" + const val yarn = "$minecraft+build.3" const val fabricLoader = "0.14.2" const val architecuryLoom = "0.12.0.290" @@ -43,7 +43,7 @@ object Versions { } object Forge { - const val forge = "${Mod.minecraft}-41.0.63" + const val forge = "${Mod.minecraft}-44.0.18" const val burningwave = "12.53.0" } @@ -52,7 +52,7 @@ object Versions { const val paperLib = "1.0.5" const val minecraft = "1.19.2" const val reflectionRemapper = "0.1.0-SNAPSHOT" - const val paperDevBundle = "1.19.2-R0.1-SNAPSHOT" + const val paperDevBundle = "1.19.3-R0.1-SNAPSHOT" } object Sponge { From f6f7529cb518d81b899b2c5b26f6b2038a750571 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 14 Dec 2022 19:14:16 -0700 Subject: [PATCH 068/161] begin working on fabric 1.19.3 --- .../java/com/dfsek/terra/forge/ForgeEntryPoint.java | 2 +- .../java/com/dfsek/terra/forge/util/BiomeUtil.java | 2 +- .../main/java/com/dfsek/terra/mod/ModPlatform.java | 8 +++++--- .../dfsek/terra/mod/config/EntityTypeTemplate.java | 2 +- .../dfsek/terra/mod/config/ProtoPlatformBiome.java | 4 ++-- .../terra/mod/config/VillagerTypeTemplate.java | 2 +- .../main/java/com/dfsek/terra/mod/data/Codecs.java | 7 ++++--- .../generation/MinecraftChunkGeneratorWrapper.java | 2 +- .../terra/mod/generation/TerraBiomeSource.java | 9 +++++---- .../dfsek/terra/mod/handle/MinecraftItemHandle.java | 2 +- .../terra/mod/handle/MinecraftWorldHandle.java | 2 +- .../block/entity/MobSpawnerBlockEntityMixin.java | 2 +- .../terra/block/state/BlockStateMixin.java | 2 +- .../terra/inventory/meta/EnchantmentMixin.java | 5 +++-- .../terra/inventory/meta/ItemStackMetaMixin.java | 2 +- .../mod/mixin/lifecycle/DataPackContentsMixin.java | 10 ++++++---- .../com/dfsek/terra/mod/util/MinecraftUtil.java | 13 ++++++++----- .../java/com/dfsek/terra/mod/util/PresetUtil.java | 2 +- .../main/java/com/dfsek/terra/mod/util/TagUtil.java | 8 ++++---- .../terra/lifecycle/mixin/NoiseConfigMixin.java | 2 +- .../dfsek/terra/lifecycle/mixin/RegistryMixin.java | 2 +- .../com/dfsek/terra/lifecycle/util/BiomeUtil.java | 2 +- .../dfsek/terra/lifecycle/util/RegistryUtil.java | 2 +- 23 files changed, 52 insertions(+), 42 deletions(-) diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java index b342e5a11..8bf758ef7 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java @@ -18,7 +18,7 @@ package com.dfsek.terra.forge; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.IEventBus; 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 177a63f8e..aacae6001 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 @@ -2,7 +2,7 @@ package com.dfsek.terra.forge.util; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.village.VillagerType; import net.minecraftforge.registries.ForgeRegistries; 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 4a6efa188..71a466567 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 @@ -5,13 +5,15 @@ import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; +import net.minecraft.registry.BuiltinRegistries; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.sound.BiomeAdditionsSound; import net.minecraft.sound.BiomeMoodSound; import net.minecraft.sound.MusicSound; import net.minecraft.sound.SoundEvent; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.village.VillagerType; import net.minecraft.world.biome.Biome.Precipitation; import net.minecraft.world.biome.Biome.TemperatureModifier; @@ -92,9 +94,9 @@ public abstract class ModPlatform extends AbstractPlatform { .registerLoader(VillagerType.class, VillagerTypeTemplate::new); } - private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { + private ProtoPlatformBiome parseBiome(DynamicRegistryManager registryManager, String id, DepthTracker tracker) throws LoadException { Identifier identifier = Identifier.tryParse(id); - if(BuiltinRegistries.BIOME.get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. + if(registryManager.get(RegistryKeys.BIOME).get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. return new ProtoPlatformBiome(identifier); } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/EntityTypeTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/EntityTypeTemplate.java index d2e46764d..98af99ec4 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/EntityTypeTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/EntityTypeTemplate.java @@ -5,7 +5,7 @@ import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import net.minecraft.entity.EntityType; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; public class EntityTypeTemplate implements ObjectTemplate> { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java index f9524ef58..080689c3c 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java @@ -17,9 +17,9 @@ package com.dfsek.terra.mod.config; +import net.minecraft.registry.RegistryKey; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryKey; +import net.minecraft.registry.Registry; import net.minecraft.world.biome.Biome; import java.util.Objects; 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 f8cce4832..d807f3b93 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 @@ -4,7 +4,7 @@ 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.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.village.VillagerType; 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 5f5dd615a..9a45d7ebf 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 @@ -2,8 +2,9 @@ package com.dfsek.terra.mod.data; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.util.dynamic.RegistryOps; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryOps; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import com.dfsek.terra.api.config.ConfigPack; @@ -35,7 +36,7 @@ public final class Codecs { id))))); public static final Codec TERRA_BIOME_SOURCE = RecordCodecBuilder - .create(instance -> instance.group(RegistryOps.createRegistryCodec(Registry.BIOME_KEY) + .create(instance -> instance.group(RegistryOps.getEntryCodec(RegistryKeys.BIOME) .fieldOf("biome_registry") .stable() .forGetter(TerraBiomeSource::getBiomeRegistry), 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 5742120d6..739c47b94 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 @@ -27,7 +27,7 @@ import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.random.CheckedRandom; import net.minecraft.util.math.random.ChunkRandom; import net.minecraft.util.math.random.RandomSeed; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.util.registry.RegistryEntry; import net.minecraft.world.ChunkRegion; import net.minecraft.world.HeightLimitView; 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 5730cee80..31e1b0c7f 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 @@ -18,8 +18,9 @@ package com.dfsek.terra.mod.generation; import com.mojang.serialization.Codec; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryEntry; +import net.minecraft.registry.Registry; +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.MultiNoiseSampler; import org.slf4j.Logger; @@ -45,7 +46,7 @@ public class TerraBiomeSource extends BiomeSource { .stream(pack.getBiomeProvider() .getBiomes() .spliterator(), false) - .map(b -> biomes.getOrCreateEntry(((ProtoPlatformBiome) b.getPlatformBiome()).getDelegate()))); + .map(b -> biomes.entryOf(((ProtoPlatformBiome) b.getPlatformBiome()).getDelegate()))); this.biomeRegistry = biomes; this.pack = pack; @@ -58,7 +59,7 @@ 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 noiseSampler) { return biomeRegistry .entryOf(((ProtoPlatformBiome) pack .getBiomeProvider() 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 5d26b6c43..49f8216c5 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 @@ -22,7 +22,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.command.CommandRegistryAccess; import net.minecraft.command.argument.ItemStackArgumentType; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import java.util.Set; import java.util.stream.Collectors; 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 13eef4b2d..81107bfd7 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 @@ -21,7 +21,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.block.Blocks; import net.minecraft.command.argument.BlockArgumentParser; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import org.jetbrains.annotations.NotNull; import com.dfsek.terra.api.block.state.BlockState; 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 f28c27a62..961fd48cd 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 @@ -23,7 +23,7 @@ import net.minecraft.block.entity.BlockEntityType; import net.minecraft.block.entity.MobSpawnerBlockEntity; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.world.MobSpawnerLogic; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Implements; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java index 636a3f721..58f24945b 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java @@ -6,7 +6,7 @@ import com.mojang.serialization.MapCodec; import net.minecraft.block.AbstractBlock.AbstractBlockState; import net.minecraft.block.Block; import net.minecraft.state.State; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Intrinsic; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java index d5394870c..48f3ab53d 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java @@ -18,7 +18,8 @@ package com.dfsek.terra.mod.mixin.implementations.terra.inventory.meta; import net.minecraft.enchantment.Enchantment; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKeys; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @@ -48,6 +49,6 @@ public abstract class EnchantmentMixin { } public String terra$getID() { - return Objects.requireNonNull(Registry.ENCHANTMENT.getId((Enchantment) (Object) this)).toString(); + return Objects.requireNonNull(RegistryKeys.ENCHANTMENT.getId((Enchantment) (Object) this)).toString(); } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java index 39974ed26..2df082068 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java @@ -20,7 +20,7 @@ package com.dfsek.terra.mod.mixin.implementations.terra.inventory.meta; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtList; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Intrinsic; 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 a9ecb9354..5222db0a7 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,8 +1,10 @@ package com.dfsek.terra.mod.mixin.lifecycle; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKeys; import net.minecraft.server.DataPackContents; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -20,9 +22,9 @@ public class DataPackContentsMixin { */ @Inject(method = "refresh(Lnet/minecraft/util/registry/DynamicRegistryManager;)V", at = @At("RETURN")) private void injectReload(DynamicRegistryManager dynamicRegistryManager, CallbackInfo ci) { - TagUtil.registerWorldPresetTags(dynamicRegistryManager.get(Registry.WORLD_PRESET_KEY)); + TagUtil.registerWorldPresetTags(dynamicRegistryManager.get(RegistryKeys.WORLD_PRESET)); - Registry biomeRegistry = dynamicRegistryManager.get(Registry.BIOME_KEY); + Registry biomeRegistry = dynamicRegistryManager.get(RegistryKeys.BIOME); TagUtil.registerBiomeTags(biomeRegistry); MinecraftUtil.registerFlora(biomeRegistry); } 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 69f91e6f6..cae38ca6f 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,11 +3,13 @@ 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.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.registry.Registry; -import net.minecraft.util.registry.RegistryEntry; -import net.minecraft.util.registry.RegistryKey; +import net.minecraft.registry.Registry; import net.minecraft.world.WorldAccess; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Builder; @@ -23,6 +25,7 @@ import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.function.Function; import com.dfsek.terra.api.block.entity.BlockEntity; import com.dfsek.terra.api.block.entity.Container; @@ -46,7 +49,7 @@ public final class MinecraftUtil { public static Optional> getEntry(Registry registry, Identifier identifier) { return registry.getOrEmpty(identifier) .flatMap(registry::getKey) - .map(registry::getOrCreateEntry); + .flatMap(registry::getEntry); } public static BlockEntity createState(WorldAccess worldAccess, BlockPos pos) { @@ -91,7 +94,7 @@ public final class MinecraftUtil { } public static RegistryKey registerKey(Identifier identifier) { - return RegistryKey.of(Registry.BIOME_KEY, identifier); + return RegistryKey.of(RegistryKeys.BIOME, identifier); } public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla, 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 f4fd942c8..e89740ff1 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 @@ -4,7 +4,7 @@ import net.minecraft.structure.StructureSet; import net.minecraft.util.Identifier; import net.minecraft.util.math.noise.DoublePerlinNoiseSampler.NoiseParameters; import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.util.registry.RegistryEntry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.MultiNoiseBiomeSource; 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 8edf50afc..81289fdfb 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,10 +1,10 @@ package com.dfsek.terra.mod.util; import com.google.common.collect.ImmutableMap; -import net.minecraft.tag.TagKey; -import net.minecraft.tag.WorldPresetTags; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryEntry; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.Registry; +import net.minecraft.registry.tag.TagKey; +import net.minecraft.registry.tag.WorldPresetTags; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.WorldPreset; import org.slf4j.Logger; diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java index 2793aa500..504a6709e 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java @@ -1,7 +1,7 @@ package com.dfsek.terra.lifecycle.mixin; import net.minecraft.util.math.noise.DoublePerlinNoiseSampler; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.noise.NoiseConfig; diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java index 8e2c12c70..31fdccb2a 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java @@ -1,6 +1,6 @@ package com.dfsek.terra.lifecycle.mixin; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; 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/BiomeUtil.java index f0d3e06e6..4e55edb38 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/BiomeUtil.java @@ -2,7 +2,7 @@ package com.dfsek.terra.lifecycle.util; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.village.VillagerType; import org.slf4j.Logger; 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 9f17b89e3..1a6568453 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 @@ -1,7 +1,7 @@ package com.dfsek.terra.lifecycle.util; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registry; import com.dfsek.terra.mod.data.Codecs; From ef846d53ad8528697250a0ee8c71a22aef466c6f Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 20:05:17 -0700 Subject: [PATCH 069/161] update MinecraftChunkGeneratorWrapper and its codec --- .../java/com/dfsek/terra/mod/data/Codecs.java | 8 ++------ .../MinecraftChunkGeneratorWrapper.java | 20 ++++++++----------- .../com/dfsek/terra/mod/util/PresetUtil.java | 2 +- 3 files changed, 11 insertions(+), 19 deletions(-) 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 9a45d7ebf..4c467bc90 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 @@ -2,7 +2,6 @@ package com.dfsek.terra.mod.data; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryOps; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; @@ -48,10 +47,6 @@ public final class Codecs { public static final Codec MINECRAFT_CHUNK_GENERATOR_WRAPPER = RecordCodecBuilder .create( instance -> instance.group( - RegistryOps.createRegistryCodec(Registry.STRUCTURE_SET_KEY) - .fieldOf("structure_registry") - .stable() - .forGetter(MinecraftChunkGeneratorWrapper::getNoiseRegistry), TERRA_BIOME_SOURCE.fieldOf("biome_source") .stable() .forGetter(MinecraftChunkGeneratorWrapper::getBiomeSource), @@ -61,6 +56,7 @@ public final class Codecs { ChunkGeneratorSettings.REGISTRY_CODEC.fieldOf("settings") .stable() .forGetter(MinecraftChunkGeneratorWrapper::getSettings) - ).apply(instance, instance.stable(MinecraftChunkGeneratorWrapper::new)) + ).apply(instance, instance.stable( + MinecraftChunkGeneratorWrapper::new)) ); } 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 739c47b94..75fd4f498 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 @@ -17,9 +17,12 @@ package com.dfsek.terra.mod.generation; +import com.dfsek.terra.mod.util.SeedHack; + import com.mojang.serialization.Codec; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.structure.StructureSet; import net.minecraft.util.Util; import net.minecraft.util.math.BlockPos; @@ -28,7 +31,6 @@ import net.minecraft.util.math.random.CheckedRandom; import net.minecraft.util.math.random.ChunkRandom; import net.minecraft.util.math.random.RandomSeed; import net.minecraft.registry.Registry; -import net.minecraft.util.registry.RegistryEntry; import net.minecraft.world.ChunkRegion; import net.minecraft.world.HeightLimitView; import net.minecraft.world.Heightmap.Type; @@ -71,15 +73,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 Registry noiseRegistry; private final RegistryEntry settings; private ChunkGenerator delegate; private ConfigPack pack; - public MinecraftChunkGeneratorWrapper(Registry noiseRegistry, TerraBiomeSource biomeSource, ConfigPack configPack, + public MinecraftChunkGeneratorWrapper(TerraBiomeSource biomeSource, ConfigPack configPack, RegistryEntry settingsSupplier) { - super(noiseRegistry, Optional.empty(), biomeSource); - this.noiseRegistry = noiseRegistry; + super(biomeSource); this.pack = configPack; this.settings = settingsSupplier; @@ -88,10 +88,6 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun this.biomeSource = biomeSource; } - public Registry getNoiseRegistry() { - return noiseRegistry; - } - @Override protected Codec getCodec() { return Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER; @@ -137,7 +133,7 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun private void beard(StructureAccessor structureAccessor, Chunk chunk, WorldProperties world, BiomeProvider biomeProvider, PreLoadCompatibilityOptions compatibilityOptions) { - StructureWeightSampler structureWeightSampler = StructureWeightSampler.method_42695(structureAccessor, chunk.getPos()); + StructureWeightSampler structureWeightSampler = StructureWeightSampler.createStructureWeightSampler(structureAccessor, chunk.getPos()); double threshold = compatibilityOptions.getBeardThreshold(); double airThreshold = compatibilityOptions.getAirThreshold(); int xi = chunk.getPos().x << 4; @@ -185,7 +181,7 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun @Override public int getHeight(int x, int z, Type heightmap, HeightLimitView height, NoiseConfig noiseConfig) { - WorldProperties properties = MinecraftAdapter.adapt(height, noiseConfig.getLegacyWorldSeed()); + 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--) { @@ -199,7 +195,7 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun @Override public VerticalBlockSample getColumnSample(int x, int z, HeightLimitView height, NoiseConfig noiseConfig) { BlockState[] array = new BlockState[height.getHeight()]; - WorldProperties properties = MinecraftAdapter.adapt(height, noiseConfig.getLegacyWorldSeed()); + WorldProperties properties = MinecraftAdapter.adapt(height, SeedHack.getSeed(noiseConfig.getMultiNoiseSampler())); BiomeProvider biomeProvider = pack.getBiomeProvider(); for(int y = height.getTopY() - 1; y >= height.getBottomY(); y--) { array[y - height.getBottomY()] = (BlockState) delegate.getBlock(properties, x, y, z, biomeProvider); 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 e89740ff1..067401adc 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 @@ -68,7 +68,7 @@ public class PresetUtil { PRESETS.add(generatorID); TerraBiomeSource biomeSource = new TerraBiomeSource(biomeRegistry, pack); - ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(structureSetRegistry, biomeSource, pack, overworld); + ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(biomeSource, pack, overworld); DimensionOptions dimensionOptions = new DimensionOptions(overworldDimensionType, generator); WorldPreset preset = new WorldPreset( From 228b26f7c46c7ecb1a73731192e8092683f8aa63 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:03:00 -0700 Subject: [PATCH 070/161] more work on evil update --- .../com/dfsek/terra/forge/ForgePlatform.java | 9 +++- .../java/com/dfsek/terra/mod/ModPlatform.java | 8 +++- .../mixin/access/VillagerTypeAccessor.java | 2 +- .../com/dfsek/terra/mod/util/PresetUtil.java | 8 +++- .../terra/lifecycle/LifecyclePlatform.java | 23 ++++++++++- .../mixin/lifecycle/SaveLoadingMixin.java | 29 +++++++++++++ .../client/MinecraftClientMixin.java | 41 ------------------- .../lifecycle/server/ServerMainMixin.java | 40 ------------------ .../dfsek/terra/lifecycle/util/BiomeUtil.java | 24 ++++++----- .../terra/lifecycle/util/LifecycleUtil.java | 13 ++++-- .../resources/terra.lifecycle.mixins.json | 3 +- 11 files changed, 95 insertions(+), 105 deletions(-) create mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java delete mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/client/MinecraftClientMixin.java delete mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/server/ServerMainMixin.java 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 2d8b51c9a..86afe0ed3 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 @@ -21,6 +21,8 @@ import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import ca.solostudios.strata.version.Version; import net.minecraft.MinecraftVersion; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; import net.minecraft.server.MinecraftServer; import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.server.ServerLifecycleHooks; @@ -86,7 +88,7 @@ public class ForgePlatform extends ModPlatform { super.platformAddon().forEach(addons::add); - String mcVersion = MinecraftVersion.CURRENT.getReleaseTarget(); + String mcVersion = MinecraftVersion.CURRENT.getName(); try { addons.add(new EphemeralAddon(Versions.parseVersion(mcVersion), "minecraft")); } catch(ParseException e) { @@ -122,4 +124,9 @@ public class ForgePlatform extends ModPlatform { public BaseAddon getPlatformAddon() { return new ForgeAddon(this); } + + @Override + public Registry getMinecraftRegistry(RegistryKey key) { + return null; + } } 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 71a466567..74ef880b9 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 @@ -7,6 +7,8 @@ import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; import net.minecraft.registry.BuiltinRegistries; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.sound.BiomeAdditionsSound; @@ -94,9 +96,9 @@ public abstract class ModPlatform extends AbstractPlatform { .registerLoader(VillagerType.class, VillagerTypeTemplate::new); } - private ProtoPlatformBiome parseBiome(DynamicRegistryManager registryManager, String id, DepthTracker tracker) throws LoadException { + private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { Identifier identifier = Identifier.tryParse(id); - if(registryManager.get(RegistryKeys.BIOME).get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. + if(getMinecraftRegistry(RegistryKeys.BIOME).get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. return new ProtoPlatformBiome(identifier); } @@ -107,6 +109,8 @@ public abstract class ModPlatform extends AbstractPlatform { protected abstract BaseAddon getPlatformAddon(); + public abstract Registry getMinecraftRegistry(RegistryKey> key); + @Override public @NotNull WorldHandle getWorldHandle() { return worldHandle; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/VillagerTypeAccessor.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/VillagerTypeAccessor.java index 477c0647b..68ae33e35 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/VillagerTypeAccessor.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/VillagerTypeAccessor.java @@ -1,6 +1,6 @@ package com.dfsek.terra.mod.mixin.access; -import net.minecraft.util.registry.RegistryKey; +import net.minecraft.registry.RegistryKey; import net.minecraft.village.VillagerType; import net.minecraft.world.biome.Biome; import org.spongepowered.asm.mixin.Mixin; 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 067401adc..b90b6d46a 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,5 +1,8 @@ package com.dfsek.terra.mod.util; +import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.registry.BuiltinRegistries; +import net.minecraft.registry.RegistryKeys; import net.minecraft.structure.StructureSet; import net.minecraft.util.Identifier; import net.minecraft.util.math.noise.DoublePerlinNoiseSampler.NoiseParameters; @@ -30,12 +33,15 @@ 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<>(); public static Pair createDefault(ConfigPack pack) { - Registry dimensionTypeRegistry = BuiltinRegistries.DIMENSION_TYPE; + + + Registry dimensionTypeRegistry = access.; Registry chunkGeneratorSettingsRegistry = BuiltinRegistries.CHUNK_GENERATOR_SETTINGS; Registry structureSetRegistry = BuiltinRegistries.STRUCTURE_SET; Registry noiseParametersRegistry = BuiltinRegistries.NOISE_PARAMETERS; 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 f218380d7..bbe2908ea 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,6 +3,9 @@ package com.dfsek.terra.lifecycle; import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import net.minecraft.MinecraftVersion; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; import net.minecraft.server.MinecraftServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,6 +13,8 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; import com.dfsek.terra.addon.EphemeralAddon; import com.dfsek.terra.api.addon.BaseAddon; @@ -23,6 +28,8 @@ public abstract class LifecyclePlatform extends ModPlatform { private static final Logger LOGGER = LoggerFactory.getLogger(LifecyclePlatform.class); private static MinecraftServer server; + private static final AtomicReference DYNAMIC_REGISTRY_MANAGER = new AtomicReference<>(); + public LifecyclePlatform() { CommonPlatform.initialize(this); load(); @@ -49,7 +56,7 @@ public abstract class LifecyclePlatform extends ModPlatform { LOGGER.warn("Failed to execute reload", throwable); return null; }).join(); - BiomeUtil.registerBiomes(); + BiomeUtil.registerBiomes(DYNAMIC_REGISTRY_MANAGER.get()); server.getWorlds().forEach(world -> { if(world.getChunkManager().getChunkGenerator() instanceof MinecraftChunkGeneratorWrapper chunkGeneratorWrapper) { getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).ifPresent(pack -> { @@ -62,13 +69,20 @@ public abstract class LifecyclePlatform extends ModPlatform { return succeed; } + public static void addRegistryManager(DynamicRegistryManager in) { + if(DYNAMIC_REGISTRY_MANAGER.get() == null) { + DYNAMIC_REGISTRY_MANAGER.set(Objects.requireNonNull(in)); + } + throw new IllegalStateException("Already set!"); + } + @Override protected Iterable platformAddon() { List addons = new ArrayList<>(); super.platformAddon().forEach(addons::add); - String mcVersion = MinecraftVersion.CURRENT.getReleaseTarget(); + String mcVersion = MinecraftVersion.CURRENT.getName(); try { addons.add(new EphemeralAddon(Versions.parseVersion(mcVersion), "minecraft")); } catch(ParseException e) { @@ -84,5 +98,10 @@ public abstract class LifecyclePlatform extends ModPlatform { return addons; } + @Override + public Registry getMinecraftRegistry(RegistryKey> key) { + return DYNAMIC_REGISTRY_MANAGER.get().get(key); + } + protected abstract Collection getPlatformMods(); } 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 new file mode 100644 index 000000000..7e86ac154 --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.lifecycle.mixin.lifecycle; + +import com.dfsek.terra.lifecycle.util.LifecycleUtil; + +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.server.SaveLoading; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + + +@Mixin(SaveLoading.class) +public class SaveLoadingMixin { + @ModifyArg( + method = "method_42097(Lnet/minecraft/registry/DynamicRegistryManager$Immutable;" + + "Lnet/minecraft/server/SaveLoading$SaveApplierFactory;Lnet/minecraft/resource/LifecycledResourceManager;" + + "Lnet/minecraft/registry/CombinedDynamicRegistries;Lnet/minecraft/server/SaveLoading$LoadContext;" + + "Lnet/minecraft/server/DataPackContents;)Ljava/lang/Object;", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/DataPackContents;refresh(Lnet/minecraft/registry/DynamicRegistryManager;)V" + ), + index = 0 + ) + private DynamicRegistryManager redirect(DynamicRegistryManager in) { + LifecycleUtil.initialize(in); + return in; + } +} diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/client/MinecraftClientMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/client/MinecraftClientMixin.java deleted file mode 100644 index 30f092786..000000000 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/client/MinecraftClientMixin.java +++ /dev/null @@ -1,41 +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.lifecycle.mixin.lifecycle.client; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.RunArgs; -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 com.dfsek.terra.lifecycle.util.LifecycleUtil; - - -@Mixin(MinecraftClient.class) -public class MinecraftClientMixin { - @Inject(method = "", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/util/WindowProvider;createWindow" + - "(Lnet/minecraft/client/WindowSettings;Ljava/lang/String;Ljava/lang/String;)" + - "Lnet/minecraft/client/util/Window;", - // sorta arbitrary position, after mod init, before window opens - shift = At.Shift.BEFORE)) - public void injectConstructor(RunArgs args, CallbackInfo callbackInfo) { - LifecycleUtil.initialize(); - } -} diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/server/ServerMainMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/server/ServerMainMixin.java deleted file mode 100644 index e2e52bd2a..000000000 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/server/ServerMainMixin.java +++ /dev/null @@ -1,40 +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.lifecycle.mixin.lifecycle.server; - -import net.minecraft.server.Main; -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 com.dfsek.terra.lifecycle.util.LifecycleUtil; - - -@Mixin(Main.class) -public class ServerMainMixin { - @Inject(method = "main([Ljava/lang/String;)V", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/resource/ResourcePackManager;(Lnet/minecraft/resource/ResourceType;" + - "[Lnet/minecraft/resource/ResourcePackProvider;)V") - // after registry manager creation - ) - private static void injectConstructor(String[] args, CallbackInfo ci) { - LifecycleUtil.initialize(); - } -} 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/BiomeUtil.java index 4e55edb38..9ac4da738 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/BiomeUtil.java @@ -1,9 +1,10 @@ package com.dfsek.terra.lifecycle.util; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.registry.Registry; -import net.minecraft.util.registry.RegistryKey; import net.minecraft.village.VillagerType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,13 +30,14 @@ public final class BiomeUtil { } - public static void registerBiomes() { + public static void registerBiomes(DynamicRegistryManager registryManager) { + Registry biomeRegistry = registryManager.get(RegistryKeys.BIOME); logger.info("Registering biomes..."); CommonPlatform.get().getConfigRegistry().forEach(pack -> { // Register all Terra biomes. pack.getCheckedRegistry(Biome.class) - .forEach((id, biome) -> registerBiome(biome, pack, id)); + .forEach((id, biome) -> registerBiome(biome, pack, id, biomeRegistry)); }); - MinecraftUtil.registerFlora(BuiltinRegistries.BIOME); + MinecraftUtil.registerFlora(biomeRegistry); logger.info("Terra biomes registered."); } @@ -46,8 +48,8 @@ public final class BiomeUtil { * @param pack The ConfigPack this biome belongs to. */ private static void registerBiome(Biome biome, ConfigPack pack, - com.dfsek.terra.api.registry.key.RegistryKey id) { - Registry registry = BuiltinRegistries.BIOME; + com.dfsek.terra.api.registry.key.RegistryKey id, + Registry registry) { RegistryKey vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(registry); @@ -56,7 +58,7 @@ public final class BiomeUtil { } else { VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); - net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, registry.get(vanilla), + net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, Objects.requireNonNull(registry.get(vanilla)), vanillaBiomeProperties); Identifier identifier = new Identifier("terra", MinecraftUtil.createBiomeID(pack, id)); @@ -67,15 +69,15 @@ public final class BiomeUtil { .getKey() .orElseThrow()); } else { - ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(BuiltinRegistries.add(registry, + ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(Registry.registerReference(registry, MinecraftUtil.registerKey(identifier) .getValue(), minecraftBiome).getKey().orElseThrow()); } - Map villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap(); + Map, VillagerType> villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap(); - villagerMap.put(RegistryKey.of(Registry.BIOME_KEY, identifier), + villagerMap.put(RegistryKey.of(RegistryKeys.BIOME, identifier), Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), villagerMap.getOrDefault(vanilla, VillagerType.PLAINS))); 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 498de58aa..1d0fbd7d6 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 @@ -1,6 +1,10 @@ package com.dfsek.terra.lifecycle.util; -import net.minecraft.util.registry.BuiltinRegistries; +import com.dfsek.terra.lifecycle.LifecyclePlatform; + +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKeys; import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; import com.dfsek.terra.mod.CommonPlatform; @@ -11,9 +15,10 @@ public final class LifecycleUtil { } - public static void initialize() { + public static void initialize(DynamicRegistryManager registryManager) { + LifecyclePlatform.addRegistryManager(registryManager); CommonPlatform.get().getEventManager().callEvent(new PlatformInitializationEvent()); - BiomeUtil.registerBiomes(); - CommonPlatform.get().registerWorldTypes((id, preset) -> BuiltinRegistries.add(BuiltinRegistries.WORLD_PRESET, id, preset)); + BiomeUtil.registerBiomes(registryManager); + CommonPlatform.get().registerWorldTypes((id, preset) -> Registry.register(registryManager.get(RegistryKeys.WORLD_PRESET), id, preset)); } } 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 7ec5e4d95..6d01c7ced 100644 --- a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -6,13 +6,12 @@ "mixins": [ "NoiseConfigMixin", "RegistryMixin", + "lifecycle.SaveLoadingMixin", "lifecycle.MinecraftServerMixin" ], "client": [ - "lifecycle.client.MinecraftClientMixin" ], "server": [ - "lifecycle.server.ServerMainMixin" ], "injectors": { "defaultRequire": 1 From 4e4627d11d8428616db1373e7d2224419d751b44 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:39:18 -0700 Subject: [PATCH 071/161] update minecraft data config templates --- .../java/com/dfsek/terra/mod/ModPlatform.java | 9 +-- .../config/BiomeAdditionsSoundTemplate.java | 3 +- .../mod/config/BiomeMoodSoundTemplate.java | 3 +- .../config/BiomeParticleConfigTemplate.java | 3 +- .../terra/mod/config/EntityTypeTemplate.java | 3 +- .../terra/mod/config/MusicSoundTemplate.java | 3 +- .../terra/mod/config/SoundEventTemplate.java | 4 +- .../mod/config/VillagerTypeTemplate.java | 3 +- .../terra/mod/handle/MinecraftItemHandle.java | 15 +++-- .../mod/handle/MinecraftWorldHandle.java | 5 +- .../entity/MobSpawnerBlockEntityMixin.java | 9 ++- .../terra/block/state/BlockStateMixin.java | 3 +- .../inventory/meta/EnchantmentMixin.java | 3 +- .../inventory/meta/ItemStackMetaMixin.java | 3 +- .../lifecycle/DataPackContentsMixin.java | 2 +- .../dfsek/terra/mod/util/MinecraftUtil.java | 2 +- .../com/dfsek/terra/mod/util/PresetUtil.java | 58 +++++++++---------- .../terra/lifecycle/LifecyclePlatform.java | 6 +- 18 files changed, 74 insertions(+), 63 deletions(-) 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 74ef880b9..4fbd61b06 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 @@ -5,10 +5,7 @@ import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; -import net.minecraft.registry.BuiltinRegistries; import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.sound.BiomeAdditionsSound; @@ -61,7 +58,7 @@ public abstract class ModPlatform extends AbstractPlatform { public void registerWorldTypes(BiConsumer registerFunction) { getRawConfigRegistry() - .forEach(pack -> PresetUtil.createDefault(pack).apply(registerFunction)); + .forEach(pack -> PresetUtil.createDefault(pack, getMinecraftRegistry()).apply(registerFunction)); } @Override @@ -98,7 +95,7 @@ public abstract class ModPlatform extends AbstractPlatform { private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { Identifier identifier = Identifier.tryParse(id); - if(getMinecraftRegistry(RegistryKeys.BIOME).get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. + if(getMinecraftRegistry().get(RegistryKeys.BIOME).get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. return new ProtoPlatformBiome(identifier); } @@ -109,7 +106,7 @@ public abstract class ModPlatform extends AbstractPlatform { protected abstract BaseAddon getPlatformAddon(); - public abstract Registry getMinecraftRegistry(RegistryKey> key); + public abstract DynamicRegistryManager getMinecraftRegistry(); @Override public @NotNull WorldHandle getWorldHandle() { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeAdditionsSoundTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeAdditionsSoundTemplate.java index e9d4a2038..4a66cf6e5 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeAdditionsSoundTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeAdditionsSoundTemplate.java @@ -3,6 +3,7 @@ package com.dfsek.terra.mod.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.minecraft.registry.Registries; import net.minecraft.sound.BiomeAdditionsSound; import net.minecraft.sound.SoundEvent; @@ -21,7 +22,7 @@ public class BiomeAdditionsSoundTemplate implements ObjectTemplate { if(sound == null || soundCultivationTicks == null || soundSpawnRange == null || soundExtraDistance == null) { return null; } else { - return new BiomeMoodSound(sound, soundCultivationTicks, soundSpawnRange, soundExtraDistance); + return new BiomeMoodSound(Registries.SOUND_EVENT.getEntry(sound), soundCultivationTicks, soundSpawnRange, soundExtraDistance); } } } 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 538a80870..a48ec5c54 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 @@ -6,6 +6,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.command.argument.ParticleEffectArgumentType; +import net.minecraft.registry.Registries; import net.minecraft.world.biome.BiomeParticleConfig; @@ -25,7 +26,7 @@ public class BiomeParticleConfigTemplate implements ObjectTemplate> { @Override public EntityType get() { - return Registry.ENTITY_TYPE.get(id); + return Registries.ENTITY_TYPE.get(id); } } 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 17745a9af..b9f563621 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 @@ -3,6 +3,7 @@ package com.dfsek.terra.mod.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.minecraft.registry.Registries; import net.minecraft.sound.MusicSound; import net.minecraft.sound.SoundEvent; @@ -29,7 +30,7 @@ public class MusicSoundTemplate implements ObjectTemplate { if(sound == null || minDelay == null || maxDelay == null || replaceCurrentMusic == null) { return null; } else { - return new MusicSound(sound, minDelay, maxDelay, replaceCurrentMusic); + return new MusicSound(Registries.SOUND_EVENT.getEntry(sound), minDelay, maxDelay, replaceCurrentMusic); } } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SoundEventTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SoundEventTemplate.java index 5e87dc21a..b5b7fe079 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SoundEventTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SoundEventTemplate.java @@ -21,9 +21,9 @@ public class SoundEventTemplate implements ObjectTemplate { if(id == null) { return null; } else if(distanceToTravel == null) { - return new SoundEvent(id); + return SoundEvent.of(id); } else { - return new SoundEvent(id, distanceToTravel); + return SoundEvent.of(id, distanceToTravel); } } } 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 d807f3b93..9aaf3362b 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java @@ -3,6 +3,7 @@ package com.dfsek.terra.mod.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import net.minecraft.registry.Registry; import net.minecraft.village.VillagerType; @@ -15,6 +16,6 @@ public class VillagerTypeTemplate implements ObjectTemplate { @Override public VillagerType get() { - return Registry.VILLAGER_TYPE.get(id); + return Registries.VILLAGER_TYPE.get(id); } } 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 49f8216c5..66582857a 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 @@ -21,6 +21,9 @@ import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.command.CommandRegistryAccess; import net.minecraft.command.argument.ItemStackArgumentType; +import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryWrapper; import net.minecraft.util.Identifier; import net.minecraft.registry.Registry; @@ -38,8 +41,12 @@ public class MinecraftItemHandle implements ItemHandle { @Override public Item createItem(String data) { try { - return (Item) new ItemStackArgumentType(new CommandRegistryAccess( - CommonPlatform.get().getServer().getRegistryManager())).parse(new StringReader(data)).getItem(); + return (Item) new ItemStackArgumentType(new CommandRegistryAccess() { + @Override + public RegistryWrapper createWrapper(RegistryKey> registryRef) { + return CommonPlatform.get().getServer().getRegistryManager().getWrapperOrThrow(registryRef); + } + }).parse(new StringReader(data)).getItem(); } catch(CommandSyntaxException e) { throw new IllegalArgumentException("Invalid item data \"" + data + "\"", e); } @@ -47,11 +54,11 @@ public class MinecraftItemHandle implements ItemHandle { @Override public Enchantment getEnchantment(String id) { - return (Enchantment) (Registry.ENCHANTMENT.get(Identifier.tryParse(id))); + return (Enchantment) (Registries.ENCHANTMENT.get(Identifier.tryParse(id))); } @Override public Set getEnchantments() { - return Registry.ENCHANTMENT.stream().map(enchantment -> (Enchantment) enchantment).collect(Collectors.toSet()); + return Registries.ENCHANTMENT.stream().map(enchantment -> (Enchantment) enchantment).collect(Collectors.toSet()); } } 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 81107bfd7..aabc38471 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 @@ -20,6 +20,7 @@ package com.dfsek.terra.mod.handle; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.block.Blocks; import net.minecraft.command.argument.BlockArgumentParser; +import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import net.minecraft.registry.Registry; import org.jetbrains.annotations.NotNull; @@ -36,7 +37,7 @@ public class MinecraftWorldHandle implements WorldHandle { @Override public @NotNull BlockState createBlockState(@NotNull String data) { try { - net.minecraft.block.BlockState state = BlockArgumentParser.block(Registry.BLOCK, data, true).blockState(); + net.minecraft.block.BlockState state = BlockArgumentParser.block(Registries.BLOCK.getReadOnlyWrapper(), data, true).blockState(); if(state == null) throw new IllegalArgumentException("Invalid data: " + data); return (BlockState) state; } catch(CommandSyntaxException e) { @@ -53,6 +54,6 @@ public class MinecraftWorldHandle implements WorldHandle { public @NotNull EntityType getEntity(@NotNull String id) { Identifier identifier = Identifier.tryParse(id); if(identifier == null) identifier = Identifier.tryParse(id); - return (EntityType) Registry.ENTITY_TYPE.get(identifier); + return (EntityType) Registries.ENTITY_TYPE.get(identifier); } } 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 961fd48cd..95fe9154c 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 @@ -21,9 +21,11 @@ import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.block.entity.MobSpawnerBlockEntity; +import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.registry.Registry; +import net.minecraft.util.math.random.Random; import net.minecraft.world.MobSpawnerLogic; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Implements; @@ -48,13 +50,16 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity { @Shadow public abstract MobSpawnerLogic getLogic(); + @Shadow + public abstract void setEntityType(net.minecraft.entity.EntityType entityType, Random random); + public EntityType terra$getSpawnedType() { - return (EntityType) Registry.ENTITY_TYPE.get( + return (EntityType) Registries.ENTITY_TYPE.get( Identifier.tryParse(((MobSpawnerLogicAccessor) getLogic()).getSpawnEntry().getNbt().getString("id"))); } public void terra$setSpawnedType(@NotNull EntityType creatureType) { - getLogic().setEntityId((net.minecraft.entity.EntityType) creatureType); + setEntityType((net.minecraft.entity.EntityType) creatureType, world.getRandom()); } public int terra$getDelay() { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java index 58f24945b..2ec3cf649 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java @@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableMap; import com.mojang.serialization.MapCodec; import net.minecraft.block.AbstractBlock.AbstractBlockState; import net.minecraft.block.Block; +import net.minecraft.registry.Registries; import net.minecraft.state.State; import net.minecraft.registry.Registry; import org.spongepowered.asm.mixin.Implements; @@ -66,7 +67,7 @@ public abstract class BlockStateMixin extends State { NbtCompound eTag = (NbtCompound) enchantment; - map.put((Enchantment) Registry.ENCHANTMENT.get(eTag.getInt("id")), eTag.getInt("lvl")); + map.put((Enchantment) Registries.ENCHANTMENT.get(eTag.getInt("id")), eTag.getInt("lvl")); }); return map; } 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 5222db0a7..d4a27e750 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 @@ -20,7 +20,7 @@ public class DataPackContentsMixin { /* * #refresh populates all tags in the registries */ - @Inject(method = "refresh(Lnet/minecraft/util/registry/DynamicRegistryManager;)V", at = @At("RETURN")) + @Inject(method = "refresh(Lnet/minecraft/registry/DynamicRegistryManager;)V", at = @At("RETURN")) private void injectReload(DynamicRegistryManager dynamicRegistryManager, CallbackInfo ci) { TagUtil.registerWorldPresetTags(dynamicRegistryManager.get(RegistryKeys.WORLD_PRESET)); 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 cae38ca6f..53f406adc 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 @@ -134,7 +134,7 @@ public final class MinecraftUtil { if(vanillaBiomeProperties.getLoopSound() == null) { vanilla.getEffects().getLoopSound().ifPresent(effects::loopSound); } else { - effects.loopSound(vanillaBiomeProperties.getLoopSound()); + effects.loopSound(Registries.SOUND_EVENT.getEntry(vanillaBiomeProperties.getLoopSound())); } if(vanillaBiomeProperties.getMoodSound() == null) { 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 b90b6d46a..b1f50f8ba 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,14 +1,10 @@ package com.dfsek.terra.mod.util; -import net.minecraft.command.CommandRegistryAccess; -import net.minecraft.registry.BuiltinRegistries; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.structure.StructureSet; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.noise.DoublePerlinNoiseSampler.NoiseParameters; -import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registry; -import net.minecraft.util.registry.RegistryEntry; +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.TheEndBiomeSource; @@ -33,40 +29,38 @@ 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<>(); - public static Pair createDefault(ConfigPack pack) { + public static Pair createDefault(ConfigPack pack, DynamicRegistryManager registryManager) { + Registry dimensionTypeRegistry = registryManager.get(RegistryKeys.DIMENSION_TYPE); + Registry chunkGeneratorSettingsRegistry = registryManager.get(RegistryKeys.CHUNK_GENERATOR_SETTINGS); + Registry biomeRegistry = registryManager.get(RegistryKeys.BIOME); - - Registry dimensionTypeRegistry = access.; - Registry chunkGeneratorSettingsRegistry = BuiltinRegistries.CHUNK_GENERATOR_SETTINGS; - Registry structureSetRegistry = BuiltinRegistries.STRUCTURE_SET; - Registry noiseParametersRegistry = BuiltinRegistries.NOISE_PARAMETERS; - Registry biomeRegistry = BuiltinRegistries.BIOME; - - RegistryEntry theNetherDimensionType = dimensionTypeRegistry.getOrCreateEntry(DimensionTypes.THE_NETHER); + RegistryEntry theNetherDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow(); RegistryEntry - netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getOrCreateEntry(ChunkGeneratorSettings.NETHER); + netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER).orElseThrow(); DimensionOptions netherDimensionOptions = new DimensionOptions(theNetherDimensionType, - new NoiseChunkGenerator(structureSetRegistry, - noiseParametersRegistry, - MultiNoiseBiomeSource.Preset.NETHER.getBiomeSource( - biomeRegistry), - netherChunkGeneratorSettings)); - RegistryEntry theEndDimensionType = dimensionTypeRegistry.getOrCreateEntry(DimensionTypes.THE_END); - RegistryEntry endChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getOrCreateEntry( - ChunkGeneratorSettings.END); + new NoiseChunkGenerator( + MultiNoiseBiomeSource.Preset.NETHER.getBiomeSource( + registryManager.createRegistryLookup() + .getOrThrow(RegistryKeys.BIOME)), + netherChunkGeneratorSettings)); + RegistryEntry theEndDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_END).orElseThrow(); + RegistryEntry endChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry( + ChunkGeneratorSettings.END).orElseThrow(); DimensionOptions endDimensionOptions = new DimensionOptions(theEndDimensionType, - new NoiseChunkGenerator(structureSetRegistry, noiseParametersRegistry, - new TheEndBiomeSource(biomeRegistry), - endChunkGeneratorSettings)); + new NoiseChunkGenerator( + TheEndBiomeSource.createVanilla( + registryManager.createRegistryLookup() + .getOrThrow(RegistryKeys.BIOME)), + endChunkGeneratorSettings)); - RegistryEntry overworldDimensionType = dimensionTypeRegistry.getOrCreateEntry(DimensionTypes.OVERWORLD); + RegistryEntry overworldDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.OVERWORLD).orElseThrow(); - RegistryEntry overworld = chunkGeneratorSettingsRegistry.getOrCreateEntry(ChunkGeneratorSettings.OVERWORLD); + RegistryEntry overworld = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.OVERWORLD) + .orElseThrow(); Identifier generatorID = Identifier.of("terra", pack.getID().toLowerCase(Locale.ROOT) + "/" + pack.getNamespace().toLowerCase( Locale.ROOT)); 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 bbe2908ea..b7916378a 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 @@ -4,8 +4,6 @@ import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import net.minecraft.MinecraftVersion; import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; import net.minecraft.server.MinecraftServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -99,8 +97,8 @@ public abstract class LifecyclePlatform extends ModPlatform { } @Override - public Registry getMinecraftRegistry(RegistryKey> key) { - return DYNAMIC_REGISTRY_MANAGER.get().get(key); + public DynamicRegistryManager getMinecraftRegistry() { + return DYNAMIC_REGISTRY_MANAGER.get(); } protected abstract Collection getPlatformMods(); From 0006762ff38633581a5e75260b213c4262930ddf Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:44:06 -0700 Subject: [PATCH 072/161] update platform biome delegate logic --- .../terra/mod/config/ProtoPlatformBiome.java | 7 ++++--- .../java/com/dfsek/terra/mod/data/Codecs.java | 5 +---- .../terra/mod/generation/TerraBiomeSource.java | 16 ++++------------ .../com/dfsek/terra/mod/util/PresetUtil.java | 2 +- .../dfsek/terra/lifecycle/util/BiomeUtil.java | 6 ++---- 5 files changed, 12 insertions(+), 24 deletions(-) diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java index 080689c3c..60cf1effa 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java @@ -18,6 +18,7 @@ package com.dfsek.terra.mod.config; import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.Identifier; import net.minecraft.registry.Registry; import net.minecraft.world.biome.Biome; @@ -31,7 +32,7 @@ import com.dfsek.terra.mod.util.MinecraftUtil; public class ProtoPlatformBiome implements PlatformBiome { private final Identifier identifier; - private RegistryKey delegate; + private RegistryEntry delegate; public ProtoPlatformBiome(Identifier identifier) { this.identifier = identifier; @@ -46,11 +47,11 @@ public class ProtoPlatformBiome implements PlatformBiome { return identifier; } - public RegistryKey getDelegate() { + public RegistryEntry getDelegate() { return delegate; } - public void setDelegate(RegistryKey delegate) { + public void setDelegate(RegistryEntry delegate) { this.delegate = Objects.requireNonNull(delegate); } } 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 4c467bc90..890e3e2b5 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 @@ -35,10 +35,7 @@ public final class Codecs { id))))); public static final Codec TERRA_BIOME_SOURCE = RecordCodecBuilder - .create(instance -> instance.group(RegistryOps.getEntryCodec(RegistryKeys.BIOME) - .fieldOf("biome_registry") - .stable() - .forGetter(TerraBiomeSource::getBiomeRegistry), + .create(instance -> instance.group( CONFIG_PACK.fieldOf("pack") .stable() .forGetter(TerraBiomeSource::getPack)) 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 31e1b0c7f..7ab085780 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 @@ -38,16 +38,14 @@ import com.dfsek.terra.mod.util.SeedHack; public class TerraBiomeSource extends BiomeSource { private static final Logger LOGGER = LoggerFactory.getLogger(TerraBiomeSource.class); - private final Registry biomeRegistry; private ConfigPack pack; - public TerraBiomeSource(Registry biomes, ConfigPack pack) { + public TerraBiomeSource(ConfigPack pack) { super(StreamSupport .stream(pack.getBiomeProvider() .getBiomes() .spliterator(), false) - .map(b -> biomes.entryOf(((ProtoPlatformBiome) b.getPlatformBiome()).getDelegate()))); - this.biomeRegistry = biomes; + .map(b -> ((ProtoPlatformBiome) b.getPlatformBiome()).getDelegate())); this.pack = pack; LOGGER.debug("Biomes: " + getBiomes()); @@ -60,22 +58,16 @@ public class TerraBiomeSource extends BiomeSource { @Override public RegistryEntry getBiome(int biomeX, int biomeY, int biomeZ, MultiNoiseSampler noiseSampler) { - return biomeRegistry - .entryOf(((ProtoPlatformBiome) pack + return ((ProtoPlatformBiome) pack .getBiomeProvider() .getBiome(biomeX << 2, biomeY << 2, biomeZ << 2, SeedHack.getSeed(noiseSampler)) - .getPlatformBiome()).getDelegate() - ); + .getPlatformBiome()).getDelegate(); } public BiomeProvider getProvider() { return pack.getBiomeProvider(); } - public Registry getBiomeRegistry() { - return biomeRegistry; - } - public ConfigPack getPack() { return pack; } 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 b1f50f8ba..bbe9c78f2 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 @@ -67,7 +67,7 @@ public class PresetUtil { PRESETS.add(generatorID); - TerraBiomeSource biomeSource = new TerraBiomeSource(biomeRegistry, pack); + TerraBiomeSource biomeSource = new TerraBiomeSource(pack); ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(biomeSource, pack, overworld); DimensionOptions dimensionOptions = new DimensionOptions(overworldDimensionType, generator); 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/BiomeUtil.java index 9ac4da738..b01e4d808 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/BiomeUtil.java @@ -54,7 +54,7 @@ public final class BiomeUtil { if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) { - ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(vanilla); + ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(registry.getEntry(vanilla).orElseThrow()); } else { VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); @@ -65,14 +65,12 @@ public final class BiomeUtil { if(registry.containsId(identifier)) { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(MinecraftUtil.getEntry(registry, identifier) - .orElseThrow() - .getKey() .orElseThrow()); } else { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(Registry.registerReference(registry, MinecraftUtil.registerKey(identifier) .getValue(), - minecraftBiome).getKey().orElseThrow()); + minecraftBiome)); } Map, VillagerType> villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap(); From e7efdd61a64721170ab8ecb8516a835d91ed4f6b Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:44:53 -0700 Subject: [PATCH 073/161] fabric compiles now --- .../java/com/dfsek/terra/lifecycle/util/RegistryUtil.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 1a6568453..6c6ee4ad6 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 @@ -1,5 +1,6 @@ package com.dfsek.terra.lifecycle.util; +import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import net.minecraft.registry.Registry; @@ -12,7 +13,7 @@ public final class RegistryUtil { } public static void register() { - Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER); - Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE); + Registry.register(Registries.CHUNK_GENERATOR, new Identifier("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER); + Registry.register(Registries.BIOME_SOURCE, new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE); } } From 51cd4cd4b7f2048d3e7d3294f85e868212d94ef0 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:46:57 -0700 Subject: [PATCH 074/161] fix RegistryMixin target class --- .../java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java index 31fdccb2a..a2d516931 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java @@ -1,5 +1,6 @@ package com.dfsek.terra.lifecycle.mixin; +import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -9,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.dfsek.terra.lifecycle.util.RegistryUtil; -@Mixin(Registry.class) +@Mixin(Registries.class) public class RegistryMixin { @Inject(method = "", at = @At("RETURN")) private static void registerTerraGenerators(CallbackInfo ci) { From cd65785de46724ce37e960a94d25a3465066b2af Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:49:59 -0700 Subject: [PATCH 075/161] fix SaveLoadingMixin --- .../dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7e86ac154..cc3c63339 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 @@ -22,7 +22,7 @@ public class SaveLoadingMixin { ), index = 0 ) - private DynamicRegistryManager redirect(DynamicRegistryManager in) { + private static DynamicRegistryManager grabManager(DynamicRegistryManager in) { LifecycleUtil.initialize(in); return in; } From 4a918d00a3c83a92972395656627526671c52c8b Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:53:10 -0700 Subject: [PATCH 076/161] allow registry manager to be overwritten --- .../java/com/dfsek/terra/lifecycle/LifecyclePlatform.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 b7916378a..5ff1387a3 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 @@ -68,10 +68,7 @@ public abstract class LifecyclePlatform extends ModPlatform { } public static void addRegistryManager(DynamicRegistryManager in) { - if(DYNAMIC_REGISTRY_MANAGER.get() == null) { - DYNAMIC_REGISTRY_MANAGER.set(Objects.requireNonNull(in)); - } - throw new IllegalStateException("Already set!"); + DYNAMIC_REGISTRY_MANAGER.set(Objects.requireNonNull(in)); } @Override From ae96d8f526804545b36d588e081cfba94d4fd796 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 18 Dec 2022 22:54:30 -0700 Subject: [PATCH 077/161] fix inject parameters in NoiseConfigMixin --- .../com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java index 504a6709e..e8091826a 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java @@ -1,5 +1,6 @@ package com.dfsek.terra.lifecycle.mixin; +import net.minecraft.registry.RegistryEntryLookup; import net.minecraft.util.math.noise.DoublePerlinNoiseSampler; import net.minecraft.registry.Registry; import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; @@ -24,10 +25,10 @@ public class NoiseConfigMixin { @Final private MultiNoiseSampler multiNoiseSampler; - @Inject(method = "(Lnet/minecraft/world/gen/chunk/ChunkGeneratorSettings;Lnet/minecraft/util/registry/Registry;J)V", + @Inject(method = "(Lnet/minecraft/world/gen/chunk/ChunkGeneratorSettings;Lnet/minecraft/registry/RegistryEntryLookup;J)V", at = @At("TAIL")) - private void mapMultiNoise(ChunkGeneratorSettings chunkGeneratorSettings, - Registry noiseRegistry, long seed, CallbackInfo ci) { + private void mapMultiNoise(ChunkGeneratorSettings chunkGeneratorSettings, RegistryEntryLookup noiseParametersLookup, long seed, + CallbackInfo ci) { SeedHack.register(multiNoiseSampler, seed); } } From 4bb09b126ad82cb7eeafece410335c2579bb929a Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 19 Dec 2022 01:27:35 -0700 Subject: [PATCH 078/161] continue registry wrangling --- .../java/com/dfsek/terra/mod/ModPlatform.java | 12 +++- .../com/dfsek/terra/mod/util/PresetUtil.java | 17 +++-- .../terra/lifecycle/LifecyclePlatform.java | 32 +++++++-- .../mixin/lifecycle/RegistryLoaderMixin.java | 65 +++++++++++++++++++ .../mixin/lifecycle/SaveLoadingMixin.java | 29 --------- .../dfsek/terra/lifecycle/util/BiomeUtil.java | 3 +- .../terra/lifecycle/util/LifecycleUtil.java | 11 ++-- .../resources/terra.lifecycle.mixins.json | 24 +++---- 8 files changed, 127 insertions(+), 66 deletions(-) create mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java delete mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java 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 4fbd61b06..9f26738b1 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 @@ -6,6 +6,7 @@ import com.dfsek.tectonic.api.exception.LoadException; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.sound.BiomeAdditionsSound; @@ -14,13 +15,16 @@ import net.minecraft.sound.MusicSound; import net.minecraft.sound.SoundEvent; import net.minecraft.util.Identifier; import net.minecraft.village.VillagerType; +import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Precipitation; import net.minecraft.world.biome.Biome.TemperatureModifier; import net.minecraft.world.biome.BiomeEffects.GrassColorModifier; import net.minecraft.world.biome.BiomeParticleConfig; import net.minecraft.world.biome.SpawnSettings; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; +import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.WorldPreset; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -58,7 +62,7 @@ public abstract class ModPlatform extends AbstractPlatform { public void registerWorldTypes(BiConsumer registerFunction) { getRawConfigRegistry() - .forEach(pack -> PresetUtil.createDefault(pack, getMinecraftRegistry()).apply(registerFunction)); + .forEach(pack -> PresetUtil.createDefault(pack, this).apply(registerFunction)); } @Override @@ -95,7 +99,7 @@ public abstract class ModPlatform extends AbstractPlatform { private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { Identifier identifier = Identifier.tryParse(id); - if(getMinecraftRegistry().get(RegistryKeys.BIOME).get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. + if(!biomeRegistry().containsId(identifier)) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. return new ProtoPlatformBiome(identifier); } @@ -106,7 +110,9 @@ public abstract class ModPlatform extends AbstractPlatform { protected abstract BaseAddon getPlatformAddon(); - public abstract DynamicRegistryManager getMinecraftRegistry(); + public abstract Registry dimensionTypeRegistry(); + public abstract Registry biomeRegistry(); + public abstract Registry chunkGeneratorSettingsRegistry(); @Override public @NotNull WorldHandle getWorldHandle() { 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 bbe9c78f2..5c7e8ce3d 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,5 +1,7 @@ package com.dfsek.terra.mod.util; +import com.dfsek.terra.mod.ModPlatform; + import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; @@ -33,19 +35,17 @@ public class PresetUtil { private static final Logger LOGGER = LoggerFactory.getLogger(PresetUtil.class); private static final List PRESETS = new ArrayList<>(); - public static Pair createDefault(ConfigPack pack, DynamicRegistryManager registryManager) { - Registry dimensionTypeRegistry = registryManager.get(RegistryKeys.DIMENSION_TYPE); - Registry chunkGeneratorSettingsRegistry = registryManager.get(RegistryKeys.CHUNK_GENERATOR_SETTINGS); - Registry biomeRegistry = registryManager.get(RegistryKeys.BIOME); - + public static Pair createDefault(ConfigPack pack, ModPlatform platform) { + Registry dimensionTypeRegistry = platform.dimensionTypeRegistry(); + Registry chunkGeneratorSettingsRegistry = platform.chunkGeneratorSettingsRegistry(); + RegistryEntry theNetherDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow(); RegistryEntry netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER).orElseThrow(); DimensionOptions netherDimensionOptions = new DimensionOptions(theNetherDimensionType, new NoiseChunkGenerator( MultiNoiseBiomeSource.Preset.NETHER.getBiomeSource( - registryManager.createRegistryLookup() - .getOrThrow(RegistryKeys.BIOME)), + platform.biomeRegistry().getReadOnlyWrapper()), netherChunkGeneratorSettings)); RegistryEntry theEndDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_END).orElseThrow(); RegistryEntry endChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry( @@ -53,8 +53,7 @@ public class PresetUtil { DimensionOptions endDimensionOptions = new DimensionOptions(theEndDimensionType, new NoiseChunkGenerator( TheEndBiomeSource.createVanilla( - registryManager.createRegistryLookup() - .getOrThrow(RegistryKeys.BIOME)), + platform.biomeRegistry().getReadOnlyWrapper()), endChunkGeneratorSettings)); RegistryEntry overworldDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.OVERWORLD).orElseThrow(); 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 5ff1387a3..8efe9562c 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 @@ -4,7 +4,11 @@ import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import net.minecraft.MinecraftVersion; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registry; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,7 +20,6 @@ import java.util.concurrent.atomic.AtomicReference; import com.dfsek.terra.addon.EphemeralAddon; import com.dfsek.terra.api.addon.BaseAddon; -import com.dfsek.terra.lifecycle.util.BiomeUtil; import com.dfsek.terra.mod.CommonPlatform; import com.dfsek.terra.mod.ModPlatform; import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; @@ -26,7 +29,9 @@ public abstract class LifecyclePlatform extends ModPlatform { private static final Logger LOGGER = LoggerFactory.getLogger(LifecyclePlatform.class); private static MinecraftServer server; - private static final AtomicReference DYNAMIC_REGISTRY_MANAGER = new AtomicReference<>(); + private static final AtomicReference> BIOMES = new AtomicReference<>(); + private static final AtomicReference> DIMENSIONS = new AtomicReference<>(); + private static final AtomicReference> SETTINGS = new AtomicReference<>(); public LifecyclePlatform() { CommonPlatform.initialize(this); @@ -54,7 +59,6 @@ public abstract class LifecyclePlatform extends ModPlatform { LOGGER.warn("Failed to execute reload", throwable); return null; }).join(); - BiomeUtil.registerBiomes(DYNAMIC_REGISTRY_MANAGER.get()); server.getWorlds().forEach(world -> { if(world.getChunkManager().getChunkGenerator() instanceof MinecraftChunkGeneratorWrapper chunkGeneratorWrapper) { getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).ifPresent(pack -> { @@ -67,8 +71,12 @@ public abstract class LifecyclePlatform extends ModPlatform { return succeed; } - public static void addRegistryManager(DynamicRegistryManager in) { - DYNAMIC_REGISTRY_MANAGER.set(Objects.requireNonNull(in)); + public static void setRegistries(Registry biomeRegistry, + Registry dimensionTypeRegistry, + Registry chunkGeneratorSettingsRegistry) { + BIOMES.set(biomeRegistry); + DIMENSIONS.set(dimensionTypeRegistry); + SETTINGS.set(chunkGeneratorSettingsRegistry); } @Override @@ -94,8 +102,18 @@ public abstract class LifecyclePlatform extends ModPlatform { } @Override - public DynamicRegistryManager getMinecraftRegistry() { - return DYNAMIC_REGISTRY_MANAGER.get(); + public Registry dimensionTypeRegistry() { + return DIMENSIONS.get(); + } + + @Override + public Registry biomeRegistry() { + return BIOMES.get(); + } + + @Override + public Registry chunkGeneratorSettingsRegistry() { + return SETTINGS.get(); } protected abstract Collection getPlatformMods(); 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 new file mode 100644 index 000000000..14a466dd4 --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java @@ -0,0 +1,65 @@ +package com.dfsek.terra.lifecycle.mixin.lifecycle; + +import com.dfsek.terra.lifecycle.LifecyclePlatform; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.registry.MutableRegistry; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryLoader; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.WorldPreset; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; +import org.checkerframework.checker.units.qual.C; +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.function.Consumer; + +import com.dfsek.terra.lifecycle.util.LifecycleUtil; + + +@Mixin(RegistryLoader.class) +public class RegistryLoaderMixin { + @SuppressWarnings("unchecked") + @Redirect( + method = "load(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)" + + "Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", + at = @At( + value = "INVOKE", + target = "Ljava/util/List;forEach(Ljava/util/function/Consumer;)V", + ordinal = 1 // we want right after the first forEach + ) + ) + private static void grabManager(List, Object>> instance, Consumer, Object>> consumer) { + MutableRegistry biomeMutableRegistry = (MutableRegistry) + instance.stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(RegistryKeys.BIOME)) + .findFirst() + .orElseThrow(); + MutableRegistry worldPresetMutableRegistry = (MutableRegistry) + instance.stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(RegistryKeys.WORLD_PRESET)) + .findFirst() + .orElseThrow(); + MutableRegistry dimensionTypeMutableRegistry = (MutableRegistry) + instance.stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(RegistryKeys.DIMENSION_TYPE)) + .findFirst() + .orElseThrow(); + MutableRegistry chunkGeneratorSettingsMutableRegistry = (MutableRegistry) + instance.stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(RegistryKeys.CHUNK_GENERATOR_SETTINGS)) + .findFirst() + .orElseThrow(); + LifecyclePlatform.setRegistries(biomeMutableRegistry, dimensionTypeMutableRegistry, chunkGeneratorSettingsMutableRegistry); + LifecycleUtil.initialize(biomeMutableRegistry, worldPresetMutableRegistry); + instance.forEach(consumer); + } +} 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 deleted file mode 100644 index cc3c63339..000000000 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.dfsek.terra.lifecycle.mixin.lifecycle; - -import com.dfsek.terra.lifecycle.util.LifecycleUtil; - -import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.server.SaveLoading; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; - - -@Mixin(SaveLoading.class) -public class SaveLoadingMixin { - @ModifyArg( - method = "method_42097(Lnet/minecraft/registry/DynamicRegistryManager$Immutable;" + - "Lnet/minecraft/server/SaveLoading$SaveApplierFactory;Lnet/minecraft/resource/LifecycledResourceManager;" + - "Lnet/minecraft/registry/CombinedDynamicRegistries;Lnet/minecraft/server/SaveLoading$LoadContext;" + - "Lnet/minecraft/server/DataPackContents;)Ljava/lang/Object;", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/server/DataPackContents;refresh(Lnet/minecraft/registry/DynamicRegistryManager;)V" - ), - index = 0 - ) - private static DynamicRegistryManager grabManager(DynamicRegistryManager in) { - LifecycleUtil.initialize(in); - return in; - } -} 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/BiomeUtil.java index b01e4d808..633434a97 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/BiomeUtil.java @@ -30,8 +30,7 @@ public final class BiomeUtil { } - public static void registerBiomes(DynamicRegistryManager registryManager) { - Registry biomeRegistry = registryManager.get(RegistryKeys.BIOME); + public static void registerBiomes(Registry biomeRegistry) { logger.info("Registering biomes..."); CommonPlatform.get().getConfigRegistry().forEach(pack -> { // Register all Terra biomes. pack.getCheckedRegistry(Biome.class) 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 1d0fbd7d6..70291458b 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 @@ -3,22 +3,25 @@ package com.dfsek.terra.lifecycle.util; import com.dfsek.terra.lifecycle.LifecyclePlatform; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.MutableRegistry; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; import com.dfsek.terra.mod.CommonPlatform; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.WorldPreset; + public final class LifecycleUtil { private LifecycleUtil() { } - public static void initialize(DynamicRegistryManager registryManager) { - LifecyclePlatform.addRegistryManager(registryManager); + public static void initialize(MutableRegistry biomeMutableRegistry, MutableRegistry worldPresetMutableRegistry) { CommonPlatform.get().getEventManager().callEvent(new PlatformInitializationEvent()); - BiomeUtil.registerBiomes(registryManager); - CommonPlatform.get().registerWorldTypes((id, preset) -> Registry.register(registryManager.get(RegistryKeys.WORLD_PRESET), id, preset)); + BiomeUtil.registerBiomes(biomeMutableRegistry); + CommonPlatform.get().registerWorldTypes((id, preset) -> Registry.register(worldPresetMutableRegistry, id, preset)); } } 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 6d01c7ced..afc8050c2 100644 --- a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -1,20 +1,20 @@ { - "required": true, - "minVersion": "0.8", - "package": "com.dfsek.terra.lifecycle.mixin", - "compatibilityLevel": "JAVA_17", - "mixins": [ + "required" : true, + "minVersion" : "0.8", + "package" : "com.dfsek.terra.lifecycle.mixin", + "compatibilityLevel" : "JAVA_17", + "mixins" : [ "NoiseConfigMixin", "RegistryMixin", - "lifecycle.SaveLoadingMixin", - "lifecycle.MinecraftServerMixin" + "lifecycle.MinecraftServerMixin", + "lifecycle.RegistryLoaderMixin" ], - "client": [ + "client" : [ ], - "server": [ + "server" : [ ], - "injectors": { - "defaultRequire": 1 + "injectors" : { + "defaultRequire" : 1 }, - "refmap": "terra.lifecycle.refmap.json" + "refmap" : "terra.lifecycle.refmap.json" } \ No newline at end of file From 57bb6bca941e9bfce296bee230256f2de241faad Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 14:41:43 -0700 Subject: [PATCH 079/161] evil registry hacks --- .../mixin/RegistryEntryReferenceInvoker.java | 13 ++++++ .../lifecycle/mixin/SimpleRegistryMixin.java | 28 +++++++++++++ .../mixin/lifecycle/RegistryLoaderMixin.java | 40 +++++++------------ .../terra/lifecycle/util/RegistryHack.java | 5 +++ .../resources/terra.lifecycle.mixins.json | 2 + 5 files changed, 62 insertions(+), 26 deletions(-) create mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryEntryReferenceInvoker.java create mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/SimpleRegistryMixin.java create mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryHack.java diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryEntryReferenceInvoker.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryEntryReferenceInvoker.java new file mode 100644 index 000000000..d84b643cb --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryEntryReferenceInvoker.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.lifecycle.mixin; + + +import net.minecraft.registry.entry.RegistryEntry.Reference; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + + +@Mixin(Reference.class) +public interface RegistryEntryReferenceInvoker { + @Invoker("setValue") + void invokeSetValue(T value); +} diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/SimpleRegistryMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/SimpleRegistryMixin.java new file mode 100644 index 000000000..2da9f317d --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/SimpleRegistryMixin.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.lifecycle.mixin; + +import com.dfsek.terra.lifecycle.util.RegistryHack; + +import net.minecraft.registry.SimpleRegistry; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.entry.RegistryEntry.Reference; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; + + +@Mixin(SimpleRegistry.class) +public class SimpleRegistryMixin implements RegistryHack { + @Shadow + @Final + private Map> valueToEntry; + + @Override + public void terra_bind() { + valueToEntry.forEach((value, entry) -> { + //noinspection unchecked + ((RegistryEntryReferenceInvoker) entry).invokeSetValue(value); + }); + } +} 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 14a466dd4..d11095d8a 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 @@ -2,6 +2,8 @@ package com.dfsek.terra.lifecycle.mixin.lifecycle; import com.dfsek.terra.lifecycle.LifecyclePlatform; +import com.dfsek.terra.lifecycle.util.RegistryHack; + import com.mojang.datafixers.util.Pair; import net.minecraft.registry.MutableRegistry; import net.minecraft.registry.RegistryKeys; @@ -34,32 +36,18 @@ public class RegistryLoaderMixin { ) ) private static void grabManager(List, Object>> instance, Consumer, Object>> consumer) { - MutableRegistry biomeMutableRegistry = (MutableRegistry) - instance.stream() - .map(Pair::getFirst) - .filter(r -> r.getKey().equals(RegistryKeys.BIOME)) - .findFirst() - .orElseThrow(); - MutableRegistry worldPresetMutableRegistry = (MutableRegistry) - instance.stream() - .map(Pair::getFirst) - .filter(r -> r.getKey().equals(RegistryKeys.WORLD_PRESET)) - .findFirst() - .orElseThrow(); - MutableRegistry dimensionTypeMutableRegistry = (MutableRegistry) - instance.stream() - .map(Pair::getFirst) - .filter(r -> r.getKey().equals(RegistryKeys.DIMENSION_TYPE)) - .findFirst() - .orElseThrow(); - MutableRegistry chunkGeneratorSettingsMutableRegistry = (MutableRegistry) - instance.stream() - .map(Pair::getFirst) - .filter(r -> r.getKey().equals(RegistryKeys.CHUNK_GENERATOR_SETTINGS)) - .findFirst() - .orElseThrow(); - LifecyclePlatform.setRegistries(biomeMutableRegistry, dimensionTypeMutableRegistry, chunkGeneratorSettingsMutableRegistry); - LifecycleUtil.initialize(biomeMutableRegistry, worldPresetMutableRegistry); + + //LifecyclePlatform.setRegistries(biomeMutableRegistry, dimensionTypeMutableRegistry, chunkGeneratorSettingsMutableRegistry); + //LifecycleUtil.initialize(biomeMutableRegistry, worldPresetMutableRegistry); + instance.forEach(mutableRegistryObjectPair -> { + System.out.println(mutableRegistryObjectPair.getFirst()); + System.out.println(mutableRegistryObjectPair.getFirst().size()); + if(mutableRegistryObjectPair.getFirst().getKey().equals(RegistryKeys.BIOME)) { + ((RegistryHack) mutableRegistryObjectPair.getFirst()).terra_bind(); + System.out.println("BIOMES: " + mutableRegistryObjectPair.getFirst().stream().toList()); + } + //System.out.println(mutableRegistryObjectPair.getFirst().stream().toList()); + }); instance.forEach(consumer); } } diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryHack.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryHack.java new file mode 100644 index 000000000..347a13bfa --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryHack.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.lifecycle.util; + +public interface RegistryHack { + void terra_bind(); +} 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 afc8050c2..101cead1c 100644 --- a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -5,7 +5,9 @@ "compatibilityLevel" : "JAVA_17", "mixins" : [ "NoiseConfigMixin", + "RegistryEntryReferenceInvoker", "RegistryMixin", + "SimpleRegistryMixin", "lifecycle.MinecraftServerMixin", "lifecycle.RegistryLoaderMixin" ], From ba2f24f1f592d6a66e2e04cc959ffe4bf32fa1a8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 21:14:38 -0700 Subject: [PATCH 080/161] 1.19.3 launch and enter world --- .../com/dfsek/terra/mod/util/PresetUtil.java | 3 +- .../mixin/lifecycle/RegistryLoaderMixin.java | 36 ++++++++++++++----- .../dfsek/terra/lifecycle/util/BiomeUtil.java | 1 - 3 files changed, 30 insertions(+), 10 deletions(-) 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 5c7e8ce3d..5bf790dfa 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 @@ -3,6 +3,7 @@ package com.dfsek.terra.mod.util; import com.dfsek.terra.mod.ModPlatform; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; @@ -38,7 +39,7 @@ public class PresetUtil { public static Pair createDefault(ConfigPack pack, ModPlatform platform) { Registry dimensionTypeRegistry = platform.dimensionTypeRegistry(); Registry chunkGeneratorSettingsRegistry = platform.chunkGeneratorSettingsRegistry(); - + RegistryEntry theNetherDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow(); RegistryEntry netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER).orElseThrow(); 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 d11095d8a..a891f056c 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 @@ -6,6 +6,8 @@ import com.dfsek.terra.lifecycle.util.RegistryHack; import com.mojang.datafixers.util.Pair; import net.minecraft.registry.MutableRegistry; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryLoader; import net.minecraft.world.biome.Biome; @@ -18,6 +20,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; import com.dfsek.terra.lifecycle.util.LifecycleUtil; @@ -36,18 +39,35 @@ public class RegistryLoaderMixin { ) ) private static void grabManager(List, Object>> instance, Consumer, Object>> consumer) { - - //LifecyclePlatform.setRegistries(biomeMutableRegistry, dimensionTypeMutableRegistry, chunkGeneratorSettingsMutableRegistry); - //LifecycleUtil.initialize(biomeMutableRegistry, worldPresetMutableRegistry); instance.forEach(mutableRegistryObjectPair -> { System.out.println(mutableRegistryObjectPair.getFirst()); System.out.println(mutableRegistryObjectPair.getFirst().size()); - if(mutableRegistryObjectPair.getFirst().getKey().equals(RegistryKeys.BIOME)) { - ((RegistryHack) mutableRegistryObjectPair.getFirst()).terra_bind(); - System.out.println("BIOMES: " + mutableRegistryObjectPair.getFirst().stream().toList()); - } - //System.out.println(mutableRegistryObjectPair.getFirst().stream().toList()); + }); + extractRegistry(instance, RegistryKeys.BIOME).ifPresent(biomes -> { // this redirect triggers twice, second time only with dimension registry. dont try extraction second time + MutableRegistry dimensionTypes = extractRegistry(instance, RegistryKeys.DIMENSION_TYPE).orElseThrow(); + MutableRegistry worldPresets = extractRegistry(instance, RegistryKeys.WORLD_PRESET).orElseThrow(); + MutableRegistry chunkGeneratorSettings = extractRegistry(instance, RegistryKeys.CHUNK_GENERATOR_SETTINGS).orElseThrow(); + + LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings); + LifecycleUtil.initialize(biomes, worldPresets); }); instance.forEach(consumer); } + + @SuppressWarnings("unchecked") + private static Optional> extractRegistry(List, Object>> instance, RegistryKey> key) { + List> matches = instance + .stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(key)) + .toList(); + if(matches.size() > 1) { + throw new IllegalStateException("Illegal number of registries returned: " + matches); + } else if(matches.isEmpty()) { + return Optional.empty(); + } + MutableRegistry registry = (MutableRegistry) matches.get(0); + ((RegistryHack) registry).terra_bind(); + return Optional.of(registry); + } } 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/BiomeUtil.java index 633434a97..0eadea7f4 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/BiomeUtil.java @@ -36,7 +36,6 @@ public final class BiomeUtil { pack.getCheckedRegistry(Biome.class) .forEach((id, biome) -> registerBiome(biome, pack, id, biomeRegistry)); }); - MinecraftUtil.registerFlora(biomeRegistry); logger.info("Terra biomes registered."); } From caad76f6dd183d7b123a7a42b1b8bd7a6b419e13 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 21:34:44 -0700 Subject: [PATCH 081/161] add mixin to inject flora --- .../mixin/lifecycle/RegistryLoaderMixin.java | 2 +- .../mixin/lifecycle/SaveLoadingMixin.java | 32 +++++++++++++++ .../resources/terra.lifecycle.mixins.json | 41 ++++++++++--------- 3 files changed, 54 insertions(+), 21 deletions(-) create mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java 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 a891f056c..cb33c527a 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 @@ -17,6 +17,7 @@ import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.checkerframework.checker.units.qual.C; 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.Redirect; import java.util.List; @@ -28,7 +29,6 @@ import com.dfsek.terra.lifecycle.util.LifecycleUtil; @Mixin(RegistryLoader.class) public class RegistryLoaderMixin { - @SuppressWarnings("unchecked") @Redirect( method = "load(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)" + "Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", 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 new file mode 100644 index 000000000..260d3c4a2 --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.lifecycle.mixin.lifecycle; + +import com.dfsek.terra.lifecycle.util.LifecycleUtil; + +import com.dfsek.terra.mod.util.MinecraftUtil; + +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.server.SaveLoading; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + + +@Mixin(SaveLoading.class) +public class SaveLoadingMixin { + @ModifyArg( + method = "method_42097(Lnet/minecraft/registry/DynamicRegistryManager$Immutable;" + + "Lnet/minecraft/server/SaveLoading$SaveApplierFactory;Lnet/minecraft/resource/LifecycledResourceManager;" + + "Lnet/minecraft/registry/CombinedDynamicRegistries;Lnet/minecraft/server/SaveLoading$LoadContext;" + + "Lnet/minecraft/server/DataPackContents;)Ljava/lang/Object;", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/DataPackContents;refresh(Lnet/minecraft/registry/DynamicRegistryManager;)V" + ), + index = 0 + ) + private static DynamicRegistryManager grabManager(DynamicRegistryManager in) { + MinecraftUtil.registerFlora(in.get(RegistryKeys.BIOME)); + return in; + } +} 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 101cead1c..bf42757a4 100644 --- a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -1,22 +1,23 @@ { - "required" : true, - "minVersion" : "0.8", - "package" : "com.dfsek.terra.lifecycle.mixin", - "compatibilityLevel" : "JAVA_17", - "mixins" : [ - "NoiseConfigMixin", - "RegistryEntryReferenceInvoker", - "RegistryMixin", - "SimpleRegistryMixin", - "lifecycle.MinecraftServerMixin", - "lifecycle.RegistryLoaderMixin" - ], - "client" : [ - ], - "server" : [ - ], - "injectors" : { - "defaultRequire" : 1 - }, - "refmap" : "terra.lifecycle.refmap.json" + "required": true, + "minVersion": "0.8", + "package": "com.dfsek.terra.lifecycle.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "NoiseConfigMixin", + "RegistryEntryReferenceInvoker", + "RegistryMixin", + "SimpleRegistryMixin", + "lifecycle.MinecraftServerMixin", + "lifecycle.RegistryLoaderMixin", + "lifecycle.SaveLoadingMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "terra.lifecycle.refmap.json" } \ No newline at end of file From 7ea5747f8ed8a58bb3c0e88d933aa97814039b57 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 21:38:40 -0700 Subject: [PATCH 082/161] clean up sysout logging --- .../mixin/lifecycle/RegistryLoaderMixin.java | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) 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 cb33c527a..98f601b83 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 @@ -15,7 +15,10 @@ import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.WorldPreset; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.checkerframework.checker.units.qual.C; +import org.slf4j.Logger; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; @@ -29,6 +32,10 @@ import com.dfsek.terra.lifecycle.util.LifecycleUtil; @Mixin(RegistryLoader.class) public class RegistryLoaderMixin { + @Shadow + @Final + private static Logger LOGGER; + @Redirect( method = "load(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)" + "Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", @@ -39,23 +46,26 @@ public class RegistryLoaderMixin { ) ) private static void grabManager(List, Object>> instance, Consumer, Object>> consumer) { - instance.forEach(mutableRegistryObjectPair -> { - System.out.println(mutableRegistryObjectPair.getFirst()); - System.out.println(mutableRegistryObjectPair.getFirst().size()); - }); - extractRegistry(instance, RegistryKeys.BIOME).ifPresent(biomes -> { // this redirect triggers twice, second time only with dimension registry. dont try extraction second time - MutableRegistry dimensionTypes = extractRegistry(instance, RegistryKeys.DIMENSION_TYPE).orElseThrow(); - MutableRegistry worldPresets = extractRegistry(instance, RegistryKeys.WORLD_PRESET).orElseThrow(); - MutableRegistry chunkGeneratorSettings = extractRegistry(instance, RegistryKeys.CHUNK_GENERATOR_SETTINGS).orElseThrow(); - - LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings); - LifecycleUtil.initialize(biomes, worldPresets); - }); + instance.forEach(mutableRegistryObjectPair -> LOGGER.debug("{}: {} entries", + mutableRegistryObjectPair.getFirst().toString(), + mutableRegistryObjectPair.getFirst().size()) + ); + extractRegistry(instance, RegistryKeys.BIOME).ifPresent( + biomes -> { // this redirect triggers twice, second time only with dimension registry. don't try extraction second time + MutableRegistry dimensionTypes = extractRegistry(instance, RegistryKeys.DIMENSION_TYPE).orElseThrow(); + MutableRegistry worldPresets = extractRegistry(instance, RegistryKeys.WORLD_PRESET).orElseThrow(); + MutableRegistry chunkGeneratorSettings = extractRegistry(instance, + RegistryKeys.CHUNK_GENERATOR_SETTINGS).orElseThrow(); + + LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings); + LifecycleUtil.initialize(biomes, worldPresets); + }); instance.forEach(consumer); } @SuppressWarnings("unchecked") - private static Optional> extractRegistry(List, Object>> instance, RegistryKey> key) { + private static Optional> extractRegistry(List, Object>> instance, + RegistryKey> key) { List> matches = instance .stream() .map(Pair::getFirst) From 4df23e464b0045e30a462254f25814d045846a1d Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 21:59:39 -0700 Subject: [PATCH 083/161] begin working on Forge --- .../dfsek/terra/forge/ForgeEntryPoint.java | 7 +++-- .../com/dfsek/terra/forge/ForgePlatform.java | 17 ++++++++++- .../mixin/lifecycle/NoiseConfigMixin.java | 30 ++++++++----------- .../com/dfsek/terra/forge/util/BiomeUtil.java | 24 +++++++-------- .../terra/mod/config/ProtoPlatformBiome.java | 2 +- 5 files changed, 44 insertions(+), 36 deletions(-) diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java index 8bf758ef7..36446a08d 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java @@ -17,6 +17,7 @@ package com.dfsek.terra.forge; +import net.minecraft.registry.RegistryKeys; import net.minecraft.util.Identifier; import net.minecraft.registry.Registry; import net.minecraft.world.biome.Biome; @@ -71,12 +72,12 @@ public class ForgeEntryPoint { public void registerBiomes(RegisterEvent event) { event.register(Keys.BLOCKS, helper -> sanityCheck.progress(RegistryStep.BLOCK, () -> logger.debug("Block registration detected."))); event.register(Keys.BIOMES, helper -> sanityCheck.progress(RegistryStep.BIOME, () -> initialize(helper))); - event.register(Registry.WORLD_PRESET_KEY, + event.register(RegistryKeys.WORLD_PRESET, helper -> sanityCheck.progress(RegistryStep.WORLD_TYPE, () -> TERRA_PLUGIN.registerWorldTypes(helper::register))); - event.register(Registry.CHUNK_GENERATOR_KEY, + event.register(RegistryKeys.CHUNK_GENERATOR, helper -> helper.register(new Identifier("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER)); - event.register(Registry.BIOME_SOURCE_KEY, helper -> helper.register(new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE)); + event.register(RegistryKeys.BIOME_SOURCE, helper -> helper.register(new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE)); } } 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 86afe0ed3..a2f26b753 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 @@ -21,10 +21,15 @@ import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import ca.solostudios.strata.version.Version; import net.minecraft.MinecraftVersion; +import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; @@ -126,7 +131,17 @@ public class ForgePlatform extends ModPlatform { } @Override - public Registry getMinecraftRegistry(RegistryKey key) { + public Registry dimensionTypeRegistry() { + return ForgeRegistries.DI; + } + + @Override + public Registry biomeRegistry() { return null; } + + @Override + public Registry chunkGeneratorSettingsRegistry() { + return Registries.DIM; + } } 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 1bdffca2e..8762d51ed 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,19 +1,26 @@ package com.dfsek.terra.forge.mixin.lifecycle; +import net.minecraft.registry.RegistryEntryLookup; +import net.minecraft.util.math.noise.DoublePerlinNoiseSampler; +import net.minecraft.util.math.noise.DoublePerlinNoiseSampler.NoiseParameters; import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; import net.minecraft.world.biome.source.util.MultiNoiseUtil.NoiseHypercube; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.densityfunction.DensityFunction; import net.minecraft.world.gen.noise.NoiseConfig; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import java.util.List; import com.dfsek.terra.mod.util.SeedHack; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + /** * Hack to map noise sampler to seeds @@ -22,23 +29,12 @@ import com.dfsek.terra.mod.util.SeedHack; public class NoiseConfigMixin { @Shadow @Final - private long legacyWorldSeed; + private MultiNoiseSampler multiNoiseSampler; - @Redirect(method = "(Lnet/minecraft/world/gen/chunk/ChunkGeneratorSettings;Lnet/minecraft/util/registry/Registry;J)V", - at = @At(value = "NEW", - target = "(Lnet/minecraft/world/gen/densityfunction/DensityFunction;" + - "Lnet/minecraft/world/gen/densityfunction/DensityFunction;" + - "Lnet/minecraft/world/gen/densityfunction/DensityFunction;" + - "Lnet/minecraft/world/gen/densityfunction/DensityFunction;" + - "Lnet/minecraft/world/gen/densityfunction/DensityFunction;" + - "Lnet/minecraft/world/gen/densityfunction/DensityFunction;Ljava/util/List;)" + - "Lnet/minecraft/world/biome/source/util/MultiNoiseUtil$MultiNoiseSampler;")) - private MultiNoiseSampler t(DensityFunction densityFunction, DensityFunction densityFunction2, DensityFunction densityFunction3, - DensityFunction densityFunction4, DensityFunction densityFunction5, DensityFunction densityFunction6, - List list) { - MultiNoiseSampler sampler = new MultiNoiseSampler(densityFunction, densityFunction2, densityFunction3, densityFunction4, - densityFunction5, densityFunction6, list); - SeedHack.register(sampler, legacyWorldSeed); - return sampler; + @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); } } 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 aacae6001..9c14f7d1a 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 @@ -1,9 +1,9 @@ package com.dfsek.terra.forge.util; +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.registry.BuiltinRegistries; -import net.minecraft.registry.Registry; -import net.minecraft.util.registry.RegistryKey; import net.minecraft.village.VillagerType; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegisterEvent.RegisterHelper; @@ -39,7 +39,6 @@ public final class BiomeUtil { pack.getCheckedRegistry(Biome.class) .forEach((id, biome) -> registerBiome(biome, pack, id, helper)); }); - MinecraftUtil.registerFlora(BuiltinRegistries.BIOME); logger.info("Terra biomes registered."); } @@ -52,7 +51,8 @@ public final class BiomeUtil { private static void registerBiome(Biome biome, ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey id, RegisterHelper helper) { - RegistryKey vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(BuiltinRegistries.BIOME); + RegistryEntry + vanilla = ForgeRegistries.BIOMES.getHolder(((ProtoPlatformBiome) biome.getPlatformBiome()).getHandle()).orElseThrow(); if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) { @@ -61,7 +61,7 @@ public final class BiomeUtil { VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, - ForgeRegistries.BIOMES.getDelegateOrThrow(vanilla) + ForgeRegistries.BIOMES.getDelegateOrThrow(vanilla.getKey().orElseThrow()) .value(), vanillaBiomeProperties); @@ -69,24 +69,20 @@ public final class BiomeUtil { if(ForgeRegistries.BIOMES.containsKey(identifier)) { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(ForgeRegistries.BIOMES.getHolder(identifier) - .orElseThrow() - .getKey() .orElseThrow()); } else { helper.register(MinecraftUtil.registerKey(identifier).getValue(), minecraftBiome); ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(ForgeRegistries.BIOMES.getHolder(identifier) - .orElseThrow() - .getKey() .orElseThrow()); } - Map villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap(); + Map, VillagerType> villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap(); - villagerMap.put(RegistryKey.of(Registry.BIOME_KEY, identifier), + villagerMap.put(RegistryKey.of(RegistryKeys.BIOME, identifier), Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), - villagerMap.getOrDefault(vanilla, VillagerType.PLAINS))); + villagerMap.getOrDefault(vanilla.getKey().orElseThrow(), VillagerType.PLAINS))); - MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier); + MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getKey().orElseThrow().getValue(), i -> new ArrayList<>()).add(identifier); } } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java index 60cf1effa..11bbae507 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java @@ -43,7 +43,7 @@ public class ProtoPlatformBiome implements PlatformBiome { } @Override - public Object getHandle() { + public Identifier getHandle() { return identifier; } From 11b60804137679ece498f23d6661730f78fc3217 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 23:00:40 -0700 Subject: [PATCH 084/161] update bukkit to 1.19.3 --- buildSrc/src/main/kotlin/Versions.kt | 2 +- platforms/bukkit/build.gradle.kts | 1 + .../bukkit/nms/v1_19_R1/build.gradle.kts | 2 +- .../bukkit/nms/v1_19_R2/build.gradle.kts | 17 ++ .../bukkit/nms/v1_19_R2/AwfulBukkitHacks.java | 100 ++++++++++ .../bukkit/nms/v1_19_R2/NMSBiomeInfo.java | 10 + .../bukkit/nms/v1_19_R2/NMSBiomeInjector.java | 81 ++++++++ .../bukkit/nms/v1_19_R2/NMSBiomeProvider.java | 42 +++++ .../v1_19_R2/NMSChunkGeneratorDelegate.java | 173 ++++++++++++++++++ .../bukkit/nms/v1_19_R2/NMSInitializer.java | 15 ++ .../nms/v1_19_R2/NMSInjectListener.java | 48 +++++ .../nms/v1_19_R2/NMSWorldProperties.java | 36 ++++ .../terra/bukkit/nms/v1_19_R2/Reflection.java | 52 ++++++ .../bukkit/nms/v1_19_R2/RegistryFetcher.java | 25 +++ 14 files changed, 602 insertions(+), 2 deletions(-) create mode 100644 platforms/bukkit/nms/v1_19_R2/build.gradle.kts create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/AwfulBukkitHacks.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInfo.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInjector.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeProvider.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSChunkGeneratorDelegate.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInitializer.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInjectListener.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSWorldProperties.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/Reflection.java create mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/RegistryFetcher.java diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 0b101e569..ee68395b9 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -50,7 +50,7 @@ object Versions { object Bukkit { const val paper = "1.18.2-R0.1-SNAPSHOT" const val paperLib = "1.0.5" - const val minecraft = "1.19.2" + const val minecraft = "1.19.3" const val reflectionRemapper = "0.1.0-SNAPSHOT" const val paperDevBundle = "1.19.3-R0.1-SNAPSHOT" } diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index f099cb4e3..d3895ad52 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -10,6 +10,7 @@ dependencies { shaded(project(":platforms:bukkit:common")) shaded(project(":platforms:bukkit:nms:v1_18_R2", configuration = "reobf")) shaded(project(":platforms:bukkit:nms:v1_19_R1", configuration = "reobf")) + shaded(project(":platforms:bukkit:nms:v1_19_R2", configuration = "reobf")) shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } diff --git a/platforms/bukkit/nms/v1_19_R1/build.gradle.kts b/platforms/bukkit/nms/v1_19_R1/build.gradle.kts index 96f9038d8..b38ee0e04 100644 --- a/platforms/bukkit/nms/v1_19_R1/build.gradle.kts +++ b/platforms/bukkit/nms/v1_19_R1/build.gradle.kts @@ -6,7 +6,7 @@ repositories { dependencies { api(project(":platforms:bukkit:common")) - paperDevBundle(Versions.Bukkit.paperDevBundle) + paperDevBundle("1.19.2-R0.1-SNAPSHOT") implementation("xyz.jpenilla", "reflection-remapper", "0.1.0-SNAPSHOT") } diff --git a/platforms/bukkit/nms/v1_19_R2/build.gradle.kts b/platforms/bukkit/nms/v1_19_R2/build.gradle.kts new file mode 100644 index 000000000..96f9038d8 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/build.gradle.kts @@ -0,0 +1,17 @@ +apply(plugin = "io.papermc.paperweight.userdev") + +repositories { + maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") +} + +dependencies { + api(project(":platforms:bukkit:common")) + paperDevBundle(Versions.Bukkit.paperDevBundle) + implementation("xyz.jpenilla", "reflection-remapper", "0.1.0-SNAPSHOT") +} + +tasks { + assemble { + dependsOn("reobfJar") + } +} \ No newline at end of file diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/AwfulBukkitHacks.java new file mode 100644 index 000000000..f7da9c45d --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/AwfulBukkitHacks.java @@ -0,0 +1,100 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import com.google.common.collect.ImmutableMap; +import com.mojang.serialization.Lifecycle; +import net.minecraft.core.Holder; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.WritableRegistry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; +import org.bukkit.NamespacedKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; +import com.dfsek.terra.registry.master.ConfigRegistry; + + +public class AwfulBukkitHacks { + private static final Logger LOGGER = LoggerFactory.getLogger(AwfulBukkitHacks.class); + + private static final Map> terraBiomeMap = new HashMap<>(); + + public static void registerBiomes(ConfigRegistry configRegistry) { + try { + LOGGER.info("Hacking biome registry..."); + WritableRegistry biomeRegistry = (WritableRegistry) RegistryFetcher.biomeRegistry(); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, false); + + 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 = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); + Biome platform = NMSBiomeInjector.createBiome(biome, Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey))); + + ResourceKey delegateKey = ResourceKey.create( + Registries.BIOME, + new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key)) + ); + + Reference holder = biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); + Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder. + + platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); + + terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location()); + + LOGGER.debug("Registered biome: " + delegateKey); + } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + throw new RuntimeException(e); + } + })); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) 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())), + HashMap::putAll); + + terraBiomeMap + .forEach((vb, terraBiomes) -> + NMSBiomeInjector.getEntry(biomeRegistry, vb).ifPresentOrElse( + vanilla -> terraBiomes.forEach( + tb -> NMSBiomeInjector.getEntry(biomeRegistry, tb).ifPresentOrElse( + terra -> { + LOGGER.debug("{} (vanilla for {}): {}", + vanilla.unwrapKey().orElseThrow().location(), + terra.unwrapKey().orElseThrow().location(), + vanilla.tags().toList()); + vanilla.tags() + .forEach(tag -> collect + .computeIfAbsent(tag, t -> new ArrayList<>()) + .add(terra)); + }, + () -> LOGGER.error("No such biome: {}", tb))), + () -> LOGGER.error("No vanilla biome: {}", vb))); + + biomeRegistry.resetTags(); + biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); + + } catch(SecurityException | IllegalArgumentException exception) { + throw new RuntimeException(exception); + } + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInfo.java new file mode 100644 index 000000000..639c9eaed --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInfo.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; + +import com.dfsek.terra.api.properties.Properties; + + +public record NMSBiomeInfo(ResourceKey biomeKey) implements Properties { +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInjector.java new file mode 100644 index 000000000..20a426949 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInjector.java @@ -0,0 +1,81 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +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 java.util.function.Function; + +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 + .precipitation(vanilla.getPrecipitation()) + .downfall(vanilla.getDownfall()) + .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_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeProvider.java new file mode 100644 index 000000000..e7b09426d --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeProvider.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import com.mojang.serialization.Codec; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Climate.Sampler; +import org.jetbrains.annotations.NotNull; + +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; + + +public class NMSBiomeProvider extends BiomeSource { + private final BiomeProvider delegate; + private final long seed; + private final Registry biomeRegistry = RegistryFetcher.biomeRegistry(); + + public NMSBiomeProvider(BiomeProvider delegate, long seed) { + super(delegate.stream() + .map(biome -> RegistryFetcher.biomeRegistry() + .getHolderOrThrow(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() + .get(NMSBiomeInfo.class) + .biomeKey()))); + this.delegate = delegate; + this.seed = seed; + } + + @Override + protected @NotNull Codec codec() { + return BiomeSource.CODEC; + } + + @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) + .getPlatformBiome()).getContext() + .get(NMSBiomeInfo.class) + .biomeKey()); + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSChunkGeneratorDelegate.java new file mode 100644 index 000000000..5faa4ba4b --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSChunkGeneratorDelegate.java @@ -0,0 +1,173 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.NoiseColumn; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.BiomeManager; +import net.minecraft.world.level.block.Blocks; +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; +import org.bukkit.craftbukkit.v1_19_R2.block.data.CraftBlockData; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; +import com.dfsek.terra.bukkit.config.PreLoadCompatibilityOptions; +import com.dfsek.terra.bukkit.world.BukkitWorldProperties; +import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; + + +public class NMSChunkGeneratorDelegate extends ChunkGenerator { + private static final Logger LOGGER = LoggerFactory.getLogger(NMSChunkGeneratorDelegate.class); + private final com.dfsek.terra.api.world.chunk.generation.ChunkGenerator delegate; + + private final ChunkGenerator vanilla; + private final ConfigPack pack; + + private final long seed; + + public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, long seed) { + super(biomeProvider); + this.delegate = pack.getGeneratorProvider().newInstance(pack); + this.vanilla = vanilla; + this.pack = pack; + this.seed = seed; + } + + @Override + protected @NotNull Codec codec() { + return ChunkGenerator.CODEC; + } + + @Override + public void applyCarvers(@NotNull WorldGenRegion chunkRegion, long seed, @NotNull RandomState noiseConfig, @NotNull BiomeManager world, + @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk, @NotNull Carving carverStep) { + // no-op + } + + @Override + public void buildSurface(@NotNull WorldGenRegion region, @NotNull StructureManager structures, @NotNull RandomState noiseConfig, + @NotNull ChunkAccess chunk) { + // no-op + } + + @Override + public void applyBiomeDecoration(@NotNull WorldGenLevel world, @NotNull ChunkAccess chunk, + @NotNull StructureManager structureAccessor) { + vanilla.applyBiomeDecoration(world, chunk, structureAccessor); + } + + @Override + public void spawnOriginalMobs(@NotNull WorldGenRegion region) { + vanilla.spawnOriginalMobs(region); + } + + @Override + public int getGenDepth() { + return vanilla.getGenDepth(); + } + + @Override + public @NotNull CompletableFuture fillFromNoise(@NotNull Executor executor, @NotNull Blender blender, + @NotNull RandomState noiseConfig, + @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk) { + return vanilla.fillFromNoise(executor, blender, noiseConfig, structureAccessor, chunk) + .thenApply(c -> { + LevelAccessor level = Reflection.STRUCTURE_MANAGER.getLevel(structureAccessor); + BiomeProvider biomeProvider = pack.getBiomeProvider(); + PreLoadCompatibilityOptions compatibilityOptions = pack.getContext().get(PreLoadCompatibilityOptions.class); + if(compatibilityOptions.isBeard()) { + beard(structureAccessor, chunk, new BukkitWorldProperties(level.getMinecraftWorld().getWorld()), biomeProvider, compatibilityOptions); + } + return c; + }); + } + + private void beard(StructureManager structureAccessor, ChunkAccess chunk, WorldProperties world, BiomeProvider biomeProvider, + PreLoadCompatibilityOptions compatibilityOptions) { + Beardifier structureWeightSampler = Beardifier.forStructuresInChunk(structureAccessor, chunk.getPos()); + double threshold = compatibilityOptions.getBeardThreshold(); + double airThreshold = compatibilityOptions.getAirThreshold(); + int xi = chunk.getPos().x << 4; + int zi = chunk.getPos().z << 4; + for(int x = 0; x < 16; x++) { + for(int z = 0; z < 16; z++) { + int depth = 0; + for(int y = world.getMaxHeight(); y >= world.getMinHeight(); y--) { + double noise = structureWeightSampler.compute(new SinglePointContext(x + xi, y, z + zi)); + if(noise > threshold) { + chunk.setBlockState(new BlockPos(x, y, z), ((CraftBlockData) ((BukkitBlockState) delegate + .getPalette(x + xi, y, z + zi, world, biomeProvider) + .get(depth, x + xi, y, z + zi, world.getSeed())).getHandle()).getState(), false); + depth++; + } else if(noise < airThreshold) { + chunk.setBlockState(new BlockPos(x, y, z), Blocks.AIR.defaultBlockState(), false); + } else { + depth = 0; + } + } + } + } + } + + @Override + public int getSeaLevel() { + return vanilla.getSeaLevel(); + } + + @Override + public int getMinY() { + return vanilla.getMinY(); + } + + @Override + public int getBaseHeight(int x, int z, @NotNull Types heightmap, @NotNull LevelHeightAccessor world, @NotNull RandomState noiseConfig) { + WorldProperties properties = new NMSWorldProperties(seed, world); + int y = properties.getMaxHeight(); + BiomeProvider biomeProvider = pack.getBiomeProvider(); + while(y >= getMinY() && !heightmap.isOpaque().test( + ((CraftBlockData) delegate.getBlock(properties, x, y - 1, z, biomeProvider).getHandle()).getState())) { + y--; + } + return y; + } + + @Override + public @NotNull NoiseColumn getBaseColumn(int x, int z, @NotNull LevelHeightAccessor world, @NotNull RandomState noiseConfig) { + /* + BlockState[] array = new BlockState[world.getHeight()]; + WorldProperties properties = new NMSWorldProperties(seed, world); + BiomeProvider biomeProvider = pack.getBiomeProvider().caching(properties); + for(int y = properties.getMaxHeight() - 1; y >= properties.getMinHeight(); y--) { + array[y - properties.getMinHeight()] = ((CraftBlockData) delegate.getBlock(properties, x, y, z, biomeProvider) + .getHandle()).getState(); + } + return new NoiseColumn(getMinY(), array); + + */ + return vanilla.getBaseColumn(x, z, world, noiseConfig); + } + + @Override + public void addDebugScreenInfo(@NotNull List text, @NotNull RandomState noiseConfig, @NotNull BlockPos pos) { + + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInitializer.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInitializer.java new file mode 100644 index 000000000..05814cfd4 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInitializer.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import org.bukkit.Bukkit; + +import com.dfsek.terra.bukkit.PlatformImpl; +import com.dfsek.terra.bukkit.nms.Initializer; + + +public class NMSInitializer implements Initializer { + @Override + public void initialize(PlatformImpl platform) { + AwfulBukkitHacks.registerBiomes(platform.getRawConfigRegistry()); + Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin()); + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInjectListener.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInjectListener.java new file mode 100644 index 000000000..015de732e --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInjectListener.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_19_R2.CraftWorld; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.world.WorldInitEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.locks.ReentrantLock; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; + + +public class NMSInjectListener implements Listener { + private static final Logger LOGGER = LoggerFactory.getLogger(NMSInjectListener.class); + private static final Set INJECTED = new HashSet<>(); + private static final ReentrantLock INJECT_LOCK = new ReentrantLock(); + + @EventHandler + public void onWorldInit(WorldInitEvent event) { + if(!INJECTED.contains(event.getWorld()) && + event.getWorld().getGenerator() instanceof BukkitChunkGeneratorWrapper bukkitChunkGeneratorWrapper) { + INJECT_LOCK.lock(); + INJECTED.add(event.getWorld()); + LOGGER.info("Preparing to take over the world: {}", event.getWorld().getName()); + CraftWorld craftWorld = (CraftWorld) event.getWorld(); + ServerLevel serverWorld = craftWorld.getHandle(); + + ConfigPack pack = bukkitChunkGeneratorWrapper.getPack(); + + ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator(); + NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed()); + + serverWorld.getChunkSource().chunkMap.generator = new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()); + + LOGGER.info("Successfully injected into world."); + + INJECT_LOCK.unlock(); + } + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSWorldProperties.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSWorldProperties.java new file mode 100644 index 000000000..cee2284d0 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSWorldProperties.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import net.minecraft.world.level.LevelHeightAccessor; + +import com.dfsek.terra.api.world.info.WorldProperties; + + +public class NMSWorldProperties implements WorldProperties { + private final long seed; + private final LevelHeightAccessor height; + + public NMSWorldProperties(long seed, LevelHeightAccessor height) { + this.seed = seed; + this.height = height; + } + + @Override + public Object getHandle() { + return height; + } + + @Override + public long getSeed() { + return seed; + } + + @Override + public int getMaxHeight() { + return height.getMaxBuildHeight(); + } + + @Override + public int getMinHeight() { + return height.getMinBuildHeight(); + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/Reflection.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/Reflection.java new file mode 100644 index 000000000..c65df8ca1 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/Reflection.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +import net.minecraft.core.Holder; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.MappedRegistry; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.StructureManager; +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 java.util.Objects; + + +public class Reflection { + public static final MappedRegistryProxy MAPPED_REGISTRY; + public static final StructureManagerProxy STRUCTURE_MANAGER; + + public static final ReferenceProxy REFERENCE; + + 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); + } + + + @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); + } +} diff --git a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/RegistryFetcher.java b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/RegistryFetcher.java new file mode 100644 index 000000000..f0c776f48 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/RegistryFetcher.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R2; + +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.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.structure.StructureSet; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_19_R2.CraftServer; + + +public class RegistryFetcher { + private static Registry getRegistry(ResourceKey> key) { + CraftServer craftserver = (CraftServer) Bukkit.getServer(); + DedicatedServer dedicatedserver = craftserver.getServer(); + return dedicatedserver + .registryAccess() + .registryOrThrow(key); + } + + public static Registry biomeRegistry() { + return getRegistry(Registries.BIOME); + } +} From 7d742451099d44262c5ae680063b489630e36de3 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 23:49:06 -0700 Subject: [PATCH 085/161] make forge compile --- .../src/main/java/com/dfsek/terra/forge/ForgePlatform.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 a2f26b753..5cf97c381 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 @@ -132,7 +132,7 @@ public class ForgePlatform extends ModPlatform { @Override public Registry dimensionTypeRegistry() { - return ForgeRegistries.DI; + return null; } @Override @@ -142,6 +142,6 @@ public class ForgePlatform extends ModPlatform { @Override public Registry chunkGeneratorSettingsRegistry() { - return Registries.DIM; + return null; } } From 5bc34eb62627d902839ac7c7f6791484acd6943e Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Dec 2022 23:49:15 -0700 Subject: [PATCH 086/161] update version to 6.2.2 --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 20122663d..c03a2a5be 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.2.1")) -versionProjects(":common:implementation", version("6.2.1")) -versionProjects(":platforms", version("6.2.1")) +versionProjects(":common:api", version("6.2.2")) +versionProjects(":common:implementation", version("6.2.2")) +versionProjects(":platforms", version("6.2.2")) allprojects { From b10130c5c602f014b73ba9271c34a39f516a0cdc Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 6 Feb 2023 13:19:36 +1100 Subject: [PATCH 087/161] Cache loaded BufferedImages --- .../loaders/config/BufferedImageLoader.java | 29 +++++++++++++++---- .../terra/config/pack/ConfigPackImpl.java | 2 +- 2 files changed, 24 insertions(+), 7 deletions(-) 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 98f24842c..ba770861c 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,24 +27,41 @@ import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; import java.lang.reflect.AnnotatedType; +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; public class BufferedImageLoader implements TypeLoader { private final Loader files; - public BufferedImageLoader(Loader files) { + private final ConfigPack pack; + + public BufferedImageLoader(Loader files, ConfigPack pack) { this.files = files; + this.pack = pack; + if (!pack.getContext().has(ImageCache.class)) + pack.getContext().put(new ImageCache(new ConcurrentHashMap<>())); } @Override public BufferedImage load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) throws LoadException { - try { - return ImageIO.read(files.get((String) c)); - } catch(IOException e) { - throw new LoadException("Unable to load image", e, depthTracker); - } + System.out.println(pack.getContext().get(ImageCache.class).map); + return pack.getContext().get(ImageCache.class).map.computeIfAbsent((String) c, s -> { + try { + return ImageIO.read(files.get(s)); + } catch(IOException e) { + throw new LoadException("Unable to load image", e, depthTracker); + } + }); + } + + /* + * Cache prevents configs from loading the same image multiple times into memory + */ + private record ImageCache(ConcurrentHashMap map) implements Properties { } } 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 84f2fb382..611539c41 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 @@ -283,7 +283,7 @@ public class ConfigPackImpl implements ConfigPack { @Override public void register(TypeRegistry registry) { registry.registerLoader(ConfigType.class, configTypeRegistry) - .registerLoader(BufferedImage.class, new BufferedImageLoader(loader)); + .registerLoader(BufferedImage.class, new BufferedImageLoader(loader, this)); registryMap.forEach(registry::registerLoader); shortcuts.forEach(registry::registerLoader); // overwrite with delegated shortcuts if present } From 5cc58babca82b59db22adfdbc07aaec0920cc811 Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 6 Feb 2023 13:21:20 +1100 Subject: [PATCH 088/161] Bump version to 6.3.0 --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index c03a2a5be..b91c23fa7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.2.2")) -versionProjects(":common:implementation", version("6.2.2")) -versionProjects(":platforms", version("6.2.2")) +versionProjects(":common:api", version("6.3.0")) +versionProjects(":common:implementation", version("6.3.0")) +versionProjects(":platforms", version("6.3.0")) allprojects { From 084ecb9ad811170bb6becfaab024248a9850ac02 Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 6 Feb 2023 20:36:28 +1100 Subject: [PATCH 089/161] Forgot to delet sout --- .../dfsek/terra/config/loaders/config/BufferedImageLoader.java | 1 - 1 file changed, 1 deletion(-) 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 ba770861c..c2395d114 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 @@ -49,7 +49,6 @@ public class BufferedImageLoader implements TypeLoader { @Override public BufferedImage load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) throws LoadException { - System.out.println(pack.getContext().get(ImageCache.class).map); return pack.getContext().get(ImageCache.class).map.computeIfAbsent((String) c, s -> { try { return ImageIO.read(files.get(s)); From 9514641e1e67ba6c4d58543c74f51f701add45e9 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 7 Feb 2023 10:17:04 +1100 Subject: [PATCH 090/161] Revert "Bump config-noise-function major version" This reverts commit 68875cc17bd4bbe78dcdc3af06afb5723182732f. --- common/addons/config-noise-function/build.gradle.kts | 2 +- .../config-noise-image/src/main/resources/terra.addon.yml | 1 - .../src/main/resources/terra.addon.yml | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/common/addons/config-noise-function/build.gradle.kts b/common/addons/config-noise-function/build.gradle.kts index 91002e3b5..f51d5e878 100644 --- a/common/addons/config-noise-function/build.gradle.kts +++ b/common/addons/config-noise-function/build.gradle.kts @@ -1,6 +1,6 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -version = version("2.0.0") +version = version("1.0.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) diff --git a/common/addons/config-noise-image/src/main/resources/terra.addon.yml b/common/addons/config-noise-image/src/main/resources/terra.addon.yml index 8716d6749..355449217 100644 --- a/common/addons/config-noise-image/src/main/resources/terra.addon.yml +++ b/common/addons/config-noise-image/src/main/resources/terra.addon.yml @@ -12,4 +12,3 @@ website: license: MIT License depends: library-image: "1.+" - config-noise-function: "2.+" diff --git a/common/addons/terrascript-function-sampler/src/main/resources/terra.addon.yml b/common/addons/terrascript-function-sampler/src/main/resources/terra.addon.yml index 938987d93..635814c2c 100644 --- a/common/addons/terrascript-function-sampler/src/main/resources/terra.addon.yml +++ b/common/addons/terrascript-function-sampler/src/main/resources/terra.addon.yml @@ -12,4 +12,4 @@ website: license: MIT License depends: structure-terrascript-loader: "1.+" - config-noise-function: "2.+" \ No newline at end of file + config-noise-function: "1.+" \ No newline at end of file From ef4fe4eb7ae7f99d1fafadaabc7ecb864cd7ed0f Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 7 Feb 2023 10:17:27 +1100 Subject: [PATCH 091/161] Revert "Bump image provider major version" This reverts commit f1bf3990c114e03e5429541499aba64ce0ed6816. --- common/addons/biome-provider-image/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/addons/biome-provider-image/build.gradle.kts b/common/addons/biome-provider-image/build.gradle.kts index 20685a679..3819ba485 100644 --- a/common/addons/biome-provider-image/build.gradle.kts +++ b/common/addons/biome-provider-image/build.gradle.kts @@ -1,4 +1,4 @@ -version = version("2.0.0") +version = version("1.0.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) From 97c0dcad9d14fed895460af05e60243caad29958 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 7 Feb 2023 10:22:14 +1100 Subject: [PATCH 092/161] Rename image lib biome provider to v2 --- .../LICENSE | 0 .../README.md | 0 .../build.gradle.kts | 0 .../addons/biome/image/v2}/ImageBiomeProvider.java | 2 +- .../biome/image/v2}/ImageBiomeProviderAddon.java | 10 +++++----- .../biome/image/v2}/config/ImageProviderTemplate.java | 4 ++-- .../converter/ClosestBiomeColorConverterTemplate.java | 2 +- .../converter/ExactBiomeColorConverterTemplate.java | 2 +- .../mapping/DefinedBiomeColorMappingTemplate.java | 2 +- .../src/main/resources/terra.addon.yml | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) rename common/addons/{biome-provider-image => biome-provider-image-v2}/LICENSE (100%) rename common/addons/{biome-provider-image => biome-provider-image-v2}/README.md (100%) rename common/addons/{biome-provider-image => biome-provider-image-v2}/build.gradle.kts (100%) rename common/addons/{biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image => biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2}/ImageBiomeProvider.java (96%) rename common/addons/{biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image => biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2}/ImageBiomeProviderAddon.java (88%) rename common/addons/{biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image => biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2}/config/ImageProviderTemplate.java (91%) rename common/addons/{biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image => biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2}/config/converter/ClosestBiomeColorConverterTemplate.java (89%) rename common/addons/{biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image => biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2}/config/converter/ExactBiomeColorConverterTemplate.java (93%) rename common/addons/{biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image => biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2}/config/converter/mapping/DefinedBiomeColorMappingTemplate.java (89%) rename common/addons/{biome-provider-image => biome-provider-image-v2}/src/main/resources/terra.addon.yml (82%) diff --git a/common/addons/biome-provider-image/LICENSE b/common/addons/biome-provider-image-v2/LICENSE similarity index 100% rename from common/addons/biome-provider-image/LICENSE rename to common/addons/biome-provider-image-v2/LICENSE diff --git a/common/addons/biome-provider-image/README.md b/common/addons/biome-provider-image-v2/README.md similarity index 100% rename from common/addons/biome-provider-image/README.md rename to common/addons/biome-provider-image-v2/README.md diff --git a/common/addons/biome-provider-image/build.gradle.kts b/common/addons/biome-provider-image-v2/build.gradle.kts similarity index 100% rename from common/addons/biome-provider-image/build.gradle.kts rename to common/addons/biome-provider-image-v2/build.gradle.kts 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-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/ImageBiomeProvider.java similarity index 96% rename from common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java rename to common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/ImageBiomeProvider.java index c9d787003..0198e49c5 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java +++ b/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/ImageBiomeProvider.java @@ -5,7 +5,7 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.image; +package com.dfsek.terra.addons.biome.image.v2; import java.util.Optional; 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-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/ImageBiomeProviderAddon.java similarity index 88% rename from common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java rename to common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/ImageBiomeProviderAddon.java index 9fbc19665..c719f86be 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java +++ b/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/ImageBiomeProviderAddon.java @@ -5,16 +5,16 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.image; +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.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.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; diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/ImageProviderTemplate.java b/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/ImageProviderTemplate.java similarity index 91% rename from common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/ImageProviderTemplate.java rename to common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/ImageProviderTemplate.java index 1ce2b5ecb..42aff8223 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/ImageProviderTemplate.java +++ b/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/ImageProviderTemplate.java @@ -5,14 +5,14 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.biome.image.config; +package com.dfsek.terra.addons.biome.image.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 com.dfsek.terra.addons.biome.image.ImageBiomeProvider; +import com.dfsek.terra.addons.biome.image.v2.ImageBiomeProvider; import com.dfsek.terra.addons.image.converter.ColorConverter; import com.dfsek.terra.addons.image.sampler.ColorSampler; import com.dfsek.terra.api.world.biome.Biome; diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ClosestBiomeColorConverterTemplate.java b/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/ClosestBiomeColorConverterTemplate.java similarity index 89% rename from common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ClosestBiomeColorConverterTemplate.java rename to common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/ClosestBiomeColorConverterTemplate.java index 09006d420..9c9e15869 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ClosestBiomeColorConverterTemplate.java +++ b/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/ClosestBiomeColorConverterTemplate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.image.config.converter; +package com.dfsek.terra.addons.biome.image.v2.config.converter; import com.dfsek.tectonic.api.config.template.annotations.Value; diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java b/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/ExactBiomeColorConverterTemplate.java similarity index 93% rename from common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java rename to common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/ExactBiomeColorConverterTemplate.java index dd9b60182..3be64aa77 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/ExactBiomeColorConverterTemplate.java +++ b/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/ExactBiomeColorConverterTemplate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.image.config.converter; +package com.dfsek.terra.addons.biome.image.v2.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/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/mapping/DefinedBiomeColorMappingTemplate.java b/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/mapping/DefinedBiomeColorMappingTemplate.java similarity index 89% rename from common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/mapping/DefinedBiomeColorMappingTemplate.java rename to common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/mapping/DefinedBiomeColorMappingTemplate.java index 3a1a0891b..88dbb82b2 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/config/converter/mapping/DefinedBiomeColorMappingTemplate.java +++ b/common/addons/biome-provider-image-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/mapping/DefinedBiomeColorMappingTemplate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.biome.image.config.converter.mapping; +package com.dfsek.terra.addons.biome.image.v2.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-v2/src/main/resources/terra.addon.yml similarity index 82% rename from common/addons/biome-provider-image/src/main/resources/terra.addon.yml rename to common/addons/biome-provider-image-v2/src/main/resources/terra.addon.yml index f031ef124..00c4fbec2 100644 --- a/common/addons/biome-provider-image/src/main/resources/terra.addon.yml +++ b/common/addons/biome-provider-image-v2/src/main/resources/terra.addon.yml @@ -4,7 +4,7 @@ contributors: id: biome-provider-image version: @VERSION@ entrypoints: - - "com.dfsek.terra.addons.biome.image.ImageBiomeProviderAddon" + - "com.dfsek.terra.addons.biome.image.v2.ImageBiomeProviderAddon" website: issues: https://github.com/PolyhedralDev/Terra/issues source: https://github.com/PolyhedralDev/Terra From 9d5b33f1308bb7e21c8c272a95ead9cd6a730ed6 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 7 Feb 2023 10:27:46 +1100 Subject: [PATCH 093/161] Re-add original image biome provider This is so we aren't breaking existing packs --- common/addons/biome-provider-image/LICENSE | 21 +++++ common/addons/biome-provider-image/README.md | 6 ++ .../biome-provider-image/build.gradle.kts | 11 +++ .../biome/image/ImageBiomeProvider.java | 86 +++++++++++++++++++ .../biome/image/ImageBiomeProviderAddon.java | 49 +++++++++++ .../biome/image/ImageProviderTemplate.java | 45 ++++++++++ .../src/main/resources/terra.addon.yml | 12 +++ 7 files changed, 230 insertions(+) create mode 100644 common/addons/biome-provider-image/LICENSE create mode 100644 common/addons/biome-provider-image/README.md create mode 100644 common/addons/biome-provider-image/build.gradle.kts create mode 100644 common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java create mode 100644 common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java create mode 100644 common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java create mode 100644 common/addons/biome-provider-image/src/main/resources/terra.addon.yml diff --git a/common/addons/biome-provider-image/LICENSE b/common/addons/biome-provider-image/LICENSE new file mode 100644 index 000000000..64c1cd516 --- /dev/null +++ b/common/addons/biome-provider-image/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2021 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/README.md b/common/addons/biome-provider-image/README.md new file mode 100644 index 000000000..49e9b8fdb --- /dev/null +++ b/common/addons/biome-provider-image/README.md @@ -0,0 +1,6 @@ +# biome-provider-image + +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 diff --git a/common/addons/biome-provider-image/build.gradle.kts b/common/addons/biome-provider-image/build.gradle.kts new file mode 100644 index 000000000..15145b578 --- /dev/null +++ b/common/addons/biome-provider-image/build.gradle.kts @@ -0,0 +1,11 @@ +version = version("1.0.0") + +dependencies { + compileOnlyApi(project(":common:addons:manifest-addon-loader")) + implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) + testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) +} + +tasks.named("shadowJar") { + relocate("net.jafama", "com.dfsek.terra.addons.biome.image.lib.jafama") +} \ No newline at end of file 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 new file mode 100644 index 000000000..aa2f647bb --- /dev/null +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 net.jafama.FastMath; + +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.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; + 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 FastMath.abs(a.getRed() - b.getRed()) + FastMath.abs(a.getGreen() - b.getGreen()) + FastMath.abs(a.getBlue() - b.getBlue()); + } + + @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; + 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; + })); + } + + @Override + public Optional getBaseBiome(int x, int z, long seed) { + return Optional.of(getBiome(x, z)); + } + + @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(FastMath.floorMod(x - image.getWidth() / 2, image.getWidth()), + FastMath.floorMod(z - image.getHeight() / 2, image.getHeight()))); + } + }, + NONE { + @Override + public Color getColor(BufferedImage image, int x, int z) { + return new Color(image.getRGB(FastMath.floorMod(x, image.getWidth()), FastMath.floorMod(z, image.getHeight()))); + } + }; + + public abstract Color getColor(BufferedImage image, int x, int z); + } +} 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 new file mode 100644 index 000000000..5db8dd51f --- /dev/null +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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.object.ObjectTemplate; + +import java.util.function.Supplier; + +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<>() { + }; + + @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("IMAGE"), + () -> new ImageProviderTemplate(event.getPack().getRegistry(Biome.class))); + }) + .failThrough(); + } +} 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 new file mode 100644 index 000000000..6bb683eca --- /dev/null +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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/src/main/resources/terra.addon.yml b/common/addons/biome-provider-image/src/main/resources/terra.addon.yml new file mode 100644 index 000000000..3fd86ad52 --- /dev/null +++ b/common/addons/biome-provider-image/src/main/resources/terra.addon.yml @@ -0,0 +1,12 @@ +schema-version: 1 +contributors: + - Terra contributors +id: biome-provider-image +version: @VERSION@ +entrypoints: + - "com.dfsek.terra.addons.biome.image.ImageBiomeProviderAddon" +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 From 4d17edef80d0172195596af7cc9f7aaf359e6bc4 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 7 Feb 2023 10:30:52 +1100 Subject: [PATCH 094/161] Add deprecation notice for biome-provider-image addon --- .../terra/addons/biome/image/ImageBiomeProviderAddon.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 5db8dd51f..ecef73f5d 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java @@ -8,6 +8,8 @@ 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; @@ -24,6 +26,9 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider; public class ImageBiomeProviderAddon implements AddonInitializer { + + private static final Logger logger = LoggerFactory.getLogger(ImageBiomeProviderAddon.class); + public static final TypeKey>> PROVIDER_REGISTRY_KEY = new TypeKey<>() { }; @@ -45,5 +50,6 @@ public class ImageBiomeProviderAddon implements AddonInitializer { () -> new ImageProviderTemplate(event.getPack().getRegistry(Biome.class))); }) .failThrough(); + 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."); } } From 3ab671827d3b972be31e1589c91c9a26c80acbe9 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 7 Feb 2023 10:55:17 +1100 Subject: [PATCH 095/161] Re-add old image sampler to config-noise-function w/ deprecation notice --- .../dfsek/terra/addons/noise/NoiseAddon.java | 5 +- .../templates/ImageSamplerTemplate.java | 47 ++++++++++++ .../addons/noise/samplers/ImageSampler.java | 75 +++++++++++++++++++ 3 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java 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 5f634d112..86743f2cc 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 @@ -18,6 +18,7 @@ import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.addons.noise.config.templates.BinaryArithmeticTemplate; 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.noise.CellularNoiseTemplate; @@ -91,7 +92,9 @@ public class NoiseAddon implements AddonInitializer { noiseRegistry.register(addon.key("PROBABILITY"), ProbabilityNormalizerTemplate::new); noiseRegistry.register(addon.key("SCALE"), ScaleNormalizerTemplate::new); noiseRegistry.register(addon.key("POSTERIZATION"), PosterizationNormalizerTemplate::new); - + + noiseRegistry.register(addon.key("IMAGE"), ImageSamplerTemplate::new); + noiseRegistry.register(addon.key("DOMAIN_WARP"), DomainWarpTemplate::new); noiseRegistry.register(addon.key("FBM"), BrownianMotionTemplate::new); 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 new file mode 100644 index 000000000..bbccae810 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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/samplers/ImageSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java new file mode 100644 index 000000000..5016d7954 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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 net.jafama.FastMath; + +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(FastMath.floorMod(FastMath.floorToInt(x * frequency), image.getWidth()), + FastMath.floorMod(FastMath.floorToInt(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); + } +} From 33f1aa07d3eeee6fc5c7e241c3ac19c7c1f2942f Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 7 Feb 2023 11:38:12 +1100 Subject: [PATCH 096/161] Mark BufferedImageLoader as deprecated --- .../terra/config/loaders/config/BufferedImageLoader.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 c2395d114..b6f50dd78 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 @@ -33,7 +33,10 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.Loader; import com.dfsek.terra.api.properties.Properties; - +/* + * @deprecated Use the Image and ImageLoader class provided by the library-image addon instead. This is subject to removal in v7. + */ +@Deprecated public class BufferedImageLoader implements TypeLoader { private final Loader files; From 7b87498751339ed15db058bc0f10e9d3067eaca0 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 7 Feb 2023 11:59:03 +1100 Subject: [PATCH 097/161] Don't load same image multiple times --- .../terra/addons/image/ImageLibraryAddon.java | 4 ++- .../addons/image/config/ImageLoader.java | 32 ++++++++++++++----- 2 files changed, 27 insertions(+), 9 deletions(-) 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 433606eec..cb556b563 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,6 +15,7 @@ import com.dfsek.terra.addons.image.sampler.ColorSampler; 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.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; @@ -40,7 +41,8 @@ public class ImageLibraryAddon implements AddonInitializer { .register(addon, ConfigPackPreLoadEvent.class) .priority(10) .then(event -> { - event.getPack().applyLoader(Image.class, new ImageLoader(event.getPack().getLoader())); + ConfigPack pack = event.getPack(); + pack.applyLoader(Image.class, new ImageLoader(pack.getLoader(), pack)); }) .then(event -> { CheckedRegistry>> colorSamplerRegistry = event.getPack().getOrCreateRegistry( diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java index 15cbe4c52..cedfbb3bb 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java @@ -11,10 +11,13 @@ import org.slf4j.LoggerFactory; import javax.imageio.ImageIO; import java.io.IOException; import java.lang.reflect.AnnotatedType; +import java.util.concurrent.ConcurrentHashMap; import com.dfsek.terra.addons.image.image.BufferedImageWrapper; import com.dfsek.terra.addons.image.image.Image; +import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.Loader; +import com.dfsek.terra.api.properties.Properties; public class ImageLoader implements TypeLoader { @@ -23,19 +26,32 @@ public class ImageLoader implements TypeLoader { private final Loader files; - public ImageLoader(Loader files) { + private final ConfigPack pack; + + public ImageLoader(Loader files, ConfigPack pack) { this.files = files; + this.pack = pack; + if(!pack.getContext().has(ImageCache.class)) + pack.getContext().put(new ImageCache(new ConcurrentHashMap<>())); } @Override public Image load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) throws LoadException { - try { - return new BufferedImageWrapper(ImageIO.read(files.get((String) c))); - } catch(IllegalArgumentException e) { - throw new LoadException("Unable to load image (image might be too large?)", e, depthTracker); - } catch(IOException e) { - throw new LoadException("Unable to load image", e, depthTracker); - } + return pack.getContext().get(ImageCache.class).map.computeIfAbsent((String) c, imagePath -> { + try { + return new BufferedImageWrapper(ImageIO.read(files.get(imagePath))); + } catch(IllegalArgumentException e) { + throw new LoadException("Unable to load image (image might be too large?)", e, depthTracker); + } catch(IOException e) { + throw new LoadException("Unable to load image", e, depthTracker); + } + }); + } + + /* + * Cache prevents configs from loading the same image multiple times into memory + */ + private record ImageCache(ConcurrentHashMap map) implements Properties { } } From 8deae0480ccf0451148c77f328cfcdba5f7b9b06 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 28 Feb 2023 11:58:39 +1100 Subject: [PATCH 098/161] Add support for WorldEdit schematic relative offsets --- .../addons/sponge/SpongeSchematicAddon.java | 22 ++++++++++++++++++- .../terra/addons/sponge/SpongeStructure.java | 13 ++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) 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 caf7f47b5..ab27f3e2d 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 @@ -30,6 +30,7 @@ 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; public class SpongeSchematicAddon implements AddonInitializer { @@ -75,6 +76,25 @@ public class SpongeSchematicAddon implements AddonInitializer { int len = baseTag.getShort("Length"); int hei = baseTag.getShort("Height"); + CompoundTag metadata = baseTag.getCompoundTag("Metadata"); + + Vector3Int offset; + // Use WorldEdit relative offset if it exists in schematic metadata + IntTag worldEditOffsetX = metadata.getIntTag("WEOffsetX"); + IntTag worldEditOffsetY = metadata.getIntTag("WEOffsetY"); + IntTag worldEditOffsetZ = metadata.getIntTag("WEOffsetZ"); + if (worldEditOffsetX != null || worldEditOffsetY != null || worldEditOffsetZ != null) { + if (worldEditOffsetX == null || worldEditOffsetY == null || worldEditOffsetZ == null) { + throw new IllegalArgumentException("Failed to parse Sponge schematic: Malformed WorldEdit offset"); + } + offset = Vector3Int.of(worldEditOffsetX.asInt(), worldEditOffsetY.asInt(), worldEditOffsetZ.asInt()); + } else { + // Set offset based on the 'Offset' field, not clear on if this is correct behaviour according to spec so left commented for now + //int[] offsetArray = baseTag.getIntArray("Offset"); + //offset = Vector3Int.of(offsetArray[0], offsetArray[1], offsetArray[2]); + offset = Vector3Int.zero(); + } + ByteArrayTag blocks = baseTag.getByteArrayTag("BlockData"); CompoundTag palette = (CompoundTag) baseTag.get("Palette"); @@ -97,7 +117,7 @@ public class SpongeSchematicAddon implements AddonInitializer { } } - return new SpongeStructure(states, addon.key(id)); + return new SpongeStructure(states, offset, addon.key(id)); } catch(IOException e) { throw new IllegalArgumentException("Failed to parse Sponge schematic: ", e); } 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 e08c51146..49bde23fb 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 @@ -23,10 +23,15 @@ public class SpongeStructure implements Structure, Keyed { private final BlockState[][][] blocks; + private final int offsetX, offsetY, offsetZ; + private final RegistryKey id; - public SpongeStructure(BlockState[][][] blocks, RegistryKey id) { + public SpongeStructure(BlockState[][][] blocks, Vector3Int offset, RegistryKey id) { this.blocks = blocks; + this.offsetX = offset.getX(); + this.offsetY = offset.getY(); + this.offsetZ = offset.getZ(); this.id = id; } @@ -37,13 +42,15 @@ public class SpongeStructure implements Structure, Keyed { int bZ = location.getZ(); for(int x = 0; x < blocks.length; x++) { for(int z = 0; z < blocks[x].length; z++) { - Vector2Int r = Vector2Int.of(x, z).rotate(rotation); + int oX = x + offsetX; + int oZ = z + offsetZ; + Vector2Int r = Vector2Int.of(oX, oZ).rotate(rotation); int rX = r.getX(); int rZ = r.getZ(); for(int y = 0; y < blocks[x][z].length; y++) { BlockState state = blocks[x][z][y]; if(state == null) continue; - world.setBlockState(bX + rX, bY + y, bZ + rZ, state); + world.setBlockState(bX + rX, bY + y + offsetY, bZ + rZ, state); } } } From 73e0899e7ca4da2b7081de9ab3da36ca1ce6bdd7 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 28 Feb 2023 13:02:19 +1100 Subject: [PATCH 099/161] Only use WorldEdit relative offset for v2 sponge schematics --- .../addons/sponge/SpongeSchematicAddon.java | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) 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 ab27f3e2d..bd46330ac 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 @@ -72,28 +72,36 @@ public class SpongeSchematicAddon implements AddonInitializer { public SpongeStructure convert(InputStream in, String id) { try { CompoundTag baseTag = (CompoundTag) new NBTDeserializer(false).fromStream(detectDecompression(in)).getTag(); + int ver = baseTag.getInt("Version"); int wid = baseTag.getShort("Width"); int len = baseTag.getShort("Length"); int hei = baseTag.getShort("Height"); - + CompoundTag metadata = baseTag.getCompoundTag("Metadata"); - Vector3Int offset; - // Use WorldEdit relative offset if it exists in schematic metadata - IntTag worldEditOffsetX = metadata.getIntTag("WEOffsetX"); - IntTag worldEditOffsetY = metadata.getIntTag("WEOffsetY"); - IntTag worldEditOffsetZ = metadata.getIntTag("WEOffsetZ"); - if (worldEditOffsetX != null || worldEditOffsetY != null || worldEditOffsetZ != null) { - if (worldEditOffsetX == null || worldEditOffsetY == null || worldEditOffsetZ == null) { - throw new IllegalArgumentException("Failed to parse Sponge schematic: Malformed WorldEdit offset"); + Vector3Int offset = switch(ver) { + case 2 -> { + // Use WorldEdit defined legacy relative offset if it exists in schematic metadata + IntTag worldEditOffsetX = metadata.getIntTag("WEOffsetX"); + IntTag worldEditOffsetY = metadata.getIntTag("WEOffsetY"); + IntTag worldEditOffsetZ = metadata.getIntTag("WEOffsetZ"); + if(worldEditOffsetX != null || worldEditOffsetY != null || worldEditOffsetZ != null) { + if(worldEditOffsetX == null || worldEditOffsetY == null || worldEditOffsetZ == null) { + throw new IllegalArgumentException("Failed to parse Sponge schematic: Malformed WorldEdit offset"); + } + yield Vector3Int.of(worldEditOffsetX.asInt(), worldEditOffsetY.asInt(), worldEditOffsetZ.asInt()); + } else { + // Relative offset handling via 'Offset' field is ambiguous in spec 2 so just apply no offset + yield Vector3Int.zero(); + } } - offset = Vector3Int.of(worldEditOffsetX.asInt(), worldEditOffsetY.asInt(), worldEditOffsetZ.asInt()); - } else { - // Set offset based on the 'Offset' field, not clear on if this is correct behaviour according to spec so left commented for now - //int[] offsetArray = baseTag.getIntArray("Offset"); - //offset = Vector3Int.of(offsetArray[0], offsetArray[1], offsetArray[2]); - offset = Vector3Int.zero(); - } + case 3 -> { + // Relative offset is more concretely defined in spec 3 to use 'Offset' field + int[] offsetArray = baseTag.getIntArray("Offset"); + yield Vector3Int.of(offsetArray[0], offsetArray[1], offsetArray[2]); + } + default -> throw new IllegalArgumentException("Failed to parse Sponge schematic: Unsupported format version: " + ver); + }; ByteArrayTag blocks = baseTag.getByteArrayTag("BlockData"); From 345012810abfcd144b06a749007c0f80e8cc0661 Mon Sep 17 00:00:00 2001 From: Astrash Date: Wed, 1 Mar 2023 13:22:39 +1100 Subject: [PATCH 100/161] Fix biome-provider-image-v2 addon manifest --- .../biome-provider-image-v2/src/main/resources/terra.addon.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 00c4fbec2..be3dd2af4 100644 --- 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 @@ -1,7 +1,7 @@ schema-version: 1 contributors: - Terra contributors -id: biome-provider-image +id: biome-provider-image-v2 version: @VERSION@ entrypoints: - "com.dfsek.terra.addons.biome.image.v2.ImageBiomeProviderAddon" From d3e0831d9ecba1800ea8d5d2c9eed32b9a6d5fb2 Mon Sep 17 00:00:00 2001 From: Astrash Date: Wed, 1 Mar 2023 13:25:20 +1100 Subject: [PATCH 101/161] Use config type based image loading Rename `path` key to `image` --- .../terra/addons/image/ImageLibraryAddon.java | 8 ++- .../addons/image/config/ImageLoader.java | 57 ------------------- .../addons/image/config/image/ImageCache.java | 46 +++++++++++++++ .../image/config/image/ImageTemplate.java | 35 ++++++++++++ .../image/ImageColorSamplerTemplate.java | 2 +- 5 files changed, 88 insertions(+), 60 deletions(-) delete mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageTemplate.java 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 cb556b563..831e4828a 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 @@ -4,7 +4,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.function.Supplier; -import com.dfsek.terra.addons.image.config.ImageLoader; +import com.dfsek.terra.addons.image.config.image.ImageTemplate; import com.dfsek.terra.addons.image.config.sampler.ConstantColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.image.SingleImageColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.image.TileImageColorSamplerTemplate; @@ -25,6 +25,9 @@ import com.dfsek.terra.api.util.reflection.TypeKey; public class ImageLibraryAddon implements AddonInitializer { + public static final TypeKey>> IMAGE_REGISTRY_KEY = new TypeKey<>() { + }; + public static final TypeKey>> COLOR_PICKER_REGISTRY_KEY = new TypeKey<>() { }; @@ -42,7 +45,8 @@ public class ImageLibraryAddon implements AddonInitializer { .priority(10) .then(event -> { ConfigPack pack = event.getPack(); - pack.applyLoader(Image.class, new ImageLoader(pack.getLoader(), pack)); + CheckedRegistry>> imageRegistry = pack.getOrCreateRegistry(IMAGE_REGISTRY_KEY); + imageRegistry.register(addon.key("BITMAP"), () -> new ImageTemplate(pack.getLoader(), pack)); }) .then(event -> { CheckedRegistry>> colorSamplerRegistry = event.getPack().getOrCreateRegistry( diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java deleted file mode 100644 index cedfbb3bb..000000000 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.dfsek.terra.addons.image.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 org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.imageio.ImageIO; -import java.io.IOException; -import java.lang.reflect.AnnotatedType; -import java.util.concurrent.ConcurrentHashMap; - -import com.dfsek.terra.addons.image.image.BufferedImageWrapper; -import com.dfsek.terra.addons.image.image.Image; -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.config.Loader; -import com.dfsek.terra.api.properties.Properties; - - -public class ImageLoader implements TypeLoader { - - private static final Logger logger = LoggerFactory.getLogger(ImageLoader.class); - - private final Loader files; - - private final ConfigPack pack; - - public ImageLoader(Loader files, ConfigPack pack) { - this.files = files; - this.pack = pack; - if(!pack.getContext().has(ImageCache.class)) - pack.getContext().put(new ImageCache(new ConcurrentHashMap<>())); - } - - @Override - public Image load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) - throws LoadException { - return pack.getContext().get(ImageCache.class).map.computeIfAbsent((String) c, imagePath -> { - try { - return new BufferedImageWrapper(ImageIO.read(files.get(imagePath))); - } catch(IllegalArgumentException e) { - throw new LoadException("Unable to load image (image might be too large?)", e, depthTracker); - } catch(IOException e) { - throw new LoadException("Unable to load image", e, depthTracker); - } - }); - } - - /* - * Cache prevents configs from loading the same image multiple times into memory - */ - private record ImageCache(ConcurrentHashMap map) implements Properties { - } -} 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 new file mode 100644 index 000000000..5f96ea390 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java @@ -0,0 +1,46 @@ +package com.dfsek.terra.addons.image.config.image; + +import javax.imageio.ImageIO; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; + +import com.dfsek.terra.addons.image.image.BufferedImageWrapper; +import com.dfsek.terra.addons.image.image.Image; +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.config.Loader; +import com.dfsek.terra.api.properties.Properties; + + +/* + * Cache prevents configs from loading the same image multiple times into memory + */ +record ImageCache(ConcurrentHashMap map) implements Properties { + public static Image load(String path, ConfigPack pack, Loader files) throws IOException { + ImageCache cache; + if(!pack.getContext().has(ImageCache.class)) { + cache = new ImageCache(new ConcurrentHashMap<>()); + pack.getContext().put(cache); + } else { + cache = pack.getContext().get(ImageCache.class); + } + + if(cache.map.containsKey(path)) { + return cache.map.get(path); + } else { + try { + BufferedImageWrapper image = new BufferedImageWrapper(ImageIO.read(files.get(path))); + cache.map.put(path, image); + return image; + } 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); + } + } + } +} 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 new file mode 100644 index 000000000..7590ca1b4 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageTemplate.java @@ -0,0 +1,35 @@ +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; + + +public class ImageTemplate implements ObjectTemplate { + + @Value("path") + private String path; + + private final Loader files; + + private final ConfigPack pack; + + public ImageTemplate(Loader files, ConfigPack pack) { + this.files = files; + this.pack = pack; + } + + @Override + public Image get() { + try { + return ImageCache.load(path, pack, files); + } catch(IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/ImageColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/ImageColorSamplerTemplate.java index 98e61baa8..3e129ba6e 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/ImageColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/ImageColorSamplerTemplate.java @@ -11,7 +11,7 @@ import com.dfsek.terra.addons.image.sampler.image.transform.Alignment; public abstract class ImageColorSamplerTemplate implements ObjectTemplate { - @Value("path") + @Value("image") protected Image image; @Value("align") From 6efff02c19ef089d5d74df5ce4f30067afcab9f8 Mon Sep 17 00:00:00 2001 From: Astrash Date: Wed, 1 Mar 2023 13:26:18 +1100 Subject: [PATCH 102/161] Implement stitched image support --- .../terra/addons/image/ImageLibraryAddon.java | 2 + .../config/image/StitchedImageTemplate.java | 76 +++++++++++++++++++ .../addons/image/image/StitchedImage.java | 74 ++++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/StitchedImageTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/StitchedImage.java 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 831e4828a..9212db2c3 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 @@ -5,6 +5,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.function.Supplier; 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.sampler.ConstantColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.image.SingleImageColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.image.TileImageColorSamplerTemplate; @@ -47,6 +48,7 @@ public class ImageLibraryAddon implements AddonInitializer { 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)); }) .then(event -> { CheckedRegistry>> colorSamplerRegistry = event.getPack().getOrCreateRegistry( 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 new file mode 100644 index 000000000..509bbeb22 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/StitchedImageTemplate.java @@ -0,0 +1,76 @@ +package com.dfsek.terra.addons.image.config.image; + +import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import com.dfsek.tectonic.api.exception.ValidationException; + +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 { + + @Value("path-format") + private String path; + + @Value("rows") + private int rows; + + @Value("columns") + private int cols; + + @Value("zero-indexed") + @Default + private boolean zeroIndexed = false; + + private final Loader files; + + private final ConfigPack pack; + + public StitchedImageTemplate(Loader files, ConfigPack pack) { + this.files = files; + this.pack = pack; + } + + @Override + public Image get() { + Image[][] grid = new Image[rows][cols]; + 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); + } catch(IOException e) { + throw new RuntimeException(e); + } + } + } + return new StitchedImage(grid, zeroIndexed); + } + + private String getFormattedPath(int row, int column) { + if (!zeroIndexed) { + row++; + column++; + } + return path.replaceFirst("\\{row}", String.valueOf(row)).replaceFirst("\\{column}", String.valueOf(column)); + } + + @Override + public boolean validate() throws ValidationException { + if(!path.contains("{row}")) + throw new ValidationException("Path format does not contain sequence '{row}'"); + if(!path.contains("{column}")) + throw new ValidationException("Path format does not contain sequence '{column}'"); + if(rows < 1) + throw new ValidationException("Must have at least one row"); + if(cols < 1) + throw new ValidationException("Must have at least one column"); + return true; + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/StitchedImage.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/StitchedImage.java new file mode 100644 index 000000000..c2d131b46 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/StitchedImage.java @@ -0,0 +1,74 @@ +package com.dfsek.terra.addons.image.image; + +public class StitchedImage implements Image { + + private final Image[][] images; + + private final int[] rowOffsets, columnOffsets; + + private final int width, height; + + public StitchedImage(Image[][] images, boolean zeroIndexed) throws IllegalArgumentException { + int width = 0; + int height = 0; + int rows = images.length; + int columns = images[0].length; + this.rowOffsets = new int[rows]; + this.columnOffsets = new int[columns]; + for(int i = 0; i < rows; i++) { + int rowHeight = images[i][0].getHeight(); + rowOffsets[i] = height; + height += rowHeight; + for(int j = 1; j < columns; j++) { + if(images[i][j].getHeight() != rowHeight) + throw new IllegalArgumentException("Image heights in row " + (i + (zeroIndexed ? 0 : 1)) + " do not match"); + } + } + for(int i = 0; i < columns; i++) { + int columnWidth = images[0][i].getWidth(); + columnOffsets[i] = width; + width += columnWidth; + for(int j = 1; j < rows; j++) { + if(images[i][j].getWidth() != columnWidth) + throw new IllegalArgumentException("Image widths in column " + (i + (zeroIndexed ? 0 : 1)) + " do not match"); + } + } + + this.width = width; + this.height = height; + this.images = images; + } + + private int getColumn(int x) { + for(int i = columnOffsets.length-1; i > 0; i--) { + if(x >= columnOffsets[i]) + return i; + } + return 0; + } + + private int getRow(int y) { + for(int i = rowOffsets.length-1; i > 0; i--) { + if(y >= rowOffsets[i]) + return i; + } + return 0; + } + + @Override + public int getRGB(int x, int y) { + int row = getRow(y); + int column = getColumn(x); + return images[row][column].getRGB(x-columnOffsets[column], y-rowOffsets[row]); + } + + @Override + public int getWidth() { + return width; + } + + @Override + public int getHeight() { + return height; + } +} From 2afcee28a6cccd47b99412dcc6c3a1196bb8af91 Mon Sep 17 00:00:00 2001 From: Astrash Date: Wed, 1 Mar 2023 13:39:09 +1100 Subject: [PATCH 103/161] Base key names on internal names --- .../addons/biome/image/v2/config/ImageProviderTemplate.java | 4 ++-- .../config/sampler/image/SingleImageColorSamplerTemplate.java | 2 +- .../config/sampler/mutate/MutateColorSamplerTemplate.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) 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-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/ImageProviderTemplate.java index 42aff8223..ddc93ee6e 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-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/ImageProviderTemplate.java @@ -27,10 +27,10 @@ public class ImageProviderTemplate implements ObjectTemplate { @Description("Sets the resolution at which to sample the image.") private int resolution = 1; - @Value("image") + @Value("color-sampler") private ColorSampler colorSampler; - @Value("biomes") + @Value("color-conversion") private ColorConverter colorConverter; @Override diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/SingleImageColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/SingleImageColorSamplerTemplate.java index e6ae59e24..fdd552804 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/SingleImageColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/SingleImageColorSamplerTemplate.java @@ -7,7 +7,7 @@ import com.dfsek.terra.addons.image.sampler.image.SingleImageColorSampler; public class SingleImageColorSamplerTemplate extends ImageColorSamplerTemplate { - @Value("outside-image") + @Value("outside-sampler") private ColorSampler fallback; @Override diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/MutateColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/MutateColorSamplerTemplate.java index 35f5f137c..2274f7b20 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/MutateColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/MutateColorSamplerTemplate.java @@ -8,6 +8,6 @@ import com.dfsek.terra.addons.image.sampler.ColorSampler; public abstract class MutateColorSamplerTemplate implements ObjectTemplate { - @Value("image") + @Value("color-sampler") protected ColorSampler sampler; } From f918f1ef66fbbd6448378fc3b2975aa2b8ec44c1 Mon Sep 17 00:00:00 2001 From: C_Corp2002 Date: Sun, 9 Apr 2023 21:08:38 -0700 Subject: [PATCH 104/161] An attempt at 1.19.4 Support I tried. --- platforms/bukkit/nms/build.gradle.kts | 17 ++ .../bukkit/nms/v1_19_R3/AwfulBukkitHacks.java | 100 ++++++++++ .../bukkit/nms/v1_19_R3/NMSBiomeInfo.java | 10 + .../bukkit/nms/v1_19_R3/NMSBiomeInjector.java | 81 ++++++++ .../bukkit/nms/v1_19_R3/NMSBiomeProvider.java | 47 +++++ .../v1_19_R3/NMSChunkGeneratorDelegate.java | 173 ++++++++++++++++++ .../bukkit/nms/v1_19_R3/NMSInitializer.java | 15 ++ .../nms/v1_19_R3/NMSInjectListener.java | 48 +++++ .../nms/v1_19_R3/NMSWorldProperties.java | 36 ++++ .../terra/bukkit/nms/v1_19_R3/Reflection.java | 52 ++++++ .../bukkit/nms/v1_19_R3/RegistryFetcher.java | 25 +++ 11 files changed, 604 insertions(+) create mode 100644 platforms/bukkit/nms/build.gradle.kts create mode 100644 platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java create mode 100644 platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java create mode 100644 platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java create mode 100644 platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java create mode 100644 platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java create mode 100644 platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java create mode 100644 platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java create mode 100644 platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java create mode 100644 platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java create mode 100644 platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java diff --git a/platforms/bukkit/nms/build.gradle.kts b/platforms/bukkit/nms/build.gradle.kts new file mode 100644 index 000000000..f516f1afd --- /dev/null +++ b/platforms/bukkit/nms/build.gradle.kts @@ -0,0 +1,17 @@ +apply(plugin = "io.papermc.paperweight.userdev") + +repositories { + maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") +} + +dependencies { + api(project(":platforms:bukkit:common")) + paperDevBundle("1.19.4-R0.1-SNAPSHOT") + implementation("xyz.jpenilla", "reflection-remapper", "0.1.0-SNAPSHOT") +} + +tasks { + assemble { + dependsOn("reobfJar") + } +} diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java new file mode 100644 index 000000000..d5ab4b3d2 --- /dev/null +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java @@ -0,0 +1,100 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import com.google.common.collect.ImmutableMap; +import com.mojang.serialization.Lifecycle; +import net.minecraft.core.Holder; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.WritableRegistry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; +import org.bukkit.NamespacedKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; +import com.dfsek.terra.registry.master.ConfigRegistry; + + +public class AwfulBukkitHacks { + private static final Logger LOGGER = LoggerFactory.getLogger(AwfulBukkitHacks.class); + + private static final Map> terraBiomeMap = new HashMap<>(); + + public static void registerBiomes(ConfigRegistry configRegistry) { + try { + LOGGER.info("Hacking biome registry..."); + WritableRegistry biomeRegistry = (WritableRegistry) RegistryFetcher.biomeRegistry(); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, false); + + 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 = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); + Biome platform = NMSBiomeInjector.createBiome(biome, Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey))); + + ResourceKey delegateKey = ResourceKey.create( + Registries.BIOME, + new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key)) + ); + + Reference holder = biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); + Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder. + + platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); + + terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location()); + + LOGGER.debug("Registered biome: " + delegateKey); + } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + throw new RuntimeException(e); + } + })); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) 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())), + HashMap::putAll); + + terraBiomeMap + .forEach((vb, terraBiomes) -> + NMSBiomeInjector.getEntry(biomeRegistry, vb).ifPresentOrElse( + vanilla -> terraBiomes.forEach( + tb -> NMSBiomeInjector.getEntry(biomeRegistry, tb).ifPresentOrElse( + terra -> { + LOGGER.debug("{} (vanilla for {}): {}", + vanilla.unwrapKey().orElseThrow().location(), + terra.unwrapKey().orElseThrow().location(), + vanilla.tags().toList()); + vanilla.tags() + .forEach(tag -> collect + .computeIfAbsent(tag, t -> new ArrayList<>()) + .add(terra)); + }, + () -> LOGGER.error("No such biome: {}", tb))), + () -> LOGGER.error("No vanilla biome: {}", vb))); + + biomeRegistry.resetTags(); + biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); + + } catch(SecurityException | IllegalArgumentException exception) { + throw new RuntimeException(exception); + } + } +} diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java new file mode 100644 index 000000000..816d96068 --- /dev/null +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; + +import com.dfsek.terra.api.properties.Properties; + + +public record NMSBiomeInfo(ResourceKey biomeKey) implements Properties { +} diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java new file mode 100644 index 000000000..11b309ea6 --- /dev/null +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java @@ -0,0 +1,81 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import net.minecraft.core.Holder; +import java.util.stream.Stream; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +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 java.util.function.Function; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; + +import static net.minecraft.world.level.biome.Biome.Precipitation; + +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 + .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/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java new file mode 100644 index 000000000..52711f0ec --- /dev/null +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java @@ -0,0 +1,47 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import com.mojang.serialization.Codec; +import net.minecraft.core.Holder; +import java.util.stream.Stream; +import net.minecraft.core.Registry; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Climate.Sampler; +import org.jetbrains.annotations.NotNull; + +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; + + +public class NMSBiomeProvider extends BiomeSource { + private final BiomeProvider delegate; + private final long seed; + private final Registry biomeRegistry = RegistryFetcher.biomeRegistry(); + + public NMSBiomeProvider(BiomeProvider delegate, long seed) { + super(); + this.delegate = delegate; + this.seed = seed; + } + @Override + protected Stream> collectPossibleBiomes() { + return delegate.stream() + .map(biome -> RegistryFetcher.biomeRegistry() + .getHolderOrThrow(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() + .get(NMSBiomeInfo.class) + .biomeKey())); + } + + @Override + protected @NotNull Codec codec() { + return BiomeSource.CODEC; + } + + @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) + .getPlatformBiome()).getContext() + .get(NMSBiomeInfo.class) + .biomeKey()); + } +} diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java new file mode 100644 index 000000000..78eda7e32 --- /dev/null +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java @@ -0,0 +1,173 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.NoiseColumn; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.BiomeManager; +import net.minecraft.world.level.block.Blocks; +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; +import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; +import com.dfsek.terra.bukkit.config.PreLoadCompatibilityOptions; +import com.dfsek.terra.bukkit.world.BukkitWorldProperties; +import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; + + +public class NMSChunkGeneratorDelegate extends ChunkGenerator { + private static final Logger LOGGER = LoggerFactory.getLogger(NMSChunkGeneratorDelegate.class); + private final com.dfsek.terra.api.world.chunk.generation.ChunkGenerator delegate; + + private final ChunkGenerator vanilla; + private final ConfigPack pack; + + private final long seed; + + public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, long seed) { + super(biomeProvider); + this.delegate = pack.getGeneratorProvider().newInstance(pack); + this.vanilla = vanilla; + this.pack = pack; + this.seed = seed; + } + + @Override + protected @NotNull Codec codec() { + return ChunkGenerator.CODEC; + } + + @Override + public void applyCarvers(@NotNull WorldGenRegion chunkRegion, long seed, @NotNull RandomState noiseConfig, @NotNull BiomeManager world, + @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk, @NotNull Carving carverStep) { + // no-op + } + + @Override + public void buildSurface(@NotNull WorldGenRegion region, @NotNull StructureManager structures, @NotNull RandomState noiseConfig, + @NotNull ChunkAccess chunk) { + // no-op + } + + @Override + public void applyBiomeDecoration(@NotNull WorldGenLevel world, @NotNull ChunkAccess chunk, + @NotNull StructureManager structureAccessor) { + vanilla.applyBiomeDecoration(world, chunk, structureAccessor); + } + + @Override + public void spawnOriginalMobs(@NotNull WorldGenRegion region) { + vanilla.spawnOriginalMobs(region); + } + + @Override + public int getGenDepth() { + return vanilla.getGenDepth(); + } + + @Override + public @NotNull CompletableFuture fillFromNoise(@NotNull Executor executor, @NotNull Blender blender, + @NotNull RandomState noiseConfig, + @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk) { + return vanilla.fillFromNoise(executor, blender, noiseConfig, structureAccessor, chunk) + .thenApply(c -> { + LevelAccessor level = Reflection.STRUCTURE_MANAGER.getLevel(structureAccessor); + BiomeProvider biomeProvider = pack.getBiomeProvider(); + PreLoadCompatibilityOptions compatibilityOptions = pack.getContext().get(PreLoadCompatibilityOptions.class); + if(compatibilityOptions.isBeard()) { + beard(structureAccessor, chunk, new BukkitWorldProperties(level.getMinecraftWorld().getWorld()), biomeProvider, compatibilityOptions); + } + return c; + }); + } + + private void beard(StructureManager structureAccessor, ChunkAccess chunk, WorldProperties world, BiomeProvider biomeProvider, + PreLoadCompatibilityOptions compatibilityOptions) { + Beardifier structureWeightSampler = Beardifier.forStructuresInChunk(structureAccessor, chunk.getPos()); + double threshold = compatibilityOptions.getBeardThreshold(); + double airThreshold = compatibilityOptions.getAirThreshold(); + int xi = chunk.getPos().x << 4; + int zi = chunk.getPos().z << 4; + for(int x = 0; x < 16; x++) { + for(int z = 0; z < 16; z++) { + int depth = 0; + for(int y = world.getMaxHeight(); y >= world.getMinHeight(); y--) { + double noise = structureWeightSampler.compute(new SinglePointContext(x + xi, y, z + zi)); + if(noise > threshold) { + chunk.setBlockState(new BlockPos(x, y, z), ((CraftBlockData) ((BukkitBlockState) delegate + .getPalette(x + xi, y, z + zi, world, biomeProvider) + .get(depth, x + xi, y, z + zi, world.getSeed())).getHandle()).getState(), false); + depth++; + } else if(noise < airThreshold) { + chunk.setBlockState(new BlockPos(x, y, z), Blocks.AIR.defaultBlockState(), false); + } else { + depth = 0; + } + } + } + } + } + + @Override + public int getSeaLevel() { + return vanilla.getSeaLevel(); + } + + @Override + public int getMinY() { + return vanilla.getMinY(); + } + + @Override + public int getBaseHeight(int x, int z, @NotNull Types heightmap, @NotNull LevelHeightAccessor world, @NotNull RandomState noiseConfig) { + WorldProperties properties = new NMSWorldProperties(seed, world); + int y = properties.getMaxHeight(); + BiomeProvider biomeProvider = pack.getBiomeProvider(); + while(y >= getMinY() && !heightmap.isOpaque().test( + ((CraftBlockData) delegate.getBlock(properties, x, y - 1, z, biomeProvider).getHandle()).getState())) { + y--; + } + return y; + } + + @Override + public @NotNull NoiseColumn getBaseColumn(int x, int z, @NotNull LevelHeightAccessor world, @NotNull RandomState noiseConfig) { + /* + BlockState[] array = new BlockState[world.getHeight()]; + WorldProperties properties = new NMSWorldProperties(seed, world); + BiomeProvider biomeProvider = pack.getBiomeProvider().caching(properties); + for(int y = properties.getMaxHeight() - 1; y >= properties.getMinHeight(); y--) { + array[y - properties.getMinHeight()] = ((CraftBlockData) delegate.getBlock(properties, x, y, z, biomeProvider) + .getHandle()).getState(); + } + return new NoiseColumn(getMinY(), array); + + */ + return vanilla.getBaseColumn(x, z, world, noiseConfig); + } + + @Override + public void addDebugScreenInfo(@NotNull List text, @NotNull RandomState noiseConfig, @NotNull BlockPos pos) { + + } +} diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java new file mode 100644 index 000000000..99797e8ab --- /dev/null +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import org.bukkit.Bukkit; + +import com.dfsek.terra.bukkit.PlatformImpl; +import com.dfsek.terra.bukkit.nms.Initializer; + + +public class NMSInitializer implements Initializer { + @Override + public void initialize(PlatformImpl platform) { + AwfulBukkitHacks.registerBiomes(platform.getRawConfigRegistry()); + Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin()); + } +} diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java new file mode 100644 index 000000000..46b479860 --- /dev/null +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.world.WorldInitEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.locks.ReentrantLock; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; + + +public class NMSInjectListener implements Listener { + private static final Logger LOGGER = LoggerFactory.getLogger(NMSInjectListener.class); + private static final Set INJECTED = new HashSet<>(); + private static final ReentrantLock INJECT_LOCK = new ReentrantLock(); + + @EventHandler + public void onWorldInit(WorldInitEvent event) { + if(!INJECTED.contains(event.getWorld()) && + event.getWorld().getGenerator() instanceof BukkitChunkGeneratorWrapper bukkitChunkGeneratorWrapper) { + INJECT_LOCK.lock(); + INJECTED.add(event.getWorld()); + LOGGER.info("Preparing to take over the world: {}", event.getWorld().getName()); + CraftWorld craftWorld = (CraftWorld) event.getWorld(); + ServerLevel serverWorld = craftWorld.getHandle(); + + ConfigPack pack = bukkitChunkGeneratorWrapper.getPack(); + + ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator(); + NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed()); + + serverWorld.getChunkSource().chunkMap.generator = new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()); + + LOGGER.info("Successfully injected into world."); + + INJECT_LOCK.unlock(); + } + } +} diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java new file mode 100644 index 000000000..0c88eec33 --- /dev/null +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import net.minecraft.world.level.LevelHeightAccessor; + +import com.dfsek.terra.api.world.info.WorldProperties; + + +public class NMSWorldProperties implements WorldProperties { + private final long seed; + private final LevelHeightAccessor height; + + public NMSWorldProperties(long seed, LevelHeightAccessor height) { + this.seed = seed; + this.height = height; + } + + @Override + public Object getHandle() { + return height; + } + + @Override + public long getSeed() { + return seed; + } + + @Override + public int getMaxHeight() { + return height.getMaxBuildHeight(); + } + + @Override + public int getMinHeight() { + return height.getMinBuildHeight(); + } +} diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java new file mode 100644 index 000000000..a10837e11 --- /dev/null +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import net.minecraft.core.Holder; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.MappedRegistry; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.StructureManager; +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 java.util.Objects; + + +public class Reflection { + public static final MappedRegistryProxy MAPPED_REGISTRY; + public static final StructureManagerProxy STRUCTURE_MANAGER; + + public static final ReferenceProxy REFERENCE; + + 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); + } + + + @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); + } +} diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java new file mode 100644 index 000000000..4c5c704b1 --- /dev/null +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +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.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.structure.StructureSet; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_19_R3.CraftServer; + + +public class RegistryFetcher { + private static Registry getRegistry(ResourceKey> key) { + CraftServer craftserver = (CraftServer) Bukkit.getServer(); + DedicatedServer dedicatedserver = craftserver.getServer(); + return dedicatedserver + .registryAccess() + .registryOrThrow(key); + } + + public static Registry biomeRegistry() { + return getRegistry(Registries.BIOME); + } +} From 9a5c1302ac32bd28b38056828a2eb18c3d024900 Mon Sep 17 00:00:00 2001 From: C_Corp2002 Date: Wed, 12 Apr 2023 00:51:12 -0700 Subject: [PATCH 105/161] Fixing...? We gottem. --- .../bukkit/nms/v1_19_R3/AwfulBukkitHacks.java | 1 + .../nms/v1_19_R3/AwfulBukkitHacks.java.txt | 100 ++++++++++++++++++ .../bukkit/nms/v1_19_R3/NMSBiomeInjector.java | 2 + 3 files changed, 103 insertions(+) create mode 100644 platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java.txt diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java index d5ab4b3d2..6ce0cc9a5 100644 --- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java @@ -98,3 +98,4 @@ public class AwfulBukkitHacks { } } } + diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java.txt b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java.txt new file mode 100644 index 000000000..d5ab4b3d2 --- /dev/null +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java.txt @@ -0,0 +1,100 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import com.google.common.collect.ImmutableMap; +import com.mojang.serialization.Lifecycle; +import net.minecraft.core.Holder; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.WritableRegistry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; +import org.bukkit.NamespacedKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; +import com.dfsek.terra.registry.master.ConfigRegistry; + + +public class AwfulBukkitHacks { + private static final Logger LOGGER = LoggerFactory.getLogger(AwfulBukkitHacks.class); + + private static final Map> terraBiomeMap = new HashMap<>(); + + public static void registerBiomes(ConfigRegistry configRegistry) { + try { + LOGGER.info("Hacking biome registry..."); + WritableRegistry biomeRegistry = (WritableRegistry) RegistryFetcher.biomeRegistry(); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, false); + + 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 = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); + Biome platform = NMSBiomeInjector.createBiome(biome, Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey))); + + ResourceKey delegateKey = ResourceKey.create( + Registries.BIOME, + new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key)) + ); + + Reference holder = biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); + Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder. + + platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); + + terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location()); + + LOGGER.debug("Registered biome: " + delegateKey); + } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + throw new RuntimeException(e); + } + })); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) 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())), + HashMap::putAll); + + terraBiomeMap + .forEach((vb, terraBiomes) -> + NMSBiomeInjector.getEntry(biomeRegistry, vb).ifPresentOrElse( + vanilla -> terraBiomes.forEach( + tb -> NMSBiomeInjector.getEntry(biomeRegistry, tb).ifPresentOrElse( + terra -> { + LOGGER.debug("{} (vanilla for {}): {}", + vanilla.unwrapKey().orElseThrow().location(), + terra.unwrapKey().orElseThrow().location(), + vanilla.tags().toList()); + vanilla.tags() + .forEach(tag -> collect + .computeIfAbsent(tag, t -> new ArrayList<>()) + .add(terra)); + }, + () -> LOGGER.error("No such biome: {}", tb))), + () -> LOGGER.error("No vanilla biome: {}", vb))); + + biomeRegistry.resetTags(); + biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); + + } catch(SecurityException | IllegalArgumentException exception) { + throw new RuntimeException(exception); + } + } +} diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java index 11b309ea6..f7bedfd0f 100644 --- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java @@ -16,6 +16,7 @@ import java.util.function.Function; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; +import static net.minecraft.world.level.biome.Biome.ClimateSettings; import static net.minecraft.world.level.biome.Biome.Precipitation; public class NMSBiomeInjector { @@ -31,6 +32,7 @@ public class NMSBiomeInjector { Biome.BiomeBuilder builder = new Biome.BiomeBuilder(); builder + .downfall(vanilla.climateSettings.downfall()) .temperature(vanilla.getBaseTemperature()) .mobSpawnSettings(vanilla.getMobSettings()) .generationSettings(vanilla.getGenerationSettings()); From 8fd10956e429bbaa02e22b980ecf71d4aaa31478 Mon Sep 17 00:00:00 2001 From: C_Corp2002 Date: Wed, 12 Apr 2023 00:51:49 -0700 Subject: [PATCH 106/161] Update build.gradle.kts --- platforms/bukkit/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index f099cb4e3..9cae85520 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -10,6 +10,7 @@ dependencies { shaded(project(":platforms:bukkit:common")) shaded(project(":platforms:bukkit:nms:v1_18_R2", configuration = "reobf")) shaded(project(":platforms:bukkit:nms:v1_19_R1", configuration = "reobf")) + shaded(project(":platforms:bukkit:nms:v1_19_R3", configuration = "reobf")) shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } From ba35b56016d1c70554a40047d7a22048fb12794f Mon Sep 17 00:00:00 2001 From: C_Corp2002 Date: Thu, 13 Apr 2023 15:40:13 -0700 Subject: [PATCH 107/161] Delete AwfulBukkitHacks.java.txt Unneeded. --- .../nms/v1_19_R3/AwfulBukkitHacks.java.txt | 100 ------------------ 1 file changed, 100 deletions(-) delete mode 100644 platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java.txt diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java.txt b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java.txt deleted file mode 100644 index d5ab4b3d2..000000000 --- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java.txt +++ /dev/null @@ -1,100 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R3; - -import com.google.common.collect.ImmutableMap; -import com.mojang.serialization.Lifecycle; -import net.minecraft.core.Holder; -import net.minecraft.core.Holder.Reference; -import net.minecraft.core.MappedRegistry; -import net.minecraft.core.WritableRegistry; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; -import net.minecraft.world.level.biome.Biome; -import org.bukkit.NamespacedKey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; -import com.dfsek.terra.registry.master.ConfigRegistry; - - -public class AwfulBukkitHacks { - private static final Logger LOGGER = LoggerFactory.getLogger(AwfulBukkitHacks.class); - - private static final Map> terraBiomeMap = new HashMap<>(); - - public static void registerBiomes(ConfigRegistry configRegistry) { - try { - LOGGER.info("Hacking biome registry..."); - WritableRegistry biomeRegistry = (WritableRegistry) RegistryFetcher.biomeRegistry(); - - Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, false); - - 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 = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); - Biome platform = NMSBiomeInjector.createBiome(biome, Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey))); - - ResourceKey delegateKey = ResourceKey.create( - Registries.BIOME, - new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key)) - ); - - Reference holder = biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); - Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder. - - platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); - - terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location()); - - LOGGER.debug("Registered biome: " + delegateKey); - } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { - throw new RuntimeException(e); - } - })); - - Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) 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())), - HashMap::putAll); - - terraBiomeMap - .forEach((vb, terraBiomes) -> - NMSBiomeInjector.getEntry(biomeRegistry, vb).ifPresentOrElse( - vanilla -> terraBiomes.forEach( - tb -> NMSBiomeInjector.getEntry(biomeRegistry, tb).ifPresentOrElse( - terra -> { - LOGGER.debug("{} (vanilla for {}): {}", - vanilla.unwrapKey().orElseThrow().location(), - terra.unwrapKey().orElseThrow().location(), - vanilla.tags().toList()); - vanilla.tags() - .forEach(tag -> collect - .computeIfAbsent(tag, t -> new ArrayList<>()) - .add(terra)); - }, - () -> LOGGER.error("No such biome: {}", tb))), - () -> LOGGER.error("No vanilla biome: {}", vb))); - - biomeRegistry.resetTags(); - biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); - - } catch(SecurityException | IllegalArgumentException exception) { - throw new RuntimeException(exception); - } - } -} From 57a45f08f08b9bffa60b191b2fe334b712dc4b3a Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 13 Apr 2023 16:31:41 -0700 Subject: [PATCH 108/161] re-package bukkit 1.19.4 code --- platforms/bukkit/nms/v1_19_R1/build.gradle.kts | 2 +- platforms/bukkit/nms/v1_19_R3/build.gradle.kts | 17 +++++++++++++++++ .../bukkit/nms/v1_19_R3/AwfulBukkitHacks.java | 0 .../terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java | 0 .../bukkit/nms/v1_19_R3/NMSBiomeInjector.java | 0 .../bukkit/nms/v1_19_R3/NMSBiomeProvider.java | 0 .../nms/v1_19_R3/NMSChunkGeneratorDelegate.java | 0 .../bukkit/nms/v1_19_R3/NMSInitializer.java | 0 .../bukkit/nms/v1_19_R3/NMSInjectListener.java | 0 .../bukkit/nms/v1_19_R3/NMSWorldProperties.java | 0 .../terra/bukkit/nms/v1_19_R3/Reflection.java | 0 .../bukkit/nms/v1_19_R3/RegistryFetcher.java | 0 12 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 platforms/bukkit/nms/v1_19_R3/build.gradle.kts rename platforms/bukkit/nms/{ => v1_19_R3}/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java (100%) rename platforms/bukkit/nms/{ => v1_19_R3}/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java (100%) rename platforms/bukkit/nms/{ => v1_19_R3}/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java (100%) rename platforms/bukkit/nms/{ => v1_19_R3}/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java (100%) rename platforms/bukkit/nms/{ => v1_19_R3}/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java (100%) rename platforms/bukkit/nms/{ => v1_19_R3}/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java (100%) rename platforms/bukkit/nms/{ => v1_19_R3}/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java (100%) rename platforms/bukkit/nms/{ => v1_19_R3}/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java (100%) rename platforms/bukkit/nms/{ => v1_19_R3}/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java (100%) rename platforms/bukkit/nms/{ => v1_19_R3}/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java (100%) diff --git a/platforms/bukkit/nms/v1_19_R1/build.gradle.kts b/platforms/bukkit/nms/v1_19_R1/build.gradle.kts index 96f9038d8..b38ee0e04 100644 --- a/platforms/bukkit/nms/v1_19_R1/build.gradle.kts +++ b/platforms/bukkit/nms/v1_19_R1/build.gradle.kts @@ -6,7 +6,7 @@ repositories { dependencies { api(project(":platforms:bukkit:common")) - paperDevBundle(Versions.Bukkit.paperDevBundle) + paperDevBundle("1.19.2-R0.1-SNAPSHOT") implementation("xyz.jpenilla", "reflection-remapper", "0.1.0-SNAPSHOT") } diff --git a/platforms/bukkit/nms/v1_19_R3/build.gradle.kts b/platforms/bukkit/nms/v1_19_R3/build.gradle.kts new file mode 100644 index 000000000..96f9038d8 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R3/build.gradle.kts @@ -0,0 +1,17 @@ +apply(plugin = "io.papermc.paperweight.userdev") + +repositories { + maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") +} + +dependencies { + api(project(":platforms:bukkit:common")) + paperDevBundle(Versions.Bukkit.paperDevBundle) + implementation("xyz.jpenilla", "reflection-remapper", "0.1.0-SNAPSHOT") +} + +tasks { + assemble { + dependsOn("reobfJar") + } +} \ No newline at end of file diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java similarity index 100% rename from platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java rename to platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java similarity index 100% rename from platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java rename to platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java similarity index 100% rename from platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java rename to platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java similarity index 100% rename from platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java rename to platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java similarity index 100% rename from platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java rename to platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java b/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java similarity index 100% rename from platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java rename to platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java b/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java similarity index 100% rename from platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java rename to platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java b/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java similarity index 100% rename from platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java rename to platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java b/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java similarity index 100% rename from platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java rename to platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java b/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java similarity index 100% rename from platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java rename to platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java From 75bff93ecd0b20747423dfdb55dea1a010ee5b30 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 13 Apr 2023 16:31:49 -0700 Subject: [PATCH 109/161] update mod versions --- buildSrc/src/main/kotlin/Versions.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 09b2244af..8be4f888a 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -24,14 +24,14 @@ object Versions { object Quilt { const val quiltLoader = "0.17.0" - const val fabricApi = "2.0.0-beta.4+0.57.0-1.19" + const val fabricApi = "6.0.0-beta.3+0.76.0-1.19.4" } object Mod { const val mixin = "0.11.2+mixin.0.8.5" - const val minecraft = "1.19" - const val yarn = "$minecraft+build.1" + const val minecraft = "1.19.4" + const val yarn = "$minecraft+build.2" const val fabricLoader = "0.14.2" const val architecuryLoom = "0.12.0.290" @@ -43,7 +43,7 @@ object Versions { } object Forge { - const val forge = "${Mod.minecraft}-41.0.63" + const val forge = "${Mod.minecraft}-45.0.43" const val burningwave = "12.53.0" } @@ -52,7 +52,7 @@ object Versions { const val paperLib = "1.0.5" const val minecraft = "1.19.2" const val reflectionRemapper = "0.1.0-SNAPSHOT" - const val paperDevBundle = "1.19.2-R0.1-SNAPSHOT" + const val paperDevBundle = "1.19.4-R0.1-SNAPSHOT" } object Sponge { From 460a7651bc24e68c5a5ed3f277d0978c4bf403b5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 13 Apr 2023 16:44:01 -0700 Subject: [PATCH 110/161] fix bukkit build --- buildSrc/src/main/kotlin/Versions.kt | 2 +- platforms/bukkit/nms/v1_19_R1/build.gradle.kts | 4 ++-- platforms/bukkit/nms/v1_19_R2/build.gradle.kts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index a3d607b67..d9ce7706e 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -19,7 +19,7 @@ object Versions { object Fabric { const val fabricLoader = "0.14.8" - const val fabricAPI = "0.69.1+1.19.3" + const val fabricAPI = "0.78.0+1.19.4" } object Quilt { diff --git a/platforms/bukkit/nms/v1_19_R1/build.gradle.kts b/platforms/bukkit/nms/v1_19_R1/build.gradle.kts index b38ee0e04..27f3b157e 100644 --- a/platforms/bukkit/nms/v1_19_R1/build.gradle.kts +++ b/platforms/bukkit/nms/v1_19_R1/build.gradle.kts @@ -6,7 +6,7 @@ repositories { dependencies { api(project(":platforms:bukkit:common")) - paperDevBundle("1.19.2-R0.1-SNAPSHOT") + paperDevBundle("1.19-R0.1-SNAPSHOT") implementation("xyz.jpenilla", "reflection-remapper", "0.1.0-SNAPSHOT") } @@ -14,4 +14,4 @@ tasks { assemble { dependsOn("reobfJar") } -} \ No newline at end of file +} diff --git a/platforms/bukkit/nms/v1_19_R2/build.gradle.kts b/platforms/bukkit/nms/v1_19_R2/build.gradle.kts index 96f9038d8..687d651b6 100644 --- a/platforms/bukkit/nms/v1_19_R2/build.gradle.kts +++ b/platforms/bukkit/nms/v1_19_R2/build.gradle.kts @@ -6,7 +6,7 @@ repositories { dependencies { api(project(":platforms:bukkit:common")) - paperDevBundle(Versions.Bukkit.paperDevBundle) + paperDevBundle("1.19.3-R0.1-SNAPSHOT") implementation("xyz.jpenilla", "reflection-remapper", "0.1.0-SNAPSHOT") } From 8b74a5dee0105e83d56462fff45cdc5dbb6ebb01 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 13 Apr 2023 16:45:09 -0700 Subject: [PATCH 111/161] implement biomeStream --- .../terra/mod/generation/TerraBiomeSource.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) 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 7ab085780..d4a285edd 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 @@ -26,6 +26,7 @@ import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.stream.Stream; import java.util.stream.StreamSupport; import com.dfsek.terra.api.config.ConfigPack; @@ -41,11 +42,6 @@ public class TerraBiomeSource extends BiomeSource { private ConfigPack pack; public TerraBiomeSource(ConfigPack pack) { - super(StreamSupport - .stream(pack.getBiomeProvider() - .getBiomes() - .spliterator(), false) - .map(b -> ((ProtoPlatformBiome) b.getPlatformBiome()).getDelegate())); this.pack = pack; LOGGER.debug("Biomes: " + getBiomes()); @@ -56,6 +52,15 @@ public class TerraBiomeSource extends BiomeSource { return Codecs.TERRA_BIOME_SOURCE; } + @Override + protected Stream> biomeStream() { + return StreamSupport + .stream(pack.getBiomeProvider() + .getBiomes() + .spliterator(), false) + .map(b -> ((ProtoPlatformBiome) b.getPlatformBiome()).getDelegate()); + } + @Override public RegistryEntry getBiome(int biomeX, int biomeY, int biomeZ, MultiNoiseSampler noiseSampler) { return ((ProtoPlatformBiome) pack From 6f2c01ceb308b674fe044d20c6bad9a123ab6414 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 13 Apr 2023 17:20:20 -0700 Subject: [PATCH 112/161] update biome builder --- .../com/dfsek/terra/mod/config/VanillaBiomeProperties.java | 4 ++-- .../src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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 b5b88a6b9..feb3680d2 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 @@ -52,7 +52,7 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties { @Value("climate.precipitation") @Default - private Precipitation precipitation = null; + private Boolean precipitation = true; @Value("climate.temperature") @Default @@ -122,7 +122,7 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties { return particleConfig; } - public Precipitation getPrecipitation() { + public Boolean getPrecipitation() { return precipitation; } 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 53f406adc..803b78b0b 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 @@ -155,11 +155,11 @@ public final class MinecraftUtil { effects.music(vanillaBiomeProperties.getMusic()); } - builder.precipitation(Objects.requireNonNullElse(vanillaBiomeProperties.getPrecipitation(), vanilla.getPrecipitation())); + builder.precipitation(Objects.requireNonNullElse(vanillaBiomeProperties.getPrecipitation(), vanilla.hasPrecipitation())); builder.temperature(Objects.requireNonNullElse(vanillaBiomeProperties.getTemperature(), vanilla.getTemperature())); - builder.downfall(Objects.requireNonNullElse(vanillaBiomeProperties.getDownfall(), vanilla.getDownfall())); + builder.downfall(Objects.requireNonNullElse(vanillaBiomeProperties.getDownfall(), ((BiomeAccessor) ((Object) vanilla)).getWeather().downfall())); builder.temperatureModifier(Objects.requireNonNullElse(vanillaBiomeProperties.getTemperatureModifier(), ((BiomeAccessor) ((Object) vanilla)).getWeather().temperatureModifier())); From ca2fe27fb36b5e1b73ac6fb046aed7da43caddba Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 13 Apr 2023 18:15:35 -0700 Subject: [PATCH 113/161] fix preset creation --- .../access/WorldPresetsRegistrarAccessor.java | 13 ++++++++ .../lifecycle/WorldPresetsRegistrarMixin.java | 23 +++++++++++++ .../mod/mixin_ifaces/RegistrarInstance.java | 8 +++++ .../com/dfsek/terra/mod/util/PresetUtil.java | 33 +++++-------------- .../src/main/resources/terra.accesswidener | 3 +- .../main/resources/terra.common.mixins.json | 4 ++- 6 files changed, 57 insertions(+), 27 deletions(-) create mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/WorldPresetsRegistrarAccessor.java create mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/WorldPresetsRegistrarMixin.java create mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin_ifaces/RegistrarInstance.java diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/WorldPresetsRegistrarAccessor.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/WorldPresetsRegistrarAccessor.java new file mode 100644 index 000000000..d7acfce81 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/WorldPresetsRegistrarAccessor.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.mod.mixin.access; + +import net.minecraft.world.dimension.DimensionOptions; +import net.minecraft.world.gen.WorldPreset; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + + +@Mixin(targets = "net.minecraft.world.gen.WorldPresets$Registrar") +public interface WorldPresetsRegistrarAccessor { + @Invoker("createPreset") + WorldPreset callCreatePreset(DimensionOptions dimensionOptions); +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/WorldPresetsRegistrarMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/WorldPresetsRegistrarMixin.java new file mode 100644 index 000000000..c102e46b8 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/WorldPresetsRegistrarMixin.java @@ -0,0 +1,23 @@ +package com.dfsek.terra.mod.mixin.lifecycle; + +import com.dfsek.terra.mod.mixin_ifaces.FloraFeatureHolder; +import com.dfsek.terra.mod.mixin_ifaces.RegistrarInstance; + +import net.minecraft.registry.Registerable; +import net.minecraft.world.gen.WorldPreset; +import net.minecraft.world.gen.WorldPresets; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +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; + + +@Mixin(WorldPresets.Registrar.class) +public class WorldPresetsRegistrarMixin { + @Inject(at = @At("RETURN"), method = "") + public void injectConstructor(Registerable presetRegisterable, CallbackInfo ci) { + RegistrarInstance.INSTANCE = (WorldPresets.Registrar) (Object) this; + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin_ifaces/RegistrarInstance.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin_ifaces/RegistrarInstance.java new file mode 100644 index 000000000..2b36837fc --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin_ifaces/RegistrarInstance.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.mod.mixin_ifaces; + +import net.minecraft.world.gen.WorldPresets; + + +public class RegistrarInstance { + public static WorldPresets.Registrar INSTANCE; +} 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 5bf790dfa..74c3bff39 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 @@ -2,19 +2,26 @@ package com.dfsek.terra.mod.util; import com.dfsek.terra.mod.ModPlatform; +import com.dfsek.terra.mod.mixin.access.WorldPresetsRegistrarAccessor; +import com.dfsek.terra.mod.mixin_ifaces.RegistrarInstance; + import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryEntryLookup; 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; import net.minecraft.world.biome.source.TheEndBiomeSource; import net.minecraft.world.dimension.DimensionOptions; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.dimension.DimensionTypes; import net.minecraft.world.gen.WorldPreset; +import net.minecraft.world.gen.WorldPresets; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.NoiseChunkGenerator; @@ -40,25 +47,7 @@ public class PresetUtil { Registry dimensionTypeRegistry = platform.dimensionTypeRegistry(); Registry chunkGeneratorSettingsRegistry = platform.chunkGeneratorSettingsRegistry(); - RegistryEntry theNetherDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow(); - RegistryEntry - netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER).orElseThrow(); - DimensionOptions netherDimensionOptions = new DimensionOptions(theNetherDimensionType, - new NoiseChunkGenerator( - MultiNoiseBiomeSource.Preset.NETHER.getBiomeSource( - platform.biomeRegistry().getReadOnlyWrapper()), - netherChunkGeneratorSettings)); - RegistryEntry theEndDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_END).orElseThrow(); - RegistryEntry endChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry( - ChunkGeneratorSettings.END).orElseThrow(); - DimensionOptions endDimensionOptions = new DimensionOptions(theEndDimensionType, - new NoiseChunkGenerator( - TheEndBiomeSource.createVanilla( - platform.biomeRegistry().getReadOnlyWrapper()), - endChunkGeneratorSettings)); - RegistryEntry overworldDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.OVERWORLD).orElseThrow(); - RegistryEntry overworld = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.OVERWORLD) .orElseThrow(); @@ -71,13 +60,7 @@ public class PresetUtil { ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(biomeSource, pack, overworld); DimensionOptions dimensionOptions = new DimensionOptions(overworldDimensionType, generator); - WorldPreset preset = new WorldPreset( - Map.of( - DimensionOptions.OVERWORLD, dimensionOptions, - DimensionOptions.NETHER, netherDimensionOptions, - DimensionOptions.END, endDimensionOptions - ) - ); + WorldPreset preset = ((WorldPresetsRegistrarAccessor) RegistrarInstance.INSTANCE).callCreatePreset(dimensionOptions); LOGGER.info("Created world type \"{}\"", generatorID); return Pair.of(generatorID, preset); } diff --git a/platforms/mixin-common/src/main/resources/terra.accesswidener b/platforms/mixin-common/src/main/resources/terra.accesswidener index 4f59bb962..d638bbf45 100644 --- a/platforms/mixin-common/src/main/resources/terra.accesswidener +++ b/platforms/mixin-common/src/main/resources/terra.accesswidener @@ -1,2 +1,3 @@ accessWidener v1 named -accessible class net/minecraft/world/biome/Biome$Weather \ No newline at end of file +accessible class net/minecraft/world/biome/Biome$Weather +accessible class net/minecraft/world/gen/WorldPresets$Registrar 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 d4402241c..8316bc6f5 100644 --- a/platforms/mixin-common/src/main/resources/terra.common.mixins.json +++ b/platforms/mixin-common/src/main/resources/terra.common.mixins.json @@ -9,6 +9,7 @@ "access.StateAccessor", "access.StructureAccessorAccessor", "access.VillagerTypeAccessor", + "access.WorldPresetsRegistrarAccessor", "fix.BeeMoveGoalsUnsynchronizedRandomAccessFix", "fix.NetherFossilOptimization", "implementations.compat.GenerationSettingsFloraFeaturesMixin", @@ -36,7 +37,8 @@ "implementations.terra.inventory.meta.ItemStackMetaMixin", "implementations.terra.world.ChunkRegionMixin", "implementations.terra.world.ServerWorldMixin", - "lifecycle.DataPackContentsMixin" + "lifecycle.DataPackContentsMixin", + "lifecycle.WorldPresetsRegistrarMixin" ], "client": [ ], From 0a16453f986a3a0e8e6969d59d380b20e193e34c Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 13 Apr 2023 18:20:16 -0700 Subject: [PATCH 114/161] remove devlaunch lazydfu --- buildSrc/src/main/kotlin/Versions.kt | 2 -- platforms/fabric/build.gradle.kts | 2 -- platforms/quilt/build.gradle.kts | 5 ----- 3 files changed, 9 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index d9ce7706e..3a58cc9b7 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -38,8 +38,6 @@ object Versions { const val architecturyPlugin = "3.4-SNAPSHOT" const val loomQuiltflower = "1.7.1" - - const val lazyDfu = "0.1.2" } object Forge { diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 7ed3f2e75..d8848e908 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -39,8 +39,6 @@ dependencies { modImplementation("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) include("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) - - modLocalRuntime("com.github.astei:lazydfu:${Versions.Mod.lazyDfu}") } loom { diff --git a/platforms/quilt/build.gradle.kts b/platforms/quilt/build.gradle.kts index 940045d47..4cff5a427 100644 --- a/platforms/quilt/build.gradle.kts +++ b/platforms/quilt/build.gradle.kts @@ -39,11 +39,6 @@ dependencies { exclude("net.fabricmc") exclude("net.fabricmc.fabric-api") } - - modLocalRuntime("com.github.astei:lazydfu:${Versions.Mod.lazyDfu}") { - exclude("net.fabricmc") - exclude("net.fabricmc.fabric-api") - } } loom { From 514e7065e20448a40d82dae8937c7c8242cf6079 Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 1 May 2023 12:02:53 +1000 Subject: [PATCH 115/161] Update image provider v2 readme --- common/addons/biome-provider-image-v2/README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/common/addons/biome-provider-image-v2/README.md b/common/addons/biome-provider-image-v2/README.md index 49e9b8fdb..573eabee7 100644 --- a/common/addons/biome-provider-image-v2/README.md +++ b/common/addons/biome-provider-image-v2/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. From c219eff149a583468d9e2ea8793c9a32c50c3bcc Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 1 May 2023 12:45:26 +1000 Subject: [PATCH 116/161] Implement distance transform sampler --- .../terra/addons/image/ImageLibraryAddon.java | 17 ++ ...DistanceTransformNoiseSamplerTemplate.java | 48 ++++ .../image/operator/DistanceTransform.java | 230 ++++++++++++++++++ 3 files changed, 295 insertions(+) create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/DistanceTransformNoiseSamplerTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java 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 9212db2c3..f1798b4b6 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 @@ -4,6 +4,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.function.Supplier; +import com.dfsek.terra.addons.image.config.image.DistanceTransformNoiseSamplerTemplate; 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.sampler.ConstantColorSamplerTemplate; @@ -12,6 +13,7 @@ import com.dfsek.terra.addons.image.config.sampler.image.TileImageColorSamplerTe import com.dfsek.terra.addons.image.config.sampler.mutate.RotateColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.mutate.TranslateColorSamplerTemplate; import com.dfsek.terra.addons.image.image.Image; +import com.dfsek.terra.addons.image.operator.DistanceTransform; import com.dfsek.terra.addons.image.sampler.ColorSampler; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; @@ -20,6 +22,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.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; @@ -32,6 +35,8 @@ public class ImageLibraryAddon implements AddonInitializer { public static final TypeKey>> COLOR_PICKER_REGISTRY_KEY = new TypeKey<>() { }; + public static final TypeKey>> NOISE_SAMPLER_TOKEN = new TypeKey<>() { + }; @Inject private Platform platform; @@ -49,6 +54,18 @@ public class ImageLibraryAddon implements AddonInitializer { 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("DISTANCE_TRANSFORM"), DistanceTransformTemplate::new); + }) + .then(event -> { + event.getPack() + .applyLoader(DistanceTransform.CostFunction.class, + (type, o, loader, depthTracker) -> DistanceTransform.CostFunction.valueOf((String) o)) + .applyLoader(DistanceTransform.Normalization.class, + (type, o, loader, depthTracker) -> DistanceTransform.Normalization.valueOf((String) o)); + + CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry( + NOISE_SAMPLER_TOKEN); + noiseRegistry.register(addon.key("DISTANCE_TRANSFORM"), DistanceTransformNoiseSamplerTemplate::new); }) .then(event -> { CheckedRegistry>> colorSamplerRegistry = event.getPack().getOrCreateRegistry( diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/DistanceTransformNoiseSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/DistanceTransformNoiseSamplerTemplate.java new file mode 100644 index 000000000..721b8332e --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/DistanceTransformNoiseSamplerTemplate.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.addons.image.config.image; + +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.image.Image; +import com.dfsek.terra.addons.image.operator.DistanceTransform; +import com.dfsek.terra.addons.image.operator.DistanceTransform.CostFunction; +import com.dfsek.terra.addons.image.operator.DistanceTransform.Normalization; +import com.dfsek.terra.addons.image.util.ColorUtil.Channel; +import com.dfsek.terra.api.noise.NoiseSampler; + + +public class DistanceTransformNoiseSamplerTemplate implements ObjectTemplate { + + @Value("image") + private Image image; + + @Value("threshold") + @Default + private int threshold = 127; + + @Value("clamp-to-max-edge") + @Default + private boolean clampToEdge = false; + + @Value("channel") + @Default + private Channel channel = Channel.GRAYSCALE; + + @Value("cost-function") + @Default + private CostFunction costFunction = CostFunction.Channel; + + @Value("invert-threshold") + @Default + private boolean invertThreshold = false; + + @Value("normalization") + @Default + private Normalization normalization = Normalization.None; + + @Override + public NoiseSampler get() { + return new DistanceTransform.Noise(new DistanceTransform(image, channel, threshold, clampToEdge, costFunction, invertThreshold), normalization); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java new file mode 100644 index 000000000..cf71fbb94 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java @@ -0,0 +1,230 @@ +package com.dfsek.terra.addons.image.operator; + +import net.jafama.FastMath; + +import com.dfsek.terra.addons.image.image.Image; +import com.dfsek.terra.addons.image.util.ColorUtil; +import com.dfsek.terra.addons.image.util.ColorUtil.Channel; +import com.dfsek.terra.api.noise.NoiseSampler; + +/** + * Computes a 2D distance transform of a given image and stores the result in a 2D array of distances. + * Implementation based on the algorithm described in the paper + * Distance Transforms of Sampled Functions + * by Pedro F. Felzenszwalb and Daniel P. Huttenlocher. + */ +public class DistanceTransform { + + private final double[][] distances; + + /** + * Size bounds matching the provided image. + */ + private final int width, height; + + /** + * Min and max distances of the distance computation. These may change after {@link #normalize(Normalization)} calls. + */ + private double minDistance, maxDistance; + + private static final double MAX_DISTANCE_CAP = 10_000_000; // Arbitrarily large value, doubtful someone would + // ever use an image large enough to exceed this. + public DistanceTransform(Image image, Channel channel, int threshold, boolean clampToMaxEdgeDistance, CostFunction costFunction, boolean invertThreshold) { + // Construct binary image based on threshold value + boolean[][] binaryImage = new boolean[image.getWidth()][image.getHeight()]; + for(int x = 0; x < image.getWidth(); x++) { + for(int y = 0; y < image.getHeight(); y++) { + binaryImage[x][y] = ColorUtil.getChannel(image.getRGB(x, y), channel) > threshold ^ invertThreshold; + } + } + + // Get edges of binary image + boolean[][] binaryImageEdge = new boolean[image.getWidth()][image.getHeight()]; + for(int x = 0; x < image.getWidth(); x++) { + for(int y = 0; y < image.getHeight(); y++) { + if(!binaryImage[x][y]) + binaryImageEdge[x][y] = false; + else + // If cell borders any false cell + binaryImageEdge[x][y] = x > 0 && !binaryImage[x-1][y] || + y > 0 && !binaryImage[x][y-1] || + x < image.getWidth ()-1 && !binaryImage[x+1][y] || + y < image.getHeight()-1 && !binaryImage[x][y+1]; + } + } + + double[][] function = new double[image.getWidth()][image.getHeight()]; + for(int x = 0; x < image.getWidth(); x++) { + for(int y = 0; y < image.getHeight(); y++) { + function[x][y] = switch (costFunction) { + case Channel -> ColorUtil.getChannel(image.getRGB(x, y), channel); + case Threshold -> binaryImage[x][y] ? MAX_DISTANCE_CAP : 0; + case ThresholdEdge, ThresholdEdgeSigned -> binaryImageEdge[x][y] ? 0 : MAX_DISTANCE_CAP; + }; + } + } + + distances = calculateDistance2D(function); + + if(costFunction == CostFunction.ThresholdEdgeSigned) { + for(int x = 0; x < image.getWidth(); x++) { + for(int y = 0; y < image.getHeight(); y++) { + distances[x][y] *= binaryImage[x][y] ? 1 : -1; + } + } + } + + if(clampToMaxEdgeDistance) { + // Find largest value on the edge of the image + double max = Double.NEGATIVE_INFINITY; + for(int x = 0; x < image.getWidth(); x++) { + max = Math.max(max, distances[x][0]); + max = Math.max(max, distances[x][image.getHeight()-1]); + } + for(int y = 0; y < image.getHeight(); y++) { + max = Math.max(max, distances[0][y]); + max = Math.max(max, distances[image.getWidth()-1][y]); + } + // Clamp to that largest value + for(int x = 0; x < image.getWidth(); x++) { + for(int y = 0; y < image.getHeight(); y++) { + distances[x][y] = Math.max(max, distances[x][y]); + } + } + } + + this.width = image.getWidth(); + this.height = image.getHeight(); + + setOutputRange(); + } + + private double[][] calculateDistance2D(double[][] f) { + double[][] d = new double[f.length][f[0].length]; + // Distance pass for each column + for(int x = 0; x < f.length; x++) { + d[x] = calculateDistance1D(f[x]); + } + // Distance pass for each row + double[] row = new double[f.length]; + for(int y = 0; y < f[0].length; y++) { + for(int x = 0; x < f[0].length; x++) + row[x] = d[x][y]; + row = calculateDistance1D(row); + for(int x = 0; x < f[0].length; x++) { + d[x][y] = FastMath.sqrt(row[x]); + } + } + return d; + } + + private double[] calculateDistance1D(double[] f) { + double[] d = new double[f.length]; + int[] v = new int[f.length]; + double[] z = new double[f.length+1]; + int k = 0; + v[0] = 0; + z[0] = Integer.MIN_VALUE; + z[1] = Integer.MAX_VALUE; + for(int q = 1; q <= f.length-1; q++) { + double s = ((f[q]+FastMath.pow2(q))-(f[v[k]]+FastMath.pow2(v[k])))/(2*q-2*v[k]); + while (s <= z[k]) { + k--; + s = ((f[q]+FastMath.pow2(q))-(f[v[k]]+FastMath.pow2(v[k])))/(2*q-2*v[k]); + } + k++; + v[k] = q; + z[k] = s; + z[k+1] = Integer.MAX_VALUE; + } + + k = 0; + for(int q = 0; q <= f.length-1; q++) { + while(z[k+1] < q) + k++; + d[q] = FastMath.pow2(q-v[k]) + f[v[k]]; + } + return d; + } + + /** + * Redistributes the stored distance computation according to the provided {@link Normalization} method. + */ + private void normalize(Normalization normalization) { + for(int x = 0; x < width; x++) { + for(int y = 0; y < height; y++) { + double d = distances[x][y]; + distances[x][y] = switch(normalization) { + case None -> distances[x][y]; + case Linear -> lerp(d, minDistance, -1, maxDistance, 1); + case SmoothPreserveZero -> { + if(minDistance > 0 || maxDistance < 0) { + // Can't preserve zero if it is not contained in range so just lerp + yield lerp(distances[x][y], minDistance, -1, maxDistance, 1); + } else { + if(d > 0) { + yield FastMath.pow2(d/maxDistance); + } else if(d < 0) { + yield -FastMath.pow2(d/minDistance); + } else { + yield 0; + } + } + } + }; + } + } + setOutputRange(); + } + + private void setOutputRange() { + double minDistance = Double.POSITIVE_INFINITY; + double maxDistance = Double.NEGATIVE_INFINITY; + for(int x = 0; x < width; x++) { + for(int y = 0; y < height; y++) { + minDistance = Math.min(minDistance, distances[x][y]); + maxDistance = Math.max(maxDistance, distances[x][y]); + } + } + this.minDistance = minDistance; + this.maxDistance = maxDistance; + } + + private static double lerp(double x, double x1, double y1, double x2, double y2) { + return (((y1-y2)*(x-x1))/(x1-x2))+y1; + } + + public enum CostFunction { + Channel, + Threshold, + ThresholdEdge, + ThresholdEdgeSigned, + } + + public enum Normalization { + None, + Linear, + SmoothPreserveZero, + } + + public static class Noise implements NoiseSampler { + + private final DistanceTransform transform; + + public Noise(DistanceTransform transform, Normalization normalization) { + this.transform = transform; + transform.normalize(normalization); + } + + @Override + public double noise(long seed, double x, double y) { + if(x<0 || y<0 || x>=transform.width || y>=transform.height) return transform.minDistance; + return transform.distances[FastMath.floorToInt(x)][FastMath.floorToInt(y)]; + } + + @Override + public double noise(long seed, double x, double y, double z) { + return noise(seed, x, z); + } + } +} From 622fed96e531098a14392886df50d53c933b3ed9 Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 1 May 2023 12:48:13 +1000 Subject: [PATCH 117/161] Use colorsampler package name instead of sampler --- .../addons/biome/image/v2/ImageBiomeProvider.java | 2 +- .../image/v2/config/ImageProviderTemplate.java | 2 +- .../terra/addons/noise/image/ImageSampler.java | 2 +- .../noise/image/config/ImageSamplerTemplate.java | 2 +- .../dfsek/terra/addons/image/ImageLibraryAddon.java | 12 ++++++------ .../{sampler => colorsampler}/ColorSampler.java | 2 +- .../image/SingleImageColorSampler.java | 6 +++--- .../image/TileImageColorSampler.java | 6 +++--- .../image/transform/Alignment.java | 2 +- .../image/transform/ImageTransformation.java | 2 +- .../mutate/RotateColorSampler.java | 4 ++-- .../mutate/TranslateColorSampler.java | 4 ++-- .../ConstantColorSamplerTemplate.java | 4 ++-- .../image/ImageColorSamplerTemplate.java | 6 +++--- .../image/SingleImageColorSamplerTemplate.java | 6 +++--- .../image/TileImageColorSamplerTemplate.java | 13 +++++++++++++ .../mutate/MutateColorSamplerTemplate.java | 4 ++-- .../mutate/RotateColorSamplerTemplate.java | 6 +++--- .../mutate/TranslateColorSamplerTemplate.java | 6 +++--- .../image/TileImageColorSamplerTemplate.java | 13 ------------- 20 files changed, 52 insertions(+), 52 deletions(-) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/{sampler => colorsampler}/ColorSampler.java (81%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/{sampler => colorsampler}/image/SingleImageColorSampler.java (79%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/{sampler => colorsampler}/image/TileImageColorSampler.java (76%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/{sampler => colorsampler}/image/transform/Alignment.java (90%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/{sampler => colorsampler}/image/transform/ImageTransformation.java (73%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/{sampler => colorsampler}/mutate/RotateColorSampler.java (82%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/{sampler => colorsampler}/mutate/TranslateColorSampler.java (80%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/{sampler => colorsampler}/ConstantColorSamplerTemplate.java (75%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/{sampler => colorsampler}/image/ImageColorSamplerTemplate.java (70%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/{sampler => colorsampler}/image/SingleImageColorSamplerTemplate.java (62%) create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/TileImageColorSamplerTemplate.java rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/{sampler => colorsampler}/mutate/MutateColorSamplerTemplate.java (70%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/{sampler => colorsampler}/mutate/RotateColorSamplerTemplate.java (63%) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/{sampler => colorsampler}/mutate/TranslateColorSamplerTemplate.java (64%) delete mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/TileImageColorSamplerTemplate.java 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 index 0198e49c5..7a37664a1 100644 --- 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 @@ -10,7 +10,7 @@ package com.dfsek.terra.addons.biome.image.v2; import java.util.Optional; import com.dfsek.terra.addons.image.converter.ColorConverter; -import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; 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-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/ImageProviderTemplate.java index ddc93ee6e..8d9955ad4 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-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/ImageProviderTemplate.java @@ -14,7 +14,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.biome.image.v2.ImageBiomeProvider; import com.dfsek.terra.addons.image.converter.ColorConverter; -import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; diff --git a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java index 3f162dba6..ad9ed167b 100644 --- a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java +++ b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java @@ -7,7 +7,7 @@ package com.dfsek.terra.addons.noise.image; -import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import com.dfsek.terra.addons.image.util.ColorUtil.Channel; import com.dfsek.terra.api.noise.NoiseSampler; diff --git a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java index 60ac77e0c..dc05def7b 100644 --- a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java +++ b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java @@ -9,7 +9,7 @@ package com.dfsek.terra.addons.noise.image.config; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import com.dfsek.terra.addons.image.util.ColorUtil.Channel; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; import com.dfsek.terra.addons.noise.image.ImageSampler; 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 f1798b4b6..a3981b739 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 @@ -7,14 +7,14 @@ import java.util.function.Supplier; import com.dfsek.terra.addons.image.config.image.DistanceTransformNoiseSamplerTemplate; 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.sampler.ConstantColorSamplerTemplate; -import com.dfsek.terra.addons.image.config.sampler.image.SingleImageColorSamplerTemplate; -import com.dfsek.terra.addons.image.config.sampler.image.TileImageColorSamplerTemplate; -import com.dfsek.terra.addons.image.config.sampler.mutate.RotateColorSamplerTemplate; -import com.dfsek.terra.addons.image.config.sampler.mutate.TranslateColorSamplerTemplate; +import com.dfsek.terra.addons.image.config.colorsampler.ConstantColorSamplerTemplate; +import com.dfsek.terra.addons.image.config.colorsampler.image.SingleImageColorSamplerTemplate; +import com.dfsek.terra.addons.image.config.colorsampler.image.TileImageColorSamplerTemplate; +import com.dfsek.terra.addons.image.config.colorsampler.mutate.RotateColorSamplerTemplate; +import com.dfsek.terra.addons.image.config.colorsampler.mutate.TranslateColorSamplerTemplate; import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.operator.DistanceTransform; -import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/ColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/ColorSampler.java similarity index 81% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/ColorSampler.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/ColorSampler.java index b6eaade20..4856a08f9 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/ColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/ColorSampler.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.image.sampler; +package com.dfsek.terra.addons.image.colorsampler; @FunctionalInterface public interface ColorSampler { diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/SingleImageColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/SingleImageColorSampler.java similarity index 79% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/SingleImageColorSampler.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/SingleImageColorSampler.java index 08e8c6e89..2c19f70bf 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/SingleImageColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/SingleImageColorSampler.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.addons.image.sampler.image; +package com.dfsek.terra.addons.image.colorsampler.image; import com.dfsek.terra.addons.image.image.Image; -import com.dfsek.terra.addons.image.sampler.ColorSampler; -import com.dfsek.terra.addons.image.sampler.image.transform.ImageTransformation; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.image.transform.ImageTransformation; public class SingleImageColorSampler implements ColorSampler { diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/TileImageColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/TileImageColorSampler.java similarity index 76% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/TileImageColorSampler.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/TileImageColorSampler.java index 7d035eff4..aae1bf21f 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/TileImageColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/TileImageColorSampler.java @@ -1,10 +1,10 @@ -package com.dfsek.terra.addons.image.sampler.image; +package com.dfsek.terra.addons.image.colorsampler.image; import net.jafama.FastMath; import com.dfsek.terra.addons.image.image.Image; -import com.dfsek.terra.addons.image.sampler.ColorSampler; -import com.dfsek.terra.addons.image.sampler.image.transform.ImageTransformation; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.image.transform.ImageTransformation; public class TileImageColorSampler implements ColorSampler { diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/transform/Alignment.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/Alignment.java similarity index 90% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/transform/Alignment.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/Alignment.java index 43674b2e9..834428c5c 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/transform/Alignment.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/Alignment.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.image.sampler.image.transform; +package com.dfsek.terra.addons.image.colorsampler.image.transform; import com.dfsek.terra.addons.image.image.Image; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/transform/ImageTransformation.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/ImageTransformation.java similarity index 73% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/transform/ImageTransformation.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/ImageTransformation.java index bc9ae5143..cc5b63e7f 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/image/transform/ImageTransformation.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/ImageTransformation.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.image.sampler.image.transform; +package com.dfsek.terra.addons.image.colorsampler.image.transform; import com.dfsek.terra.addons.image.image.Image; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/mutate/RotateColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/RotateColorSampler.java similarity index 82% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/mutate/RotateColorSampler.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/RotateColorSampler.java index 92e99f59d..d7fae42b2 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/mutate/RotateColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/RotateColorSampler.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.addons.image.sampler.mutate; +package com.dfsek.terra.addons.image.colorsampler.mutate; -import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import net.jafama.FastMath; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/mutate/TranslateColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/TranslateColorSampler.java similarity index 80% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/mutate/TranslateColorSampler.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/TranslateColorSampler.java index 8f9c35fa8..f281e5152 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/mutate/TranslateColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/TranslateColorSampler.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.addons.image.sampler.mutate; +package com.dfsek.terra.addons.image.colorsampler.mutate; -import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; public class TranslateColorSampler implements ColorSampler { diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ConstantColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java similarity index 75% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ConstantColorSamplerTemplate.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java index 2e3269daf..4a07edd3f 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ConstantColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.addons.image.config.sampler; +package com.dfsek.terra.addons.image.config.colorsampler; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; public class ConstantColorSamplerTemplate implements ObjectTemplate { diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/ImageColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/ImageColorSamplerTemplate.java similarity index 70% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/ImageColorSamplerTemplate.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/ImageColorSamplerTemplate.java index 3e129ba6e..3b9e6fe37 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/ImageColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/ImageColorSamplerTemplate.java @@ -1,12 +1,12 @@ -package com.dfsek.terra.addons.image.config.sampler.image; +package com.dfsek.terra.addons.image.config.colorsampler.image; 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.image.Image; -import com.dfsek.terra.addons.image.sampler.ColorSampler; -import com.dfsek.terra.addons.image.sampler.image.transform.Alignment; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.image.transform.Alignment; public abstract class ImageColorSamplerTemplate implements ObjectTemplate { diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/SingleImageColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/SingleImageColorSamplerTemplate.java similarity index 62% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/SingleImageColorSamplerTemplate.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/SingleImageColorSamplerTemplate.java index fdd552804..dd31a3d67 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/SingleImageColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/SingleImageColorSamplerTemplate.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.addons.image.config.sampler.image; +package com.dfsek.terra.addons.image.config.colorsampler.image; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.image.sampler.ColorSampler; -import com.dfsek.terra.addons.image.sampler.image.SingleImageColorSampler; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.image.SingleImageColorSampler; public class SingleImageColorSamplerTemplate extends ImageColorSamplerTemplate { diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/TileImageColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/TileImageColorSamplerTemplate.java new file mode 100644 index 000000000..72421cb58 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/TileImageColorSamplerTemplate.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.addons.image.config.colorsampler.image; + +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.image.TileImageColorSampler; + + +public class TileImageColorSamplerTemplate extends ImageColorSamplerTemplate { + + @Override + public ColorSampler get() { + return new TileImageColorSampler(image, alignment); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/MutateColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/MutateColorSamplerTemplate.java similarity index 70% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/MutateColorSamplerTemplate.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/MutateColorSamplerTemplate.java index 2274f7b20..532963837 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/MutateColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/MutateColorSamplerTemplate.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.addons.image.config.sampler.mutate; +package com.dfsek.terra.addons.image.config.colorsampler.mutate; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; public abstract class MutateColorSamplerTemplate implements ObjectTemplate { diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/RotateColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/RotateColorSamplerTemplate.java similarity index 63% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/RotateColorSamplerTemplate.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/RotateColorSamplerTemplate.java index 3122d3c34..6ade23c77 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/RotateColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/RotateColorSamplerTemplate.java @@ -1,10 +1,10 @@ -package com.dfsek.terra.addons.image.config.sampler.mutate; +package com.dfsek.terra.addons.image.config.colorsampler.mutate; import com.dfsek.tectonic.api.config.template.annotations.Value; import net.jafama.FastMath; -import com.dfsek.terra.addons.image.sampler.ColorSampler; -import com.dfsek.terra.addons.image.sampler.mutate.RotateColorSampler; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.mutate.RotateColorSampler; public class RotateColorSamplerTemplate extends MutateColorSamplerTemplate { diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/TranslateColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/TranslateColorSamplerTemplate.java similarity index 64% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/TranslateColorSamplerTemplate.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/TranslateColorSamplerTemplate.java index 7141c8ad8..e8e18c447 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/mutate/TranslateColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/TranslateColorSamplerTemplate.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.addons.image.config.sampler.mutate; +package com.dfsek.terra.addons.image.config.colorsampler.mutate; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.image.sampler.ColorSampler; -import com.dfsek.terra.addons.image.sampler.mutate.TranslateColorSampler; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; +import com.dfsek.terra.addons.image.colorsampler.mutate.TranslateColorSampler; public class TranslateColorSamplerTemplate extends MutateColorSamplerTemplate { diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/TileImageColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/TileImageColorSamplerTemplate.java deleted file mode 100644 index 759559c21..000000000 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/image/TileImageColorSamplerTemplate.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dfsek.terra.addons.image.config.sampler.image; - -import com.dfsek.terra.addons.image.sampler.ColorSampler; -import com.dfsek.terra.addons.image.sampler.image.TileImageColorSampler; - - -public class TileImageColorSamplerTemplate extends ImageColorSamplerTemplate { - - @Override - public ColorSampler get() { - return new TileImageColorSampler(image, alignment); - } -} From ff0985bd314b1d74a6be8f4b4c394c5a509a38be Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 1 May 2023 13:10:58 +1000 Subject: [PATCH 118/161] Make imagelib MathUtil --- .../terra/addons/image/operator/DistanceTransform.java | 7 +++---- .../java/com/dfsek/terra/addons/image/util/MathUtil.java | 9 +++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MathUtil.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java index cf71fbb94..79ea9b381 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java @@ -7,6 +7,9 @@ import com.dfsek.terra.addons.image.util.ColorUtil; import com.dfsek.terra.addons.image.util.ColorUtil.Channel; import com.dfsek.terra.api.noise.NoiseSampler; +import static com.dfsek.terra.addons.image.util.MathUtil.lerp; + + /** * Computes a 2D distance transform of a given image and stores the result in a 2D array of distances. * Implementation based on the algorithm described in the paper @@ -190,10 +193,6 @@ public class DistanceTransform { this.maxDistance = maxDistance; } - private static double lerp(double x, double x1, double y1, double x2, double y2) { - return (((y1-y2)*(x-x1))/(x1-x2))+y1; - } - public enum CostFunction { Channel, Threshold, diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MathUtil.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MathUtil.java new file mode 100644 index 000000000..40e52e5d1 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MathUtil.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.addons.image.util; + +public class MathUtil { + private MathUtil() {} + + public static double lerp(double x, double x1, double y1, double x2, double y2) { + return (((y1-y2)*(x-x1))/(x1-x2))+y1; + } +} From ffa55cb7a3fc81bb47949151c302e90a377b2dd0 Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 1 May 2023 13:57:07 +1000 Subject: [PATCH 119/161] Implement premultiplication in ColorUtil --- .../terra/addons/image/util/ColorUtil.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java index f138fb374..fd06a3fbd 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java @@ -61,6 +61,29 @@ public class ColorUtil { return channel.zero(rgb); } + /* + * Multiply each color channel by the alpha channel + */ + public static int premultiply(int rgb) { + int alpha = getAlpha(rgb); + int red = (getRed(rgb) * alpha + 127) / 255; + int green = (getGreen(rgb) * alpha + 127) / 255; + int blue = (getBlue(rgb) * alpha + 127) / 255; + return rgb(alpha, red, green, blue); + } + + public static int rgb(int alpha, int red, int green, int blue) { + return rgbAlpha(alpha) | rgbRed(red) | rgbGreen(green) | rgbBlue(blue); + } + + public static int rgbAlpha(int alpha) { return alpha << 24; } + + public static int rgbRed(int red) { return red << 16; } + + public static int rgbGreen(int green) { return green << 8; } + + public static int rgbBlue(int blue) { return blue; } + public enum Channel { RED { @Override From 50fc5890012b57ed3d89ef7d354c99f737edd3ab Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 1 May 2023 13:58:18 +1000 Subject: [PATCH 120/161] Move distance transform to appropriate package --- .../java/com/dfsek/terra/addons/image/ImageLibraryAddon.java | 3 +-- .../DistanceTransformNoiseSamplerTemplate.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) rename common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/{image => noisesampler}/DistanceTransformNoiseSamplerTemplate.java (96%) 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 a3981b739..deaed7c8d 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 @@ -4,7 +4,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.function.Supplier; -import com.dfsek.terra.addons.image.config.image.DistanceTransformNoiseSamplerTemplate; +import com.dfsek.terra.addons.image.config.noisesampler.DistanceTransformNoiseSamplerTemplate; 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.colorsampler.ConstantColorSamplerTemplate; @@ -54,7 +54,6 @@ public class ImageLibraryAddon implements AddonInitializer { 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("DISTANCE_TRANSFORM"), DistanceTransformTemplate::new); }) .then(event -> { event.getPack() diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/DistanceTransformNoiseSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/noisesampler/DistanceTransformNoiseSamplerTemplate.java similarity index 96% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/DistanceTransformNoiseSamplerTemplate.java rename to common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/noisesampler/DistanceTransformNoiseSamplerTemplate.java index 721b8332e..faf6dd96d 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/DistanceTransformNoiseSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/noisesampler/DistanceTransformNoiseSamplerTemplate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.image.config.image; +package com.dfsek.terra.addons.image.config.noisesampler; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; From 39d21fbe08cb40587e21558e50fb4b2447402451 Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 1 May 2023 13:58:56 +1000 Subject: [PATCH 121/161] Implement channel noise sampler --- .../terra/addons/image/ImageLibraryAddon.java | 2 + .../ChannelNoiseSamplerTemplate.java | 41 +++++++++++++++++++ .../noisesampler/ChannelNoiseSampler.java | 40 ++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/noisesampler/ChannelNoiseSamplerTemplate.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/noisesampler/ChannelNoiseSampler.java 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 deaed7c8d..20c1d462b 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 @@ -4,6 +4,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.function.Supplier; +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.image.ImageTemplate; import com.dfsek.terra.addons.image.config.image.StitchedImageTemplate; @@ -65,6 +66,7 @@ public class ImageLibraryAddon implements AddonInitializer { CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry( NOISE_SAMPLER_TOKEN); noiseRegistry.register(addon.key("DISTANCE_TRANSFORM"), DistanceTransformNoiseSamplerTemplate::new); + noiseRegistry.register(addon.key("CHANNEL"), ChannelNoiseSamplerTemplate::new); }) .then(event -> { CheckedRegistry>> colorSamplerRegistry = event.getPack().getOrCreateRegistry( 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/noisesampler/ChannelNoiseSamplerTemplate.java new file mode 100644 index 000000000..4aac073d4 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/noisesampler/ChannelNoiseSamplerTemplate.java @@ -0,0 +1,41 @@ +package com.dfsek.terra.addons.image.config.noisesampler; + +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.util.ColorUtil.Channel; +import com.dfsek.terra.api.noise.NoiseSampler; + + +public class ChannelNoiseSamplerTemplate implements ObjectTemplate { + + @Value("color-sampler") + private ColorSampler colorSampler; + + @Value("channel") + private Channel channel; + + /* + * If the channel should be normalized to range [-1, 1] or not + */ + @Value("normalize") + @Default + private boolean normalize = true; + + /* + * Whether to multiply color channels by the alpha channel or not. If users + * are expecting pixel transparency to reduce the output value then this should + * be set to true. + */ + @Value("premultiply") + @Default + private boolean premultiply = false; + + @Override + public NoiseSampler get() { + return new ChannelNoiseSampler(colorSampler, channel, normalize, premultiply); + } +} 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/noisesampler/ChannelNoiseSampler.java new file mode 100644 index 000000000..52d977591 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/noisesampler/ChannelNoiseSampler.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.addons.image.noisesampler; + +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; +import com.dfsek.terra.addons.image.util.ColorUtil; +import com.dfsek.terra.addons.image.util.ColorUtil.Channel; +import com.dfsek.terra.api.noise.NoiseSampler; + +import static com.dfsek.terra.addons.image.util.MathUtil.lerp; + + +public class ChannelNoiseSampler implements NoiseSampler { + + private final ColorSampler colorSampler; + + private final Channel channel; + + private final boolean normalize; + + private final boolean premultiply; + + public ChannelNoiseSampler(ColorSampler colorSampler, Channel channel, boolean normalize, boolean premultiply) { + this.colorSampler = colorSampler; + this.channel = channel; + this.normalize = normalize; + this.premultiply = premultiply; + } + + @Override + public double noise(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); + return normalize ? lerp(channelValue, 0, -1, 255, 1) : channelValue; + } + + @Override + public double noise(long seed, double x, double y, double z) { + return noise(seed, x, z); + } +} From 105be0c346a603b4a5a8a278800e30a0aa0a2b9a Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 2 May 2023 12:52:13 +1000 Subject: [PATCH 122/161] Implement color parsing from strings --- .../DefinedBiomeColorMappingTemplate.java | 5 +- .../terra/addons/image/ImageLibraryAddon.java | 5 +- .../addons/image/config/ColorLoader.java | 92 +++++++++++++++++++ .../ConstantColorSamplerTemplate.java | 5 +- .../terra/addons/image/util/ColorUtil.java | 9 ++ 5 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ColorLoader.java 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-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/mapping/DefinedBiomeColorMappingTemplate.java index 88dbb82b2..ea650d424 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-v2/src/main/java/com/dfsek/terra/addons/biome/image/v2/config/converter/mapping/DefinedBiomeColorMappingTemplate.java @@ -5,6 +5,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.Map; +import com.dfsek.terra.addons.image.config.ColorLoader.ColorString; import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; import com.dfsek.terra.addons.image.util.MapUtil; import com.dfsek.terra.api.world.biome.Biome; @@ -13,11 +14,11 @@ import com.dfsek.terra.api.world.biome.Biome; public class DefinedBiomeColorMappingTemplate implements ObjectTemplate> { @Value("map") - Map map; + Map map; @Override public ColorMapping get() { - var map = MapUtil.mapKeys(this.map, Integer::decode); + var map = MapUtil.mapKeys(this.map, ColorString::getColor); return () -> map; } } 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 20c1d462b..fdcbc701d 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 @@ -4,6 +4,8 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.function.Supplier; +import com.dfsek.terra.addons.image.config.ColorLoader; +import com.dfsek.terra.addons.image.config.ColorLoader.ColorString; 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.image.ImageTemplate; @@ -61,7 +63,8 @@ public class ImageLibraryAddon implements AddonInitializer { .applyLoader(DistanceTransform.CostFunction.class, (type, o, loader, depthTracker) -> DistanceTransform.CostFunction.valueOf((String) o)) .applyLoader(DistanceTransform.Normalization.class, - (type, o, loader, depthTracker) -> DistanceTransform.Normalization.valueOf((String) o)); + (type, o, loader, depthTracker) -> DistanceTransform.Normalization.valueOf((String) o)) + .applyLoader(ColorString.class, new ColorLoader()); CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry( NOISE_SAMPLER_TOKEN); diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ColorLoader.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ColorLoader.java new file mode 100644 index 000000000..76b069c68 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ColorLoader.java @@ -0,0 +1,92 @@ +package com.dfsek.terra.addons.image.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.image.config.ColorLoader.ColorString; +import com.dfsek.terra.addons.image.util.ColorUtil; + + +public class ColorLoader implements TypeLoader { + + @Override + public ColorString load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader, + DepthTracker depthTracker) throws LoadException { + return new ColorString((String) o); + } + + public static class ColorString { + + private final int argb; + + public ColorString(String string) throws IllegalArgumentException { + this.argb = parse(string); + } + + public int getColor() { + return argb; + } + + private static int parse(String string) throws IllegalArgumentException { + if (string.length() == 0) + throw new IllegalArgumentException("Empty string cannot be parsed as a valid color"); + + String[] split = string.split(","); + + if (split.length == 1) + return parseHex(string); + else if (split.length == 3) + return parseChannels("255", split[0], split[1], split[2]); + else if (split.length == 4) + return parseChannels(split[0], split[1], split[2], split[3]); + else + throw new IllegalArgumentException("Invalid channels provided, required format RED,GREEN,BLUE or ALPHA,RED,GREEN,BLUE"); + } + + private static int parseHex(String hex) throws IllegalArgumentException { + if (hex.startsWith("#")) + hex = hex.substring(1); + + int alpha = 255; + int red = 0; + int green = 0; + int blue = 0; + + try { + if(hex.length() == 8) { + alpha = Integer.parseInt(hex.substring(0, 2), 16); + hex = hex.substring(2); + } + + if(hex.length() != 6) + throw new IllegalArgumentException("Invalid color channels, required format AARRGGBB or RRGGBB"); + + red = Integer.parseInt(hex.substring(0, 2), 16); + green = Integer.parseInt(hex.substring(2, 4), 16); + blue = Integer.parseInt(hex.substring(4, 6), 16); + + return ColorUtil.rgbValidated(alpha, red, green, blue); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Failed to parse hex color", e); + } + } + + private static int parseChannels(String alpha, String red, String green, String blue) throws IllegalArgumentException { + try { + int a = Integer.decode(alpha); + int r = Integer.decode(red); + int g = Integer.decode(green); + int b = Integer.decode(blue); + + return ColorUtil.rgbValidated(a, r, g, b); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Invalid channel value", e); + } + } + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java index 4a07edd3f..61702340b 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java @@ -4,15 +4,16 @@ 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.config.ColorLoader.ColorString; public class ConstantColorSamplerTemplate implements ObjectTemplate { @Value("color") - private int color; + private ColorString color; @Override public ColorSampler get() { - return ((x, z) -> color); + return ((x, z) -> color.argb()); } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java index fd06a3fbd..fed9ee4ee 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java @@ -76,6 +76,15 @@ public class ColorUtil { return rgbAlpha(alpha) | rgbRed(red) | rgbGreen(green) | rgbBlue(blue); } + public static int rgbValidated(int alpha, int red, int green, int blue) throws IllegalArgumentException { + if (alpha < 0 || alpha > 255 || + red < 0 || red > 255 || + green < 0 || green > 255 || + blue < 0 || blue > 255 + ) throw new IllegalArgumentException("Channel values must be in range 0-255"); + return rgb(alpha, red, green, blue); + } + public static int rgbAlpha(int alpha) { return alpha << 24; } public static int rgbRed(int red) { return red << 16; } From 36d0ef77fb78558848a72d0089fd9f1d22c7cf82 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 2 May 2023 12:58:37 +1000 Subject: [PATCH 123/161] Add image support addon for biome pipeline --- common/addons/pipeline-image/LICENSE | 21 ++++++ common/addons/pipeline-image/build.gradle.kts | 7 ++ .../biome/pipeline/image/ImageSource.java | 29 ++++++++ .../pipeline/image/PipelineImageAddon.java | 68 +++++++++++++++++++ .../image/config/ImageSourceTemplate.java | 25 +++++++ ...stPipelineBiomeColorConverterTemplate.java | 19 ++++++ ...ctPipelineBiomeColorConverterTemplate.java | 37 ++++++++++ ...inedPipelineBiomeColorMappingTemplate.java | 24 +++++++ .../src/main/resources/terra.addon.yml | 15 ++++ 9 files changed, 245 insertions(+) create mode 100644 common/addons/pipeline-image/LICENSE create mode 100644 common/addons/pipeline-image/build.gradle.kts create mode 100644 common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/ImageSource.java create mode 100644 common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/PipelineImageAddon.java create mode 100644 common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/ImageSourceTemplate.java create mode 100644 common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ClosestPipelineBiomeColorConverterTemplate.java create mode 100644 common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ExactPipelineBiomeColorConverterTemplate.java create mode 100644 common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/mapping/DefinedPipelineBiomeColorMappingTemplate.java create mode 100644 common/addons/pipeline-image/src/main/resources/terra.addon.yml diff --git a/common/addons/pipeline-image/LICENSE b/common/addons/pipeline-image/LICENSE new file mode 100644 index 000000000..22b8e06e5 --- /dev/null +++ b/common/addons/pipeline-image/LICENSE @@ -0,0 +1,21 @@ +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/pipeline-image/build.gradle.kts b/common/addons/pipeline-image/build.gradle.kts new file mode 100644 index 000000000..1befb4b44 --- /dev/null +++ b/common/addons/pipeline-image/build.gradle.kts @@ -0,0 +1,7 @@ +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: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 new file mode 100644 index 000000000..857e0de34 --- /dev/null +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/ImageSource.java @@ -0,0 +1,29 @@ +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.image.colorsampler.ColorSampler; +import com.dfsek.terra.addons.image.converter.ColorConverter; + + +public class ImageSource implements Source { + + private final ColorSampler colorSampler; + + private final ColorConverter colorConverter; + + public ImageSource(ColorSampler colorSampler, ColorConverter colorConverter) { + this.colorSampler = colorSampler; + this.colorConverter = colorConverter; + } + + @Override + public PipelineBiome get(long seed, int x, int z) { + return colorConverter.apply(colorSampler.apply(x, z)); + } + + @Override + public Iterable getBiomes() { + return colorConverter.getEntries(); + } +} 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 new file mode 100644 index 000000000..eb62a79b2 --- /dev/null +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/PipelineImageAddon.java @@ -0,0 +1,68 @@ +package com.dfsek.terra.addons.biome.pipeline.image; + +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import java.util.function.Supplier; + +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; +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; + + +public class PipelineImageAddon implements AddonInitializer { + + public static final TypeKey>>> PIPELINE_BIOME_COLOR_CONVERTER_REGISTRY_KEY = new TypeKey<>() { + }; + + public static final TypeKey>>> PIPELINE_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(500) + .then(event -> { + CheckedRegistry>>> biomeColorConverterRegistry = event.getPack().getOrCreateRegistry( + PIPELINE_BIOME_COLOR_CONVERTER_REGISTRY_KEY); + biomeColorConverterRegistry.register(addon.key("EXACT"), ExactPipelineBiomeColorConverterTemplate::new); + biomeColorConverterRegistry.register(addon.key("CLOSEST"), ClosestPipelineBiomeColorConverterTemplate::new); + }) + .then(event -> { + CheckedRegistry>> sourceRegistry = event.getPack().getOrCreateRegistry(BiomePipelineAddon.SOURCE_REGISTRY_KEY); + sourceRegistry.register(addon.key("IMAGE"), ImageSourceTemplate::new); + }) + .then(event -> { + CheckedRegistry>>> biomeColorMappingRegistry = event.getPack().getOrCreateRegistry( + PIPELINE_BIOME_COLOR_MAPPING_REGISTRY_KEY); + biomeColorMappingRegistry.register(addon.key("USE_BIOME_COLORS"), () -> () -> new BiomeDefinedColorMapping<>(event.getPack().getRegistry(Biome.class), DelegatedPipelineBiome::new)); + biomeColorMappingRegistry.register(addon.key("MAP"), DefinedPipelineBiomeColorMappingTemplate::new); + }) + .failThrough(); + } +} 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 new file mode 100644 index 000000000..40d2910c8 --- /dev/null +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/ImageSourceTemplate.java @@ -0,0 +1,25 @@ +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.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; + + +public class ImageSourceTemplate implements ObjectTemplate { + + @Value("color-sampler") + private ColorSampler colorSampler; + + @Value("color-conversion") + private ColorConverter colorConverter; + + @Override + public Source get() { + return new ImageSource(colorSampler, 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 new file mode 100644 index 000000000..a695398dc --- /dev/null +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ClosestPipelineBiomeColorConverterTemplate.java @@ -0,0 +1,19 @@ +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.image.config.converter.ClosestColorConverterTemplate; +import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; + + +public class ClosestPipelineBiomeColorConverterTemplate extends ClosestColorConverterTemplate { + + @Value("match") + private ColorMapping match; + + @Override + protected ColorMapping getMapping() { + return match; + } +} 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 new file mode 100644 index 000000000..305a03e31 --- /dev/null +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/ExactPipelineBiomeColorConverterTemplate.java @@ -0,0 +1,37 @@ +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.image.config.converter.ExactColorConverterTemplate; +import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; + + +public class ExactPipelineBiomeColorConverterTemplate extends ExactColorConverterTemplate { + + @Value("match") + private ColorMapping match; + + @Value("else") + private PipelineBiome fallback; + + @Value("ignore-alpha") + @Default + private boolean ignoreAlpha = true; + + @Override + protected ColorMapping getMapping() { + return match; + } + + @Override + protected PipelineBiome getFallback() { + return fallback; + } + + @Override + protected boolean ignoreAlpha() { + return ignoreAlpha; + } +} 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 new file mode 100644 index 000000000..b1d4115f2 --- /dev/null +++ b/common/addons/pipeline-image/src/main/java/com/dfsek/terra/addons/biome/pipeline/image/config/converter/mapping/DefinedPipelineBiomeColorMappingTemplate.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.addons.biome.pipeline.image.config.converter.mapping; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import java.util.Map; + +import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome; +import com.dfsek.terra.addons.image.config.ColorLoader.ColorString; +import com.dfsek.terra.addons.image.converter.mapping.ColorMapping; +import com.dfsek.terra.addons.image.util.MapUtil; + + +public class DefinedPipelineBiomeColorMappingTemplate implements ObjectTemplate> { + + @Value("map") + Map map; + + @Override + public ColorMapping get() { + var map = MapUtil.mapKeys(this.map, ColorString::getColor); + return () -> map; + } +} diff --git a/common/addons/pipeline-image/src/main/resources/terra.addon.yml b/common/addons/pipeline-image/src/main/resources/terra.addon.yml new file mode 100644 index 000000000..09adeb933 --- /dev/null +++ b/common/addons/pipeline-image/src/main/resources/terra.addon.yml @@ -0,0 +1,15 @@ +schema-version: 1 +contributors: + - Terra contributors +id: pipeline-image +version: @VERSION@ +entrypoints: + - "com.dfsek.terra.addons.biome.pipeline.image.PipelineImageAddon" +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.+" + biome-provider-pipeline-v2: "1.+" From 3c593c701324bbb0d0eaf12b6281378295291351 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 2 May 2023 13:03:13 +1000 Subject: [PATCH 124/161] Fix method call --- .../image/config/colorsampler/ConstantColorSamplerTemplate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java index 61702340b..c2d940480 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java @@ -14,6 +14,6 @@ public class ConstantColorSamplerTemplate implements ObjectTemplate color.argb()); + return ((x, z) -> color.getColor()); } } From dacddef5d64a2ca71e3044d5aa5779752e432581 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 2 May 2023 13:04:23 +1000 Subject: [PATCH 125/161] rgb -> argb --- .../addons/image/config/ColorLoader.java | 4 +- .../terra/addons/image/util/ColorUtil.java | 120 +++++++++--------- 2 files changed, 62 insertions(+), 62 deletions(-) diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ColorLoader.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ColorLoader.java index 76b069c68..03316d87b 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ColorLoader.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ColorLoader.java @@ -70,7 +70,7 @@ public class ColorLoader implements TypeLoader { green = Integer.parseInt(hex.substring(2, 4), 16); blue = Integer.parseInt(hex.substring(4, 6), 16); - return ColorUtil.rgbValidated(alpha, red, green, blue); + return ColorUtil.argbValidated(alpha, red, green, blue); } catch (NumberFormatException e) { throw new IllegalArgumentException("Failed to parse hex color", e); } @@ -83,7 +83,7 @@ public class ColorLoader implements TypeLoader { int g = Integer.decode(green); int b = Integer.decode(blue); - return ColorUtil.rgbValidated(a, r, g, b); + return ColorUtil.argbValidated(a, r, g, b); } catch (NumberFormatException e) { throw new IllegalArgumentException("Invalid channel value", e); } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java index fed9ee4ee..11924ea43 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java @@ -13,145 +13,145 @@ public class ColorUtil { FastMath.abs(getBlue(a) - getBlue(b)); } - public static int getRed(int rgb) { - return rgb >> 16 & 255; + public static int getRed(int argb) { + return argb >> 16 & 255; } - public static int getGreen(int rgb) { - return rgb >> 8 & 255; + public static int getGreen(int argb) { + return argb >> 8 & 255; } - public static int getBlue(int rgb) { - return rgb >> 0 & 255; + public static int getBlue(int argb) { + return argb >> 0 & 255; } - public static int getAlpha(int rgb) { - return rgb >> 24 & 255; + public static int getAlpha(int argb) { + return argb >> 24 & 255; } - public static int getGrayscale(int rgb) { - return (getRed(rgb) + getGreen(rgb) + getBlue(rgb)) / 3; + public static int getGrayscale(int argb) { + return (getRed(argb) + getGreen(argb) + getBlue(argb)) / 3; } - public static int getChannel(int rgb, Channel channel) { - return channel.from(rgb); + public static int getChannel(int argb, Channel channel) { + return channel.from(argb); } - public static int zeroRed(int rgb) { - return rgb & ~0x00FF0000; + public static int zeroRed(int argb) { + return argb & ~0x00FF0000; } - public static int zeroGreen(int rgb) { - return rgb & ~0x0000FF00; + public static int zeroGreen(int argb) { + return argb & ~0x0000FF00; } - public static int zeroBlue(int rgb) { - return rgb & ~0x000000FF; + public static int zeroBlue(int argb) { + return argb & ~0x000000FF; } - public static int zeroAlpha(int rgb) { - return rgb & ~0xFF000000; + public static int zeroAlpha(int argb) { + return argb & ~0xFF000000; } - public static int zeroGrayscale(int rgb) { - return rgb & ~0x00FFFFFF; + public static int zeroGrayscale(int argb) { + return argb & ~0x00FFFFFF; } - public static int zeroChannel(int rgb, Channel channel) { - return channel.zero(rgb); + public static int zeroChannel(int argb, Channel channel) { + return channel.zero(argb); } /* * Multiply each color channel by the alpha channel */ - public static int premultiply(int rgb) { - int alpha = getAlpha(rgb); - int red = (getRed(rgb) * alpha + 127) / 255; - int green = (getGreen(rgb) * alpha + 127) / 255; - int blue = (getBlue(rgb) * alpha + 127) / 255; - return rgb(alpha, red, green, blue); + public static int premultiply(int argb) { + int alpha = getAlpha(argb); + int red = (getRed(argb) * alpha + 127) / 255; + int green = (getGreen(argb) * alpha + 127) / 255; + int blue = (getBlue(argb) * alpha + 127) / 255; + return argb(alpha, red, green, blue); } - public static int rgb(int alpha, int red, int green, int blue) { - return rgbAlpha(alpha) | rgbRed(red) | rgbGreen(green) | rgbBlue(blue); + public static int argb(int alpha, int red, int green, int blue) { + return argbAlpha(alpha) | argbRed(red) | argbGreen(green) | argbBlue(blue); } - public static int rgbValidated(int alpha, int red, int green, int blue) throws IllegalArgumentException { + public static int argbValidated(int alpha, int red, int green, int blue) throws IllegalArgumentException { if (alpha < 0 || alpha > 255 || red < 0 || red > 255 || green < 0 || green > 255 || blue < 0 || blue > 255 ) throw new IllegalArgumentException("Channel values must be in range 0-255"); - return rgb(alpha, red, green, blue); + return argb(alpha, red, green, blue); } - public static int rgbAlpha(int alpha) { return alpha << 24; } + public static int argbAlpha(int alpha) { return alpha << 24; } - public static int rgbRed(int red) { return red << 16; } + public static int argbRed(int red) { return red << 16; } - public static int rgbGreen(int green) { return green << 8; } + public static int argbGreen(int green) { return green << 8; } - public static int rgbBlue(int blue) { return blue; } + public static int argbBlue(int blue) { return blue; } public enum Channel { RED { @Override - public int from(int rgb) { - return getRed(rgb); + public int from(int argb) { + return getRed(argb); } @Override - public int zero(int rgb) { - return zeroRed(rgb); + public int zero(int argb) { + return zeroRed(argb); } }, GREEN { @Override - public int from(int rgb) { - return getGreen(rgb); + public int from(int argb) { + return getGreen(argb); } @Override - public int zero(int rgb) { - return zeroGreen(rgb); + public int zero(int argb) { + return zeroGreen(argb); } }, BLUE { @Override - public int from(int rgb) { - return getBlue(rgb); + public int from(int argb) { + return getBlue(argb); } @Override - public int zero(int rgb) { - return zeroBlue(rgb); + public int zero(int argb) { + return zeroBlue(argb); } }, GRAYSCALE { @Override - public int from(int rgb) { - return getGrayscale(rgb); + public int from(int argb) { + return getGrayscale(argb); } @Override - public int zero(int rgb) { - return zeroGrayscale(rgb); + public int zero(int argb) { + return zeroGrayscale(argb); } }, ALPHA { @Override - public int from(int rgb) { - return getAlpha(rgb); + public int from(int argb) { + return getAlpha(argb); } @Override - public int zero(int rgb) { - return zeroAlpha(rgb); + public int zero(int argb) { + return zeroAlpha(argb); } }; - public abstract int from(int rgb); + public abstract int from(int argb); - public abstract int zero(int rgb); + public abstract int zero(int argb); } } From 09d847bc5ae436d1b95d56529cac4f9e0e0cba40 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 2 May 2023 13:12:23 +1000 Subject: [PATCH 126/161] Add argb method to Channel class --- .../terra/addons/image/util/ColorUtil.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java index 11924ea43..0f9574454 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java @@ -93,6 +93,8 @@ public class ColorUtil { public static int argbBlue(int blue) { return blue; } + public static int argbGrayscale(int value) { return argb(value, value, value, value); } + public enum Channel { RED { @Override @@ -104,6 +106,11 @@ public class ColorUtil { public int zero(int argb) { return zeroRed(argb); } + + @Override + public int argb(int value) { + return argbRed(value); + } }, GREEN { @Override @@ -115,6 +122,11 @@ public class ColorUtil { public int zero(int argb) { return zeroGreen(argb); } + + @Override + public int argb(int value) { + return argbGreen(value); + } }, BLUE { @Override @@ -126,6 +138,11 @@ public class ColorUtil { public int zero(int argb) { return zeroBlue(argb); } + + @Override + public int argb(int value) { + return argbBlue(value); + } }, GRAYSCALE { @Override @@ -137,6 +154,11 @@ public class ColorUtil { public int zero(int argb) { return zeroGrayscale(argb); } + + @Override + public int argb(int value) { + return argbAlpha(value); + } }, ALPHA { @Override @@ -148,10 +170,17 @@ public class ColorUtil { public int zero(int argb) { return zeroAlpha(argb); } + + @Override + public int argb(int value) { + return argbAlpha(value); + } }; public abstract int from(int argb); public abstract int zero(int argb); + + public abstract int argb(int value); } } From b4ea09929cf3314bc8b5794343f9eb435ba86974 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 2 May 2023 13:36:25 +1000 Subject: [PATCH 127/161] ColorUtil documentation --- .../terra/addons/image/util/ColorUtil.java | 142 +++++++++++++++++- 1 file changed, 139 insertions(+), 3 deletions(-) diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java index 0f9574454..0c52ea5a6 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java @@ -3,6 +3,9 @@ package com.dfsek.terra.addons.image.util; import net.jafama.FastMath; +/** + * Utility class for manipulating 8 bit ARGB colors + */ public class ColorUtil { private ColorUtil() {} @@ -13,56 +16,135 @@ public class ColorUtil { FastMath.abs(getBlue(a) - getBlue(b)); } + /** + * Returns the red channel value of a given ARGB color value. + * + * @param argb the ARGB color value to extract the red channel value from + * @return the red channel value of the given ARGB color value, in the range 0-255 + */ public static int getRed(int argb) { return argb >> 16 & 255; } + /** + * Returns the green channel value of a given ARGB color value. + * + * @param argb the ARGB color value to extract the green channel value from + * @return the green channel value of the given ARGB color value, in the range 0-255 + */ public static int getGreen(int argb) { return argb >> 8 & 255; } + /** + * Returns the blue channel value of a given ARGB color value. + * + * @param argb the ARGB color value to extract the blue channel value from + * @return the blue channel value of the given ARGB color value, in the range 0-255 + */ public static int getBlue(int argb) { - return argb >> 0 & 255; + return argb & 255; } + /** + * Returns the alpha channel value of a given ARGB color value. + * + * @param argb the ARGB color value to extract the blue channel value from + * @return the alpha channel value of the given ARGB color value, in the range 0-255 + */ public static int getAlpha(int argb) { return argb >> 24 & 255; } + /** + * Returns the grayscale value of a given ARGB color value. + * + * @param argb the ARGB color value to convert to grayscale + * @return the grayscale value of the given ARGB color value, in the range 0-255 + */ public static int getGrayscale(int argb) { return (getRed(argb) + getGreen(argb) + getBlue(argb)) / 3; } + /** + * Returns the value of the specified channel for a given ARGB color value. + * + * @param argb the ARGB color value to extract the channel value from + * @param channel the channel to extract the value from + * @return the value of the specified channel for the given ARGB color value, in the range 0-255 + */ public static int getChannel(int argb, Channel channel) { return channel.from(argb); } + /** + * Sets the red channel value of a given ARGB color value to zero. + * + * @param argb the ARGB color value to zero the red channel of + * @return the resulting ARGB color value with the red channel set to zero + */ public static int zeroRed(int argb) { return argb & ~0x00FF0000; } + /** + * Sets the green channel value of a given ARGB color value to zero. + * + * @param argb the ARGB color value to zero the green channel of + * @return the resulting ARGB color value with the green channel set to zero + */ public static int zeroGreen(int argb) { return argb & ~0x0000FF00; } + /** + * Sets the blue channel value of a given ARGB color value to zero. + * + * @param argb the ARGB color value to zero the blue channel of + * @return the resulting ARGB color value with the blue channel set to zero + */ public static int zeroBlue(int argb) { return argb & ~0x000000FF; } + /** + * Sets the alpha channel value of a given ARGB color value to zero. + * This is the same as setting the color to fully transparent. + * + * @param argb the ARGB color value to zero the alpha channel of + * @return the resulting ARGB color value with the alpha channel set to zero + */ public static int zeroAlpha(int argb) { return argb & ~0xFF000000; } + /** + * Sets the color channels of a given ARGB color value to zero. + * This is the same as setting the color to black, while preserving the alpha. + * + * @param argb the ARGB color value to zero the color channel of + * @return the resulting ARGB color value with the color channels set to zero + */ public static int zeroGrayscale(int argb) { return argb & ~0x00FFFFFF; } + /** + * Sets the specified channel value of a given ARGB color value to zero. + * + * @param argb the ARGB color value to zero the specified channel of + * @param channel the channel to zero the value of + * @return the resulting ARGB color value with the specified channel value set to zero + */ public static int zeroChannel(int argb, Channel channel) { return channel.zero(argb); } - /* - * Multiply each color channel by the alpha channel + /** + * Multiply the RGB channels of a given ARGB color value by its alpha channel value. + * + * @param argb the ARGB color value to premultiply the RGB channels of + * @return the resulting premultiplied ARGB color value */ public static int premultiply(int argb) { int alpha = getAlpha(argb); @@ -72,10 +154,30 @@ public class ColorUtil { return argb(alpha, red, green, blue); } + /** + * Returns an ARGB color value with the specified values for alpha, red, green, and blue channels. + * + * @param alpha the alpha value, between 0 and 255, to set in the ARGB color value + * @param red the red value, between 0 and 255, to set in the ARGB color value + * @param green the green value, between 0 and 255, to set in the ARGB color value + * @param blue the blue value, between 0 and 255, to set in the ARGB color value + * @return the resulting ARGB color value with the specified values for alpha, red, green, and blue channels + */ public static int argb(int alpha, int red, int green, int blue) { return argbAlpha(alpha) | argbRed(red) | argbGreen(green) | argbBlue(blue); } + /** + * Returns an ARGB color value with the specified values for alpha, red, green, and blue channels, + * after validating that each channel value is in the range 0-255. + * + * @param alpha the alpha value, between 0 and 255, to set in the ARGB color value + * @param red the red value, between 0 and 255, to set in the ARGB color value + * @param green the green value, between 0 and 255, to set in the ARGB color value + * @param blue the blue value, between 0 and 255, to set in the ARGB color value + * @return the resulting ARGB color value with the specified values for alpha, red, green, and blue channels + * @throws IllegalArgumentException if any channel value is outside the range 0-255 + */ public static int argbValidated(int alpha, int red, int green, int blue) throws IllegalArgumentException { if (alpha < 0 || alpha > 255 || red < 0 || red > 255 || @@ -85,14 +187,48 @@ public class ColorUtil { return argb(alpha, red, green, blue); } + /** + * Returns the ARGB color value with the specified alpha channel value and zero + * for the red, green, and blue channels. + * + * @param alpha the alpha channel value to set in the ARGB color value + * @return the resulting ARGB color value + */ public static int argbAlpha(int alpha) { return alpha << 24; } + /** + * Returns the ARGB color value with the specified red channel value and zero + * for the alpha, green, and blue channels. + * + * @param red the red channel value to set in the ARGB color value + * @return the resulting ARGB color value + */ public static int argbRed(int red) { return red << 16; } + /** + * Returns the ARGB color value with the specified red channel value and zero + * for the alpha, red, and blue channels. + * + * @param green the green channel value to set in the ARGB color value + * @return the resulting ARGB color value + */ public static int argbGreen(int green) { return green << 8; } + /** + * Returns the ARGB color value with the specified blue channel value and zero + * for the alpha, red, and green channels. + * + * @param blue the blue channel value to set in the ARGB color value + * @return the resulting ARGB color value + */ public static int argbBlue(int blue) { return blue; } + /** + * Returns an ARGB color value with the specified grayscale value for all four channels. + * + * @param value the grayscale value to set in all four channels of the ARGB color value + * @return the resulting ARGB color value with the specified grayscale value for all four channels + */ public static int argbGrayscale(int value) { return argb(value, value, value, value); } public enum Channel { From 9fa5307a6023f7be1c6a6d93a406fc43318d1883 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 2 May 2023 13:41:42 +1000 Subject: [PATCH 128/161] Remove image sampler addon The image sampler is implemented as the 'CHANNEL' sampler provided directly by the library-image addon instead. --- common/addons/config-noise-image/LICENSE | 21 --------- .../config-noise-image/build.gradle.kts | 13 ----- .../addons/noise/image/ImageSampler.java | 38 --------------- .../addons/noise/image/ImageSamplerAddon.java | 47 ------------------- .../image/config/ImageSamplerTemplate.java | 36 -------------- .../src/main/resources/terra.addon.yml | 14 ------ 6 files changed, 169 deletions(-) delete mode 100644 common/addons/config-noise-image/LICENSE delete mode 100644 common/addons/config-noise-image/build.gradle.kts delete mode 100644 common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java delete mode 100644 common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSamplerAddon.java delete mode 100644 common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java delete mode 100644 common/addons/config-noise-image/src/main/resources/terra.addon.yml diff --git a/common/addons/config-noise-image/LICENSE b/common/addons/config-noise-image/LICENSE deleted file mode 100644 index 64c1cd516..000000000 --- a/common/addons/config-noise-image/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020-2021 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/config-noise-image/build.gradle.kts b/common/addons/config-noise-image/build.gradle.kts deleted file mode 100644 index 668538541..000000000 --- a/common/addons/config-noise-image/build.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -version = version("1.0.0") - -dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) - compileOnlyApi(project(":common:addons:library-image")) - compileOnlyApi(project(":common:addons:config-noise-function")) - implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) - testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) -} - -tasks.named("shadowJar") { - relocate("net.jafama", "com.dfsek.terra.addons.noise.image.lib.jafama") -} \ No newline at end of file diff --git a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java deleted file mode 100644 index ad9ed167b..000000000 --- a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSampler.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2020-2021 Polyhedral Development - * - * The Terra 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.image; - -import com.dfsek.terra.addons.image.colorsampler.ColorSampler; -import com.dfsek.terra.addons.image.util.ColorUtil.Channel; -import com.dfsek.terra.api.noise.NoiseSampler; - - -public class ImageSampler implements NoiseSampler { - private final Channel channel; - - private final double frequency; - - private final ColorSampler colorSampler; - - public ImageSampler(ColorSampler colorSampler, Channel channel, double frequency) { - this.channel = channel; - this.frequency = frequency; - this.colorSampler = colorSampler; - } - - @Override - public double noise(long seed, double x, double y) { - return channel.from(colorSampler.apply((int) (x * frequency), (int) (y * frequency))) / 255D * 2 - 1; - } - - @Override - public double noise(long seed, double x, double y, double z) { - return noise(seed, x, y); - } - -} diff --git a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSamplerAddon.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSamplerAddon.java deleted file mode 100644 index a67f1e4eb..000000000 --- a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/ImageSamplerAddon.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2020-2021 Polyhedral Development - * - * The Terra 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.image; - -import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; - -import java.util.function.Supplier; - -import com.dfsek.terra.addons.manifest.api.AddonInitializer; -import com.dfsek.terra.addons.noise.NoiseAddon; -import com.dfsek.terra.addons.noise.image.config.ImageSamplerTemplate; -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.NoiseSampler; -import com.dfsek.terra.api.registry.CheckedRegistry; - - -public class ImageSamplerAddon implements AddonInitializer { - - @Inject - private Platform platform; - - @Inject - private BaseAddon addon; - - @Override - public void initialize() { - platform.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(addon, ConfigPackPreLoadEvent.class) - .priority(502) - .then(event -> { - CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry( - NoiseAddon.NOISE_SAMPLER_TOKEN); - noiseRegistry.register(addon.key("IMAGE"), ImageSamplerTemplate::new); - }) - .failThrough(); - } -} diff --git a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java b/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java deleted file mode 100644 index dc05def7b..000000000 --- a/common/addons/config-noise-image/src/main/java/com/dfsek/terra/addons/noise/image/config/ImageSamplerTemplate.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2020-2021 Polyhedral Development - * - * The Terra 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.image.config; - -import com.dfsek.tectonic.api.config.template.annotations.Value; - -import com.dfsek.terra.addons.image.colorsampler.ColorSampler; -import com.dfsek.terra.addons.image.util.ColorUtil.Channel; -import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; -import com.dfsek.terra.addons.noise.image.ImageSampler; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; - - -@SuppressWarnings({ "unused", "FieldMayBeFinal" }) -public class ImageSamplerTemplate extends SamplerTemplate { - - @Value("image") - private @Meta ColorSampler colorSampler; - - @Value("frequency") - private @Meta double frequency; - - @Value("channel") - private @Meta Channel channel; - - @Override - public NoiseSampler get() { - return new ImageSampler(colorSampler, channel, frequency); - } -} diff --git a/common/addons/config-noise-image/src/main/resources/terra.addon.yml b/common/addons/config-noise-image/src/main/resources/terra.addon.yml deleted file mode 100644 index 355449217..000000000 --- a/common/addons/config-noise-image/src/main/resources/terra.addon.yml +++ /dev/null @@ -1,14 +0,0 @@ -schema-version: 1 -contributors: - - Terra contributors -id: config-noise-image -version: @VERSION@ -entrypoints: - - "com.dfsek.terra.addons.noise.image.ImageSamplerAddon" -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.+" From 58b743e6e8be39442949e413c57b9266a4be8bf9 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 2 May 2023 14:15:20 +1000 Subject: [PATCH 129/161] Distance transform documentation --- ...DistanceTransformNoiseSamplerTemplate.java | 26 +++++++++++++++++++ .../image/operator/DistanceTransform.java | 13 ++++++++++ 2 files changed, 39 insertions(+) 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/noisesampler/DistanceTransformNoiseSamplerTemplate.java index faf6dd96d..32c523d3c 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/noisesampler/DistanceTransformNoiseSamplerTemplate.java @@ -17,26 +17,52 @@ public class DistanceTransformNoiseSamplerTemplate implements ObjectTemplate Date: Fri, 9 Jun 2023 03:04:41 -0700 Subject: [PATCH 130/161] 1.19.4 fabric --- .../java/com/dfsek/terra/mod/ModPlatform.java | 4 +++- .../lifecycle/WorldPresetsRegistrarMixin.java | 23 ------------------- .../com/dfsek/terra/mod/util/PresetUtil.java | 22 +++++++++++++++++- .../main/resources/terra.common.mixins.json | 3 +-- .../terra/lifecycle/LifecyclePlatform.java | 13 ++++++++--- .../mixin/lifecycle/RegistryLoaderMixin.java | 13 ++++------- .../terra/lifecycle/util/LifecycleUtil.java | 13 +++++------ 7 files changed, 46 insertions(+), 45 deletions(-) delete mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/WorldPresetsRegistrarMixin.java 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 9f26738b1..b2b11bb7e 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 @@ -5,8 +5,8 @@ import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; -import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.sound.BiomeAdditionsSound; @@ -22,6 +22,7 @@ import net.minecraft.world.biome.BiomeEffects.GrassColorModifier; import net.minecraft.world.biome.BiomeParticleConfig; import net.minecraft.world.biome.SpawnSettings; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; +import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.WorldPreset; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; @@ -113,6 +114,7 @@ public abstract class ModPlatform extends AbstractPlatform { public abstract Registry dimensionTypeRegistry(); public abstract Registry biomeRegistry(); public abstract Registry chunkGeneratorSettingsRegistry(); + public abstract Registry multiNoiseBiomeSourceParameterListRegistry(); @Override public @NotNull WorldHandle getWorldHandle() { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/WorldPresetsRegistrarMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/WorldPresetsRegistrarMixin.java deleted file mode 100644 index c102e46b8..000000000 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/WorldPresetsRegistrarMixin.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.dfsek.terra.mod.mixin.lifecycle; - -import com.dfsek.terra.mod.mixin_ifaces.FloraFeatureHolder; -import com.dfsek.terra.mod.mixin_ifaces.RegistrarInstance; - -import net.minecraft.registry.Registerable; -import net.minecraft.world.gen.WorldPreset; -import net.minecraft.world.gen.WorldPresets; -import org.spongepowered.asm.mixin.Implements; -import org.spongepowered.asm.mixin.Interface; -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; - - -@Mixin(WorldPresets.Registrar.class) -public class WorldPresetsRegistrarMixin { - @Inject(at = @At("RETURN"), method = "") - public void injectConstructor(Registerable presetRegisterable, CallbackInfo ci) { - RegistrarInstance.INSTANCE = (WorldPresets.Registrar) (Object) this; - } -} 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 74c3bff39..fc5c48e79 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 @@ -46,25 +46,45 @@ public class PresetUtil { public static Pair createDefault(ConfigPack pack, ModPlatform platform) { 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.of("terra", pack.getID().toLowerCase(Locale.ROOT) + "/" + pack.getNamespace().toLowerCase( Locale.ROOT)); PRESETS.add(generatorID); + RegistryEntry registryEntry = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow(); + RegistryEntry.Reference reference = multiNoiseBiomeSourceParameterLists.getEntry(MultiNoiseBiomeSourceParameterLists.NETHER).orElseThrow(); + RegistryEntry registryEntry2 = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER).orElseThrow(); + + RegistryEntry registryEntry3 = dimensionTypeRegistry.getEntry(DimensionTypes.THE_END).orElseThrow(); + RegistryEntry registryEntry4 = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.END).orElseThrow(); + TerraBiomeSource biomeSource = new TerraBiomeSource(pack); ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(biomeSource, pack, overworld); DimensionOptions dimensionOptions = new DimensionOptions(overworldDimensionType, generator); - WorldPreset preset = ((WorldPresetsRegistrarAccessor) RegistrarInstance.INSTANCE).callCreatePreset(dimensionOptions); + 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); 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 List getPresets() { return PRESETS; } 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 8316bc6f5..dc6b5d4b9 100644 --- a/platforms/mixin-common/src/main/resources/terra.common.mixins.json +++ b/platforms/mixin-common/src/main/resources/terra.common.mixins.json @@ -37,8 +37,7 @@ "implementations.terra.inventory.meta.ItemStackMetaMixin", "implementations.terra.world.ChunkRegionMixin", "implementations.terra.world.ServerWorldMixin", - "lifecycle.DataPackContentsMixin", - "lifecycle.WorldPresetsRegistrarMixin" + "lifecycle.DataPackContentsMixin" ], "client": [ ], 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 8efe9562c..409c32684 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,10 +3,10 @@ package com.dfsek.terra.lifecycle; import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import net.minecraft.MinecraftVersion; -import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registry; import net.minecraft.server.MinecraftServer; import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.slf4j.Logger; @@ -15,7 +15,6 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; import com.dfsek.terra.addon.EphemeralAddon; @@ -32,6 +31,7 @@ public abstract class LifecyclePlatform extends ModPlatform { private static final AtomicReference> BIOMES = new AtomicReference<>(); private static final AtomicReference> DIMENSIONS = new AtomicReference<>(); private static final AtomicReference> SETTINGS = new AtomicReference<>(); + private static final AtomicReference> NOISE = new AtomicReference<>(); public LifecyclePlatform() { CommonPlatform.initialize(this); @@ -73,10 +73,12 @@ public abstract class LifecyclePlatform extends ModPlatform { public static void setRegistries(Registry biomeRegistry, Registry dimensionTypeRegistry, - Registry chunkGeneratorSettingsRegistry) { + Registry chunkGeneratorSettingsRegistry, + Registry multiNoiseBiomeSourceParameterListRegistry) { BIOMES.set(biomeRegistry); DIMENSIONS.set(dimensionTypeRegistry); SETTINGS.set(chunkGeneratorSettingsRegistry); + NOISE.set(multiNoiseBiomeSourceParameterListRegistry); } @Override @@ -116,5 +118,10 @@ public abstract class LifecyclePlatform extends ModPlatform { return SETTINGS.get(); } + @Override + public Registry multiNoiseBiomeSourceParameterListRegistry() { + return NOISE.get(); + } + protected abstract Collection getPlatformMods(); } 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 98f601b83..8193a3224 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java @@ -1,33 +1,29 @@ package com.dfsek.terra.lifecycle.mixin.lifecycle; -import com.dfsek.terra.lifecycle.LifecyclePlatform; - -import com.dfsek.terra.lifecycle.util.RegistryHack; - import com.mojang.datafixers.util.Pair; import net.minecraft.registry.MutableRegistry; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryLoader; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.WorldPreset; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; -import org.checkerframework.checker.units.qual.C; import org.slf4j.Logger; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import java.util.List; import java.util.Optional; import java.util.function.Consumer; +import com.dfsek.terra.lifecycle.LifecyclePlatform; import com.dfsek.terra.lifecycle.util.LifecycleUtil; +import com.dfsek.terra.lifecycle.util.RegistryHack; @Mixin(RegistryLoader.class) @@ -56,8 +52,9 @@ public class RegistryLoaderMixin { MutableRegistry worldPresets = extractRegistry(instance, RegistryKeys.WORLD_PRESET).orElseThrow(); MutableRegistry chunkGeneratorSettings = extractRegistry(instance, RegistryKeys.CHUNK_GENERATOR_SETTINGS).orElseThrow(); + MutableRegistry multiNoiseBiomeSourceParameterLists = extractRegistry(instance, RegistryKeys.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST).orElseThrow(); - LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings); + LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings, multiNoiseBiomeSourceParameterLists); LifecycleUtil.initialize(biomes, worldPresets); }); instance.forEach(consumer); 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 70291458b..ed8ee64a1 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 @@ -1,18 +1,15 @@ package com.dfsek.terra.lifecycle.util; -import com.dfsek.terra.lifecycle.LifecyclePlatform; - -import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.MutableRegistry; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.WorldPreset; import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; import com.dfsek.terra.mod.CommonPlatform; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.WorldPreset; - public final class LifecycleUtil { private LifecycleUtil() { @@ -21,7 +18,9 @@ public final class LifecycleUtil { public static void initialize(MutableRegistry biomeMutableRegistry, MutableRegistry worldPresetMutableRegistry) { CommonPlatform.get().getEventManager().callEvent(new PlatformInitializationEvent()); + BiomeUtil.registerBiomes(biomeMutableRegistry); - CommonPlatform.get().registerWorldTypes((id, preset) -> Registry.register(worldPresetMutableRegistry, id, preset)); + CommonPlatform.get().registerWorldTypes((id, preset) -> Registry.register(worldPresetMutableRegistry, RegistryKey.of(RegistryKeys.WORLD_PRESET, id), preset)); + } } From bea8f97179db4bb62b51f2e081344ae1e85db69e Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 9 Jun 2023 03:33:47 -0700 Subject: [PATCH 131/161] fix bukkit pack reloading --- .../generator/BukkitBlockPopulator.java | 33 +++++++++++++++++++ .../BukkitChunkGeneratorWrapper.java | 13 ++------ 2 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitBlockPopulator.java diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitBlockPopulator.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitBlockPopulator.java new file mode 100644 index 000000000..1a1cb3b13 --- /dev/null +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitBlockPopulator.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.bukkit.generator; + +import org.bukkit.generator.BlockPopulator; +import org.bukkit.generator.LimitedRegion; +import org.bukkit.generator.WorldInfo; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.bukkit.world.BukkitProtoWorld; + + +public class BukkitBlockPopulator extends BlockPopulator { + private ConfigPack pack; + private final BlockState air; + + public BukkitBlockPopulator(ConfigPack pack, BlockState air) { + this.pack = pack; + this.air = air; + } + + public void setPack(ConfigPack pack) { + this.pack = pack; + } + + @Override + public void populate(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ, + @NotNull LimitedRegion limitedRegion) { + pack.getStages().forEach(generationStage -> generationStage.populate(new BukkitProtoWorld(limitedRegion, air, pack.getBiomeProvider()))); + } +} diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index 8d7302fa7..8a6b17bdd 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -45,12 +45,14 @@ public class BukkitChunkGeneratorWrapper extends org.bukkit.generator.ChunkGener private final BlockState air; private ChunkGenerator delegate; private ConfigPack pack; + private final BukkitBlockPopulator blockPopulator; public BukkitChunkGeneratorWrapper(ChunkGenerator delegate, ConfigPack pack, BlockState air) { this.delegate = delegate; this.pack = pack; this.air = air; + this.blockPopulator = new BukkitBlockPopulator(pack, air); } public void setDelegate(ChunkGenerator delegate) { @@ -70,16 +72,7 @@ public class BukkitChunkGeneratorWrapper extends org.bukkit.generator.ChunkGener @Override public @NotNull List getDefaultPopulators(@NotNull World world) { - return pack.getStages() - .stream() - .map(generationStage -> new BlockPopulator() { - @Override - public void populate(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z, - @NotNull LimitedRegion limitedRegion) { - generationStage.populate(new BukkitProtoWorld(limitedRegion, air, pack.getBiomeProvider())); - } - }) - .collect(Collectors.toList()); + return List.of(blockPopulator); } @Override From 183255140b746754aa617e4021cf9037ad99660d Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 10 Jun 2023 15:28:46 -0700 Subject: [PATCH 132/161] remove unused RegistrarInstance class --- .../dfsek/terra/mod/mixin_ifaces/RegistrarInstance.java | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin_ifaces/RegistrarInstance.java diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin_ifaces/RegistrarInstance.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin_ifaces/RegistrarInstance.java deleted file mode 100644 index 2b36837fc..000000000 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin_ifaces/RegistrarInstance.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.mod.mixin_ifaces; - -import net.minecraft.world.gen.WorldPresets; - - -public class RegistrarInstance { - public static WorldPresets.Registrar INSTANCE; -} From 41b702112144839a1ddb7b7be362b327df1a8bba Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 10 Jun 2023 15:49:33 -0700 Subject: [PATCH 133/161] fix fabric pack reloading --- .../java/com/dfsek/terra/lifecycle/LifecyclePlatform.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 409c32684..81ebcae8a 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 @@ -2,8 +2,13 @@ package com.dfsek.terra.lifecycle; import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; + +import com.dfsek.terra.lifecycle.util.BiomeUtil; + import net.minecraft.MinecraftVersion; +import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList; @@ -55,6 +60,7 @@ public abstract class LifecyclePlatform extends ModPlatform { if(server != null) { + BiomeUtil.registerBiomes(server.getRegistryManager().get(RegistryKeys.BIOME)); server.reloadResources(server.getDataPackManager().getNames()).exceptionally(throwable -> { LOGGER.warn("Failed to execute reload", throwable); return null; From 46b61d841d04ad89581e8fb2d5e8cc67e4ba6b68 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 10 Jun 2023 15:50:45 -0700 Subject: [PATCH 134/161] remove unneeded buildscript --- platforms/bukkit/nms/build.gradle.kts | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 platforms/bukkit/nms/build.gradle.kts diff --git a/platforms/bukkit/nms/build.gradle.kts b/platforms/bukkit/nms/build.gradle.kts deleted file mode 100644 index f516f1afd..000000000 --- a/platforms/bukkit/nms/build.gradle.kts +++ /dev/null @@ -1,17 +0,0 @@ -apply(plugin = "io.papermc.paperweight.userdev") - -repositories { - maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") -} - -dependencies { - api(project(":platforms:bukkit:common")) - paperDevBundle("1.19.4-R0.1-SNAPSHOT") - implementation("xyz.jpenilla", "reflection-remapper", "0.1.0-SNAPSHOT") -} - -tasks { - assemble { - dependsOn("reobfJar") - } -} From 170687abdbd18f54dc7c6f3d684c27963b268145 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 10 Jun 2023 15:53:27 -0700 Subject: [PATCH 135/161] remove unused mixin --- .../mixin/access/WorldPresetsRegistrarAccessor.java | 13 ------------- .../src/main/resources/terra.common.mixins.json | 1 - 2 files changed, 14 deletions(-) delete mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/WorldPresetsRegistrarAccessor.java diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/WorldPresetsRegistrarAccessor.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/WorldPresetsRegistrarAccessor.java deleted file mode 100644 index d7acfce81..000000000 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/WorldPresetsRegistrarAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dfsek.terra.mod.mixin.access; - -import net.minecraft.world.dimension.DimensionOptions; -import net.minecraft.world.gen.WorldPreset; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - - -@Mixin(targets = "net.minecraft.world.gen.WorldPresets$Registrar") -public interface WorldPresetsRegistrarAccessor { - @Invoker("createPreset") - WorldPreset callCreatePreset(DimensionOptions dimensionOptions); -} 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 dc6b5d4b9..d4402241c 100644 --- a/platforms/mixin-common/src/main/resources/terra.common.mixins.json +++ b/platforms/mixin-common/src/main/resources/terra.common.mixins.json @@ -9,7 +9,6 @@ "access.StateAccessor", "access.StructureAccessorAccessor", "access.VillagerTypeAccessor", - "access.WorldPresetsRegistrarAccessor", "fix.BeeMoveGoalsUnsynchronizedRandomAccessFix", "fix.NetherFossilOptimization", "implementations.compat.GenerationSettingsFloraFeaturesMixin", From d0591f292ea8add1903d2006d906f48c5ae6d592 Mon Sep 17 00:00:00 2001 From: Astrash Date: Wed, 14 Jun 2023 11:15:25 +1000 Subject: [PATCH 136/161] Use primitive int over Integer --- .../terra/addons/image/colorsampler/ColorSampler.java | 2 +- .../image/colorsampler/image/SingleImageColorSampler.java | 2 +- .../image/colorsampler/image/TileImageColorSampler.java | 2 +- .../image/colorsampler/mutate/RotateColorSampler.java | 5 +++-- .../image/colorsampler/mutate/TranslateColorSampler.java | 2 +- .../image/converter/ClosestMatchColorConverter.java | 2 +- .../terra/addons/image/converter/ColorConverter.java | 8 ++++---- .../terra/addons/image/converter/ExactColorConverter.java | 2 +- 8 files changed, 13 insertions(+), 12 deletions(-) diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/ColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/ColorSampler.java index 4856a08f9..9cf226302 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/ColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/ColorSampler.java @@ -8,5 +8,5 @@ public interface ColorSampler { * @param z World z coordinate * @return Integer representing a web color */ - Integer apply(int x, int z); + int apply(int x, int z); } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/SingleImageColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/SingleImageColorSampler.java index 2c19f70bf..420b0f62f 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/SingleImageColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/SingleImageColorSampler.java @@ -20,7 +20,7 @@ public class SingleImageColorSampler implements ColorSampler { } @Override - public Integer apply(int x, int z) { + public int apply(int x, int z) { var nx = transformation.transformX(image, x); var nz = transformation.transformZ(image, z); if(nx < 0 || nz < 0 || nx >= image.getWidth() || nz >= image.getHeight()) return fallback.apply(x, z); diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/TileImageColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/TileImageColorSampler.java index aae1bf21f..ec03c4941 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/TileImageColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/TileImageColorSampler.java @@ -19,7 +19,7 @@ public class TileImageColorSampler implements ColorSampler { } @Override - public Integer apply(int x, int z) { + public int apply(int x, int z) { x = transformation.transformX(image, x); z = transformation.transformZ(image, z); return image.getRGB(FastMath.floorMod(x, image.getWidth()), FastMath.floorMod(z, image.getHeight())); 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 d7fae42b2..ed425e35d 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,8 +1,9 @@ package com.dfsek.terra.addons.image.colorsampler.mutate; -import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import net.jafama.FastMath; +import com.dfsek.terra.addons.image.colorsampler.ColorSampler; + public class RotateColorSampler implements ColorSampler { @@ -16,7 +17,7 @@ public class RotateColorSampler implements ColorSampler { } @Override - public Integer apply(int x, int z) { + public int apply(int x, int z) { return sampler.apply( (int) (x * FastMath.cos(radians) - z * FastMath.sin(radians)), (int) (z * FastMath.cos(radians) + x * FastMath.sin(radians)) diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/TranslateColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/TranslateColorSampler.java index f281e5152..16d3cb71c 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/TranslateColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/TranslateColorSampler.java @@ -15,7 +15,7 @@ public class TranslateColorSampler implements ColorSampler { } @Override - public Integer apply(int x, int z) { + public int apply(int x, int z) { return sampler.apply(x - translateX, z - translateZ); } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java index a95e2ee83..b2d44f94d 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java @@ -16,7 +16,7 @@ public class ClosestMatchColorConverter implements ColorConverter { } @Override - public T apply(Integer color) { + public T apply(int color) { int closest = 0; int smallestDistance = Integer.MAX_VALUE; for(int compare : colors) { diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ColorConverter.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ColorConverter.java index bb5a87613..5f76291d8 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ColorConverter.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ColorConverter.java @@ -1,8 +1,8 @@ package com.dfsek.terra.addons.image.converter; -import java.util.function.Function; - - -public interface ColorConverter extends Function { +public interface ColorConverter { + + T apply(int color); + Iterable getEntries(); } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java index 99188f379..8f6f55d4c 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java @@ -25,7 +25,7 @@ public class ExactColorConverter implements ColorConverter { } @Override - public T apply(Integer color) { + public T apply(int color) { if (ignoreAlpha) { color = ColorUtil.zeroAlpha(color); } From a5cbce3667015355962f9d771b4d1e4514ded6f7 Mon Sep 17 00:00:00 2001 From: Astrash Date: Wed, 14 Jun 2023 12:07:37 +1000 Subject: [PATCH 137/161] Optimize cardinal rotations for RotateColorSampler --- .../mutate/RotateColorSampler.java | 49 ++++++++++++++++--- .../mutate/RotateColorSamplerTemplate.java | 5 +- 2 files changed, 44 insertions(+), 10 deletions(-) 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 ed425e35d..46a449773 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 @@ -4,23 +4,58 @@ import net.jafama.FastMath; import com.dfsek.terra.addons.image.colorsampler.ColorSampler; - public class RotateColorSampler implements ColorSampler { private final ColorSampler sampler; private final double radians; - public RotateColorSampler(ColorSampler sampler, double radians) { + private final RotationMethod rotationMethod; + + public RotateColorSampler(ColorSampler sampler, double degrees) { this.sampler = sampler; - this.radians = radians; + + double normalizedDegrees = degrees % 360.0; + if (normalizedDegrees < 0) normalizedDegrees += 360.0; + + if (normalizedDegrees == 0.0) + rotationMethod = RotationMethod.DEG_0; + else if (normalizedDegrees == 90.0) + rotationMethod = RotationMethod.DEG_90; + else if (normalizedDegrees == 180.0) + rotationMethod = RotationMethod.DEG_180; + else if (normalizedDegrees == 270.0) + rotationMethod = RotationMethod.DEG_270; + else + rotationMethod = RotationMethod.RAD_ANY; + + this.radians = FastMath.toRadians(degrees); } @Override public int apply(int x, int z) { - return sampler.apply( - (int) (x * FastMath.cos(radians) - z * FastMath.sin(radians)), - (int) (z * FastMath.cos(radians) + x * FastMath.sin(radians)) - ); + int rx = switch(rotationMethod) { + case DEG_0 -> x; + case DEG_90 -> -z; + case DEG_180 -> -x; + case DEG_270 -> z; + case RAD_ANY -> (int) (x * FastMath.cos(radians) - z * FastMath.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 * FastMath.cos(radians) + x * FastMath.sin(radians)); + }; + return sampler.apply(rx, rz); + } + + private enum RotationMethod { + DEG_0, + DEG_90, + DEG_180, + DEG_270, + RAD_ANY, } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/RotateColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/RotateColorSamplerTemplate.java index 6ade23c77..662735a54 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/RotateColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/RotateColorSamplerTemplate.java @@ -1,7 +1,6 @@ package com.dfsek.terra.addons.image.config.colorsampler.mutate; import com.dfsek.tectonic.api.config.template.annotations.Value; -import net.jafama.FastMath; import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import com.dfsek.terra.addons.image.colorsampler.mutate.RotateColorSampler; @@ -10,10 +9,10 @@ import com.dfsek.terra.addons.image.colorsampler.mutate.RotateColorSampler; public class RotateColorSamplerTemplate extends MutateColorSamplerTemplate { @Value("angle") - private double angle; + private double degrees; @Override public ColorSampler get() { - return new RotateColorSampler(sampler, FastMath.toRadians(angle)); + return new RotateColorSampler(sampler, degrees); } } From f46f35d2ad543bb1ab59d9ad77b1f36df56cfa8e Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 15 Jun 2023 15:52:36 -0700 Subject: [PATCH 138/161] make forge compile --- .../src/main/java/com/dfsek/terra/forge/ForgePlatform.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 5cf97c381..5f854740e 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 @@ -26,6 +26,7 @@ import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.server.MinecraftServer; import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraftforge.fml.loading.FMLLoader; @@ -144,4 +145,9 @@ public class ForgePlatform extends ModPlatform { public Registry chunkGeneratorSettingsRegistry() { return null; } + + @Override + public Registry multiNoiseBiomeSourceParameterListRegistry() { + return null; + } } From 49efbed6f55b37c604af77b35dc4d9cb3b8f6b91 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 15 Jun 2023 17:11:04 -0700 Subject: [PATCH 139/161] update versions --- buildSrc/src/main/kotlin/Versions.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 3a58cc9b7..6c9e8a888 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -19,7 +19,7 @@ object Versions { object Fabric { const val fabricLoader = "0.14.8" - const val fabricAPI = "0.78.0+1.19.4" + const val fabricAPI = "0.83.1+1.20.1" } object Quilt { @@ -30,9 +30,9 @@ object Versions { object Mod { const val mixin = "0.11.2+mixin.0.8.5" - const val minecraft = "1.19.4" + const val minecraft = "1.20.1" const val yarn = "$minecraft+build.2" - const val fabricLoader = "0.14.2" + const val fabricLoader = "0.14.21" const val architecuryLoom = "0.12.0.290" const val architecturyPlugin = "3.4-SNAPSHOT" @@ -41,16 +41,16 @@ object Versions { } object Forge { - const val forge = "${Mod.minecraft}-45.0.43" + const val forge = "${Mod.minecraft}-47.0.3" const val burningwave = "12.53.0" } object Bukkit { const val paper = "1.18.2-R0.1-SNAPSHOT" const val paperLib = "1.0.5" - const val minecraft = "1.19.4" + const val minecraft = "1.20.1" const val reflectionRemapper = "0.1.0-SNAPSHOT" - const val paperDevBundle = "1.19.4-R0.1-SNAPSHOT" + const val paperDevBundle = "1.20.1-R0.1-SNAPSHOT" } object Sponge { From 9ba46ae3a542f003ec7296ed33f8d407f633b9ae Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 15 Jun 2023 17:11:14 -0700 Subject: [PATCH 140/161] make new bukkit NMS module --- platforms/bukkit/build.gradle.kts | 1 + .../bukkit/nms/v1_19_R3/build.gradle.kts | 2 +- .../bukkit/nms/v1_20_R1/build.gradle.kts | 17 ++ .../bukkit/nms/v1_19_R3/AwfulBukkitHacks.java | 101 ++++++++++ .../bukkit/nms/v1_19_R3/NMSBiomeInfo.java | 10 + .../bukkit/nms/v1_19_R3/NMSBiomeInjector.java | 83 +++++++++ .../bukkit/nms/v1_19_R3/NMSBiomeProvider.java | 47 +++++ .../v1_19_R3/NMSChunkGeneratorDelegate.java | 173 ++++++++++++++++++ .../bukkit/nms/v1_19_R3/NMSInitializer.java | 15 ++ .../nms/v1_19_R3/NMSInjectListener.java | 48 +++++ .../nms/v1_19_R3/NMSWorldProperties.java | 36 ++++ .../terra/bukkit/nms/v1_19_R3/Reflection.java | 52 ++++++ .../bukkit/nms/v1_19_R3/RegistryFetcher.java | 25 +++ 13 files changed, 609 insertions(+), 1 deletion(-) create mode 100644 platforms/bukkit/nms/v1_20_R1/build.gradle.kts create mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java create mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java create mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java create mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java create mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java create mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java create mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java create mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java create mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java create mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 52bcba095..331941410 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -12,6 +12,7 @@ dependencies { shaded(project(":platforms:bukkit:nms:v1_19_R1", configuration = "reobf")) shaded(project(":platforms:bukkit:nms:v1_19_R2", configuration = "reobf")) shaded(project(":platforms:bukkit:nms:v1_19_R3", configuration = "reobf")) + shaded(project(":platforms:bukkit:nms:v1_20_R1", configuration = "reobf")) shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } diff --git a/platforms/bukkit/nms/v1_19_R3/build.gradle.kts b/platforms/bukkit/nms/v1_19_R3/build.gradle.kts index 96f9038d8..5b92e7ab2 100644 --- a/platforms/bukkit/nms/v1_19_R3/build.gradle.kts +++ b/platforms/bukkit/nms/v1_19_R3/build.gradle.kts @@ -6,7 +6,7 @@ repositories { dependencies { api(project(":platforms:bukkit:common")) - paperDevBundle(Versions.Bukkit.paperDevBundle) + paperDevBundle("1.19.4-R0.1-SNAPSHOT") implementation("xyz.jpenilla", "reflection-remapper", "0.1.0-SNAPSHOT") } diff --git a/platforms/bukkit/nms/v1_20_R1/build.gradle.kts b/platforms/bukkit/nms/v1_20_R1/build.gradle.kts new file mode 100644 index 000000000..96f9038d8 --- /dev/null +++ b/platforms/bukkit/nms/v1_20_R1/build.gradle.kts @@ -0,0 +1,17 @@ +apply(plugin = "io.papermc.paperweight.userdev") + +repositories { + maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") +} + +dependencies { + api(project(":platforms:bukkit:common")) + paperDevBundle(Versions.Bukkit.paperDevBundle) + implementation("xyz.jpenilla", "reflection-remapper", "0.1.0-SNAPSHOT") +} + +tasks { + assemble { + dependsOn("reobfJar") + } +} \ No newline at end of file diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java new file mode 100644 index 000000000..6ce0cc9a5 --- /dev/null +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java @@ -0,0 +1,101 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import com.google.common.collect.ImmutableMap; +import com.mojang.serialization.Lifecycle; +import net.minecraft.core.Holder; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.WritableRegistry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; +import org.bukkit.NamespacedKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; +import com.dfsek.terra.registry.master.ConfigRegistry; + + +public class AwfulBukkitHacks { + private static final Logger LOGGER = LoggerFactory.getLogger(AwfulBukkitHacks.class); + + private static final Map> terraBiomeMap = new HashMap<>(); + + public static void registerBiomes(ConfigRegistry configRegistry) { + try { + LOGGER.info("Hacking biome registry..."); + WritableRegistry biomeRegistry = (WritableRegistry) RegistryFetcher.biomeRegistry(); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, false); + + 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 = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); + Biome platform = NMSBiomeInjector.createBiome(biome, Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey))); + + ResourceKey delegateKey = ResourceKey.create( + Registries.BIOME, + new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key)) + ); + + Reference holder = biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); + Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder. + + platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); + + terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location()); + + LOGGER.debug("Registered biome: " + delegateKey); + } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + throw new RuntimeException(e); + } + })); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) 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())), + HashMap::putAll); + + terraBiomeMap + .forEach((vb, terraBiomes) -> + NMSBiomeInjector.getEntry(biomeRegistry, vb).ifPresentOrElse( + vanilla -> terraBiomes.forEach( + tb -> NMSBiomeInjector.getEntry(biomeRegistry, tb).ifPresentOrElse( + terra -> { + LOGGER.debug("{} (vanilla for {}): {}", + vanilla.unwrapKey().orElseThrow().location(), + terra.unwrapKey().orElseThrow().location(), + vanilla.tags().toList()); + vanilla.tags() + .forEach(tag -> collect + .computeIfAbsent(tag, t -> new ArrayList<>()) + .add(terra)); + }, + () -> LOGGER.error("No such biome: {}", tb))), + () -> LOGGER.error("No vanilla biome: {}", vb))); + + biomeRegistry.resetTags(); + biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); + + } catch(SecurityException | IllegalArgumentException exception) { + throw new RuntimeException(exception); + } + } +} + diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java new file mode 100644 index 000000000..816d96068 --- /dev/null +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; + +import com.dfsek.terra.api.properties.Properties; + + +public record NMSBiomeInfo(ResourceKey biomeKey) implements Properties { +} diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java new file mode 100644 index 000000000..f7bedfd0f --- /dev/null +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java @@ -0,0 +1,83 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import net.minecraft.core.Holder; +import java.util.stream.Stream; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +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 java.util.function.Function; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; + +import static net.minecraft.world.level.biome.Biome.ClimateSettings; +import static net.minecraft.world.level.biome.Biome.Precipitation; + +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_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java new file mode 100644 index 000000000..52711f0ec --- /dev/null +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java @@ -0,0 +1,47 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import com.mojang.serialization.Codec; +import net.minecraft.core.Holder; +import java.util.stream.Stream; +import net.minecraft.core.Registry; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Climate.Sampler; +import org.jetbrains.annotations.NotNull; + +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; + + +public class NMSBiomeProvider extends BiomeSource { + private final BiomeProvider delegate; + private final long seed; + private final Registry biomeRegistry = RegistryFetcher.biomeRegistry(); + + public NMSBiomeProvider(BiomeProvider delegate, long seed) { + super(); + this.delegate = delegate; + this.seed = seed; + } + @Override + protected Stream> collectPossibleBiomes() { + return delegate.stream() + .map(biome -> RegistryFetcher.biomeRegistry() + .getHolderOrThrow(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() + .get(NMSBiomeInfo.class) + .biomeKey())); + } + + @Override + protected @NotNull Codec codec() { + return BiomeSource.CODEC; + } + + @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) + .getPlatformBiome()).getContext() + .get(NMSBiomeInfo.class) + .biomeKey()); + } +} diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java new file mode 100644 index 000000000..78eda7e32 --- /dev/null +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java @@ -0,0 +1,173 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.NoiseColumn; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.BiomeManager; +import net.minecraft.world.level.block.Blocks; +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; +import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; +import com.dfsek.terra.bukkit.config.PreLoadCompatibilityOptions; +import com.dfsek.terra.bukkit.world.BukkitWorldProperties; +import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; + + +public class NMSChunkGeneratorDelegate extends ChunkGenerator { + private static final Logger LOGGER = LoggerFactory.getLogger(NMSChunkGeneratorDelegate.class); + private final com.dfsek.terra.api.world.chunk.generation.ChunkGenerator delegate; + + private final ChunkGenerator vanilla; + private final ConfigPack pack; + + private final long seed; + + public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, long seed) { + super(biomeProvider); + this.delegate = pack.getGeneratorProvider().newInstance(pack); + this.vanilla = vanilla; + this.pack = pack; + this.seed = seed; + } + + @Override + protected @NotNull Codec codec() { + return ChunkGenerator.CODEC; + } + + @Override + public void applyCarvers(@NotNull WorldGenRegion chunkRegion, long seed, @NotNull RandomState noiseConfig, @NotNull BiomeManager world, + @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk, @NotNull Carving carverStep) { + // no-op + } + + @Override + public void buildSurface(@NotNull WorldGenRegion region, @NotNull StructureManager structures, @NotNull RandomState noiseConfig, + @NotNull ChunkAccess chunk) { + // no-op + } + + @Override + public void applyBiomeDecoration(@NotNull WorldGenLevel world, @NotNull ChunkAccess chunk, + @NotNull StructureManager structureAccessor) { + vanilla.applyBiomeDecoration(world, chunk, structureAccessor); + } + + @Override + public void spawnOriginalMobs(@NotNull WorldGenRegion region) { + vanilla.spawnOriginalMobs(region); + } + + @Override + public int getGenDepth() { + return vanilla.getGenDepth(); + } + + @Override + public @NotNull CompletableFuture fillFromNoise(@NotNull Executor executor, @NotNull Blender blender, + @NotNull RandomState noiseConfig, + @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk) { + return vanilla.fillFromNoise(executor, blender, noiseConfig, structureAccessor, chunk) + .thenApply(c -> { + LevelAccessor level = Reflection.STRUCTURE_MANAGER.getLevel(structureAccessor); + BiomeProvider biomeProvider = pack.getBiomeProvider(); + PreLoadCompatibilityOptions compatibilityOptions = pack.getContext().get(PreLoadCompatibilityOptions.class); + if(compatibilityOptions.isBeard()) { + beard(structureAccessor, chunk, new BukkitWorldProperties(level.getMinecraftWorld().getWorld()), biomeProvider, compatibilityOptions); + } + return c; + }); + } + + private void beard(StructureManager structureAccessor, ChunkAccess chunk, WorldProperties world, BiomeProvider biomeProvider, + PreLoadCompatibilityOptions compatibilityOptions) { + Beardifier structureWeightSampler = Beardifier.forStructuresInChunk(structureAccessor, chunk.getPos()); + double threshold = compatibilityOptions.getBeardThreshold(); + double airThreshold = compatibilityOptions.getAirThreshold(); + int xi = chunk.getPos().x << 4; + int zi = chunk.getPos().z << 4; + for(int x = 0; x < 16; x++) { + for(int z = 0; z < 16; z++) { + int depth = 0; + for(int y = world.getMaxHeight(); y >= world.getMinHeight(); y--) { + double noise = structureWeightSampler.compute(new SinglePointContext(x + xi, y, z + zi)); + if(noise > threshold) { + chunk.setBlockState(new BlockPos(x, y, z), ((CraftBlockData) ((BukkitBlockState) delegate + .getPalette(x + xi, y, z + zi, world, biomeProvider) + .get(depth, x + xi, y, z + zi, world.getSeed())).getHandle()).getState(), false); + depth++; + } else if(noise < airThreshold) { + chunk.setBlockState(new BlockPos(x, y, z), Blocks.AIR.defaultBlockState(), false); + } else { + depth = 0; + } + } + } + } + } + + @Override + public int getSeaLevel() { + return vanilla.getSeaLevel(); + } + + @Override + public int getMinY() { + return vanilla.getMinY(); + } + + @Override + public int getBaseHeight(int x, int z, @NotNull Types heightmap, @NotNull LevelHeightAccessor world, @NotNull RandomState noiseConfig) { + WorldProperties properties = new NMSWorldProperties(seed, world); + int y = properties.getMaxHeight(); + BiomeProvider biomeProvider = pack.getBiomeProvider(); + while(y >= getMinY() && !heightmap.isOpaque().test( + ((CraftBlockData) delegate.getBlock(properties, x, y - 1, z, biomeProvider).getHandle()).getState())) { + y--; + } + return y; + } + + @Override + public @NotNull NoiseColumn getBaseColumn(int x, int z, @NotNull LevelHeightAccessor world, @NotNull RandomState noiseConfig) { + /* + BlockState[] array = new BlockState[world.getHeight()]; + WorldProperties properties = new NMSWorldProperties(seed, world); + BiomeProvider biomeProvider = pack.getBiomeProvider().caching(properties); + for(int y = properties.getMaxHeight() - 1; y >= properties.getMinHeight(); y--) { + array[y - properties.getMinHeight()] = ((CraftBlockData) delegate.getBlock(properties, x, y, z, biomeProvider) + .getHandle()).getState(); + } + return new NoiseColumn(getMinY(), array); + + */ + return vanilla.getBaseColumn(x, z, world, noiseConfig); + } + + @Override + public void addDebugScreenInfo(@NotNull List text, @NotNull RandomState noiseConfig, @NotNull BlockPos pos) { + + } +} diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java new file mode 100644 index 000000000..99797e8ab --- /dev/null +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import org.bukkit.Bukkit; + +import com.dfsek.terra.bukkit.PlatformImpl; +import com.dfsek.terra.bukkit.nms.Initializer; + + +public class NMSInitializer implements Initializer { + @Override + public void initialize(PlatformImpl platform) { + AwfulBukkitHacks.registerBiomes(platform.getRawConfigRegistry()); + Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin()); + } +} diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java new file mode 100644 index 000000000..46b479860 --- /dev/null +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.world.WorldInitEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.locks.ReentrantLock; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; + + +public class NMSInjectListener implements Listener { + private static final Logger LOGGER = LoggerFactory.getLogger(NMSInjectListener.class); + private static final Set INJECTED = new HashSet<>(); + private static final ReentrantLock INJECT_LOCK = new ReentrantLock(); + + @EventHandler + public void onWorldInit(WorldInitEvent event) { + if(!INJECTED.contains(event.getWorld()) && + event.getWorld().getGenerator() instanceof BukkitChunkGeneratorWrapper bukkitChunkGeneratorWrapper) { + INJECT_LOCK.lock(); + INJECTED.add(event.getWorld()); + LOGGER.info("Preparing to take over the world: {}", event.getWorld().getName()); + CraftWorld craftWorld = (CraftWorld) event.getWorld(); + ServerLevel serverWorld = craftWorld.getHandle(); + + ConfigPack pack = bukkitChunkGeneratorWrapper.getPack(); + + ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator(); + NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed()); + + serverWorld.getChunkSource().chunkMap.generator = new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()); + + LOGGER.info("Successfully injected into world."); + + INJECT_LOCK.unlock(); + } + } +} diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java new file mode 100644 index 000000000..0c88eec33 --- /dev/null +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import net.minecraft.world.level.LevelHeightAccessor; + +import com.dfsek.terra.api.world.info.WorldProperties; + + +public class NMSWorldProperties implements WorldProperties { + private final long seed; + private final LevelHeightAccessor height; + + public NMSWorldProperties(long seed, LevelHeightAccessor height) { + this.seed = seed; + this.height = height; + } + + @Override + public Object getHandle() { + return height; + } + + @Override + public long getSeed() { + return seed; + } + + @Override + public int getMaxHeight() { + return height.getMaxBuildHeight(); + } + + @Override + public int getMinHeight() { + return height.getMinBuildHeight(); + } +} diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java new file mode 100644 index 000000000..a10837e11 --- /dev/null +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import net.minecraft.core.Holder; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.MappedRegistry; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.StructureManager; +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 java.util.Objects; + + +public class Reflection { + public static final MappedRegistryProxy MAPPED_REGISTRY; + public static final StructureManagerProxy STRUCTURE_MANAGER; + + public static final ReferenceProxy REFERENCE; + + 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); + } + + + @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); + } +} diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java new file mode 100644 index 000000000..4c5c704b1 --- /dev/null +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +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.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.structure.StructureSet; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_19_R3.CraftServer; + + +public class RegistryFetcher { + private static Registry getRegistry(ResourceKey> key) { + CraftServer craftserver = (CraftServer) Bukkit.getServer(); + DedicatedServer dedicatedserver = craftserver.getServer(); + return dedicatedserver + .registryAccess() + .registryOrThrow(key); + } + + public static Registry biomeRegistry() { + return getRegistry(Registries.BIOME); + } +} From a548c30484436a7385bf6cf77b17212d1166cc4f Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 15 Jun 2023 17:11:53 -0700 Subject: [PATCH 141/161] clean up unused bstats relocation --- platforms/bukkit/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 331941410..dbc2d4125 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -18,7 +18,6 @@ dependencies { tasks { shadowJar { - relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") relocate("com.google.common", "com.dfsek.terra.lib.google.common") relocate("org.apache.logging.slf4j", "com.dfsek.terra.lib.slf4j-over-log4j") From aad58f5968ab4b5b459a08973c08a27d9e8d4ecc Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 15 Jun 2023 17:14:45 -0700 Subject: [PATCH 142/161] update nms imports --- .../terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java | 2 +- .../com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java | 2 +- .../com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java index 78eda7e32..86c108eb8 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java @@ -18,7 +18,7 @@ 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; -import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R1.block.data.CraftBlockData; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java index 46b479860..983d117ea 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java @@ -3,7 +3,7 @@ package com.dfsek.terra.bukkit.nms.v1_19_R3; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldInitEvent; diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java index 4c5c704b1..b7d45ed1d 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java @@ -5,9 +5,8 @@ import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.levelgen.structure.StructureSet; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_19_R3.CraftServer; +import org.bukkit.craftbukkit.v1_20_R1.CraftServer; public class RegistryFetcher { From b75a8f85e4b8dfec2ee7ddd9878158c64ac11798 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 15 Jun 2023 17:16:20 -0700 Subject: [PATCH 143/161] restore NMSChunkGeneratorDelegate#getBaseColumn --- .../bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java | 7 ++----- .../bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java index 78eda7e32..e977a2855 100644 --- a/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java @@ -10,6 +10,7 @@ import net.minecraft.world.level.StructureManager; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Beardifier; @@ -152,18 +153,14 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { @Override public @NotNull NoiseColumn getBaseColumn(int x, int z, @NotNull LevelHeightAccessor world, @NotNull RandomState noiseConfig) { - /* BlockState[] array = new BlockState[world.getHeight()]; WorldProperties properties = new NMSWorldProperties(seed, world); - BiomeProvider biomeProvider = pack.getBiomeProvider().caching(properties); + BiomeProvider biomeProvider = pack.getBiomeProvider(); for(int y = properties.getMaxHeight() - 1; y >= properties.getMinHeight(); y--) { array[y - properties.getMinHeight()] = ((CraftBlockData) delegate.getBlock(properties, x, y, z, biomeProvider) .getHandle()).getState(); } return new NoiseColumn(getMinY(), array); - - */ - return vanilla.getBaseColumn(x, z, world, noiseConfig); } @Override diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java index 86c108eb8..985eb4982 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java @@ -10,6 +10,7 @@ import net.minecraft.world.level.StructureManager; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Beardifier; @@ -152,18 +153,14 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { @Override public @NotNull NoiseColumn getBaseColumn(int x, int z, @NotNull LevelHeightAccessor world, @NotNull RandomState noiseConfig) { - /* BlockState[] array = new BlockState[world.getHeight()]; WorldProperties properties = new NMSWorldProperties(seed, world); - BiomeProvider biomeProvider = pack.getBiomeProvider().caching(properties); + BiomeProvider biomeProvider = pack.getBiomeProvider(); for(int y = properties.getMaxHeight() - 1; y >= properties.getMinHeight(); y--) { array[y - properties.getMinHeight()] = ((CraftBlockData) delegate.getBlock(properties, x, y, z, biomeProvider) .getHandle()).getState(); } return new NoiseColumn(getMinY(), array); - - */ - return vanilla.getBaseColumn(x, z, world, noiseConfig); } @Override From 9d38ee4329834321eaedb01f279e74a39a5f046e Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 15 Jun 2023 17:18:36 -0700 Subject: [PATCH 144/161] repackage NMS 1.20.1 --- .../bukkit/nms/{v1_19_R3 => v1_20_R1}/AwfulBukkitHacks.java | 2 +- .../terra/bukkit/nms/{v1_19_R3 => v1_20_R1}/NMSBiomeInfo.java | 2 +- .../bukkit/nms/{v1_19_R3 => v1_20_R1}/NMSBiomeInjector.java | 2 +- .../bukkit/nms/{v1_19_R3 => v1_20_R1}/NMSBiomeProvider.java | 2 +- .../nms/{v1_19_R3 => v1_20_R1}/NMSChunkGeneratorDelegate.java | 2 +- .../bukkit/nms/{v1_19_R3 => v1_20_R1}/NMSInitializer.java | 2 +- .../bukkit/nms/{v1_19_R3 => v1_20_R1}/NMSInjectListener.java | 2 +- .../bukkit/nms/{v1_19_R3 => v1_20_R1}/NMSWorldProperties.java | 2 +- .../terra/bukkit/nms/{v1_19_R3 => v1_20_R1}/Reflection.java | 4 +--- .../bukkit/nms/{v1_19_R3 => v1_20_R1}/RegistryFetcher.java | 2 +- 10 files changed, 10 insertions(+), 12 deletions(-) rename platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/{v1_19_R3 => v1_20_R1}/AwfulBukkitHacks.java (99%) rename platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/{v1_19_R3 => v1_20_R1}/NMSBiomeInfo.java (83%) rename platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/{v1_19_R3 => v1_20_R1}/NMSBiomeInjector.java (98%) rename platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/{v1_19_R3 => v1_20_R1}/NMSBiomeProvider.java (97%) rename platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/{v1_19_R3 => v1_20_R1}/NMSChunkGeneratorDelegate.java (99%) rename platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/{v1_19_R3 => v1_20_R1}/NMSInitializer.java (90%) rename platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/{v1_19_R3 => v1_20_R1}/NMSInjectListener.java (97%) rename platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/{v1_19_R3 => v1_20_R1}/NMSWorldProperties.java (94%) rename platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/{v1_19_R3 => v1_20_R1}/Reflection.java (96%) rename platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/{v1_19_R3 => v1_20_R1}/RegistryFetcher.java (94%) diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/AwfulBukkitHacks.java similarity index 99% rename from platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java rename to platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/AwfulBukkitHacks.java index 6ce0cc9a5..c30882958 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/AwfulBukkitHacks.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R1; import com.google.common.collect.ImmutableMap; import com.mojang.serialization.Lifecycle; diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeInfo.java similarity index 83% rename from platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java rename to platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeInfo.java index 816d96068..7d8203ce3 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeInfo.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R1; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeInjector.java similarity index 98% rename from platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java rename to platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeInjector.java index f7bedfd0f..d0c32c7d5 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeInjector.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R1; import net.minecraft.core.Holder; import java.util.stream.Stream; diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeProvider.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java rename to platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeProvider.java index 52711f0ec..2f29ac3ef 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeProvider.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R1; import com.mojang.serialization.Codec; import net.minecraft.core.Holder; diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSChunkGeneratorDelegate.java similarity index 99% rename from platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java rename to platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSChunkGeneratorDelegate.java index 985eb4982..f0e929a5b 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSChunkGeneratorDelegate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R1; import com.mojang.serialization.Codec; import net.minecraft.core.BlockPos; diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSInitializer.java similarity index 90% rename from platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java rename to platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSInitializer.java index 99797e8ab..6fb689ee7 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSInitializer.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R1; import org.bukkit.Bukkit; diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSInjectListener.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java rename to platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSInjectListener.java index 983d117ea..3b2fbb0f8 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSInjectListener.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R1; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkGenerator; diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSWorldProperties.java similarity index 94% rename from platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java rename to platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSWorldProperties.java index 0c88eec33..9754c7627 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSWorldProperties.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R1; import net.minecraft.world.level.LevelHeightAccessor; diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/Reflection.java similarity index 96% rename from platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java rename to platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/Reflection.java index a10837e11..6197e6e01 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/Reflection.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R1; import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; @@ -12,8 +12,6 @@ import xyz.jpenilla.reflectionremapper.proxy.annotation.FieldSetter; import xyz.jpenilla.reflectionremapper.proxy.annotation.MethodName; import xyz.jpenilla.reflectionremapper.proxy.annotation.Proxies; -import java.util.Objects; - public class Reflection { public static final MappedRegistryProxy MAPPED_REGISTRY; diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/RegistryFetcher.java similarity index 94% rename from platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java rename to platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/RegistryFetcher.java index b7d45ed1d..9c7de5d8a 100644 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java +++ b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/RegistryFetcher.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R1; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; From 18644d61003e72ae3dba823bef6f188fd47e1a18 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 15 Jun 2023 17:22:21 -0700 Subject: [PATCH 145/161] update fabric dependencies --- platforms/fabric/src/main/resources/fabric.mod.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json index e71bcfeac..cbb32e4cc 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -28,6 +28,6 @@ "depends": { "fabricloader": ">=0.14.2", "java": ">=17", - "minecraft": "1.19.x" + "minecraft": "1.20.x" } } \ No newline at end of file From 36f89946d4047cd157bec3c1785a4a0187ba38c6 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 15 Jun 2023 17:26:04 -0700 Subject: [PATCH 146/161] update SignBlockEntityMixin --- .../terra/block/entity/SignBlockEntityMixin.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/SignBlockEntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/SignBlockEntityMixin.java index e32d7e053..fe8d2cbab 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/SignBlockEntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/SignBlockEntityMixin.java @@ -18,6 +18,7 @@ package com.dfsek.terra.mod.mixin.implementations.terra.block.entity; import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.block.entity.SignText; import net.minecraft.text.Text; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Final; @@ -34,17 +35,17 @@ import com.dfsek.terra.api.block.entity.Sign; @Implements(@Interface(iface = Sign.class, prefix = "terra$")) public abstract class SignBlockEntityMixin { @Shadow - @Final - private Text[] texts; + private SignText frontText; @Shadow - public abstract void setTextOnRow(int row, Text text); + public abstract boolean setText(SignText text, boolean front); public void terra$setLine(int index, @NotNull String line) throws IndexOutOfBoundsException { - setTextOnRow(index, Text.literal(line)); + setText(frontText.withMessage(index, Text.literal(line)), true); } public @NotNull String[] terra$getLines() { + Text[] texts = frontText.getMessages(false); String[] lines = new String[texts.length]; for(int i = 0; i < texts.length; i++) { lines[i] = texts[i].getString(); @@ -53,7 +54,7 @@ public abstract class SignBlockEntityMixin { } public @NotNull String terra$getLine(int index) throws IndexOutOfBoundsException { - return texts[index].getString(); + return frontText.getMessage(index, false).getString(); } public void terra$applyState(String state) { From 549edd11ea95607f47eb034829ce8dc9cddf2eba Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 15 Jun 2023 17:27:26 -0700 Subject: [PATCH 147/161] update ServerCommandSourceMixin --- .../terra/entity/ServerCommandSourceMixin.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/ServerCommandSourceMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/ServerCommandSourceMixin.java index f11ee5f73..0dd882638 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/ServerCommandSourceMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/ServerCommandSourceMixin.java @@ -37,9 +37,6 @@ import com.dfsek.terra.api.entity.Player; @Mixin(ServerCommandSource.class) @Implements(@Interface(iface = CommandSender.class, prefix = "terra$")) public abstract class ServerCommandSourceMixin { - @Shadow - public abstract void sendFeedback(Text message, boolean broadcastToOps); - @Shadow public abstract ServerPlayerEntity getPlayer() throws CommandSyntaxException; @@ -47,8 +44,11 @@ public abstract class ServerCommandSourceMixin { @Nullable public abstract net.minecraft.entity.@Nullable Entity getEntity(); + @Shadow + public abstract void sendMessage(Text message); + public void terra$sendMessage(String message) { - sendFeedback(Text.literal(message), true); + sendMessage(Text.literal(message)); } @Nullable From 3f3e2fe97c8f82b165b3e9bfb171da3dd8532206 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 20 Jun 2023 09:57:43 +1000 Subject: [PATCH 148/161] Reduce pipeline v2 caching --- .../terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java | 2 +- .../addons/biome/pipeline/v2/config/BiomePipelineTemplate.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java index 6c5b6f289..1a34d06e0 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-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/PipelineBiomeProvider.java @@ -37,7 +37,7 @@ public class PipelineBiomeProvider implements BiomeProvider { this.noiseAmp = noiseAmp; this.chunkSize = pipeline.getChunkSize(); this.biomeChunkCache = Caffeine.newBuilder() - .maximumSize(1024) + .maximumSize(64) .build(pipeline::generateChunk); Set biomeSet = new HashSet<>(); 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 index 52ee4292d..776d5cd04 100644 --- 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 @@ -54,6 +54,6 @@ public class BiomePipelineTemplate implements ObjectTemplate { @Override public BiomeProvider get() { - return new PipelineBiomeProvider(new PipelineImpl(source, stages, resolution, 500), resolution, blendSampler, blendAmplitude); + return new PipelineBiomeProvider(new PipelineImpl(source, stages, resolution, 128), resolution, blendSampler, blendAmplitude); } } From 73baaec6cd06e29f7fe56abc2a130c2a3bef5d1a Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 11 Jul 2023 09:33:57 +1000 Subject: [PATCH 149/161] Bump version to 6.3.1 --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index b91c23fa7..e4a533f8c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.3.0")) -versionProjects(":common:implementation", version("6.3.0")) -versionProjects(":platforms", version("6.3.0")) +versionProjects(":common:api", version("6.3.1")) +versionProjects(":common:implementation", version("6.3.1")) +versionProjects(":platforms", version("6.3.1")) allprojects { From 9d83dfd1648ee439ea79791def9addc358a6ad96 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 16 Jul 2023 11:49:14 +1000 Subject: [PATCH 150/161] Bump version to 6.3.2 --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index e4a533f8c..db6c27c15 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.3.1")) -versionProjects(":common:implementation", version("6.3.1")) -versionProjects(":platforms", version("6.3.1")) +versionProjects(":common:api", version("6.3.2")) +versionProjects(":common:implementation", version("6.3.2")) +versionProjects(":platforms", version("6.3.2")) allprojects { From fcbf51d80bd633ee24c24edc9ca3650fd1997945 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 16 Jul 2023 11:51:51 +1000 Subject: [PATCH 151/161] Allow Range keys to be meta annotated --- .../dfsek/terra/config/GenericLoaders.java | 2 ++ .../terra/config/loaders/RangeLoader.java | 27 +++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) 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 f4f5c6cfd..67874694f 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 @@ -35,6 +35,7 @@ import com.dfsek.terra.config.loaders.LinkedHashMapLoader; import com.dfsek.terra.config.loaders.MaterialSetLoader; import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; import com.dfsek.terra.config.loaders.RangeLoader; +import com.dfsek.terra.config.loaders.RangeLoader.RangeMap; import com.dfsek.terra.config.loaders.VersionLoader; import com.dfsek.terra.config.loaders.VersionRangeLoader; @@ -50,6 +51,7 @@ public class GenericLoaders implements LoaderRegistrar { public void register(TypeRegistry registry) { registry.registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) .registerLoader(Range.class, new RangeLoader()) + .registerLoader(RangeMap.class, RangeLoader.RangeMapTemplate::new) // Needed to use ObjectTemplates in TypeLoaders .registerLoader(Version.class, new VersionLoader()) .registerLoader(MaterialSet.class, new MaterialSetLoader()) .registerLoader(VersionRange.class, new VersionRangeLoader()) 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 b4e55f935..c4463bfbb 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 @@ -17,14 +17,20 @@ package com.dfsek.terra.config.loaders; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; 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.config.meta.Meta; + import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; import java.util.Map; +import java.util.function.Supplier; import com.dfsek.terra.api.util.ConstantRange; import com.dfsek.terra.api.util.Range; @@ -36,11 +42,28 @@ public class RangeLoader implements TypeLoader { public Range load(@NotNull AnnotatedType type, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException { if(o instanceof Map) { - Map map = (Map) o; - return new ConstantRange(map.get("min"), map.get("max")); + return configLoader.loadType(RangeMap.class, o, depthTracker).get(); } else { int h = configLoader.loadType(Integer.class, o, depthTracker); return new ConstantRange(h, h + 1); } } + + public interface RangeMap extends Supplier {} + + /* + * Template needed so keys can be meta annotated, otherwise the loader could just grab keys directly from the object + */ + public static class RangeMapTemplate implements ObjectTemplate { + @Value("min") + private @Meta int min; + + @Value("max") + private @Meta int max; + + @Override + public RangeMap get() { + return () -> new ConstantRange(min, max); + } + } } From 379fa601a3d2e64b1bb8866c5789fd342a9d9bbf Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 16 Jul 2023 17:04:51 +1000 Subject: [PATCH 152/161] Meta annotate LINEAR_HEIGHTMAP sampler --- .../config/templates/LinearHeightmapSamplerTemplate.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 3185ea9c3..d4339968e 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 @@ -4,6 +4,7 @@ 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; @@ -11,14 +12,14 @@ import com.dfsek.terra.api.noise.NoiseSampler; public class LinearHeightmapSamplerTemplate extends SamplerTemplate { @Value("sampler") @Default - private NoiseSampler sampler = NoiseSampler.zero(); + private @Meta NoiseSampler sampler = NoiseSampler.zero(); @Value("base") - private double base; + private @Meta double base; @Value("scale") @Default - private double scale = 1; + private @Meta double scale = 1; @Override public NoiseSampler get() { From 34c0895c1f4588711241fbdff467ef93a8899c33 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 16 Jul 2023 22:46:23 +1000 Subject: [PATCH 153/161] Make metalist injection error more user friendly --- .../terra/config/preprocessor/MetaListLikePreprocessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaListLikePreprocessor.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaListLikePreprocessor.java index 38f754cf7..59e335ab4 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaListLikePreprocessor.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaListLikePreprocessor.java @@ -68,7 +68,7 @@ public class MetaListLikePreprocessor extends MetaPreprocessor { if(!(metaValue instanceof List)) { throw new LoadException( - "MetaList/Set injection candidate must be list, is type " + metaValue.getClass().getCanonicalName(), + "Meta list / set injection (via <<) must point to a list. '" + meta + "' points to type " + metaValue.getClass().getCanonicalName(), depthTracker); } From 1a784b51ace5f66b6a1b8641c1c3a047c931afb4 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 18 Jul 2023 14:25:07 +1000 Subject: [PATCH 154/161] Implement expression normalizer sampler --- .../dfsek/terra/addons/noise/NoiseAddon.java | 3 +- .../noise/ExpressionFunctionTemplate.java | 45 +++---------- .../ExpressionNormalizerTemplate.java | 63 +++++++++++++++++++ .../normalizer/ExpressionNormalizer.java | 33 ++++++++++ .../addons/noise/paralithic/FunctionUtil.java | 31 +++++++++ 5 files changed, 138 insertions(+), 37 deletions(-) create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ExpressionNormalizerTemplate.java create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ExpressionNormalizer.java create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java 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 86743f2cc..1c226711a 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 @@ -30,6 +30,7 @@ import com.dfsek.terra.addons.noise.config.templates.noise.fractal.BrownianMotio import com.dfsek.terra.addons.noise.config.templates.noise.fractal.PingPongTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.fractal.RidgedFractalTemplate; import com.dfsek.terra.addons.noise.config.templates.normalizer.ClampNormalizerTemplate; +import com.dfsek.terra.addons.noise.config.templates.normalizer.ExpressionNormalizerTemplate; 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; @@ -134,7 +135,7 @@ public class NoiseAddon implements AddonInitializer { Map packSamplers = new LinkedHashMap<>(); Map packFunctions = new LinkedHashMap<>(); noiseRegistry.register(addon.key("EXPRESSION"), () -> new ExpressionFunctionTemplate(packSamplers, packFunctions)); - + noiseRegistry.register(addon.key("EXPRESSION_NORMALIZER"), () -> new ExpressionNormalizerTemplate(packSamplers, packFunctions)); 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/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 a15cc8e61..e401aa0cf 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java @@ -8,7 +8,6 @@ package com.dfsek.terra.addons.noise.config.templates.noise; import com.dfsek.paralithic.eval.tokenizer.ParseException; -import com.dfsek.paralithic.functions.Function; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; @@ -19,17 +18,16 @@ import java.util.Map; import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; -import com.dfsek.terra.addons.noise.paralithic.defined.UserDefinedFunction; -import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction2; -import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction3; import com.dfsek.terra.addons.noise.samplers.noise.ExpressionFunction; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; +import static com.dfsek.terra.addons.noise.paralithic.FunctionUtil.convertFunctionsAndSamplers; + @SuppressWarnings({ "FieldMayBeFinal", "unused" }) public class ExpressionFunctionTemplate extends SamplerTemplate { - private final Map otherFunctions; + private final Map globalSamplers; private final Map globalFunctions; @Value("variables") @Default @@ -43,44 +41,19 @@ public class ExpressionFunctionTemplate extends SamplerTemplate functions = new LinkedHashMap<>(); - public ExpressionFunctionTemplate(Map otherFunctions, Map samplers) { - this.otherFunctions = otherFunctions; - this.globalFunctions = samplers; + public ExpressionFunctionTemplate(Map globalSamplers, Map globalFunctions) { + this.globalSamplers = globalSamplers; + this.globalFunctions = globalFunctions; } @Override public NoiseSampler get() { + var mergedFunctions = new HashMap<>(globalFunctions); mergedFunctions.putAll(functions); + var mergedSamplers = new HashMap<>(globalSamplers); mergedSamplers.putAll(samplers); try { - Map noiseFunctionMap = generateFunctions(); - return new ExpressionFunction(noiseFunctionMap, expression, vars); + return new ExpressionFunction(convertFunctionsAndSamplers(mergedFunctions, mergedSamplers), expression, vars); } catch(ParseException e) { throw new RuntimeException("Failed to parse expression.", e); } } - - private Map generateFunctions() throws ParseException { - Map noiseFunctionMap = new HashMap<>(); - - for(Map.Entry entry : globalFunctions.entrySet()) { - noiseFunctionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue())); - } - - for(Map.Entry entry : functions.entrySet()) { - noiseFunctionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue())); - } - - otherFunctions.forEach((id, function) -> { - if(function.getDimensions() == 2) { - noiseFunctionMap.put(id, new NoiseFunction2(function.getSampler())); - } else noiseFunctionMap.put(id, new NoiseFunction3(function.getSampler())); - }); - - samplers.forEach((id, function) -> { - if(function.getDimensions() == 2) { - noiseFunctionMap.put(id, new NoiseFunction2(function.getSampler())); - } else noiseFunctionMap.put(id, new NoiseFunction3(function.getSampler())); - }); - - return noiseFunctionMap; - } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ExpressionNormalizerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ExpressionNormalizerTemplate.java new file mode 100644 index 000000000..97318d388 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ExpressionNormalizerTemplate.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra 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.normalizer; + +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; + +import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; +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 java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +import static com.dfsek.terra.addons.noise.paralithic.FunctionUtil.convertFunctionsAndSamplers; + + +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) +public class ExpressionNormalizerTemplate extends NormalizerTemplate { + + private final Map globalSamplers; + private final Map globalFunctions; + + @Value("expression") + private @Meta String expression; + + @Value("variables") + @Default + private @Meta Map vars = new HashMap<>(); + + @Value("samplers") + @Default + private @Meta LinkedHashMap samplers = new LinkedHashMap<>(); + + @Value("functions") + @Default + private @Meta LinkedHashMap functions = new LinkedHashMap<>(); + + public ExpressionNormalizerTemplate(Map globalSamplers, Map globalFunctions) { + this.globalSamplers = globalSamplers; + this.globalFunctions = globalFunctions; + } + + @Override + public NoiseSampler 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); + } 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/normalizer/ExpressionNormalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ExpressionNormalizer.java new file mode 100644 index 000000000..95c607f76 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ExpressionNormalizer.java @@ -0,0 +1,33 @@ +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 com.dfsek.terra.api.noise.NoiseSampler; + +import java.util.Map; + + +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/paralithic/FunctionUtil.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java new file mode 100644 index 000000000..f968f5bad --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.addons.noise.paralithic; + +import com.dfsek.paralithic.eval.tokenizer.ParseException; +import com.dfsek.paralithic.functions.Function; + +import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; +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 java.util.HashMap; +import java.util.Map; + + +public class FunctionUtil { + private FunctionUtil() {} + + public static Map convertFunctionsAndSamplers(Map functions, + Map samplers) throws ParseException { + Map functionMap = new HashMap<>(); + for(Map.Entry entry : functions.entrySet()) { + functionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue())); + } + samplers.forEach((id, sampler) -> functionMap.put(id, + sampler.getDimensions() == 2 ? + new NoiseFunction2(sampler.getSampler()) : + new NoiseFunction3(sampler.getSampler()))); + return functionMap; + } +} From 00aeb984197a576c3b0598de0c96f2c943ea4780 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 18 Jul 2023 14:27:36 +1000 Subject: [PATCH 155/161] Implement translation sampler --- .../dfsek/terra/addons/noise/NoiseAddon.java | 4 +++ .../templates/TranslateSamplerTemplate.java | 32 +++++++++++++++++++ .../noise/samplers/TranslateSampler.java | 27 ++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/TranslateSamplerTemplate.java create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/TranslateSampler.java 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 1c226711a..2417921e7 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 @@ -21,6 +21,7 @@ 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; import com.dfsek.terra.addons.noise.config.templates.noise.CellularNoiseTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.ConstantNoiseTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.ExpressionFunctionTemplate; @@ -117,12 +118,15 @@ public class NoiseAddon implements AddonInitializer { noiseRegistry.register(addon.key("WHITE_NOISE"), () -> new SimpleNoiseTemplate(WhiteNoiseSampler::new)); noiseRegistry.register(addon.key("POSITIVE_WHITE_NOISE"), () -> new SimpleNoiseTemplate(PositiveWhiteNoiseSampler::new)); noiseRegistry.register(addon.key("GAUSSIAN"), () -> new SimpleNoiseTemplate(GaussianNoiseSampler::new)); + + noiseRegistry.register(addon.key("DISTANCE"), DistanceSamplerTemplate::new); noiseRegistry.register(addon.key("CONSTANT"), ConstantNoiseTemplate::new); noiseRegistry.register(addon.key("KERNEL"), KernelTemplate::new); noiseRegistry.register(addon.key("LINEAR_HEIGHTMAP"), LinearHeightmapSamplerTemplate::new); + noiseRegistry.register(addon.key("TRANSLATE"), TranslateSamplerTemplate::new); noiseRegistry.register(addon.key("ADD"), () -> new BinaryArithmeticTemplate<>(AdditionSampler::new)); noiseRegistry.register(addon.key("SUB"), () -> new BinaryArithmeticTemplate<>(SubtractionSampler::new)); 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 new file mode 100644 index 000000000..c08a8253f --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/TranslateSamplerTemplate.java @@ -0,0 +1,32 @@ +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.terra.addons.noise.samplers.TranslateSampler; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.noise.NoiseSampler; + + +public class TranslateSamplerTemplate extends SamplerTemplate { + + @Value("sampler") + private NoiseSampler sampler; + + @Value("x") + @Default + private @Meta double x = 0; + + @Value("y") + @Default + private @Meta double y = 0; + + @Value("z") + @Default + private @Meta double z = 0; + + @Override + public NoiseSampler get() { + return new TranslateSampler(sampler, x, y ,z); + } +} 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 new file mode 100644 index 000000000..b634da5dc --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/TranslateSampler.java @@ -0,0 +1,27 @@ +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); + } +} From 02198e1b881f25704c4763d9009b760037dd2f44 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 18 Jul 2023 14:29:28 +1000 Subject: [PATCH 156/161] Implement distance sampler --- .../dfsek/terra/addons/noise/NoiseAddon.java | 4 ++ .../noise/DistanceSamplerTemplate.java | 42 ++++++++++++ .../noise/samplers/noise/DistanceSampler.java | 66 +++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DistanceSamplerTemplate.java create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DistanceSampler.java 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 2417921e7..b002f29a4 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 @@ -24,6 +24,7 @@ import com.dfsek.terra.addons.noise.config.templates.LinearHeightmapSamplerTempl import com.dfsek.terra.addons.noise.config.templates.TranslateSamplerTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.CellularNoiseTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.ConstantNoiseTemplate; +import com.dfsek.terra.addons.noise.config.templates.noise.DistanceSamplerTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.ExpressionFunctionTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.GaborNoiseTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.SimpleNoiseTemplate; @@ -44,6 +45,7 @@ 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; @@ -85,6 +87,8 @@ public class NoiseAddon implements AddonInitializer { (type, o, loader, depthTracker) -> CellularSampler.DistanceFunction.valueOf((String) o)) .applyLoader(CellularSampler.ReturnType.class, (type, o, loader, depthTracker) -> CellularSampler.ReturnType.valueOf((String) o)) + .applyLoader(DistanceSampler.DistanceFunction.class, + (type, o, loader, depthTracker) -> DistanceSampler.DistanceFunction.valueOf((String) o)) .applyLoader(DimensionApplicableNoiseSampler.class, DimensionApplicableNoiseSampler::new) .applyLoader(FunctionTemplate.class, FunctionTemplate::new); 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 new file mode 100644 index 000000000..1bd6fb2dc --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DistanceSamplerTemplate.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.addons.noise.config.templates.noise; + +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; +import com.dfsek.terra.addons.noise.samplers.noise.DistanceSampler; +import com.dfsek.terra.addons.noise.samplers.noise.DistanceSampler.DistanceFunction; +import com.dfsek.terra.api.config.meta.Meta; + + +public class DistanceSamplerTemplate extends SamplerTemplate { + + @Value("distance-function") + @Default + private DistanceSampler.@Meta DistanceFunction distanceFunction = DistanceFunction.Euclidean; + + @Value("point.x") + @Default + private @Meta double x = 0; + + @Value("point.y") + @Default + private @Meta double y = 0; + + @Value("point.z") + @Default + private @Meta double z = 0; + + @Value("normalize") + @Default + private @Meta boolean normalize = false; + + @Value("radius") + @Default + private @Meta double normalizeRadius = 100; + + @Override + public DistanceSampler get() { + return new DistanceSampler(distanceFunction, x, y, z, normalize, normalizeRadius); + } +} 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 new file mode 100644 index 000000000..1e083fb86 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DistanceSampler.java @@ -0,0 +1,66 @@ +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 + } + + @Override + public double getNoiseRaw(long seed, double x, double y) { + double dx = x - ox; + double dy = y - oz; + if (normalize && (fastAbs(dx) > radius || fastAbs(dy) > radius)) return 1; + double dist = distance2d(distanceFunction, dx, dy); + if (normalize) return fastMin(((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 && (fastAbs(dx) > radius || fastAbs(dy) > radius || fastAbs(dz) > radius)) return 1; + double dist = distance3d(distanceFunction, dx, dy, dz); + if (normalize) return fastMin(((2*dist)/distanceAtRadius)-1, 1); + return dist; + } + + private static double distance2d(DistanceFunction distanceFunction, double x, double z) { + return switch(distanceFunction) { + case Euclidean -> fastSqrt(x*x + z*z); + case EuclideanSq -> x*x + z*z; + case Manhattan -> fastAbs(x) + fastAbs(z); + }; + } + + private static double distance3d(DistanceFunction distanceFunction, double x, double y, double z) { + return switch(distanceFunction) { + case Euclidean -> fastSqrt(x*x + y*y + z*z); + case EuclideanSq -> x*x + y*y + z*z; + case Manhattan -> fastAbs(x) + fastAbs(y) + fastAbs(z); + }; + } + + public enum DistanceFunction { + Euclidean, + EuclideanSq, + Manhattan + } +} From 0e3a7560114bd3b481c5e67e2f8c3060578ac0b4 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 18 Jul 2023 14:29:54 +1000 Subject: [PATCH 157/161] Bump config-noise-function to v1.1.0 --- common/addons/config-noise-function/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/addons/config-noise-function/build.gradle.kts b/common/addons/config-noise-function/build.gradle.kts index f51d5e878..02054f08b 100644 --- a/common/addons/config-noise-function/build.gradle.kts +++ b/common/addons/config-noise-function/build.gradle.kts @@ -1,6 +1,6 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -version = version("1.0.0") +version = version("1.1.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) From aab28ff4f9339e67771ffe70f52bc605c6c98b8c Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 18 Jul 2023 14:32:12 +1000 Subject: [PATCH 158/161] Bump version to 6.4.0 --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index db6c27c15..0d71e84fc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.3.2")) -versionProjects(":common:implementation", version("6.3.2")) -versionProjects(":platforms", version("6.3.2")) +versionProjects(":common:api", version("6.4.0")) +versionProjects(":common:implementation", version("6.4.0")) +versionProjects(":platforms", version("6.4.0")) allprojects { From 81e354f91cc6f2503e890159b173a85f7aa392d5 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 18 Jul 2023 22:06:08 +1000 Subject: [PATCH 159/161] Use tectonic properly --- .../java/com/dfsek/terra/config/GenericLoaders.java | 2 -- .../com/dfsek/terra/config/loaders/RangeLoader.java | 13 ++++++------- 2 files changed, 6 insertions(+), 9 deletions(-) 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 67874694f..f4f5c6cfd 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 @@ -35,7 +35,6 @@ import com.dfsek.terra.config.loaders.LinkedHashMapLoader; import com.dfsek.terra.config.loaders.MaterialSetLoader; import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; import com.dfsek.terra.config.loaders.RangeLoader; -import com.dfsek.terra.config.loaders.RangeLoader.RangeMap; import com.dfsek.terra.config.loaders.VersionLoader; import com.dfsek.terra.config.loaders.VersionRangeLoader; @@ -51,7 +50,6 @@ public class GenericLoaders implements LoaderRegistrar { public void register(TypeRegistry registry) { registry.registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) .registerLoader(Range.class, new RangeLoader()) - .registerLoader(RangeMap.class, RangeLoader.RangeMapTemplate::new) // Needed to use ObjectTemplates in TypeLoaders .registerLoader(Version.class, new VersionLoader()) .registerLoader(MaterialSet.class, new MaterialSetLoader()) .registerLoader(VersionRange.class, new VersionRangeLoader()) 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 c4463bfbb..ca40d6b90 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 @@ -24,13 +24,14 @@ 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.tectonic.impl.MapConfiguration; + import com.dfsek.terra.api.config.meta.Meta; import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; import java.util.Map; -import java.util.function.Supplier; import com.dfsek.terra.api.util.ConstantRange; import com.dfsek.terra.api.util.Range; @@ -42,19 +43,17 @@ public class RangeLoader implements TypeLoader { public Range load(@NotNull AnnotatedType type, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException { if(o instanceof Map) { - return configLoader.loadType(RangeMap.class, o, depthTracker).get(); + return configLoader.load(new RangeMapTemplate(), new MapConfiguration((Map) o), depthTracker).get(); } else { int h = configLoader.loadType(Integer.class, o, depthTracker); return new ConstantRange(h, h + 1); } } - public interface RangeMap extends Supplier {} - /* * Template needed so keys can be meta annotated, otherwise the loader could just grab keys directly from the object */ - public static class RangeMapTemplate implements ObjectTemplate { + public static class RangeMapTemplate implements ObjectTemplate { @Value("min") private @Meta int min; @@ -62,8 +61,8 @@ public class RangeLoader implements TypeLoader { private @Meta int max; @Override - public RangeMap get() { - return () -> new ConstantRange(min, max); + public Range get() { + return new ConstantRange(min, max); } } } From 5eeb5af6c40d70182f6dbdce2663a797904b3b6d Mon Sep 17 00:00:00 2001 From: David W Date: Fri, 22 Sep 2023 00:23:49 +0200 Subject: [PATCH 160/161] Add cell center offset return to CELLULAR sampler (#407) * Add offset lookup return to cellular sampler * bump noise function plugin version * revert version to 1.1.0 * rename OffsetNoiseLookup, switch axis orientation * rename return type aswell in cellcampler --- .../terra/addons/noise/samplers/noise/CellularSampler.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java index f31f81a3f..603722420 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java @@ -351,6 +351,7 @@ public class CellularSampler extends NoiseFunction { 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; @@ -514,6 +515,7 @@ public class CellularSampler extends NoiseFunction { 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; @@ -540,6 +542,7 @@ public class CellularSampler extends NoiseFunction { Distance2Mul, Distance2Div, NoiseLookup, + LocalNoiseLookup, Distance3, Distance3Add, Distance3Sub, From 3f9ead0d6661ff871b28ff711b32036e8781c3ad Mon Sep 17 00:00:00 2001 From: Astrash Date: Wed, 27 Sep 2023 13:39:51 +1000 Subject: [PATCH 161/161] Remove repeated code in cellular sampler --- .../noise/samplers/noise/CellularSampler.java | 265 +++++------------- 1 file changed, 65 insertions(+), 200 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java index 603722420..cdd40990d 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java @@ -240,99 +240,37 @@ public class CellularSampler extends NoiseFunction { double centerX = x; double centerY = y; - switch(distanceFunction) { - default: - case Euclidean: - case EuclideanSq: - 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 = vecX * vecX + vecY * vecY; - - distance1 = fastMax(fastMin(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; + 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 -> fastAbs(vecX) + fastAbs(vecY); + case Hybrid -> (fastAbs(vecX) + fastAbs(vecY)) + (vecX * vecX + vecY * vecY); + default -> vecX * vecX + vecY * vecY; + }; + + distance1 = fastMax(fastMin(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; } - break; - case Manhattan: - 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 = fastAbs(vecX) + fastAbs(vecY); - - distance1 = fastMax(fastMin(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; - } - break; - case Hybrid: - 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 = (fastAbs(vecX) + fastAbs(vecY)) + (vecX * vecX + vecY * vecY); - - distance1 = fastMax(fastMin(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; - } - break; + yPrimed += PRIME_Y; + } + xPrimed += PRIME_X; } if(distanceFunction == DistanceFunction.Euclidean && returnType != ReturnType.CellValue) { @@ -383,120 +321,47 @@ public class CellularSampler extends NoiseFunction { double centerY = y; double centerZ = z; - switch(distanceFunction) { - case Euclidean: - case EuclideanSq: - for(int xi = xr - 1; xi <= xr + 1; xi++) { - int yPrimed = yPrimedBase; + 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); - 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 = vecX * vecX + vecY * vecY + vecZ * vecZ; - - 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; - } - break; - case Manhattan: - for(int xi = xr - 1; xi <= xr + 1; xi++) { - int yPrimed = yPrimedBase; + 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; - 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 = fastAbs(vecX) + fastAbs(vecY) + fastAbs(vecZ); - - 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; - } - break; - case Hybrid: - 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 = (fastAbs(vecX) + fastAbs(vecY) + fastAbs(vecZ)) + - (vecX * vecX + vecY * vecY + vecZ * vecZ); - + double newDistance = 0; + switch(distanceFunction) { + case Euclidean, EuclideanSq -> newDistance = vecX * vecX + vecY * vecY + vecZ * vecZ; + case Manhattan -> newDistance = fastAbs(vecX) + fastAbs(vecY) + fastAbs(vecZ); + case Hybrid -> { + newDistance = (fastAbs(vecX) + fastAbs(vecY) + fastAbs(vecZ)) + (vecX * vecX + vecY * vecY + vecZ * vecZ); distance1 = fastMax(fastMin(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(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; } - break; - default: - break; + yPrimed += PRIME_Y; + } + xPrimed += PRIME_X; } if(distanceFunction == DistanceFunction.Euclidean && returnType != ReturnType.CellValue) {