From e831f85d4520253547cae0716a481348cdfc9b0e Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 12 Jul 2022 09:47:29 +1000 Subject: [PATCH 001/126] Partial layered generator implementation --- .../chunk-generator-layered/build.gradle.kts | 12 +++ .../LayeredChunkGeneratorAddon.java | 85 ++++++++++++++++++ ...yeredChunkGeneratorPackConfigTemplate.java | 36 ++++++++ .../palette/BlockLayerPaletteTemplate.java | 20 +++++ .../BelowLayerPredicateTemplate.java | 20 +++++ .../RangeLayerPredicateTemplate.java | 20 +++++ .../SamplerLayerPredicateTemplate.java | 21 +++++ .../resolve/PaletteLayerResolverTemplate.java | 37 ++++++++ .../PredicateLayerResolverTemplate.java | 29 ++++++ .../generation/LayeredChunkGenerator.java | 88 +++++++++++++++++++ .../layer/palette/BlockLayerPalette.java | 27 ++++++ .../layer/palette/LayerPalette.java | 12 +++ .../layer/predicate/BelowLayerPredicate.java | 18 ++++ .../layer/predicate/LayerPredicate.java | 8 ++ .../layer/predicate/RangeLayerPredicate.java | 18 ++++ .../predicate/SamplerLayerPredicate.java | 20 +++++ .../layer/resolve/LayerResolver.java | 8 ++ .../layer/resolve/PaletteLayerResolver.java | 18 ++++ .../layer/resolve/PredicateLayerResolver.java | 26 ++++++ .../src/main/resources/terra.addon.yml | 12 +++ 20 files changed, 535 insertions(+) create mode 100644 common/addons/chunk-generator-layered/build.gradle.kts create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/LayeredChunkGeneratorPackConfigTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/BelowLayerPredicateTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/RangeLayerPredicateTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/LayerPalette.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/LayerPredicate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/LayerResolver.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PaletteLayerResolver.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PredicateLayerResolver.java create mode 100644 common/addons/chunk-generator-layered/src/main/resources/terra.addon.yml diff --git a/common/addons/chunk-generator-layered/build.gradle.kts b/common/addons/chunk-generator-layered/build.gradle.kts new file mode 100644 index 0000000000..b26c61a77a --- /dev/null +++ b/common/addons/chunk-generator-layered/build.gradle.kts @@ -0,0 +1,12 @@ +version = version("0.1.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.chunkgenerator.lib.jafama") +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java new file mode 100644 index 0000000000..850bcffd30 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -0,0 +1,85 @@ +package com.dfsek.terra.addons.chunkgenerator; + +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.config.LayeredChunkGeneratorPackConfigTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate; +import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +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.chunk.generation.util.provider.ChunkGeneratorProvider; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.function.Supplier; + + +public class LayeredChunkGeneratorAddon implements AddonInitializer { + + private static final Logger logger = LoggerFactory.getLogger(LayeredChunkGenerator.class); + + public static final TypeKey>> LAYER_PALETTE_TOKEN = new TypeKey<>() { + }; + + public static final TypeKey>> LAYER_RESOLVER_TOKEN = new TypeKey<>() { + }; + + public static final TypeKey>> LAYER_PREDICATE_TOKEN = new TypeKey<>() { + }; + + @Inject + private Platform platform; + + @Inject + private BaseAddon addon; + + @Override + public void initialize() { + + platform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(addon, ConfigPackPreLoadEvent.class) + .priority(50) + .then(event -> { + CheckedRegistry>> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); + paletteRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new); + }) + .then(event -> { + logger.info("Registering LayerResolvers.."); + LayeredChunkGeneratorPackConfigTemplate config = event.loadTemplate(new LayeredChunkGeneratorPackConfigTemplate()); + CheckedRegistry>> resolverRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TOKEN); + resolverRegistry.register(addon.key("PREDICATE"), PredicateLayerResolverTemplate::new); + resolverRegistry.register(addon.key("PALETTE"), () -> new PaletteLayerResolverTemplate(config.getPalettes())); + }) + .then(event -> { + CheckedRegistry>> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN); + predicateRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new); + predicateRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new); + predicateRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new); + }) + .then(event -> { + LayeredChunkGeneratorPackConfigTemplate config = event.loadTemplate(new LayeredChunkGeneratorPackConfigTemplate()); + event.getPack() + .getOrCreateRegistry(ChunkGeneratorProvider.class) + .register(addon.key("LAYERED"), + pack -> new LayeredChunkGenerator(platform, config.getResolver())); + }) + .failThrough(); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/LayeredChunkGeneratorPackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/LayeredChunkGeneratorPackConfigTemplate.java new file mode 100644 index 0000000000..0363cd420a --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/LayeredChunkGeneratorPackConfigTemplate.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.addons.chunkgenerator.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.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.noise.NoiseSampler; + +import java.util.Map; + + +public class LayeredChunkGeneratorPackConfigTemplate implements ConfigTemplate { + @Value("generation.sampler") + private @Meta NoiseSampler sampler; + + @Value("generation.resolver") + private @Meta LayerResolver resolver; + + @Value("generation.palettes") + private @Meta Map palettes; + + public Map getPalettes() { + return palettes; + } + + public NoiseSampler getSampler() { + return sampler; + } + + public LayerResolver getResolver() { + return resolver; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java new file mode 100644 index 0000000000..f3afff5ea4 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java @@ -0,0 +1,20 @@ +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 com.dfsek.terra.addons.chunkgenerator.layer.palette.BlockLayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.api.block.state.BlockState; + + +public class BlockLayerPaletteTemplate implements ObjectTemplate { + + @Value("block") + private BlockState block; + + @Override + public BlockLayerPalette get() { + return new BlockLayerPalette(block); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/BelowLayerPredicateTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/BelowLayerPredicateTemplate.java new file mode 100644 index 0000000000..9b0c41917a --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/BelowLayerPredicateTemplate.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.chunkgenerator.config.predicate; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.BelowLayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.api.config.meta.Meta; + + +public class BelowLayerPredicateTemplate implements ObjectTemplate { + + @Value("y") + private @Meta int y; + + @Override + public LayerPredicate get() { + return new BelowLayerPredicate(y); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/RangeLayerPredicateTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/RangeLayerPredicateTemplate.java new file mode 100644 index 0000000000..309c5ba22a --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/RangeLayerPredicateTemplate.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.chunkgenerator.config.predicate; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.RangeLayerPredicate; +import com.dfsek.terra.api.util.Range; + + +public class RangeLayerPredicateTemplate implements ObjectTemplate { + + @Value("range") + private Range range; + + @Override + public LayerPredicate get() { + return new RangeLayerPredicate(range); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java new file mode 100644 index 0000000000..d47dd33ec5 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.predicate; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.noise.NoiseSampler; + + +public class SamplerLayerPredicateTemplate implements ObjectTemplate { + + @Value("sampler") + private @Meta NoiseSampler sampler; + + @Override + public LayerPredicate get() { + return new SamplerLayerPredicate(sampler); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java new file mode 100644 index 0000000000..34955487d9 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.addons.chunkgenerator.config.resolve; + +import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate; +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 com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PaletteLayerResolver; + +import java.util.Map; + + +public class PaletteLayerResolverTemplate implements ObjectTemplate, ValidatedConfigTemplate { + + private final Map palettes; + + public PaletteLayerResolverTemplate(Map palettes) { + this.palettes = palettes; + } + + @Value("palette") + private String palette; + + @Override + public LayerResolver get() { + return new PaletteLayerResolver(palettes.get(palette)); + } + + @Override + public boolean validate() throws ValidationException { + if(!palettes.containsKey(palette)) throw new ValidationException("The palette " + palette + " does not exist!"); + return true; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java new file mode 100644 index 0000000000..3e4da4d6e1 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.addons.chunkgenerator.config.resolve; + +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PredicateLayerResolver; +import com.dfsek.terra.api.config.meta.Meta; + + +public class PredicateLayerResolverTemplate implements ObjectTemplate { + + @Value("if") + private @Meta LayerPredicate predicate; + + @Value("then") + private @Meta LayerResolver trueResolver; + + @Value("else") + private @Meta LayerResolver falseResolver; + + + @Override + public PredicateLayerResolver get() { + return new PredicateLayerResolver(predicate, trueResolver, falseResolver); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java new file mode 100644 index 0000000000..98b83a6193 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java @@ -0,0 +1,88 @@ +package com.dfsek.terra.addons.chunkgenerator.generation; + +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.util.Column; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; +import com.dfsek.terra.api.world.chunk.generation.ProtoChunk; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; +import com.dfsek.terra.api.world.info.WorldProperties; + +import org.jetbrains.annotations.NotNull; + + +public class LayeredChunkGenerator implements ChunkGenerator { + + private final Platform platform; + private final LayerResolver resolver; + + public LayeredChunkGenerator(Platform platform, LayerResolver resolver) { + this.platform = platform; + this.resolver = resolver; + } + + @Override + public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldProperties world, @NotNull BiomeProvider biomeProvider, + int chunkX, int chunkZ) { + + platform.getProfiler().push("chunk_base_layered"); + + int xOrig = (chunkX << 4); + int zOrig = (chunkZ << 4); + long seed = world.getSeed(); + + for(int x = 0; x < 16; x++) { + for(int z = 0; z < 16; z++) { + + int cx = xOrig + x; + int cz = zOrig + z; + int paletteLevel = 0; + LayerPalette previousLayerPalette = null; + Column biomeColumn = biomeProvider.getColumn(cx, cz, world); + + for(int y = world.getMaxHeight() - 1; y >= world.getMinHeight(); y--) { + + Biome biome = biomeColumn.get(y); + + LayerPalette layerPalette = resolver.resolve(seed, biome, x, y, z); + + if (previousLayerPalette == layerPalette) { + paletteLevel++; + } else { + paletteLevel = 0; + } + previousLayerPalette = layerPalette; + + Palette palette = layerPalette.get(seed, biome, x, y, z); + + chunk.setBlock(cx, y, cz, palette.get(paletteLevel, x, y, z, seed)); + + } + } + } + + platform.getProfiler().pop("chunk_base_layered"); + } + + @Override + public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProvider biomeProvider) { + long seed = world.getSeed(); + Biome biome = biomeProvider.getBiome(x, y, z, seed); + int layer = 0; // Default to layer 0 for now + return resolver.resolve(seed, biome, x, y, z) + .get(seed, biome, x, y, z) + .get(layer, x, y, z, seed); + } + + @Override + public Palette getPalette(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { + long seed = world.getSeed(); + Biome biome = biomeProvider.getBiome(x, y, z, seed); + return resolver.resolve(seed, biome, x, y, z) + .get(seed, biome, x, y, z); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java new file mode 100644 index 0000000000..28001ddf55 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.palette; + +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class BlockLayerPalette implements LayerPalette { + + private final Palette palette; + + public BlockLayerPalette(BlockState block) { + this.palette = new SingletonPalette(block); + } + + @Override + public Palette get(long seed, Biome biome, int x, int y, int z) { + return palette; + } + + private record SingletonPalette(BlockState blockState) implements Palette { + @Override + public BlockState get(int layer, double x, double y, double z, long seed) { + return blockState; + } + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/LayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/LayerPalette.java new file mode 100644 index 0000000000..1b654e847e --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/LayerPalette.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.palette; + +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; +import com.dfsek.terra.api.world.info.WorldProperties; + + +public interface LayerPalette { + + Palette get(long seed, Biome biome, int x, int y, int z); + +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java new file mode 100644 index 0000000000..8ccd3d2003 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.predicate; + +import com.dfsek.terra.api.world.biome.Biome; + + +public class BelowLayerPredicate implements LayerPredicate { + + private final int y; + + public BelowLayerPredicate(int y) { + this.y = y; + } + + @Override + public boolean test(long seed, Biome biome, int x, int y, int z) { + return y < this.y; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/LayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/LayerPredicate.java new file mode 100644 index 0000000000..7e80604d09 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/LayerPredicate.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.predicate; + +import com.dfsek.terra.api.world.biome.Biome; + + +public interface LayerPredicate { + boolean test(long seed, Biome biome, int x, int y, int z); +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java new file mode 100644 index 0000000000..36d8c72343 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.predicate; + +import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.world.biome.Biome; + + +public class RangeLayerPredicate implements LayerPredicate { + + private final Range range; + + public RangeLayerPredicate(Range range) { + this.range = range; + } + @Override + public boolean test(long seed, Biome biome, int x, int y, int z) { + return range.isInRange(y); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java new file mode 100644 index 0000000000..04a7707573 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.predicate; + +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.world.biome.Biome; + + +public class SamplerLayerPredicate implements LayerPredicate { + + private final NoiseSampler sampler; + + public SamplerLayerPredicate(NoiseSampler sampler) { + this.sampler = sampler; + } + + + @Override + public boolean test(long seed, Biome biome, int x, int y, int z) { + return sampler.noise(seed, x, y, z) > 0; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/LayerResolver.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/LayerResolver.java new file mode 100644 index 0000000000..ed7d1532e7 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/LayerResolver.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.resolve; + +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.api.world.biome.Biome; + +public interface LayerResolver { + LayerPalette resolve(long seed, Biome biome, int x, int y, int z); +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PaletteLayerResolver.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PaletteLayerResolver.java new file mode 100644 index 0000000000..454c29139c --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PaletteLayerResolver.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.resolve; + +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.api.world.biome.Biome; + +public class PaletteLayerResolver implements LayerResolver { + + private final LayerPalette palette; + + public PaletteLayerResolver(LayerPalette palette) { + this.palette = palette; + } + + @Override + public LayerPalette resolve(long seed, Biome biome, int x, int y, int z) { + return palette; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PredicateLayerResolver.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PredicateLayerResolver.java new file mode 100644 index 0000000000..fa56c42a7f --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PredicateLayerResolver.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.resolve; + +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.api.world.biome.Biome; + + +public class PredicateLayerResolver implements LayerResolver { + + private final LayerPredicate predicate; + + private final LayerResolver trueResolver; + + private final LayerResolver falseResolver; + + public PredicateLayerResolver(LayerPredicate predicate, LayerResolver trueResolver, LayerResolver falseResolver) { + this.predicate = predicate; + this.trueResolver = trueResolver; + this.falseResolver = falseResolver; + } + + @Override + public LayerPalette resolve(long seed, Biome biome, int x, int y, int z) { + return predicate.test(seed, biome, x, y, z) ? trueResolver.resolve(seed, biome, x, y, z) : falseResolver.resolve(seed, biome, x, y, z); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/resources/terra.addon.yml b/common/addons/chunk-generator-layered/src/main/resources/terra.addon.yml new file mode 100644 index 0000000000..1b7a2d3427 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/resources/terra.addon.yml @@ -0,0 +1,12 @@ +schema-version: 1 +contributors: + - Terra contributors +id: chunk-generator-layered +version: @VERSION@ +entrypoints: + - "com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon" +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 2a9d94094cd62d6f07e31ee5af5dd5f8b9aab502 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 12 Jul 2022 13:15:27 +1000 Subject: [PATCH 002/126] Finish initial layered generator implementation --- .../LayeredChunkGeneratorAddon.java | 38 ++++++++++--------- ...yeredChunkGeneratorPackConfigTemplate.java | 36 ------------------ .../LayerPalettePackConfigTemplate.java | 21 ++++++++++ .../LayerPredicatePackConfigTemplate.java | 21 ++++++++++ .../LayerResolverPackConfigTemplate.java | 18 +++++++++ .../PredicateLayerResolverTemplate.java | 23 +++++++++-- .../generation/LayeredChunkGenerator.java | 10 ++--- .../layer/palette/LayerPalette.java | 2 - 8 files changed, 105 insertions(+), 64 deletions(-) delete mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/LayeredChunkGeneratorPackConfigTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPalettePackConfigTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.java diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index 850bcffd30..4b03f5121c 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -1,12 +1,18 @@ package com.dfsek.terra.addons.chunkgenerator; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.function.Supplier; -import com.dfsek.terra.addons.chunkgenerator.config.LayeredChunkGeneratorPackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.palette.LayerPalettePackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.predicate.LayerPredicatePackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.resolve.LayerResolverPackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate; import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate; import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; @@ -19,16 +25,10 @@ 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.chunk.generation.util.provider.ChunkGeneratorProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.function.Supplier; - public class LayeredChunkGeneratorAddon implements AddonInitializer { @@ -51,34 +51,38 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer { @Override public void initialize() { + + LayerPalettePackConfigTemplate paletteConfig = new LayerPalettePackConfigTemplate(); + LayerPredicatePackConfigTemplate predicateConfig = new LayerPredicatePackConfigTemplate(); + LayerResolverPackConfigTemplate resolverConfig = new LayerResolverPackConfigTemplate(); platform.getEventManager() .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) - .priority(50) + .priority(1000) .then(event -> { CheckedRegistry>> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); paletteRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new); - }) - .then(event -> { - logger.info("Registering LayerResolvers.."); - LayeredChunkGeneratorPackConfigTemplate config = event.loadTemplate(new LayeredChunkGeneratorPackConfigTemplate()); - CheckedRegistry>> resolverRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TOKEN); - resolverRegistry.register(addon.key("PREDICATE"), PredicateLayerResolverTemplate::new); - resolverRegistry.register(addon.key("PALETTE"), () -> new PaletteLayerResolverTemplate(config.getPalettes())); + event.loadTemplate(paletteConfig); }) .then(event -> { CheckedRegistry>> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN); predicateRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new); predicateRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new); predicateRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new); + event.loadTemplate(predicateConfig); + }) + .then(event -> { + CheckedRegistry>> resolverRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TOKEN); + resolverRegistry.register(addon.key("TEST_PREDICATE"), () -> new PredicateLayerResolverTemplate(predicateConfig.getPredicates())); + resolverRegistry.register(addon.key("USE_PALETTE"), () -> new PaletteLayerResolverTemplate(paletteConfig.getPalettes())); + event.loadTemplate(resolverConfig); }) .then(event -> { - LayeredChunkGeneratorPackConfigTemplate config = event.loadTemplate(new LayeredChunkGeneratorPackConfigTemplate()); event.getPack() .getOrCreateRegistry(ChunkGeneratorProvider.class) .register(addon.key("LAYERED"), - pack -> new LayeredChunkGenerator(platform, config.getResolver())); + pack -> new LayeredChunkGenerator(platform, resolverConfig.getResolver())); }) .failThrough(); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/LayeredChunkGeneratorPackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/LayeredChunkGeneratorPackConfigTemplate.java deleted file mode 100644 index 0363cd420a..0000000000 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/LayeredChunkGeneratorPackConfigTemplate.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.dfsek.terra.addons.chunkgenerator.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.addons.chunkgenerator.layer.palette.LayerPalette; -import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; - -import java.util.Map; - - -public class LayeredChunkGeneratorPackConfigTemplate implements ConfigTemplate { - @Value("generation.sampler") - private @Meta NoiseSampler sampler; - - @Value("generation.resolver") - private @Meta LayerResolver resolver; - - @Value("generation.palettes") - private @Meta Map palettes; - - public Map getPalettes() { - return palettes; - } - - public NoiseSampler getSampler() { - return sampler; - } - - public LayerResolver getResolver() { - return resolver; - } -} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPalettePackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPalettePackConfigTemplate.java new file mode 100644 index 0000000000..e68a0628d4 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPalettePackConfigTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.palette; + +import com.dfsek.tectonic.api.config.template.ConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import java.util.Map; + +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.api.config.meta.Meta; + + +public class LayerPalettePackConfigTemplate implements ConfigTemplate { + + @Value("generation.palettes") + private @Meta Map palettes; + + public Map getPalettes() { + return palettes; + } + +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java new file mode 100644 index 0000000000..fbddab2c0f --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.predicate; + +import com.dfsek.tectonic.api.config.template.ConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import java.util.Map; + +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.api.config.meta.Meta; + + +public class LayerPredicatePackConfigTemplate implements ConfigTemplate { + + @Value("generation.predicates") + private @Meta Map predicates; + + public Map getPredicates() { + return predicates; + } + +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.java new file mode 100644 index 0000000000..8f848a27a7 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.chunkgenerator.config.resolve; + +import com.dfsek.tectonic.api.config.template.ConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.api.config.meta.Meta; + + +public class LayerResolverPackConfigTemplate implements ConfigTemplate { + + @Value("generation.resolver") + private @Meta LayerResolver resolver; + + public LayerResolver getResolver() { + return resolver; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java index 3e4da4d6e1..03a9c3346d 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java @@ -1,8 +1,11 @@ package com.dfsek.terra.addons.chunkgenerator.config.resolve; +import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate; 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.util.Map; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; @@ -10,10 +13,16 @@ import com.dfsek.terra.api.config.meta.Meta; -public class PredicateLayerResolverTemplate implements ObjectTemplate { +public class PredicateLayerResolverTemplate implements ObjectTemplate, ValidatedConfigTemplate { + + private final Map predicates; + + public PredicateLayerResolverTemplate(Map predicates) { + this.predicates = predicates; + } @Value("if") - private @Meta LayerPredicate predicate; + private @Meta String predicate; @Value("then") private @Meta LayerResolver trueResolver; @@ -24,6 +33,12 @@ public class PredicateLayerResolverTemplate implements ObjectTemplate Date: Sat, 16 Jul 2022 16:28:57 +1000 Subject: [PATCH 003/126] Store palettes and predicates in registries --- .../LayeredChunkGeneratorAddon.java | 64 +++++++++++-------- .../{layer/palette => api}/LayerPalette.java | 2 +- .../predicate => api}/LayerPredicate.java | 2 +- .../{layer/resolve => api}/LayerResolver.java | 3 +- .../LayerPalettePackConfigTemplate.java | 4 +- .../LayerPredicatePackConfigTemplate.java | 9 ++- .../LayerResolverPackConfigTemplate.java | 4 +- .../palette/BlockLayerPaletteTemplate.java | 2 +- .../BelowLayerPredicateTemplate.java | 2 +- .../RangeLayerPredicateTemplate.java | 2 +- .../SamplerLayerPredicateTemplate.java | 2 +- .../resolve/PaletteLayerResolverTemplate.java | 28 ++------ .../PredicateLayerResolverTemplate.java | 28 ++------ .../generation/LayeredChunkGenerator.java | 4 +- .../layer/palette/BlockLayerPalette.java | 1 + .../layer/predicate/BelowLayerPredicate.java | 1 + .../layer/predicate/RangeLayerPredicate.java | 1 + .../predicate/SamplerLayerPredicate.java | 1 + .../layer/resolve/PaletteLayerResolver.java | 3 +- .../layer/resolve/PredicateLayerResolver.java | 5 +- .../chunkgenerator/util/InstanceWrapper.java | 12 ++++ 21 files changed, 88 insertions(+), 92 deletions(-) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/{layer/palette => api}/LayerPalette.java (78%) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/{layer/predicate => api}/LayerPredicate.java (70%) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/{layer/resolve => api}/LayerResolver.java (53%) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/{palette => pack}/LayerPalettePackConfigTemplate.java (77%) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/{predicate => pack}/LayerPredicatePackConfigTemplate.java (56%) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/{resolve => pack}/LayerResolverPackConfigTemplate.java (75%) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/InstanceWrapper.java diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index 4b03f5121c..3062d20277 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -7,18 +7,19 @@ import java.util.function.Supplier; import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.palette.LayerPalettePackConfigTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPalettePackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.predicate.LayerPredicatePackConfigTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPredicatePackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.resolve.LayerResolverPackConfigTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate; import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate; import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; -import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; -import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; @@ -34,13 +35,19 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer { private static final Logger logger = LoggerFactory.getLogger(LayeredChunkGenerator.class); - public static final TypeKey>> LAYER_PALETTE_TOKEN = new TypeKey<>() { + public static final TypeKey>> LAYER_PALETTE_TYPE_TOKEN = new TypeKey<>() { }; - public static final TypeKey>> LAYER_RESOLVER_TOKEN = new TypeKey<>() { + public static final TypeKey> LAYER_PALETTE_TOKEN = new TypeKey<>() { }; - public static final TypeKey>> LAYER_PREDICATE_TOKEN = new TypeKey<>() { + public static final TypeKey>> LAYER_PREDICATE_TYPE_TOKEN = new TypeKey<>() { + }; + + public static final TypeKey> LAYER_PREDICATE_TOKEN = new TypeKey<>() { + }; + + public static final TypeKey>> LAYER_RESOLVER_TYPE_TOKEN = new TypeKey<>() { }; @Inject @@ -51,38 +58,39 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer { @Override public void initialize() { - - LayerPalettePackConfigTemplate paletteConfig = new LayerPalettePackConfigTemplate(); - LayerPredicatePackConfigTemplate predicateConfig = new LayerPredicatePackConfigTemplate(); - LayerResolverPackConfigTemplate resolverConfig = new LayerResolverPackConfigTemplate(); platform.getEventManager() .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) .priority(1000) .then(event -> { - CheckedRegistry>> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); - paletteRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new); - event.loadTemplate(paletteConfig); - }) - .then(event -> { - CheckedRegistry>> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN); - predicateRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new); - predicateRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new); - predicateRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new); - event.loadTemplate(predicateConfig); + CheckedRegistry>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN); + paletteTypeRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new); + CheckedRegistry> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); + event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> { + paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette)); + }); }) .then(event -> { - CheckedRegistry>> resolverRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TOKEN); - resolverRegistry.register(addon.key("TEST_PREDICATE"), () -> new PredicateLayerResolverTemplate(predicateConfig.getPredicates())); - resolverRegistry.register(addon.key("USE_PALETTE"), () -> new PaletteLayerResolverTemplate(paletteConfig.getPalettes())); - event.loadTemplate(resolverConfig); + CheckedRegistry>> predicateTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TYPE_TOKEN); + predicateTypeRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new); + predicateTypeRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new); + predicateTypeRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new); + CheckedRegistry> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN); + event.loadTemplate(new LayerPredicatePackConfigTemplate()).getPredicates().forEach((key, predicate) -> { + predicateRegistry.register(addon.key(key), new InstanceWrapper<>(predicate)); + }); }) .then(event -> { + CheckedRegistry>> resolverTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TYPE_TOKEN); + resolverTypeRegistry.register(addon.key("TEST_PREDICATE"), PredicateLayerResolverTemplate::new); + resolverTypeRegistry.register(addon.key("USE_PALETTE"), PaletteLayerResolverTemplate::new); + LayerResolver resolver = event.loadTemplate(new LayerResolverPackConfigTemplate()).getResolver(); + event.getPack() .getOrCreateRegistry(ChunkGeneratorProvider.class) .register(addon.key("LAYERED"), - pack -> new LayeredChunkGenerator(platform, resolverConfig.getResolver())); + pack -> new LayeredChunkGenerator(platform, resolver)); }) .failThrough(); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/LayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java similarity index 78% rename from common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/LayerPalette.java rename to common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java index c75b0491d1..f5e6321654 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/LayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.chunkgenerator.layer.palette; +package com.dfsek.terra.addons.chunkgenerator.api; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.chunk.generation.util.Palette; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/LayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java similarity index 70% rename from common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/LayerPredicate.java rename to common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java index 7e80604d09..bed38a3b0e 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/LayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.chunkgenerator.layer.predicate; +package com.dfsek.terra.addons.chunkgenerator.api; import com.dfsek.terra.api.world.biome.Biome; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/LayerResolver.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerResolver.java similarity index 53% rename from common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/LayerResolver.java rename to common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerResolver.java index ed7d1532e7..def10d8ec2 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/LayerResolver.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerResolver.java @@ -1,6 +1,5 @@ -package com.dfsek.terra.addons.chunkgenerator.layer.resolve; +package com.dfsek.terra.addons.chunkgenerator.api; -import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; import com.dfsek.terra.api.world.biome.Biome; public interface LayerResolver { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPalettePackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java similarity index 77% rename from common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPalettePackConfigTemplate.java rename to common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java index e68a0628d4..1fed5f9e70 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPalettePackConfigTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java @@ -1,11 +1,11 @@ -package com.dfsek.terra.addons.chunkgenerator.config.palette; +package com.dfsek.terra.addons.chunkgenerator.config.pack; import com.dfsek.tectonic.api.config.template.ConfigTemplate; import com.dfsek.tectonic.api.config.template.annotations.Value; import java.util.Map; -import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; import com.dfsek.terra.api.config.meta.Meta; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java similarity index 56% rename from common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java rename to common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java index fbddab2c0f..ca7d472542 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java @@ -1,18 +1,21 @@ -package com.dfsek.terra.addons.chunkgenerator.config.predicate; +package com.dfsek.terra.addons.chunkgenerator.config.pack; import com.dfsek.tectonic.api.config.template.ConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; +import java.util.LinkedHashMap; import java.util.Map; -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.api.config.meta.Meta; public class LayerPredicatePackConfigTemplate implements ConfigTemplate { @Value("generation.predicates") - private @Meta Map predicates; + @Default + private @Meta Map predicates = new LinkedHashMap<>(); public Map getPredicates() { return predicates; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerResolverPackConfigTemplate.java similarity index 75% rename from common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.java rename to common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerResolverPackConfigTemplate.java index 8f848a27a7..71e8363afd 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerResolverPackConfigTemplate.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.addons.chunkgenerator.config.resolve; +package com.dfsek.terra.addons.chunkgenerator.config.pack; import com.dfsek.tectonic.api.config.template.ConfigTemplate; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; import com.dfsek.terra.api.config.meta.Meta; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java index f3afff5ea4..d3fbfacb2a 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.chunkgenerator.layer.palette.BlockLayerPalette; -import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; import com.dfsek.terra.api.block.state.BlockState; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/BelowLayerPredicateTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/BelowLayerPredicateTemplate.java index 9b0c41917a..b6ec6d6c11 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/BelowLayerPredicateTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/BelowLayerPredicateTemplate.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.BelowLayerPredicate; -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.api.config.meta.Meta; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/RangeLayerPredicateTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/RangeLayerPredicateTemplate.java index 309c5ba22a..fec9f8a77a 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/RangeLayerPredicateTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/RangeLayerPredicateTemplate.java @@ -3,7 +3,7 @@ import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.RangeLayerPredicate; import com.dfsek.terra.api.util.Range; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java index d47dd33ec5..b784320a4e 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java @@ -3,7 +3,7 @@ import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java index 34955487d9..53d7669d3c 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java @@ -1,37 +1,21 @@ package com.dfsek.terra.addons.chunkgenerator.config.resolve; -import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate; 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 com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; -import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PaletteLayerResolver; - -import java.util.Map; +import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; -public class PaletteLayerResolverTemplate implements ObjectTemplate, ValidatedConfigTemplate { - - private final Map palettes; - - public PaletteLayerResolverTemplate(Map palettes) { - this.palettes = palettes; - } +public class PaletteLayerResolverTemplate implements ObjectTemplate { @Value("palette") - private String palette; + private InstanceWrapper palette; @Override public LayerResolver get() { - return new PaletteLayerResolver(palettes.get(palette)); - } - - @Override - public boolean validate() throws ValidationException { - if(!palettes.containsKey(palette)) throw new ValidationException("The palette " + palette + " does not exist!"); - return true; + return new PaletteLayerResolver(palette.get()); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java index 03a9c3346d..b143a9c839 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java @@ -1,28 +1,19 @@ package com.dfsek.terra.addons.chunkgenerator.config.resolve; -import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate; 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.util.Map; - -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; -import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PredicateLayerResolver; +import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.api.config.meta.Meta; -public class PredicateLayerResolverTemplate implements ObjectTemplate, ValidatedConfigTemplate { - - private final Map predicates; - - public PredicateLayerResolverTemplate(Map predicates) { - this.predicates = predicates; - } +public class PredicateLayerResolverTemplate implements ObjectTemplate { @Value("if") - private @Meta String predicate; + private @Meta InstanceWrapper predicate; @Value("then") private @Meta LayerResolver trueResolver; @@ -30,15 +21,8 @@ public PredicateLayerResolverTemplate(Map predicates) { @Value("else") private @Meta LayerResolver falseResolver; - @Override public PredicateLayerResolver get() { - return new PredicateLayerResolver(predicates.get(predicate), trueResolver, falseResolver); - } - - @Override - public boolean validate() throws ValidationException { - if (!predicates.containsKey(predicate)) throw new ValidationException("The predicate " + predicate + " does not exist!"); - return true; + return new PredicateLayerResolver(predicate.get(), trueResolver, falseResolver); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java index cb8866f2b4..5104f0ca61 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java @@ -2,8 +2,8 @@ import org.jetbrains.annotations.NotNull; -import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; -import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.util.Column; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java index 28001ddf55..4054609e81 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java @@ -1,5 +1,6 @@ package com.dfsek.terra.addons.chunkgenerator.layer.palette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.chunk.generation.util.Palette; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java index 8ccd3d2003..1ffb519392 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java @@ -1,5 +1,6 @@ package com.dfsek.terra.addons.chunkgenerator.layer.predicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.api.world.biome.Biome; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java index 36d8c72343..9e0ab8ba05 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java @@ -1,5 +1,6 @@ package com.dfsek.terra.addons.chunkgenerator.layer.predicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.world.biome.Biome; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java index 04a7707573..fef96a675d 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java @@ -1,5 +1,6 @@ package com.dfsek.terra.addons.chunkgenerator.layer.predicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.world.biome.Biome; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PaletteLayerResolver.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PaletteLayerResolver.java index 454c29139c..e0780c9217 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PaletteLayerResolver.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PaletteLayerResolver.java @@ -1,6 +1,7 @@ package com.dfsek.terra.addons.chunkgenerator.layer.resolve; -import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; import com.dfsek.terra.api.world.biome.Biome; public class PaletteLayerResolver implements LayerResolver { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PredicateLayerResolver.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PredicateLayerResolver.java index fa56c42a7f..b23e846526 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PredicateLayerResolver.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PredicateLayerResolver.java @@ -1,7 +1,8 @@ package com.dfsek.terra.addons.chunkgenerator.layer.resolve; -import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; import com.dfsek.terra.api.world.biome.Biome; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/InstanceWrapper.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/InstanceWrapper.java new file mode 100644 index 0000000000..ebb1e6ad7a --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/InstanceWrapper.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.addons.chunkgenerator.util; + +import java.util.function.Supplier; + + +public record InstanceWrapper(T instance) implements Supplier { + + @Override + public T get() { + return instance; + } +} From 809a6422a15ddb6a4ac748cd914f311f6a9ec752 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 16 Jul 2022 16:36:45 +1000 Subject: [PATCH 004/126] Rename some keys --- .../addons/chunkgenerator/LayeredChunkGeneratorAddon.java | 4 ++-- .../config/pack/LayerPalettePackConfigTemplate.java | 2 +- .../config/resolve/PaletteLayerResolverTemplate.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index 3062d20277..eb284732cb 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -83,8 +83,8 @@ public void initialize() { }) .then(event -> { CheckedRegistry>> resolverTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TYPE_TOKEN); - resolverTypeRegistry.register(addon.key("TEST_PREDICATE"), PredicateLayerResolverTemplate::new); - resolverTypeRegistry.register(addon.key("USE_PALETTE"), PaletteLayerResolverTemplate::new); + resolverTypeRegistry.register(addon.key("TEST"), PredicateLayerResolverTemplate::new); + resolverTypeRegistry.register(addon.key("LAYER"), PaletteLayerResolverTemplate::new); LayerResolver resolver = event.loadTemplate(new LayerResolverPackConfigTemplate()).getResolver(); event.getPack() diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java index 1fed5f9e70..8485ec8366 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java @@ -11,7 +11,7 @@ public class LayerPalettePackConfigTemplate implements ConfigTemplate { - @Value("generation.palettes") + @Value("generation.layers") private @Meta Map palettes; public Map getPalettes() { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java index 53d7669d3c..de1474dbff 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java @@ -11,7 +11,7 @@ public class PaletteLayerResolverTemplate implements ObjectTemplate { - @Value("palette") + @Value("layer") private InstanceWrapper palette; @Override From 698725c921fec844c7ac31137e8bc652d91d3749 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 16 Jul 2022 17:03:28 +1000 Subject: [PATCH 005/126] Implement layer samplers --- .../LayeredChunkGeneratorAddon.java | 29 +++++++++++++++---- .../chunkgenerator/api/LayerSampler.java | 11 +++++++ .../pack/LayerSamplerPackConfigTemplate.java | 21 ++++++++++++++ .../SamplerLayerPredicateTemplate.java | 12 ++++++-- .../sampler/SimpleLayerSamplerTemplate.java | 21 ++++++++++++++ .../predicate/SamplerLayerPredicate.java | 12 ++++---- .../layer/sampler/SimpleLayerSampler.java | 25 ++++++++++++++++ 7 files changed, 117 insertions(+), 14 deletions(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerSampler.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerSamplerPackConfigTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/SimpleLayerSamplerTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/SimpleLayerSampler.java diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index eb284732cb..e766993b82 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -6,19 +6,22 @@ import java.util.function.Supplier; -import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPalettePackConfigTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPredicatePackConfigTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerSamplerPackConfigTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate; import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.sampler.SimpleLayerSamplerTemplate; import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; -import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; -import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; -import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; @@ -35,6 +38,12 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer { private static final Logger logger = LoggerFactory.getLogger(LayeredChunkGenerator.class); + public static final TypeKey>> LAYER_SAMPLER_TYPE_TOKEN = new TypeKey<>() { + }; + + public static final TypeKey> LAYER_SAMPLER_TOKEN = new TypeKey<>() { + }; + public static final TypeKey>> LAYER_PALETTE_TYPE_TOKEN = new TypeKey<>() { }; @@ -63,6 +72,14 @@ public void initialize() { .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) .priority(1000) + .then(event -> { + CheckedRegistry>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN); + CheckedRegistry> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN); + samplerTypeRegistry.register(addon.key("SIMPLE"), SimpleLayerSamplerTemplate::new); + event.loadTemplate(new LayerSamplerPackConfigTemplate()).getSamplers().forEach((key, sampler) -> { + samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler)); + }); + }) .then(event -> { CheckedRegistry>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN); paletteTypeRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerSampler.java new file mode 100644 index 0000000000..d328b3b5c9 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerSampler.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.addons.chunkgenerator.api; + +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.world.biome.Biome; + + +public interface LayerSampler { + double sample(long seed, Biome biome, int x, int y, int z); + + NoiseSampler getSampler(); +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerSamplerPackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerSamplerPackConfigTemplate.java new file mode 100644 index 0000000000..e811314007 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerSamplerPackConfigTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pack; + +import com.dfsek.tectonic.api.config.template.ConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import java.util.Map; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.api.config.meta.Meta; + + +public class LayerSamplerPackConfigTemplate implements ConfigTemplate { + + @Value("generation.samplers") + private @Meta Map samplers; + + public Map getSamplers() { + return samplers; + } + +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java index b784320a4e..93265156d8 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java @@ -1,21 +1,27 @@ package com.dfsek.terra.addons.chunkgenerator.config.predicate; +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.chunkgenerator.api.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; public class SamplerLayerPredicateTemplate implements ObjectTemplate { @Value("sampler") - private @Meta NoiseSampler sampler; + private @Meta InstanceWrapper sampler; + + @Value("threshold") + @Default + private double threshold = 0; @Override public LayerPredicate get() { - return new SamplerLayerPredicate(sampler); + return new SamplerLayerPredicate(sampler.get(), threshold); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/SimpleLayerSamplerTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/SimpleLayerSamplerTemplate.java new file mode 100644 index 0000000000..46bd115d63 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/SimpleLayerSamplerTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.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.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.SimpleLayerSampler; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.noise.NoiseSampler; + + +public class SimpleLayerSamplerTemplate implements ObjectTemplate { + + @Value("sampler") + private @Meta NoiseSampler sampler; + + @Override + public LayerSampler get() { + return new SimpleLayerSampler(sampler); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java index fef96a675d..6322054201 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java @@ -1,21 +1,23 @@ package com.dfsek.terra.addons.chunkgenerator.layer.predicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; import com.dfsek.terra.api.world.biome.Biome; public class SamplerLayerPredicate implements LayerPredicate { - private final NoiseSampler sampler; + private final LayerSampler sampler; - public SamplerLayerPredicate(NoiseSampler sampler) { + private final double threshold; + + public SamplerLayerPredicate(LayerSampler sampler, double threshold) { this.sampler = sampler; + this.threshold = threshold; } - @Override public boolean test(long seed, Biome biome, int x, int y, int z) { - return sampler.noise(seed, x, y, z) > 0; + return sampler.sample(seed, biome, x, y, z) > threshold; } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/SimpleLayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/SimpleLayerSampler.java new file mode 100644 index 0000000000..71dbb96c53 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/SimpleLayerSampler.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.sampler; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.world.biome.Biome; + + +public class SimpleLayerSampler implements LayerSampler { + + private NoiseSampler sampler; + + public SimpleLayerSampler(NoiseSampler sampler) { + this.sampler = sampler; + } + + @Override + public double sample(long seed, Biome biome, int x, int y, int z) { + return sampler.noise(seed, x, y, z); + } + + @Override + public NoiseSampler getSampler() { + return sampler; + } +} From b57b71baa76f1e4628e7423e953c04547af5e21e Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 16 Jul 2022 17:17:18 +1000 Subject: [PATCH 006/126] Replace BLOCK layer palette with PALETTE --- .../LayeredChunkGeneratorAddon.java | 4 +-- .../palette/BlockLayerPaletteTemplate.java | 20 ------------- .../palette/SimpleLayerPaletteTemplate.java | 20 +++++++++++++ .../layer/palette/BlockLayerPalette.java | 28 ------------------- .../layer/palette/SimpleLayerPalette.java | 20 +++++++++++++ 5 files changed, 42 insertions(+), 50 deletions(-) delete mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.java delete mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index e766993b82..72b8658115 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -14,7 +14,7 @@ import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPredicatePackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerSamplerPackConfigTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.palette.SimpleLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate; @@ -82,7 +82,7 @@ public void initialize() { }) .then(event -> { CheckedRegistry>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN); - paletteTypeRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new); + paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new); CheckedRegistry> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> { paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette)); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java deleted file mode 100644 index d3fbfacb2a..0000000000 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java +++ /dev/null @@ -1,20 +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 com.dfsek.terra.addons.chunkgenerator.layer.palette.BlockLayerPalette; -import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; -import com.dfsek.terra.api.block.state.BlockState; - - -public class BlockLayerPaletteTemplate implements ObjectTemplate { - - @Value("block") - private BlockState block; - - @Override - public BlockLayerPalette get() { - return new BlockLayerPalette(block); - } -} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.java new file mode 100644 index 0000000000..2ee6a2a2fd --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.java @@ -0,0 +1,20 @@ +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 com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.palette.SimpleLayerPalette; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class SimpleLayerPaletteTemplate implements ObjectTemplate { + + @Value("palette") + private Palette palette; + + @Override + public LayerPalette get() { + return new SimpleLayerPalette(palette); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java deleted file mode 100644 index 4054609e81..0000000000 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.dfsek.terra.addons.chunkgenerator.layer.palette; - -import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; -import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.chunk.generation.util.Palette; - - -public class BlockLayerPalette implements LayerPalette { - - private final Palette palette; - - public BlockLayerPalette(BlockState block) { - this.palette = new SingletonPalette(block); - } - - @Override - public Palette get(long seed, Biome biome, int x, int y, int z) { - return palette; - } - - private record SingletonPalette(BlockState blockState) implements Palette { - @Override - public BlockState get(int layer, double x, double y, double z, long seed) { - return blockState; - } - } -} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java new file mode 100644 index 0000000000..4bfbe21333 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.palette; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class SimpleLayerPalette implements LayerPalette { + + private final Palette palette; + + public SimpleLayerPalette(Palette palette) { + this.palette = palette; + } + + @Override + public Palette get(long seed, Biome biome, int x, int y, int z) { + return palette; + } +} From edcba9707d5a5a63882c1fd9e20cda6f13db69ee Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 16 Jul 2022 18:56:30 +1000 Subject: [PATCH 007/126] Implement biome defined layer palettes --- .../LayeredChunkGeneratorAddon.java | 10 +++ .../BiomeDefinedLayerPaletteTemplate.java | 22 ++++++ .../palette/BiomeDefinedLayerPalette.java | 67 +++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index 72b8658115..884466636f 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -14,6 +14,7 @@ import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPredicatePackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerSamplerPackConfigTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.palette.BiomeDefinedLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.SimpleLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate; @@ -22,10 +23,12 @@ import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate; import com.dfsek.terra.addons.chunkgenerator.config.sampler.SimpleLayerSamplerTemplate; import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; +import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; 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.ConfigurationLoadEvent; 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; @@ -83,6 +86,7 @@ public void initialize() { .then(event -> { CheckedRegistry>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN); paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new); + paletteTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerPaletteTemplate::new); CheckedRegistry> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> { paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette)); @@ -110,5 +114,11 @@ public void initialize() { pack -> new LayeredChunkGenerator(platform, resolver)); }) .failThrough(); + + platform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(addon, ConfigurationLoadEvent.class) + .priority(1000) + .then(BiomeDefinedLayerPalette.injectLayerPalettes); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java new file mode 100644 index 0000000000..133e491b56 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.addons.chunkgenerator.config.palette; + +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.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class BiomeDefinedLayerPaletteTemplate implements ObjectTemplate { + + @Value("default") + @Default + private Palette defaultPalette = null; + + @Override + public LayerPalette get() { + return new BiomeDefinedLayerPalette(defaultPalette); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java new file mode 100644 index 0000000000..94489dece0 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java @@ -0,0 +1,67 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.palette; + +import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate; +import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; +import com.dfsek.terra.api.properties.Properties; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class BiomeDefinedLayerPalette implements LayerPalette { + + private final Palette defaultPalette; + + public BiomeDefinedLayerPalette(Palette defaultPalette) { + this.defaultPalette = defaultPalette; + } + + @Override + public Palette get(long seed, Biome biome, int x, int y, int z) { + return biome.getContext().get(BiomeLayerPalettes.class).palettes().get(this); + } + + public Optional getDefaultPalette() { + return Optional.ofNullable(defaultPalette); + } + + public static Consumer injectLayerPalettes = event -> { + if(event.is(Biome.class)) { + + Map paletteFields = new HashMap<>(); + DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder(); + + event.getPack().getRegistry(LayeredChunkGeneratorAddon.LAYER_PALETTE_TOKEN).forEach((registryKey, registryEntry) -> { + LayerPalette layerPalette = registryEntry.get(); + // Add template value for each BiomeDefinedLayerPalette + if (layerPalette instanceof BiomeDefinedLayerPalette biomeLayerPalette) { + String id = registryKey.getID(); + String fieldName = id + "LayerPalette"; + paletteFields.put(biomeLayerPalette, fieldName); + DynamicValue.Builder value = DynamicValue.builder("layers." + id, Palette.class); + biomeLayerPalette.getDefaultPalette().ifPresent(value::setDefault); + templateBuilder.value(fieldName, value.build()); + } + }); + + DynamicTemplate layerPaletteBiomeTemplate = event.load(templateBuilder.build()); + + Map paletteMap = paletteFields.entrySet().stream().collect( + Collectors.toMap(Entry::getKey, entry -> layerPaletteBiomeTemplate.get(entry.getValue(), Palette.class))); + event.getLoadedObject(Biome.class).getContext().put(new BiomeLayerPalettes(paletteMap)); + } + }; + + public record BiomeLayerPalettes(Map palettes) implements Properties { + } +} From 4d31fda79f44f228f5ea34abbb54269183de3ff2 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 16 Jul 2022 20:11:17 +1000 Subject: [PATCH 008/126] Implement layer palette groups --- .../LayeredChunkGeneratorAddon.java | 1 + .../chunkgenerator/api/LayerPalette.java | 65 ++++++++++++++++++- .../BiomeDefinedLayerPaletteTemplate.java | 5 +- .../config/palette/LayerPaletteTemplate.java | 21 ++++++ .../palette/SimpleLayerPaletteTemplate.java | 5 +- .../generation/LayeredChunkGenerator.java | 4 ++ .../palette/BiomeDefinedLayerPalette.java | 5 +- .../layer/palette/SimpleLayerPalette.java | 5 +- 8 files changed, 99 insertions(+), 12 deletions(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPaletteTemplate.java diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index 884466636f..aa502eb58a 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -88,6 +88,7 @@ public void initialize() { paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new); paletteTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerPaletteTemplate::new); CheckedRegistry> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); + event.getPack().applyLoader(LayerPalette.Group.class, new LayerPalette.Group.Loader(event.getPack())); event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> { paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette)); }); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java index f5e6321654..c4eb14f066 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java @@ -1,10 +1,71 @@ package com.dfsek.terra.addons.chunkgenerator.api; +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 java.util.HashMap; +import java.util.Map; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.properties.Properties; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.chunk.generation.util.Palette; -public interface LayerPalette { + +public abstract class LayerPalette { + + private final Group group; + + private final boolean resetsGroup; + + protected LayerPalette(Group group, boolean resetsGroup) { + this.group = group; + this.resetsGroup = resetsGroup; + } + + public abstract Palette get(long seed, Biome biome, int x, int y, int z); + + public final Group getGroup() { + return group; + } + + public final boolean resetsGroup() { + return resetsGroup; + } + + public static class Group { + + public static Group NO_GROUP = new Group(); + + private Group() {} + + public static Group get(String string, ConfigPack pack) { + if (!pack.getContext().has(Holder.class)) { + pack.getContext().put(new Holder(new HashMap<>())); + } + return pack.getContext().get(Holder.class).groups.computeIfAbsent(string, s -> new Group()); + } - Palette get(long seed, Biome biome, int x, int y, int z); + private record Holder(Map groups) implements Properties {} + + public static class Loader implements TypeLoader { + private final ConfigPack pack; + + public Loader(ConfigPack pack) { + this.pack = pack; + } + + @Override + public Group load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader, + DepthTracker depthTracker) throws LoadException { + String groupName = (String) o; + return Group.get(groupName, pack); + } + } + } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java index 133e491b56..f04d81ffd7 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java @@ -2,14 +2,13 @@ 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.chunkgenerator.api.LayerPalette; import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette; import com.dfsek.terra.api.world.chunk.generation.util.Palette; -public class BiomeDefinedLayerPaletteTemplate implements ObjectTemplate { +public class BiomeDefinedLayerPaletteTemplate extends LayerPaletteTemplate { @Value("default") @Default @@ -17,6 +16,6 @@ public class BiomeDefinedLayerPaletteTemplate implements ObjectTemplate { + + @Value("group") + @Default + protected LayerPalette.Group group = LayerPalette.Group.NO_GROUP; + + @Value("resets-group") + @Default + protected boolean resetsGroup = false; + +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.java index 2ee6a2a2fd..43432b43cb 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.java @@ -1,20 +1,19 @@ 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 com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; import com.dfsek.terra.addons.chunkgenerator.layer.palette.SimpleLayerPalette; import com.dfsek.terra.api.world.chunk.generation.util.Palette; -public class SimpleLayerPaletteTemplate implements ObjectTemplate { +public class SimpleLayerPaletteTemplate extends LayerPaletteTemplate { @Value("palette") private Palette palette; @Override public LayerPalette get() { - return new SimpleLayerPalette(palette); + return new SimpleLayerPalette(group, resetsGroup, palette); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java index 5104f0ca61..2de7cfd903 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java @@ -52,6 +52,10 @@ public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldPropertie if (previousLayerPalette == layerPalette) { paletteLevel++; + } else if (layerPalette.resetsGroup()) { + paletteLevel = 0; + } else if (previousLayerPalette != null && layerPalette.getGroup() == previousLayerPalette.getGroup()) { + paletteLevel++; } else { paletteLevel = 0; } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java index 94489dece0..56f5953811 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java @@ -18,11 +18,12 @@ import com.dfsek.terra.api.world.chunk.generation.util.Palette; -public class BiomeDefinedLayerPalette implements LayerPalette { +public class BiomeDefinedLayerPalette extends LayerPalette { private final Palette defaultPalette; - public BiomeDefinedLayerPalette(Palette defaultPalette) { + public BiomeDefinedLayerPalette(Group group, boolean resetsGroup, Palette defaultPalette) { + super(group, resetsGroup); this.defaultPalette = defaultPalette; } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java index 4bfbe21333..e39beacef6 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java @@ -5,11 +5,12 @@ import com.dfsek.terra.api.world.chunk.generation.util.Palette; -public class SimpleLayerPalette implements LayerPalette { +public class SimpleLayerPalette extends LayerPalette { private final Palette palette; - public SimpleLayerPalette(Palette palette) { + public SimpleLayerPalette(Group group, boolean resetsGroup, Palette palette) { + super(group, resetsGroup); this.palette = palette; } From fea7d7a4fd256cf49b810db847f7e174cb6be402 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 17 Jul 2022 20:35:05 +1000 Subject: [PATCH 009/126] Implement sampler operators + sampler list predicate --- .../LayeredChunkGeneratorAddon.java | 9 +++ .../SamplerLayerPredicateTemplate.java | 7 ++- .../SamplerListLayerPredicateTemplate.java | 38 ++++++++++++ .../predicate/SamplerLayerPredicate.java | 48 ++++++++++++++- .../predicate/SamplerListLayerPredicate.java | 58 +++++++++++++++++++ 5 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerListLayerPredicateTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index aa502eb58a..956d85784e 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -19,11 +19,14 @@ import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerListLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate; import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate; import com.dfsek.terra.addons.chunkgenerator.config.sampler.SimpleLayerSamplerTemplate; import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate.CoordinateTest; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; @@ -98,6 +101,12 @@ public void initialize() { predicateTypeRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new); predicateTypeRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new); predicateTypeRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new); + predicateTypeRegistry.register(addon.key("SAMPLER_LIST"), SamplerListLayerPredicateTemplate::new); + + event.getPack().applyLoader(CoordinateTest.class, CoordinateTest.Template::new) + .applyLoader(SamplerLayerPredicate.Operator.class, + (type, o, loader, depthTracker) -> SamplerLayerPredicate.Operator.valueOf((String) o)); + CheckedRegistry> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN); event.loadTemplate(new LayerPredicatePackConfigTemplate()).getPredicates().forEach((key, predicate) -> { predicateRegistry.register(addon.key(key), new InstanceWrapper<>(predicate)); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java index 93265156d8..63a6fe4da9 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java @@ -7,6 +7,7 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate.Operator; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.api.config.meta.Meta; @@ -20,8 +21,12 @@ public class SamplerLayerPredicateTemplate implements ObjectTemplate { + + @Value("sampler") + private @Meta InstanceWrapper sampler; + + @Value("tests") + private List tests; + + @Value("default-threshold") + @Default + private double defaultThreshold = 0; + + @Value("default-operator") + @Default + private Operator defaultOperator = Operator.GreaterThan; + + @Override + public LayerPredicate get() { + return new SamplerListLayerPredicate(sampler.get(), defaultOperator, tests); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java index 6322054201..27fd6d886b 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java @@ -11,13 +11,57 @@ public class SamplerLayerPredicate implements LayerPredicate { private final double threshold; - public SamplerLayerPredicate(LayerSampler sampler, double threshold) { + private final Operator operator; + + public SamplerLayerPredicate(LayerSampler sampler, Operator operator, double threshold) { this.sampler = sampler; + this.operator = operator; this.threshold = threshold; } @Override public boolean test(long seed, Biome biome, int x, int y, int z) { - return sampler.sample(seed, biome, x, y, z) > threshold; + return operator.evaluate(sampler.sample(seed, biome, x, y, z), threshold); + } + + public enum Operator { + GreaterThan { + @Override + public boolean evaluate(double a, double b) { + return a > b; + } + }, + GreaterThanOrEqual { + @Override + public boolean evaluate(double a, double b) { + return a >= b; + } + }, + LessThan { + @Override + public boolean evaluate(double a, double b) { + return a < b; + } + }, + LessThanOrEqual { + @Override + public boolean evaluate(double a, double b) { + return a <= b; + } + }, + Equals { + @Override + public boolean evaluate(double a, double b) { + return a == b; + } + }, + NotEquals { + @Override + public boolean evaluate(double a, double b) { + return a != b; + } + }; + + public abstract boolean evaluate(double a, double b); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java new file mode 100644 index 0000000000..6735c33104 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java @@ -0,0 +1,58 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.predicate; + +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import java.util.List; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate.Operator; +import com.dfsek.terra.api.world.biome.Biome; + + +public class SamplerListLayerPredicate implements LayerPredicate { + + private final List tests; + private final Operator operator; + private final LayerSampler sampler; + + public SamplerListLayerPredicate(LayerSampler sampler, Operator operator, List tests) { + this.sampler = sampler; + this.operator = operator; + this.tests = tests; + } + + @Override + public boolean test(long seed, Biome biome, int x, int y, int z) { + for (CoordinateTest test : tests) { + if (operator.evaluate(sampler.sample(seed, biome, x + test.x, y + test.y, z + test.z), test.threshold)) return true; + } + return false; + } + + public record CoordinateTest(int x, int y, int z, double threshold) { + + public static class Template implements ObjectTemplate { + + @Value("x") + private int x; + + @Value("y") + private int y; + + @Value("z") + private int z; + + @Value("threshold") + @Default + private double threshold = 0; + + @Override + public CoordinateTest get() { + return new CoordinateTest(x, y, z, threshold); + } + } + } +} From 0b057c5a74f6dc2c36a91718f92ec7b5372cd468 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 17 Jul 2022 20:36:12 +1000 Subject: [PATCH 010/126] Add platform air layer palette --- .../LayeredChunkGeneratorAddon.java | 7 +++++- .../PlatformAirLayerPaletteTemplate.java | 22 +++++++++++++++++++ .../palette/SingletonPalette.java | 18 +++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/PlatformAirLayerPaletteTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SingletonPalette.java diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index 956d85784e..9fc2e85300 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -15,6 +15,7 @@ import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerSamplerPackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.BiomeDefinedLayerPaletteTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.palette.PlatformAirLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.SimpleLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate; @@ -82,6 +83,7 @@ public void initialize() { CheckedRegistry>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN); CheckedRegistry> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN); samplerTypeRegistry.register(addon.key("SIMPLE"), SimpleLayerSamplerTemplate::new); + event.loadTemplate(new LayerSamplerPackConfigTemplate()).getSamplers().forEach((key, sampler) -> { samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler)); }); @@ -90,8 +92,11 @@ public void initialize() { CheckedRegistry>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN); paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new); paletteTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerPaletteTemplate::new); - CheckedRegistry> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); + paletteTypeRegistry.register(addon.key("AIR"), () -> new PlatformAirLayerPaletteTemplate(platform)); + event.getPack().applyLoader(LayerPalette.Group.class, new LayerPalette.Group.Loader(event.getPack())); + + CheckedRegistry> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> { paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette)); }); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/PlatformAirLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/PlatformAirLayerPaletteTemplate.java new file mode 100644 index 0000000000..00e4feadf3 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/PlatformAirLayerPaletteTemplate.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.addons.chunkgenerator.config.palette; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.palette.SimpleLayerPalette; +import com.dfsek.terra.addons.chunkgenerator.palette.SingletonPalette; +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.block.state.BlockState; + + +public class PlatformAirLayerPaletteTemplate extends LayerPaletteTemplate { + + private BlockState air; + + public PlatformAirLayerPaletteTemplate(Platform platform) { + this.air = platform.getWorldHandle().air(); + } + + @Override + public LayerPalette get() { + return new SimpleLayerPalette(group, resetsGroup, new SingletonPalette(air)); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SingletonPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SingletonPalette.java new file mode 100644 index 0000000000..fb83db0ea3 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SingletonPalette.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.chunkgenerator.palette; + +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class SingletonPalette implements Palette { + private final BlockState blockState; + + public SingletonPalette(BlockState blockState) { + this.blockState = blockState; + } + + @Override + public BlockState get(int layer, double x, double y, double z, long seed) { + return blockState; + } +} From 237b897146a64455c552076b99c6a89f0b854075 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 17 Jul 2022 20:36:26 +1000 Subject: [PATCH 011/126] Rename predicates key to tests --- .../config/pack/LayerPredicatePackConfigTemplate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java index ca7d472542..cf4bb2172b 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java @@ -13,7 +13,7 @@ public class LayerPredicatePackConfigTemplate implements ConfigTemplate { - @Value("generation.predicates") + @Value("generation.tests") @Default private @Meta Map predicates = new LinkedHashMap<>(); From 7baace047b8c0d1e496ecfb683231604c7fa125d Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 18 Jul 2022 11:59:25 +1000 Subject: [PATCH 012/126] Change layer class method signatures --- .../addons/chunkgenerator/api/LayerPredicate.java | 5 +++-- .../addons/chunkgenerator/api/LayerResolver.java | 6 ++++-- .../addons/chunkgenerator/api/LayerSampler.java | 8 +++----- .../generation/LayeredChunkGenerator.java | 12 +++++------- .../layer/predicate/BelowLayerPredicate.java | 5 +++-- .../layer/predicate/RangeLayerPredicate.java | 5 +++-- .../layer/predicate/SamplerLayerPredicate.java | 7 ++++--- .../layer/predicate/SamplerListLayerPredicate.java | 7 ++++--- .../layer/resolve/PaletteLayerResolver.java | 6 ++++-- .../layer/resolve/PredicateLayerResolver.java | 7 ++++--- .../layer/sampler/SimpleLayerSampler.java | 12 ++++-------- 11 files changed, 41 insertions(+), 39 deletions(-) diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java index bed38a3b0e..ce2170d346 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java @@ -1,8 +1,9 @@ package com.dfsek.terra.addons.chunkgenerator.api; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; public interface LayerPredicate { - boolean test(long seed, Biome biome, int x, int y, int z); + boolean test(int x, int y, int z, WorldProperties properties, BiomeProvider provider); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerResolver.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerResolver.java index def10d8ec2..5d0efbd069 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerResolver.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerResolver.java @@ -1,7 +1,9 @@ package com.dfsek.terra.addons.chunkgenerator.api; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; + public interface LayerResolver { - LayerPalette resolve(long seed, Biome biome, int x, int y, int z); + LayerPalette resolve(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerSampler.java index d328b3b5c9..5a782494e6 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerSampler.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerSampler.java @@ -1,11 +1,9 @@ package com.dfsek.terra.addons.chunkgenerator.api; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; public interface LayerSampler { - double sample(long seed, Biome biome, int x, int y, int z); - - NoiseSampler getSampler(); + double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java index 2de7cfd903..c89766682a 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java @@ -48,7 +48,7 @@ public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldPropertie Biome biome = biomeColumn.get(y); - LayerPalette layerPalette = resolver.resolve(seed, biome, cx, y, cz); + LayerPalette layerPalette = resolver.resolve(cx, y, cz, world, biomeProvider); if (previousLayerPalette == layerPalette) { paletteLevel++; @@ -60,11 +60,9 @@ public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldPropertie paletteLevel = 0; } previousLayerPalette = layerPalette; - - Palette palette = layerPalette.get(seed, biome, cx, y, cz); - chunk.setBlock(cx, y, cz, palette.get(paletteLevel, cx, y, cz, seed)); - + chunk.setBlock(cx, y, cz, layerPalette.get(seed, biome, cx, y, cz) + .get(paletteLevel, cx, y, cz, seed)); } } } @@ -77,7 +75,7 @@ public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProv long seed = world.getSeed(); Biome biome = biomeProvider.getBiome(x, y, z, seed); int layer = 0; // Default to layer 0 for now - return resolver.resolve(seed, biome, x, y, z) + return resolver.resolve(x, y, z, world, biomeProvider) .get(seed, biome, x, y, z) .get(layer, x, y, z, seed); } @@ -86,7 +84,7 @@ public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProv public Palette getPalette(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { long seed = world.getSeed(); Biome biome = biomeProvider.getBiome(x, y, z, seed); - return resolver.resolve(seed, biome, x, y, z) + return resolver.resolve(x, y, z, world, biomeProvider) .get(seed, biome, x, y, z); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java index 1ffb519392..5eb85d4f87 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java @@ -1,7 +1,8 @@ package com.dfsek.terra.addons.chunkgenerator.layer.predicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; public class BelowLayerPredicate implements LayerPredicate { @@ -13,7 +14,7 @@ public BelowLayerPredicate(int y) { } @Override - public boolean test(long seed, Biome biome, int x, int y, int z) { + public boolean test(int x, int y, int z, WorldProperties properties, BiomeProvider biomeProvider) { return y < this.y; } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java index 9e0ab8ba05..d116bb686d 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java @@ -2,7 +2,8 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.api.util.Range; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; public class RangeLayerPredicate implements LayerPredicate { @@ -13,7 +14,7 @@ public RangeLayerPredicate(Range range) { this.range = range; } @Override - public boolean test(long seed, Biome biome, int x, int y, int z) { + public boolean test(int x, int y, int z, WorldProperties world, BiomeProvider provider) { return range.isInRange(y); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java index 27fd6d886b..e7de52e255 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java @@ -2,7 +2,8 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; public class SamplerLayerPredicate implements LayerPredicate { @@ -20,8 +21,8 @@ public SamplerLayerPredicate(LayerSampler sampler, Operator operator, double thr } @Override - public boolean test(long seed, Biome biome, int x, int y, int z) { - return operator.evaluate(sampler.sample(seed, biome, x, y, z), threshold); + public boolean test(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { + return operator.evaluate(sampler.sample(x, y, z, world, biomeProvider), threshold); } public enum Operator { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java index 6735c33104..173f796826 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java @@ -9,7 +9,8 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate.Operator; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; public class SamplerListLayerPredicate implements LayerPredicate { @@ -25,9 +26,9 @@ public SamplerListLayerPredicate(LayerSampler sampler, Operator operator, List Date: Mon, 18 Jul 2022 12:00:28 +1000 Subject: [PATCH 013/126] Implement biome defined layer samplers --- .../LayeredChunkGeneratorAddon.java | 6 +- .../BiomeDefinedLayerSamplerTemplate.java | 23 ++++++ .../palette/BiomeDefinedLayerPalette.java | 2 +- .../sampler/BiomeDefinedLayerSampler.java | 75 +++++++++++++++++++ 4 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index 9fc2e85300..418631c397 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -23,11 +23,13 @@ import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerListLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate; import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.sampler.BiomeDefinedLayerSamplerTemplate; import com.dfsek.terra.addons.chunkgenerator.config.sampler.SimpleLayerSamplerTemplate; import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate.CoordinateTest; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; @@ -83,6 +85,7 @@ public void initialize() { CheckedRegistry>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN); CheckedRegistry> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN); samplerTypeRegistry.register(addon.key("SIMPLE"), SimpleLayerSamplerTemplate::new); + samplerTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerSamplerTemplate::new); event.loadTemplate(new LayerSamplerPackConfigTemplate()).getSamplers().forEach((key, sampler) -> { samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler)); @@ -134,6 +137,7 @@ public void initialize() { .getHandler(FunctionalEventHandler.class) .register(addon, ConfigurationLoadEvent.class) .priority(1000) - .then(BiomeDefinedLayerPalette.injectLayerPalettes); + .then(BiomeDefinedLayerPalette.injectLayerPalettes) + .then(BiomeDefinedLayerSampler.injectLayerSamplers); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java new file mode 100644 index 0000000000..4fb7965c30 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java @@ -0,0 +1,23 @@ +package com.dfsek.terra.addons.chunkgenerator.config.sampler; + +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.noise.NoiseSampler; + + +public class BiomeDefinedLayerSamplerTemplate implements ObjectTemplate { + + @Value("default") + @Default + private @Meta NoiseSampler defaultSampler = null; + + @Override + public LayerSampler get() { + return new BiomeDefinedLayerSampler(defaultSampler); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java index 56f5953811..c53efea264 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java @@ -49,7 +49,7 @@ public Optional getDefaultPalette() { String id = registryKey.getID(); String fieldName = id + "LayerPalette"; paletteFields.put(biomeLayerPalette, fieldName); - DynamicValue.Builder value = DynamicValue.builder("layers." + id, Palette.class); + DynamicValue.Builder value = DynamicValue.builder("generation.layers." + id, Palette.class); biomeLayerPalette.getDefaultPalette().ifPresent(value::setDefault); templateBuilder.value(fieldName, value.build()); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java new file mode 100644 index 0000000000..804acdf0df --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java @@ -0,0 +1,75 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.sampler; + +import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate; +import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.properties.Properties; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; + + +public class BiomeDefinedLayerSampler implements LayerSampler { + + private final NoiseSampler defaultSampler; + + public BiomeDefinedLayerSampler(@Nullable NoiseSampler defaultSampler) { + this.defaultSampler = defaultSampler; + } + + @Override + public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { + return biomeProvider.getBiome(x, y, z, world.getSeed()) + .getContext() + .get(BiomeLayerSamplers.class) + .samplers() + .get(this) + .noise(world.getSeed(), x, y, z); + } + + private Optional getDefaultSampler() { + return Optional.ofNullable(defaultSampler); + } + + public static Consumer injectLayerSamplers = event -> { + if(event.is(Biome.class)) { + + Map samplerFields = new HashMap<>(); + DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder(); + + event.getPack().getRegistry(LayeredChunkGeneratorAddon.LAYER_SAMPLER_TOKEN).forEach((registryKey, registryEntry) -> { + LayerSampler layerSampler = registryEntry.get(); + + if (layerSampler instanceof BiomeDefinedLayerSampler biomeLayerSampler) { + String id = registryKey.getID(); + String fieldName = id + "LayerSampler"; + samplerFields.put(biomeLayerSampler, fieldName); + DynamicValue.Builder value = DynamicValue.builder("generation.samplers." + id, NoiseSampler.class); + biomeLayerSampler.getDefaultSampler().ifPresent(value::setDefault); + templateBuilder.value(fieldName, value.build()); + } + }); + + DynamicTemplate layerSamplerBiomeTemplate = event.load(templateBuilder.build()); + + Map samplerMap = samplerFields.entrySet().stream().collect( + Collectors.toMap(Entry::getKey, entry -> layerSamplerBiomeTemplate.get(entry.getValue(), NoiseSampler.class))); + event.getLoadedObject(Biome.class).getContext().put(new BiomeLayerSamplers(samplerMap)); + } + }; + + public record BiomeLayerSamplers(Map samplers) implements Properties { + } +} From 55e024dab04fb3f029de50b8f8620b41b22bed77 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 11:51:54 +1000 Subject: [PATCH 014/126] Change layer signatures --- .../dfsek/terra/addons/chunkgenerator/api/LayerPalette.java | 5 +++-- .../terra/addons/chunkgenerator/api/LayerPredicate.java | 2 +- .../layer/palette/BiomeDefinedLayerPalette.java | 6 ++++-- .../chunkgenerator/layer/palette/SimpleLayerPalette.java | 5 +++-- .../chunkgenerator/layer/predicate/BelowLayerPredicate.java | 2 +- .../chunkgenerator/layer/predicate/RangeLayerPredicate.java | 2 +- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java index c4eb14f066..bce83f62b3 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java @@ -12,8 +12,9 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.properties.Properties; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.util.Palette; +import com.dfsek.terra.api.world.info.WorldProperties; public abstract class LayerPalette { @@ -27,7 +28,7 @@ protected LayerPalette(Group group, boolean resetsGroup) { this.resetsGroup = resetsGroup; } - public abstract Palette get(long seed, Biome biome, int x, int y, int z); + public abstract Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider); public final Group getGroup() { return group; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java index ce2170d346..95c09b7989 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java @@ -5,5 +5,5 @@ public interface LayerPredicate { - boolean test(int x, int y, int z, WorldProperties properties, BiomeProvider provider); + boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java index c53efea264..2eb965f031 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java @@ -15,7 +15,9 @@ import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; import com.dfsek.terra.api.properties.Properties; import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.util.Palette; +import com.dfsek.terra.api.world.info.WorldProperties; public class BiomeDefinedLayerPalette extends LayerPalette { @@ -28,8 +30,8 @@ public BiomeDefinedLayerPalette(Group group, boolean resetsGroup, Palette defaul } @Override - public Palette get(long seed, Biome biome, int x, int y, int z) { - return biome.getContext().get(BiomeLayerPalettes.class).palettes().get(this); + public Palette get(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) { + return biomeProvider.getBiome(x, y, z, worldProperties.getSeed()).getContext().get(BiomeLayerPalettes.class).palettes().get(this); } public Optional getDefaultPalette() { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java index e39beacef6..ff98582302 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java @@ -1,8 +1,9 @@ package com.dfsek.terra.addons.chunkgenerator.layer.palette; import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.util.Palette; +import com.dfsek.terra.api.world.info.WorldProperties; public class SimpleLayerPalette extends LayerPalette { @@ -15,7 +16,7 @@ public SimpleLayerPalette(Group group, boolean resetsGroup, Palette palette) { } @Override - public Palette get(long seed, Biome biome, int x, int y, int z) { + public Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { return palette; } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java index 5eb85d4f87..2f5f4faf38 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java @@ -14,7 +14,7 @@ public BelowLayerPredicate(int y) { } @Override - public boolean test(int x, int y, int z, WorldProperties properties, BiomeProvider biomeProvider) { + public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) { return y < this.y; } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java index d116bb686d..c7d108a118 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java @@ -14,7 +14,7 @@ public RangeLayerPredicate(Range range) { this.range = range; } @Override - public boolean test(int x, int y, int z, WorldProperties world, BiomeProvider provider) { + public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) { return range.isInRange(y); } } From 50397a4a6b2c2979978446fd47f2dda26cc65406 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 11:53:00 +1000 Subject: [PATCH 015/126] Add loaders for vector classes --- .../dfsek/terra/config/GenericLoaders.java | 8 ++++- .../config/loaders/Vector3IntLoader.java | 31 ++++++++++++++++++ .../terra/config/loaders/Vector3Loader.java | 32 +++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3IntLoader.java create mode 100644 common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3Loader.java 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 f4f5c6cfd2..964f30f092 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 @@ -31,10 +31,14 @@ import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.MaterialSet; import com.dfsek.terra.api.util.collection.ProbabilityCollection; +import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.terra.api.util.vector.Vector3Int; 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.Vector3IntLoader; +import com.dfsek.terra.config.loaders.Vector3Loader; import com.dfsek.terra.config.loaders.VersionLoader; import com.dfsek.terra.config.loaders.VersionRangeLoader; @@ -53,7 +57,9 @@ public void register(TypeRegistry registry) { .registerLoader(Version.class, new VersionLoader()) .registerLoader(MaterialSet.class, new MaterialSetLoader()) .registerLoader(VersionRange.class, new VersionRangeLoader()) - .registerLoader(LinkedHashMap.class, new LinkedHashMapLoader()); + .registerLoader(LinkedHashMap.class, new LinkedHashMapLoader()) + .registerLoader(Vector3.class, new Vector3Loader()) + .registerLoader(Vector3Int.class, new Vector3IntLoader()); if(platform != null) { registry.registerLoader(BaseAddon.class, platform.getAddons()) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3IntLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3IntLoader.java new file mode 100644 index 0000000000..06d470594e --- /dev/null +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3IntLoader.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.config.loaders; + +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 java.util.List; +import java.util.Map; + +import com.dfsek.terra.api.util.vector.Vector3Int; + +public class Vector3IntLoader implements TypeLoader { + + @SuppressWarnings("unchecked") + @Override + public Vector3Int load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader, + DepthTracker depthTracker) throws LoadException { + if (o instanceof List) { + List list = (List) o; + return Vector3Int.of(list.get(0), list.get(1), list.get(2)); + } + else { + Map map = (Map) o; + return Vector3Int.of(map.get("x"), map.get("y"), map.get("z")); + } + } +} + diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3Loader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3Loader.java new file mode 100644 index 0000000000..cdfffe15ad --- /dev/null +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3Loader.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.config.loaders; + +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 java.util.List; +import java.util.Map; + +import com.dfsek.terra.api.util.vector.Vector3; + + +public class Vector3Loader implements TypeLoader { + + @SuppressWarnings("unchecked") + @Override + public Vector3 load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader, + DepthTracker depthTracker) throws LoadException { + if (o instanceof List) { + List list = (List) o; + return Vector3.of(list.get(0), list.get(1), list.get(2)); + } + else { + Map map = (Map) o; + return Vector3.of(map.get("x"), map.get("y"), map.get("z")); + } + } +} + From d9bd9135de72968f7b957691f0121afd51046aac Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 11:58:59 +1000 Subject: [PATCH 016/126] Add point sets to layered gen --- .../LayeredChunkGeneratorAddon.java | 33 ++++++++++++ .../generative/AdjacentPointSetTemplate.java | 15 ++++++ .../generative/SimplePointSetTemplate.java | 22 ++++++++ .../geometric/CubePointSetTemplate.java | 19 +++++++ .../geometric/CuboidPointSetTemplate.java | 25 ++++++++++ .../geometric/SphericalPointSetTemplate.java | 19 +++++++ .../operative/DifferencePointSetTemplate.java | 21 ++++++++ .../ExpressionFilterPointSetTemplate.java | 27 ++++++++++ .../IntersectionPointSetTemplate.java | 21 ++++++++ .../operative/UnionPointSetTemplate.java | 21 ++++++++ .../SamplerLayerPredicateTemplate.java | 4 +- .../SamplerListLayerPredicateTemplate.java | 18 +++---- .../predicate/SamplerLayerPredicate.java | 49 ++---------------- .../predicate/SamplerListLayerPredicate.java | 50 +++++-------------- .../chunkgenerator/math/BooleanOperator.java | 42 ++++++++++++++++ .../math/pointset/PointSet.java | 14 ++++++ .../pointset/generative/AdjacentPointSet.java | 20 ++++++++ .../pointset/generative/SimplePointSet.java | 22 ++++++++ .../generative/geometric/CuboidPointSet.java | 31 ++++++++++++ .../geometric/SphericalPointSet.java | 36 +++++++++++++ .../operative/DifferencePointSet.java | 29 +++++++++++ .../operative/ExpressionFilterPointSet.java | 32 ++++++++++++ .../operative/IntersectionPointSet.java | 29 +++++++++++ .../pointset/operative/UnionPointSet.java | 29 +++++++++++ platforms/fabric/build.gradle.kts | 4 +- 25 files changed, 536 insertions(+), 96 deletions(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/AdjacentPointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/SimplePointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CubePointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CuboidPointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/SphericalPointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/DifferencePointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/ExpressionFilterPointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/IntersectionPointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/UnionPointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/BooleanOperator.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/PointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/AdjacentPointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/SimplePointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/CuboidPointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/SphericalPointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/DifferencePointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/ExpressionFilterPointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/IntersectionPointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/UnionPointSet.java diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index 418631c397..8445945779 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -17,6 +17,15 @@ import com.dfsek.terra.addons.chunkgenerator.config.palette.BiomeDefinedLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.PlatformAirLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.SimpleLayerPaletteTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.AdjacentPointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.SimplePointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.CubePointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.CuboidPointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.SphericalPointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.DifferencePointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.ExpressionFilterPointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.IntersectionPointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.UnionPointSetTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate; @@ -30,6 +39,8 @@ import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate.CoordinateTest; import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler; +import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; @@ -47,6 +58,9 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer { private static final Logger logger = LoggerFactory.getLogger(LayeredChunkGenerator.class); + public static final TypeKey>> POINT_SET_TYPE_TOKEN = new TypeKey<>() { + }; + public static final TypeKey>> LAYER_SAMPLER_TYPE_TOKEN = new TypeKey<>() { }; @@ -81,6 +95,25 @@ public void initialize() { .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) .priority(1000) + .then(event -> { + event.getPack().applyLoader(BooleanOperator.class, + (type, o, loader, depthTracker) -> BooleanOperator.valueOf((String) o)); + + CheckedRegistry>> pointSetTypeRegistry = event.getPack().getOrCreateRegistry( + POINT_SET_TYPE_TOKEN); + pointSetTypeRegistry.register(addon.key("LIST"), SimplePointSetTemplate::new); + pointSetTypeRegistry.register(addon.key("ADJACENT"), AdjacentPointSetTemplate::new); + + pointSetTypeRegistry.register(addon.key("SPHERE"), SphericalPointSetTemplate::new); + pointSetTypeRegistry.register(addon.key("CUBOID"), CuboidPointSetTemplate::new); + pointSetTypeRegistry.register(addon.key("CUBE"), CubePointSetTemplate::new); + + pointSetTypeRegistry.register(addon.key("UNION"), UnionPointSetTemplate::new); + pointSetTypeRegistry.register(addon.key("INTERSECTION"), IntersectionPointSetTemplate::new); + pointSetTypeRegistry.register(addon.key("DIFFERENCE"), DifferencePointSetTemplate::new); + + pointSetTypeRegistry.register(addon.key("EXPRESSION"), ExpressionFilterPointSetTemplate::new); + }) .then(event -> { CheckedRegistry>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN); CheckedRegistry> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/AdjacentPointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/AdjacentPointSetTemplate.java new file mode 100644 index 0000000000..8379cce2e9 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/AdjacentPointSetTemplate.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative; + +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.AdjacentPointSet; + + +public class AdjacentPointSetTemplate implements ObjectTemplate { + + @Override + public PointSet get() { + return new AdjacentPointSet(); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/SimplePointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/SimplePointSetTemplate.java new file mode 100644 index 0000000000..b8104cf07b --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/SimplePointSetTemplate.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import java.util.Set; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.SimplePointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + + +public class SimplePointSetTemplate implements ObjectTemplate { + + @Value("points") + private Set list; + + @Override + public PointSet get() { + return new SimplePointSet(list); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CubePointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CubePointSetTemplate.java new file mode 100644 index 0000000000..340dd1985d --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CubePointSetTemplate.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.CuboidPointSet; + + +public class CubePointSetTemplate implements ObjectTemplate { + + @Value("size") + private int size; + + @Override + public PointSet get() { + return new CuboidPointSet(-size, -size, -size, size, size, size); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CuboidPointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CuboidPointSetTemplate.java new file mode 100644 index 0000000000..457548a2ae --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CuboidPointSetTemplate.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.CuboidPointSet; + + +public class CuboidPointSetTemplate implements ObjectTemplate { + + @Value("size.x") + private int xSize; + + @Value("size.y") + private int ySize; + + @Value("size.z") + private int zSize; + + @Override + public PointSet get() { + return new CuboidPointSet(-xSize, -ySize, -zSize, xSize, ySize, zSize); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/SphericalPointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/SphericalPointSetTemplate.java new file mode 100644 index 0000000000..b822f119f7 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/SphericalPointSetTemplate.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.SphericalPointSet; + + +public class SphericalPointSetTemplate implements ObjectTemplate { + + @Value("radius") + private double radius; + + @Override + public PointSet get() { + return new SphericalPointSet(radius); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/DifferencePointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/DifferencePointSetTemplate.java new file mode 100644 index 0000000000..5a381513e2 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/DifferencePointSetTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative; + +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.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.DifferencePointSet; + + +public class DifferencePointSetTemplate implements ObjectTemplate { + + @Value("point-sets") + private List set; + + @Override + public PointSet get() { + return new DifferencePointSet(set); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/ExpressionFilterPointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/ExpressionFilterPointSetTemplate.java new file mode 100644 index 0000000000..ef30b76658 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/ExpressionFilterPointSetTemplate.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative; + +import com.dfsek.paralithic.eval.tokenizer.ParseException; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.ExpressionFilterPointSet; + + +public class ExpressionFilterPointSetTemplate implements ObjectTemplate { + + @Value("point-set") + private PointSet set; + + @Value("expression") + private String expression; + + @Override + public PointSet get() { + try { + return new ExpressionFilterPointSet(set, expression); + } catch(ParseException e) { + throw new RuntimeException("Failed to parse expression.", e); + } + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/IntersectionPointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/IntersectionPointSetTemplate.java new file mode 100644 index 0000000000..d860287e61 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/IntersectionPointSetTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative; + +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.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.IntersectionPointSet; + + +public class IntersectionPointSetTemplate implements ObjectTemplate { + + @Value("point-sets") + private List sets; + + @Override + public PointSet get() { + return new IntersectionPointSet(sets); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/UnionPointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/UnionPointSetTemplate.java new file mode 100644 index 0000000000..2a4ba8ac97 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/UnionPointSetTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative; + +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.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.UnionPointSet; + + +public class UnionPointSetTemplate implements ObjectTemplate { + + @Value("point-sets") + private List sets; + + @Override + public PointSet get() { + return new UnionPointSet(sets); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java index 63a6fe4da9..c9be753707 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java @@ -7,7 +7,7 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate.Operator; +import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.api.config.meta.Meta; @@ -23,7 +23,7 @@ public class SamplerLayerPredicateTemplate implements ObjectTemplate sampler; - @Value("tests") - private List tests; + @Value("point-set") + private PointSet points; - @Value("default-threshold") + @Value("threshold") @Default private double defaultThreshold = 0; - @Value("default-operator") + @Value("operator") @Default - private Operator defaultOperator = Operator.GreaterThan; + private BooleanOperator defaultOperator = BooleanOperator.GreaterThan; @Override public LayerPredicate get() { - return new SamplerListLayerPredicate(sampler.get(), defaultOperator, tests); + return new SamplerListLayerPredicate(sampler.get(), defaultThreshold, defaultOperator, points); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java index e7de52e255..8143da5808 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java @@ -2,6 +2,7 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; @@ -12,57 +13,17 @@ public class SamplerLayerPredicate implements LayerPredicate { private final double threshold; - private final Operator operator; + private final BooleanOperator operator; - public SamplerLayerPredicate(LayerSampler sampler, Operator operator, double threshold) { + public SamplerLayerPredicate(LayerSampler sampler, BooleanOperator operator, double threshold) { this.sampler = sampler; this.operator = operator; this.threshold = threshold; } @Override - public boolean test(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { - return operator.evaluate(sampler.sample(x, y, z, world, biomeProvider), threshold); + public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) { + return operator.evaluate(sampler.sample(x, y, z, worldProperties, biomeProvider), threshold); } - public enum Operator { - GreaterThan { - @Override - public boolean evaluate(double a, double b) { - return a > b; - } - }, - GreaterThanOrEqual { - @Override - public boolean evaluate(double a, double b) { - return a >= b; - } - }, - LessThan { - @Override - public boolean evaluate(double a, double b) { - return a < b; - } - }, - LessThanOrEqual { - @Override - public boolean evaluate(double a, double b) { - return a <= b; - } - }, - Equals { - @Override - public boolean evaluate(double a, double b) { - return a == b; - } - }, - NotEquals { - @Override - public boolean evaluate(double a, double b) { - return a != b; - } - }; - - public abstract boolean evaluate(double a, double b); - } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java index 173f796826..b34be1bcf8 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java @@ -1,59 +1,33 @@ package com.dfsek.terra.addons.chunkgenerator.layer.predicate; -import com.dfsek.tectonic.api.config.template.annotations.Default; -import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; - -import java.util.List; - import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate.Operator; +import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; public class SamplerListLayerPredicate implements LayerPredicate { - private final List tests; - private final Operator operator; + private final Vector3Int[] points; + private final BooleanOperator operator; private final LayerSampler sampler; + private final double threshold; - public SamplerListLayerPredicate(LayerSampler sampler, Operator operator, List tests) { + public SamplerListLayerPredicate(LayerSampler sampler, double threshold, BooleanOperator operator, PointSet points) { this.sampler = sampler; + this.threshold = threshold; this.operator = operator; - this.tests = tests; + this.points = points.toArray(); } @Override - public boolean test(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { - for (CoordinateTest test : tests) { - if (operator.evaluate(sampler.sample(x + test.x, y + test.y, z + test.z, world, biomeProvider), test.threshold)) return true; + public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) { + for (Vector3Int point : points) { + if (operator.evaluate(sampler.sample(x + point.getX(), y + point.getY(), z + point.getZ(), worldProperties, biomeProvider), threshold)) return true; } return false; } - - public record CoordinateTest(int x, int y, int z, double threshold) { - - public static class Template implements ObjectTemplate { - - @Value("x") - private int x; - - @Value("y") - private int y; - - @Value("z") - private int z; - - @Value("threshold") - @Default - private double threshold = 0; - - @Override - public CoordinateTest get() { - return new CoordinateTest(x, y, z, threshold); - } - } - } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/BooleanOperator.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/BooleanOperator.java new file mode 100644 index 0000000000..7c013ac766 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/BooleanOperator.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.addons.chunkgenerator.math; + +public enum BooleanOperator { + GreaterThan { + @Override + public boolean evaluate(double a, double b) { + return a > b; + } + }, + GreaterThanOrEqual { + @Override + public boolean evaluate(double a, double b) { + return a >= b; + } + }, + LessThan { + @Override + public boolean evaluate(double a, double b) { + return a < b; + } + }, + LessThanOrEqual { + @Override + public boolean evaluate(double a, double b) { + return a <= b; + } + }, + Equals { + @Override + public boolean evaluate(double a, double b) { + return a == b; + } + }, + NotEquals { + @Override + public boolean evaluate(double a, double b) { + return a != b; + } + }; + + public abstract boolean evaluate(double a, double b); +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/PointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/PointSet.java new file mode 100644 index 0000000000..16466fd6ac --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/PointSet.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset; + +import java.util.function.Supplier; +import java.util.stream.Stream; + +import com.dfsek.terra.api.util.vector.Vector3Int; + + +public interface PointSet extends Supplier> { + + default Vector3Int[] toArray() { + return this.get().distinct().toArray(Vector3Int[]::new); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/AdjacentPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/AdjacentPointSet.java new file mode 100644 index 0000000000..e6788a455a --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/AdjacentPointSet.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative; + +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + +public class AdjacentPointSet implements PointSet { + @Override + public Stream get() { + return Stream.of( + Vector3Int.of(0, 0, -1), + Vector3Int.of(0, 0, 1), + Vector3Int.of(0, -1, 0), + Vector3Int.of(0, 1, 0), + Vector3Int.of(-1, 0, 0), + Vector3Int.of(1, 0, 0) + ); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/SimplePointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/SimplePointSet.java new file mode 100644 index 0000000000..e1e50bdc08 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/SimplePointSet.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative; + +import java.util.Set; +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + + +public class SimplePointSet implements PointSet { + + private final Stream points; + + public SimplePointSet(Set points) { + this.points = points.stream(); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/CuboidPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/CuboidPointSet.java new file mode 100644 index 0000000000..08e8d746f4 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/CuboidPointSet.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric; + +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + + +public class CuboidPointSet implements PointSet { + + private final Stream points; + + public CuboidPointSet(int x1, int y1, int z1, int x2, int y2, int z2) { + Set points = new HashSet<>(); + for (int x = x1; x <= x2; x = x + 1) { + for (int y = y1; y <= y2; y = y + 1) { + for (int z = z1; z <= z2; z = z + 1) { + points.add(Vector3Int.of(x, y, z)); + } + } + } + this.points = points.stream(); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/SphericalPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/SphericalPointSet.java new file mode 100644 index 0000000000..5621fadef9 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/SphericalPointSet.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric; + +import net.jafama.FastMath; + +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + + +public class SphericalPointSet implements PointSet { + + private final Stream points; + + public SphericalPointSet(double radius) { + Stream.Builder streamBuilder = Stream.builder(); + int roundedRadius = FastMath.ceilToInt(radius); + for(int x = -roundedRadius; x <= roundedRadius; x++) { + for(int y = -roundedRadius; y <= roundedRadius; y++) { + for(int z = -roundedRadius; z <= roundedRadius; z++) { + Vector3Int pos = Vector3Int.of(x, y, z); + double length = pos.toVector3().length(); + if (length == 0) continue; + if (length > radius) continue; + streamBuilder.add(pos); + } + } + } + this.points = streamBuilder.build(); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/DifferencePointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/DifferencePointSet.java new file mode 100644 index 0000000000..ed958bf1a7 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/DifferencePointSet.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative; + +import com.google.common.collect.Sets; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + +public class DifferencePointSet implements PointSet { + + private final Stream points; + + public DifferencePointSet(List sets) { + points = sets.stream() + .map(PointSet::get) + .map(s -> s.collect(Collectors.toSet())) + .reduce(Sets::difference).orElse(Collections.emptySet()) + .stream(); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/ExpressionFilterPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/ExpressionFilterPointSet.java new file mode 100644 index 0000000000..8906446e99 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/ExpressionFilterPointSet.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative; + +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 java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + + +public class ExpressionFilterPointSet implements PointSet { + + private final Stream points; + + public ExpressionFilterPointSet(PointSet set, String eq) throws ParseException { + Parser parser = new Parser(); + Scope scope = new Scope(); + scope.addInvocationVariable("x"); + scope.addInvocationVariable("y"); + scope.addInvocationVariable("z"); + Expression expression = parser.parse(eq, scope); + this.points = set.get().filter(v -> expression.evaluate(v.getX(), v.getY(), v.getZ()) == 1); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/IntersectionPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/IntersectionPointSet.java new file mode 100644 index 0000000000..0dbe0c498c --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/IntersectionPointSet.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative; + +import com.google.common.collect.Sets; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + +public class IntersectionPointSet implements PointSet { + + private final Stream points; + + public IntersectionPointSet(List sets) { + points = sets.stream() + .map(PointSet::get) + .map(s -> s.collect(Collectors.toSet())) + .reduce(Sets::intersection).orElse(Collections.emptySet()) + .stream(); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/UnionPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/UnionPointSet.java new file mode 100644 index 0000000000..bd01c1c68f --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/UnionPointSet.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative; + +import com.google.common.collect.Sets; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + +public class UnionPointSet implements PointSet { + + private final Stream points; + + public UnionPointSet(List sets) { + points = sets.stream() + .map(PointSet::get) + .map(s -> s.collect(Collectors.toSet())) + .reduce(Sets::union).orElse(Collections.emptySet()) + .stream(); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 7ed3f2e75c..b457594d8a 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -52,10 +52,10 @@ loom { launches { named("client") { - property("fabric.log.level", "debug") + property("fabric.log.level", "info") } named("server") { - property("fabric.log.level", "debug") + property("fabric.log.level", "info") } } } From 596c84ab101aa3579138324ec986350d11da8450 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 11:59:15 +1000 Subject: [PATCH 017/126] Forgot signature change in chunk generator --- .../chunkgenerator/generation/LayeredChunkGenerator.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java index c89766682a..ae096ca6f7 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java @@ -61,7 +61,7 @@ public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldPropertie } previousLayerPalette = layerPalette; - chunk.setBlock(cx, y, cz, layerPalette.get(seed, biome, cx, y, cz) + chunk.setBlock(cx, y, cz, layerPalette.get(cx, y, cz, world, biomeProvider) .get(paletteLevel, cx, y, cz, seed)); } } @@ -76,7 +76,7 @@ public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProv Biome biome = biomeProvider.getBiome(x, y, z, seed); int layer = 0; // Default to layer 0 for now return resolver.resolve(x, y, z, world, biomeProvider) - .get(seed, biome, x, y, z) + .get(x, y, z, world, biomeProvider) .get(layer, x, y, z, seed); } @@ -85,6 +85,6 @@ public Palette getPalette(int x, int y, int z, WorldProperties world, BiomeProvi long seed = world.getSeed(); Biome biome = biomeProvider.getBiome(x, y, z, seed); return resolver.resolve(x, y, z, world, biomeProvider) - .get(seed, biome, x, y, z); + .get(x, y, z, world, biomeProvider); } } From 9a171b0cdb197663e8ec84291cd96728db3c2860 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 12:00:54 +1000 Subject: [PATCH 018/126] Implement dot product layer palette --- .../LayeredChunkGeneratorAddon.java | 32 ++++++-------- .../DotProductLayerPaletteTemplate.java | 44 +++++++++++++++++++ .../layer/palette/DotProductLayerPalette.java | 43 ++++++++++++++++++ .../palette/DoubleNavigableHolder.java | 34 ++++++++++++++ 4 files changed, 135 insertions(+), 18 deletions(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/DotProductLayerPaletteTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/DotProductLayerPalette.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/DoubleNavigableHolder.java diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index 8445945779..b2bf49e76b 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -15,6 +15,7 @@ import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerSamplerPackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.BiomeDefinedLayerPaletteTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.palette.DotProductLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.PlatformAirLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.SimpleLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.AdjacentPointSetTemplate; @@ -36,8 +37,6 @@ import com.dfsek.terra.addons.chunkgenerator.config.sampler.SimpleLayerSamplerTemplate; import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette; -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate.CoordinateTest; import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler; import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; @@ -124,11 +123,24 @@ public void initialize() { samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler)); }); }) + .then(event -> { + CheckedRegistry>> predicateTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TYPE_TOKEN); + predicateTypeRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new); + predicateTypeRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new); + predicateTypeRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new); + predicateTypeRegistry.register(addon.key("SAMPLER_POINTS"), SamplerListLayerPredicateTemplate::new); + + CheckedRegistry> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN); + event.loadTemplate(new LayerPredicatePackConfigTemplate()).getPredicates().forEach((key, predicate) -> { + predicateRegistry.register(addon.key(key), new InstanceWrapper<>(predicate)); + }); + }) .then(event -> { CheckedRegistry>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN); paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new); paletteTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerPaletteTemplate::new); paletteTypeRegistry.register(addon.key("AIR"), () -> new PlatformAirLayerPaletteTemplate(platform)); + paletteTypeRegistry.register(addon.key("SURFACE_NORMAL"), DotProductLayerPaletteTemplate::new); event.getPack().applyLoader(LayerPalette.Group.class, new LayerPalette.Group.Loader(event.getPack())); @@ -137,22 +149,6 @@ public void initialize() { paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette)); }); }) - .then(event -> { - CheckedRegistry>> predicateTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TYPE_TOKEN); - predicateTypeRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new); - predicateTypeRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new); - predicateTypeRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new); - predicateTypeRegistry.register(addon.key("SAMPLER_LIST"), SamplerListLayerPredicateTemplate::new); - - event.getPack().applyLoader(CoordinateTest.class, CoordinateTest.Template::new) - .applyLoader(SamplerLayerPredicate.Operator.class, - (type, o, loader, depthTracker) -> SamplerLayerPredicate.Operator.valueOf((String) o)); - - CheckedRegistry> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN); - event.loadTemplate(new LayerPredicatePackConfigTemplate()).getPredicates().forEach((key, predicate) -> { - predicateRegistry.register(addon.key(key), new InstanceWrapper<>(predicate)); - }); - }) .then(event -> { CheckedRegistry>> resolverTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TYPE_TOKEN); resolverTypeRegistry.register(addon.key("TEST"), PredicateLayerResolverTemplate::new); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/DotProductLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/DotProductLayerPaletteTemplate.java new file mode 100644 index 0000000000..6d8fed140d --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/DotProductLayerPaletteTemplate.java @@ -0,0 +1,44 @@ +package com.dfsek.terra.addons.chunkgenerator.config.palette; + +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import java.util.HashMap; +import java.util.Map; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.palette.DotProductLayerPalette; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.AdjacentPointSet; +import com.dfsek.terra.addons.chunkgenerator.palette.DoubleNavigableHolder; +import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class DotProductLayerPaletteTemplate extends LayerPaletteTemplate { + + @Value("normal.approximation-points") + @Default + private PointSet normalApproximationPoints = new AdjacentPointSet(); + + @Value("normal.direction") + @Default + private Vector3 direction = Vector3.of(0, 1, 0); + + @Value("normal.sampler") + private InstanceWrapper sampler; + + @Value("palettes") + private Map palettes; + + @Override + public LayerPalette get() { + Map paletteMap = new HashMap<>(); + palettes.forEach((s, p) -> { + paletteMap.put(Double.parseDouble(s), p); + }); + return new DotProductLayerPalette(group, resetsGroup, normalApproximationPoints, new DoubleNavigableHolder<>(paletteMap), sampler.get(), direction); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/DotProductLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/DotProductLayerPalette.java new file mode 100644 index 0000000000..8da5d5f7b5 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/DotProductLayerPalette.java @@ -0,0 +1,43 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.palette; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.palette.DoubleNavigableHolder; +import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; +import com.dfsek.terra.api.world.info.WorldProperties; + + +public class DotProductLayerPalette extends LayerPalette { + + private static final Logger logger = LoggerFactory.getLogger(DotProductLayerPalette.class); + private final DoubleNavigableHolder palettes; + private final Vector3Int[] samplePoints; + private final LayerSampler sampler; + private final Vector3 direction; + + public DotProductLayerPalette(Group group, boolean resetsGroup, + PointSet points, DoubleNavigableHolder palettes, LayerSampler sampler, Vector3 direction) { + super(group, resetsGroup); + this.palettes = palettes; + this.sampler = sampler; + this.direction = direction; + this.samplePoints = points.toArray(); + } + + @Override + public Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { + Vector3.Mutable surfaceNormalApproximation = Vector3.Mutable.of(0, 0, 0); + for(Vector3Int point : samplePoints) { + double scalar = -sampler.sample(x+point.getX(), y+point.getY(), z+point.getZ(), world, biomeProvider); + surfaceNormalApproximation.add(point.toVector3Mutable().multiply(scalar)); + } + return palettes.get(direction.dot(surfaceNormalApproximation.normalize())); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/DoubleNavigableHolder.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/DoubleNavigableHolder.java new file mode 100644 index 0000000000..2f0a9f91b0 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/DoubleNavigableHolder.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.addons.chunkgenerator.palette; + +import java.util.Map; +import java.util.NavigableMap; +import java.util.TreeMap; + + +public class DoubleNavigableHolder { + + private final NavigableMap map; + + public DoubleNavigableHolder(Map inputMap) { + NavigableMap map = new TreeMap<>(inputMap); + map.put(Double.MAX_VALUE, map.lastEntry().getValue()); + this.map = map; + } + + public T get(double threshold) { + return map.ceilingEntry(threshold).getValue(); + } + + enum Method { + CEILING, + FLOOR, + CLOSEST + } + + public class Single extends DoubleNavigableHolder { + + public Single(Map inputMap) { + super(inputMap); + } + } +} From c2902cc549d0b5e2b0c7dfb39318498123e00f04 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 12:01:10 +1000 Subject: [PATCH 019/126] Add paralithic as layered gen dependency --- common/addons/chunk-generator-layered/build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/addons/chunk-generator-layered/build.gradle.kts b/common/addons/chunk-generator-layered/build.gradle.kts index b26c61a77a..4065850b0c 100644 --- a/common/addons/chunk-generator-layered/build.gradle.kts +++ b/common/addons/chunk-generator-layered/build.gradle.kts @@ -2,6 +2,7 @@ version = version("0.1.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) + api("com.dfsek", "paralithic", Versions.Libraries.paralithic) implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) @@ -9,4 +10,5 @@ dependencies { tasks.named("shadowJar") { relocate("net.jafama", "com.dfsek.terra.addons.chunkgenerator.lib.jafama") + relocate("com.dfsek.paralithic", "com.dfsek.terra.addons.chunkgenerator.lib.paralithic") } From bd139a8edcdc5da0d030a8d51d0ae422c076c7f4 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 12:08:21 +1000 Subject: [PATCH 020/126] BooleanOperator -> RelationalOperator --- .../LayeredChunkGeneratorAddon.java | 6 +++--- .../SamplerLayerPredicateTemplate.java | 4 ++-- .../SamplerListLayerPredicateTemplate.java | 4 ++-- .../predicate/SamplerLayerPredicate.java | 8 ++++---- .../predicate/SamplerListLayerPredicate.java | 8 ++++---- ...nOperator.java => RelationalOperator.java} | 19 +++++++++++-------- .../util/DoubleBiPredicate.java | 6 ++++++ 7 files changed, 32 insertions(+), 23 deletions(-) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/{BooleanOperator.java => RelationalOperator.java} (52%) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/DoubleBiPredicate.java diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index b2bf49e76b..4a22c40241 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -38,7 +38,7 @@ import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette; import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler; -import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator; +import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.addons.manifest.api.AddonInitializer; @@ -95,8 +95,8 @@ public void initialize() { .register(addon, ConfigPackPreLoadEvent.class) .priority(1000) .then(event -> { - event.getPack().applyLoader(BooleanOperator.class, - (type, o, loader, depthTracker) -> BooleanOperator.valueOf((String) o)); + event.getPack().applyLoader(RelationalOperator.class, + (type, o, loader, depthTracker) -> RelationalOperator.valueOf((String) o)); CheckedRegistry>> pointSetTypeRegistry = event.getPack().getOrCreateRegistry( POINT_SET_TYPE_TOKEN); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java index c9be753707..4477acaedc 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java @@ -7,7 +7,7 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; -import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator; +import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.api.config.meta.Meta; @@ -23,7 +23,7 @@ public class SamplerLayerPredicateTemplate implements ObjectTemplate b; } }, GreaterThanOrEqual { @Override - public boolean evaluate(double a, double b) { + public boolean test(double a, double b) { return a >= b; } }, LessThan { @Override - public boolean evaluate(double a, double b) { + public boolean test(double a, double b) { return a < b; } }, LessThanOrEqual { @Override - public boolean evaluate(double a, double b) { + public boolean test(double a, double b) { return a <= b; } }, Equals { @Override - public boolean evaluate(double a, double b) { + public boolean test(double a, double b) { return a == b; } }, NotEquals { @Override - public boolean evaluate(double a, double b) { + public boolean test(double a, double b) { return a != b; } }; - public abstract boolean evaluate(double a, double b); + public abstract boolean test(double a, double b); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/DoubleBiPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/DoubleBiPredicate.java new file mode 100644 index 0000000000..948a0fc32f --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/DoubleBiPredicate.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.addons.chunkgenerator.util; + +@FunctionalInterface +public interface DoubleBiPredicate { + boolean test(double a, double b); +} From 866d527d35de75a106e12a2fd302e7083a52ab9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Fri, 17 Nov 2023 13:11:28 -0700 Subject: [PATCH 021/126] bump version --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 73654719d7..a8a497a85f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.4.0")) -versionProjects(":common:implementation", version("6.4.0")) -versionProjects(":platforms", version("6.4.0")) +versionProjects(":common:api", version("6.5.0")) +versionProjects(":common:implementation", version("6.5.0")) +versionProjects(":platforms", version("6.5.0")) allprojects { From e499ddebd4f76f434cc670605a88417c2a59e282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Fri, 17 Nov 2023 13:34:56 -0700 Subject: [PATCH 022/126] update condeowners --- .github/CODEOWNERS | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 4afb8b9c13..732a59b1d3 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,19 +1,13 @@ # Global owners, automatically request review when pull request is submitted -* @dfsek @solonovamax +* @dfsek @solonovamax @duplexsystem @Astrashh @justaureus # Platforms -## dfsek wrote the majority of the platform impls -/platforms/bukkit/ @dfsek -/platforms/fabric/ @dfsek -/platforms/forge/ @dfsek -/platforms/sponge/ @dfsek -## solonovamax is working on the region generator (unless duplexsystem takes it over) -/platforms/region/ @solonovamax +/platforms/ @dfsek @solonovamax @duplexsystem @justaureus # Common -/common/ @dfsek @solonovamax +/common/ @dfsek @solonovamax @duplexsystem @Astrashh # Gradle Stuff -## Most gradle stuff was written by solonovamax -/buildSrc/ @solonovamax -*.gradle.kts @solonovamax \ No newline at end of file +/buildSrc/ @dfsek @solonovamax @duplexsystem +*.gradle.kts @dfsek @solonovamax @duplexsystem +/gradle/ @dfsek @solonovamax @duplexsystem \ No newline at end of file From 3aef977384d6d6f2d03b3ac2d33876634fe7f9a9 Mon Sep 17 00:00:00 2001 From: Astrashh Date: Sat, 25 Nov 2023 12:02:45 +1100 Subject: [PATCH 023/126] Patch version 6.4.1 (#435) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Bump version to 6.4.1 * fix fabric dev env * Invert exposed ore logic (#433) * Invert exposed ore logic * Bump ore addon version * Use logger in Gradle over println (#434) * Log info instead of println in gradle scripts * Missed buildSrc printlns --------- Co-authored-by: Zoë --- build.gradle.kts | 6 +-- buildSrc/src/main/kotlin/AddonConfig.kt | 4 +- .../src/main/kotlin/DistributionConfig.kt | 2 +- buildSrc/src/main/kotlin/Utils.kt | 4 +- .../terra/tectonicdoc/GenerateDocsTask.kt | 2 +- common/addons/config-ore/build.gradle.kts | 2 +- .../addons/ore/utils/VanillaOreUtils.java | 39 ++++++++----------- platforms/fabric/build.gradle.kts | 2 + platforms/merged/build.gradle.kts | 4 +- settings.gradle.kts | 2 +- 10 files changed, 31 insertions(+), 36 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 73654719d7..f1156e2f75 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.4.0")) -versionProjects(":common:implementation", version("6.4.0")) -versionProjects(":platforms", version("6.4.0")) +versionProjects(":common:api", version("6.4.1")) +versionProjects(":common:implementation", version("6.4.1")) +versionProjects(":platforms", version("6.4.1")) allprojects { diff --git a/buildSrc/src/main/kotlin/AddonConfig.kt b/buildSrc/src/main/kotlin/AddonConfig.kt index b4dda3bcaa..1880a7b0d2 100644 --- a/buildSrc/src/main/kotlin/AddonConfig.kt +++ b/buildSrc/src/main/kotlin/AddonConfig.kt @@ -18,7 +18,7 @@ fun Project.addonDir(dir: File, task: Task) { matchingAddons(dir) { it.name.startsWith("Terra-") // Assume everything that starts with Terra- is a core addon. }.forEach { - println("Deleting old addon: " + it.absolutePath) + logger.info("Deleting old addon: " + it.absolutePath) it.delete() } forSubProjects(":common:addons") { @@ -29,7 +29,7 @@ fun Project.addonDir(dir: File, task: Task) { val base = "${jar.archiveBaseName.get()}-${version}" - println("Copying addon ${jar.archiveFileName.get()} to ${target.absolutePath}. Base name: $base") + logger.info("Copying addon ${jar.archiveFileName.get()} to ${target.absolutePath}. Base name: $base") jar.archiveFile.orNull?.asFile?.copyTo(target) } diff --git a/buildSrc/src/main/kotlin/DistributionConfig.kt b/buildSrc/src/main/kotlin/DistributionConfig.kt index 8c262e729b..df003b078d 100644 --- a/buildSrc/src/main/kotlin/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/DistributionConfig.kt @@ -53,7 +53,7 @@ fun Project.configureDistribution() { forSubProjects(":common:addons") { val jar = getJarTask() - println("Packaging addon ${jar.archiveFileName.get()} to $dest. size: ${jar.archiveFile.get().asFile.length() / 1024}KB") + logger.info("Packaging addon ${jar.archiveFileName.get()} to $dest. size: ${jar.archiveFile.get().asFile.length() / 1024}KB") val boot = if (extra.has("bootstrap") && extra.get("bootstrap") as Boolean) "bootstrap/" else "" val addonPath = fs.getPath("/addons/$boot${jar.archiveFileName.get()}") diff --git a/buildSrc/src/main/kotlin/Utils.kt b/buildSrc/src/main/kotlin/Utils.kt index b775871b09..679786788b 100644 --- a/buildSrc/src/main/kotlin/Utils.kt +++ b/buildSrc/src/main/kotlin/Utils.kt @@ -42,10 +42,10 @@ fun preRelease(preRelease: Boolean) { fun Project.versionProjects(project: String, version: String) { forSubProjects(project) { this.version = version - println("Setting version of $path to $version") + logger.info("Setting version of $path to $version") } project(project).version = version - println("Setting version of $project to $version") + logger.info("Setting version of $project to $version") } fun Project.version(version: String): String { diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/tectonicdoc/GenerateDocsTask.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/tectonicdoc/GenerateDocsTask.kt index 30f5153553..60977aee5c 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/tectonicdoc/GenerateDocsTask.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/tectonicdoc/GenerateDocsTask.kt @@ -82,7 +82,7 @@ abstract class GenerateDocsTask : DefaultTask() { } template.add(keyName.toString(), description.toString().ifBlank { - println("No description provided for field " + field.name + " in class " + name) + logger.info("No description provided for field " + field.name + " in class " + name) "*No description provided.*" }) } diff --git a/common/addons/config-ore/build.gradle.kts b/common/addons/config-ore/build.gradle.kts index 469635ee66..06718492e4 100644 --- a/common/addons/config-ore/build.gradle.kts +++ b/common/addons/config-ore/build.gradle.kts @@ -1,4 +1,4 @@ -version = version("1.1.0") +version = version("1.1.1") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java index cfef65b571..f8ede8680e 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java @@ -8,31 +8,24 @@ public class VanillaOreUtils { - protected static boolean shouldNotDiscard(Random random, double chance) { - if(chance <= 0.0F) { - return true; - } else if(chance >= 1.0F) { - return false; - } else { - return random.nextFloat() >= chance; - } + private static boolean shouldExpose(Random random, double exposedChance) { + if(exposedChance >= 1.0F) return true; + if(exposedChance <= 0.0F) return false; + return random.nextFloat() < exposedChance; } - public static boolean shouldPlace(MaterialSet replaceable, BlockType type, Double exposed, Random random, WritableWorld world, int x, + public static boolean shouldPlace(MaterialSet replaceable, BlockType type, Double exposedChance, Random random, WritableWorld world, + int x, int y, int z) { - if(!replaceable.contains(type)) { - return false; - } else if(shouldNotDiscard(random, exposed)) { - return true; - } else { - return !(world.getBlockState(x, y, z - 1).isAir() || - world.getBlockState(x, y, z + 1).isAir() || - world.getBlockState(x, y - 1, z).isAir() || - world.getBlockState(x, y + 1, z).isAir() || - world.getBlockState(x - 1, y, z).isAir() || - world.getBlockState(x + 1, y, z).isAir()); - } + if(!replaceable.contains(type)) return false; + if(shouldExpose(random, exposedChance)) return true; // Exposed blocks can be placed regardless of adjacency to air + // Adjacency is checked after determining not exposed rather than vice-versa, assuming block checks are more expensive + boolean adjacentAir = world.getBlockState(x, y, z - 1).isAir() || + world.getBlockState(x, y, z + 1).isAir() || + world.getBlockState(x, y - 1, z).isAir() || + world.getBlockState(x, y + 1, z).isAir() || + world.getBlockState(x - 1, y, z).isAir() || + world.getBlockState(x + 1, y, z).isAir(); + return !adjacentAir; // Exposed check did not pass earlier so only blocks not adjacent air should place } - } - diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 3b977d8af8..3598ae92c5 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -29,6 +29,8 @@ dependencies { modImplementation("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) include("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) + + modRuntimeOnly("net.fabricmc.fabric-api", "fabric-api", Versions.Fabric.fabricAPI) } loom { diff --git a/platforms/merged/build.gradle.kts b/platforms/merged/build.gradle.kts index ec9e56f878..aab37e093c 100644 --- a/platforms/merged/build.gradle.kts +++ b/platforms/merged/build.gradle.kts @@ -13,7 +13,7 @@ val dump = tasks.create("dumpDependents") { doFirst { taskSet.forEach { val resource = File(resourcesDir, it.archiveFileName.get()) - println("Including archive " + it.archiveFileName.orNull + " in directory " + resource.absolutePath) + logger.info("Including archive " + it.archiveFileName.orNull + " in directory " + resource.absolutePath) it.archiveFile.get().asFile.copyTo(resource, true) } } @@ -32,6 +32,6 @@ afterEvaluate { } tasks["dumpDependents"].dependsOn(task) taskSet.add(task) - println("Merged JAR will incorporate task ${task.name} from platform ${it.name}.") + logger.info("Merged JAR will incorporate task ${task.name} from platform ${it.name}.") } } \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 7a1cdc8a0d..5791769858 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -5,7 +5,7 @@ fun includeImmediateChildren(dir: File, type: String) { dir.walkTopDown().maxDepth(1).forEach { if (!it.isDirectory || !File(it, "build.gradle.kts").exists()) return@forEach val addonDir = it.relativeTo(file(".")).path.replace("/", ":").replace("\\", ":") - println("Including $type directory \"$addonDir\" as subproject.") + logger.info("Including $type directory \"$addonDir\" as subproject.") include(addonDir) } } From c82e015559998c44deb04ecc099bc9b6c1c90cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Mon, 27 Nov 2023 10:08:50 -0700 Subject: [PATCH 024/126] flatten array for pipeline biomes --- .../pipeline/v2/pipeline/BiomeChunkImpl.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java index e9fe9dbb22..6592a6cd87 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java +++ b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java @@ -14,7 +14,9 @@ public class BiomeChunkImpl implements BiomeChunk { private final SeededVector worldOrigin; private final int chunkOriginArrayIndex; private final int worldCoordinateScale; - private PipelineBiome[][] biomes; + private PipelineBiome[] biomes; + + private final int size; public BiomeChunkImpl(SeededVector worldOrigin, PipelineImpl pipeline) { @@ -22,14 +24,14 @@ public BiomeChunkImpl(SeededVector worldOrigin, PipelineImpl pipeline) { this.chunkOriginArrayIndex = pipeline.getChunkOriginArrayIndex(); this.worldCoordinateScale = pipeline.getResolution(); - int size = pipeline.getArraySize(); + this.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]; + 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 @@ -43,7 +45,7 @@ public BiomeChunkImpl(SeededVector worldOrigin, PipelineImpl pipeline) { 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), + biomes[(xIndex * size) + zIndex] = pipeline.getSource().get(worldOrigin.seed(), xIndexToWorldCoordinate(xIndex), zIndexToWorldCoordinate(zIndex)); } } @@ -65,7 +67,7 @@ public BiomeChunkImpl(SeededVector worldOrigin, PipelineImpl pipeline) { // 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; + PipelineBiome[] tempArray = biomes; biomes = lookupArray; lookupArray = tempArray; @@ -74,7 +76,7 @@ public BiomeChunkImpl(SeededVector worldOrigin, PipelineImpl pipeline) { 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)); + biomes[(xIndex * size) + zIndex] = stage.apply(new ViewPoint(this, gridInterval, gridX, gridZ, xIndex, zIndex, lookupArray, size)); } } } @@ -133,7 +135,7 @@ private static int calculateGridInterval(int totalExpansions, int expansionsAppl public PipelineBiome get(int xInChunk, int zInChunk) { int xIndex = xInChunk + chunkOriginArrayIndex; int zIndex = zInChunk + chunkOriginArrayIndex; - return biomes[xIndex][zIndex]; + return biomes[(xIndex * size) + zIndex]; } private int xIndexToWorldCoordinate(int xIndex) { @@ -159,10 +161,11 @@ public static class ViewPoint { private final int gridZ; private final int xIndex; private final int zIndex; - private final PipelineBiome[][] lookupArray; + private final PipelineBiome[] lookupArray; + private final int size; private ViewPoint(BiomeChunkImpl chunk, int gridInterval, int gridX, int gridZ, int xIndex, int zIndex, - PipelineBiome[][] lookupArray) { + PipelineBiome[] lookupArray, int size) { this.chunk = chunk; this.gridInterval = gridInterval; this.gridX = gridX; @@ -170,13 +173,14 @@ private ViewPoint(BiomeChunkImpl chunk, int gridInterval, int gridX, int gridZ, this.xIndex = xIndex; this.zIndex = zIndex; this.lookupArray = lookupArray; - this.biome = lookupArray[xIndex][zIndex]; + this.size = size; + this.biome = lookupArray[(this.xIndex * this.size) + this.zIndex]; } public PipelineBiome getRelativeBiome(int x, int z) { int lookupXIndex = this.xIndex + x * gridInterval; int lookupZIndex = this.zIndex + z * gridInterval; - return lookupArray[lookupXIndex][lookupZIndex]; + return lookupArray[(lookupXIndex * this.size) + lookupZIndex]; } public PipelineBiome getBiome() { From 734d4bfb94036caa92874ea33f21db25564cdc75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Mon, 27 Nov 2023 10:16:55 -0700 Subject: [PATCH 025/126] reformat --- .../extrusions/ReplaceExtrusion.java | 8 +-- .../biome/image/v2/ImageBiomeProvider.java | 4 +- .../pipeline/v2/pipeline/BiomeChunkImpl.java | 6 +-- .../terra/config/pack/ConfigPackImpl.java | 49 ++++++++++++------- .../bukkit/nms/v1_19_R1/NMSBiomeInfo.java | 4 +- 5 files changed, 43 insertions(+), 28 deletions(-) diff --git a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/ReplaceExtrusion.java b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/ReplaceExtrusion.java index daa1b12d92..26b1ec4bb8 100644 --- a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/ReplaceExtrusion.java +++ b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/ReplaceExtrusion.java @@ -1,5 +1,9 @@ package com.dfsek.terra.addons.biome.extrusion.extrusions; +import java.util.Collection; +import java.util.function.Predicate; +import java.util.stream.Collectors; + import com.dfsek.terra.addons.biome.extrusion.api.Extrusion; import com.dfsek.terra.addons.biome.extrusion.api.ReplaceableBiome; import com.dfsek.terra.addons.biome.query.api.BiomeQueries; @@ -8,10 +12,6 @@ import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.Biome; -import java.util.Collection; -import java.util.function.Predicate; -import java.util.stream.Collectors; - /** * Sets biomes at locations based on a sampler. 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 8809410c53..073bea70e2 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 @@ -7,13 +7,13 @@ package com.dfsek.terra.addons.biome.image.v2; +import java.util.Optional; + import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import com.dfsek.terra.addons.image.converter.ColorConverter; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import java.util.Optional; - public class ImageBiomeProvider implements BiomeProvider { private final int resolution; diff --git a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java index 6592a6cd87..78b0fe806f 100644 --- a/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java +++ b/common/addons/biome-provider-pipeline-v2/src/main/java/com/dfsek/terra/addons/biome/pipeline/v2/pipeline/BiomeChunkImpl.java @@ -14,9 +14,8 @@ public class BiomeChunkImpl implements BiomeChunk { private final SeededVector worldOrigin; private final int chunkOriginArrayIndex; private final int worldCoordinateScale; - private PipelineBiome[] biomes; - private final int size; + private PipelineBiome[] biomes; public BiomeChunkImpl(SeededVector worldOrigin, PipelineImpl pipeline) { @@ -76,7 +75,8 @@ public BiomeChunkImpl(SeededVector worldOrigin, PipelineImpl pipeline) { for(int gridX = 0; gridX < gridSize; gridX = gridX + 1) { int xIndex = gridOrigin + gridX * gridInterval; int zIndex = gridOrigin + gridZ * gridInterval; - biomes[(xIndex * size) + zIndex] = stage.apply(new ViewPoint(this, gridInterval, gridX, gridZ, xIndex, zIndex, lookupArray, size)); + biomes[(xIndex * size) + zIndex] = stage.apply( + new ViewPoint(this, gridInterval, gridX, gridZ, xIndex, zIndex, lookupArray, size)); } } } 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 06b617cd80..82ec7d95b5 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 @@ -26,6 +26,33 @@ import com.dfsek.tectonic.api.loader.ConfigLoader; import com.dfsek.tectonic.api.loader.type.TypeLoader; import com.dfsek.tectonic.yaml.YamlConfiguration; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.Multimaps; +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; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Supplier; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; @@ -56,28 +83,16 @@ 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.*; +import com.dfsek.terra.config.preprocessor.MetaListLikePreprocessor; +import com.dfsek.terra.config.preprocessor.MetaMapPreprocessor; +import com.dfsek.terra.config.preprocessor.MetaNumberPreprocessor; +import com.dfsek.terra.config.preprocessor.MetaStringPreprocessor; +import com.dfsek.terra.config.preprocessor.MetaValuePreprocessor; import com.dfsek.terra.config.prototype.ProtoConfig; import com.dfsek.terra.registry.CheckedRegistryImpl; import com.dfsek.terra.registry.OpenRegistryImpl; import com.dfsek.terra.registry.ShortcutHolder; -import com.google.common.collect.ListMultimap; -import com.google.common.collect.Multimaps; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.awt.image.BufferedImage; -import java.io.*; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Supplier; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - /** * Represents a Terra configuration pack. diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInfo.java index 02e67dc8d1..31024cf32a 100644 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInfo.java +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInfo.java @@ -1,10 +1,10 @@ package com.dfsek.terra.bukkit.nms.v1_19_R1; -import com.dfsek.terra.api.properties.Properties; - 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 { } From 382069b09497aecc18e91161929c0820750102f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Mon, 27 Nov 2023 11:35:06 -0700 Subject: [PATCH 026/126] Bump Version to 6.4.2 --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index f1156e2f75..0088d805e2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.4.1")) -versionProjects(":common:implementation", version("6.4.1")) -versionProjects(":platforms", version("6.4.1")) +versionProjects(":common:api", version("6.4.2")) +versionProjects(":common:implementation", version("6.4.2")) +versionProjects(":platforms", version("6.4.2")) allprojects { From aecdcd578cdb3e6b592214a58bf8e50e14cd8aeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Mon, 27 Nov 2023 13:35:48 -0700 Subject: [PATCH 027/126] initial 1.20.3 also disable forge. we're not publishing it anyway --- buildSrc/src/main/kotlin/Versions.kt | 19 ++++++++++--------- ...d.gradle.kts => build.gradle.kts.disabled} | 0 platforms/mixin-common/build.gradle.kts | 2 +- .../mod/handle/MinecraftWorldHandle.java | 12 ++++++++++++ .../mixin/access/MobSpawnerLogicAccessor.java | 4 ++-- .../entity/MobSpawnerBlockEntityMixin.java | 2 +- 6 files changed, 26 insertions(+), 13 deletions(-) rename platforms/forge/{build.gradle.kts => build.gradle.kts.disabled} (100%) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 18dbd85fef..28efbc1e65 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -20,7 +20,8 @@ object Versions { } object Fabric { - const val fabricAPI = "0.90.0+${Mod.minecraft}" + // const val fabricAPI = "0.90.0+${Mod.minecraft}" + const val fabricAPI = "0.91.1+1.20.3" } // // object Quilt { @@ -31,20 +32,20 @@ object Versions { object Mod { const val mixin = "0.12.5+mixin.0.8.5" - const val minecraft = "1.20.2" - const val yarn = "$minecraft+build.4" - const val fabricLoader = "0.14.23" + const val minecraft = "1.20.3-pre3" + const val yarn = "$minecraft+build.1" + const val fabricLoader = "0.14.25" const val architecuryLoom = "1.3.357" const val architecturyPlugin = "3.4.146" const val loomVineflower = "1.11.0" } - - object Forge { - const val forge = "${Mod.minecraft}-48.0.13" - const val burningwave = "12.63.0" - } +// +// object Forge { +// const val forge = "${Mod.minecraft}-48.0.13" +// const val burningwave = "12.63.0" +// } object Bukkit { const val paper = "1.18.2-R0.1-SNAPSHOT" diff --git a/platforms/forge/build.gradle.kts b/platforms/forge/build.gradle.kts.disabled similarity index 100% rename from platforms/forge/build.gradle.kts rename to platforms/forge/build.gradle.kts.disabled diff --git a/platforms/mixin-common/build.gradle.kts b/platforms/mixin-common/build.gradle.kts index a6b4e72311..031cd71591 100644 --- a/platforms/mixin-common/build.gradle.kts +++ b/platforms/mixin-common/build.gradle.kts @@ -24,7 +24,7 @@ dependencies { } architectury { - common("fabric", "forge") + common("fabric") minecraft = Versions.Mod.minecraft } 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 52ea52dfa8..5380414176 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 @@ -23,6 +23,8 @@ import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.entity.EntityType; @@ -31,11 +33,21 @@ public class MinecraftWorldHandle implements WorldHandle { + private static final BlockState AIR = (BlockState) Blocks.AIR.getDefaultState(); + private static final Logger logger = LoggerFactory.getLogger(MinecraftWorldHandle.class); + @Override public @NotNull BlockState createBlockState(@NotNull String data) { try { + if(data.equals("minecraft:grass")) { //TODO: remove in 7.0 + data = "minecraft:short_grass"; + logger.warn( + "Translating minecraft:grass to minecraft:short_grass. In 1.20.3 minecraft:grass was renamed to minecraft:short_grass" + + ". You are advised to preform this rename in your config backs as this translation will be removed in the next major " + + "version of Terra."); + } net.minecraft.block.BlockState state = BlockArgumentParser.block(Registries.BLOCK.getReadOnlyWrapper(), data, true) .blockState(); if(state == null) throw new IllegalArgumentException("Invalid data: " + data); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/MobSpawnerLogicAccessor.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/MobSpawnerLogicAccessor.java index 5289cd4274..002b5c25ba 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/MobSpawnerLogicAccessor.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/MobSpawnerLogicAccessor.java @@ -17,8 +17,8 @@ package com.dfsek.terra.mod.mixin.access; -import net.minecraft.world.MobSpawnerEntry; -import net.minecraft.world.MobSpawnerLogic; +import net.minecraft.block.spawner.MobSpawnerEntry; +import net.minecraft.block.spawner.MobSpawnerLogic; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; 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 1b882e5fd5..8004b903f7 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,11 +21,11 @@ import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.block.entity.MobSpawnerBlockEntity; +import net.minecraft.block.spawner.MobSpawnerLogic; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.random.Random; -import net.minecraft.world.MobSpawnerLogic; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; From 913637b0a537ef18e3d52b58f1e2e1f690c71dd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Tue, 5 Dec 2023 18:29:43 -0700 Subject: [PATCH 028/126] update deps --- buildSrc/build.gradle.kts | 6 ++-- buildSrc/src/main/kotlin/DependencyConfig.kt | 10 +++--- buildSrc/src/main/kotlin/Versions.kt | 33 ++++++++++---------- platforms/fabric/build.gradle.kts | 1 - platforms/mixin-common/build.gradle.kts | 1 - platforms/mixin-lifecycle/build.gradle.kts | 1 - 6 files changed, 25 insertions(+), 27 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index eaec594a48..47b630e2f4 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -17,10 +17,10 @@ repositories { dependencies { //TODO Allow pulling from Versions.kt implementation("com.github.johnrengelman", "shadow", "8.1.1") - implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.5.6") + implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.5.10") - implementation("org.ow2.asm", "asm", "9.5") - implementation("org.ow2.asm", "asm-tree", "9.5") + implementation("org.ow2.asm", "asm", "9.6") + implementation("org.ow2.asm", "asm-tree", "9.6") implementation("com.dfsek.tectonic", "common", "4.2.0") implementation("org.yaml", "snakeyaml", "2.2") } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/DependencyConfig.kt b/buildSrc/src/main/kotlin/DependencyConfig.kt index 82b3b206b1..84c5e19e47 100644 --- a/buildSrc/src/main/kotlin/DependencyConfig.kt +++ b/buildSrc/src/main/kotlin/DependencyConfig.kt @@ -54,11 +54,11 @@ fun Project.configureDependencies() { } dependencies { - testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") - testImplementation("org.junit.jupiter:junit-jupiter-engine:5.7.0") - compileOnly("org.jetbrains:annotations:23.0.0") + testImplementation("org.junit.jupiter", "junit-jupiter-api", Versions.Libraries.Internal.junit) + testImplementation("org.junit.jupiter", "junit-jupiter-engine", Versions.Libraries.Internal.junit) + compileOnly("org.jetbrains", "annotations", Versions.Libraries.Internal.jetBrainsAnnotations) - compileOnly("com.google.guava:guava:30.0-jre") - testImplementation("com.google.guava:guava:30.0-jre") + compileOnly("com.google.guava", "guava", Versions.Libraries.Internal.guava) + testImplementation("com.google.guava", "guava", Versions.Libraries.Internal.guava) } } diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 28efbc1e65..34cb058db1 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -11,17 +11,18 @@ object Versions { object Internal { const val shadow = "8.1.1" - const val apacheText = "1.10.0" - const val apacheIO = "2.14.0" + const val apacheText = "1.11.0" + const val apacheIO = "2.15.1" const val guava = "32.1.3-jre" - const val asm = "9.5" + const val asm = "9.6" const val snakeYml = "2.2" + const val jetBrainsAnnotations = "24.1.0" + const val junit = "5.10.1" } } object Fabric { - // const val fabricAPI = "0.90.0+${Mod.minecraft}" - const val fabricAPI = "0.91.1+1.20.3" + const val fabricAPI = "0.91.1+${Mod.minecraft}" } // // object Quilt { @@ -32,12 +33,12 @@ object Versions { object Mod { const val mixin = "0.12.5+mixin.0.8.5" - const val minecraft = "1.20.3-pre3" + const val minecraft = "1.20.3" const val yarn = "$minecraft+build.1" - const val fabricLoader = "0.14.25" + const val fabricLoader = "0.15.0" - const val architecuryLoom = "1.3.357" - const val architecturyPlugin = "3.4.146" + const val architecuryLoom = "1.4.367" + const val architecturyPlugin = "3.4.151" const val loomVineflower = "1.11.0" } @@ -48,14 +49,14 @@ object Versions { // } object Bukkit { - const val paper = "1.18.2-R0.1-SNAPSHOT" - const val paperLib = "1.0.5" + const val paper = "1.18.2-R0.1-20220920.010157-167" + const val paperLib = "1.0.8" const val foliaLib = "0.2.5" const val minecraft = "1.20.2" - const val reflectionRemapper = "0.1.0-SNAPSHOT" - const val paperDevBundle = "1.20.2-R0.1-SNAPSHOT" - const val runPaper = "2.2.0" - const val paperWeight = "1.5.6" + const val reflectionRemapper = "0.1.0" + const val paperDevBundle = "1.20.2-R0.1-20231203.034718-121" + const val runPaper = "2.2.2" + const val paperWeight = "1.5.10" } // @@ -67,6 +68,6 @@ object Versions { // object CLI { const val nbt = "6.1" - const val logback = "1.4.11" + const val logback = "1.4.14" } } \ No newline at end of file diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 3598ae92c5..dba2687289 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -3,7 +3,6 @@ import java.util.* plugins { id("dev.architectury.loom") version Versions.Mod.architecuryLoom id("architectury-plugin") version Versions.Mod.architecturyPlugin - id("io.github.juuxel.loom-vineflower") version Versions.Mod.loomVineflower } architectury { diff --git a/platforms/mixin-common/build.gradle.kts b/platforms/mixin-common/build.gradle.kts index 031cd71591..2fb92233c6 100644 --- a/platforms/mixin-common/build.gradle.kts +++ b/platforms/mixin-common/build.gradle.kts @@ -1,7 +1,6 @@ plugins { id("dev.architectury.loom") version Versions.Mod.architecuryLoom id("architectury-plugin") version Versions.Mod.architecturyPlugin - id("io.github.juuxel.loom-vineflower") version Versions.Mod.loomVineflower } loom { diff --git a/platforms/mixin-lifecycle/build.gradle.kts b/platforms/mixin-lifecycle/build.gradle.kts index 490cdf687a..a4e7004121 100644 --- a/platforms/mixin-lifecycle/build.gradle.kts +++ b/platforms/mixin-lifecycle/build.gradle.kts @@ -1,7 +1,6 @@ plugins { id("dev.architectury.loom") version Versions.Mod.architecuryLoom id("architectury-plugin") version Versions.Mod.architecturyPlugin - id("io.github.juuxel.loom-vineflower") version Versions.Mod.loomVineflower } dependencies { From bc65015af0bf4ce59fd1475d0d0fb128a3c690db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Tue, 5 Dec 2023 18:53:19 -0700 Subject: [PATCH 029/126] update gradle --- gradle/wrapper/gradle-wrapper.jar | Bin 63721 -> 43462 bytes gradle/wrapper/gradle-wrapper.properties | 3 ++- gradlew | 14 +++++++------- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7f93135c49b765f8051ef9d0a6055ff8e46073d8..d64cd4917707c1f8861d8cb53dd15194d4248596 100644 GIT binary patch literal 43462 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 literal 63721 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鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ac72c34e8a..db8c3baafe 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +distributionSha256Sum=9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 0adc8e1a53..1aa94a4269 100755 --- a/gradlew +++ b/gradlew @@ -145,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -153,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -202,11 +202,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ From 3339d08e114e477529a85abee8caac286ba3e4f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB?= Date: Tue, 5 Dec 2023 19:35:23 -0700 Subject: [PATCH 030/126] Create gradle-build.yml --- .github/workflows/gradle-build.yml | 70 ++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 .github/workflows/gradle-build.yml diff --git a/.github/workflows/gradle-build.yml b/.github/workflows/gradle-build.yml new file mode 100644 index 0000000000..462e6dc9d6 --- /dev/null +++ b/.github/workflows/gradle-build.yml @@ -0,0 +1,70 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +# This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created +# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle + +name: Gradle Build + +on: [pull_request] + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + server-id: github # Value of the distributionManagement/repository/id field of the pom.xml + settings-path: ${{ github.workspace }} # location for the settings.xml file + + - name: Gradle Wrapper Validation + uses: gradle/wrapper-validation-action@v1.1.0 + + - uses: burrunan/gradle-cache-action@v1 + name: Build PROJECT_NAME + # Extra environment variables for Gradle execution (regular GitHub Actions feature) + # Note: env must be outside of "with" + env: + VARIABLE: VALUE + with: + # Specifies arguments for Gradle execution + # If arguments is missing or empty, then Gradle is not executed + arguments: build + # arguments can be multi-line for better readability + # arguments: | + # --no-paralell + # build + # -x test + # Gradle version to use for execution: + # wrapper (default), current, rc, nightly, release-nightly, or + # versions like 6.6 (see https://services.gradle.org/versions/all) + gradle-version: wrapper + # Properties are passed as -Pname=value + properties: | + kotlin.js.compiler=ir + kotlin.parallel.tasks.in.project=true + +# - name: Build with Gradle +# uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0 +# with: +# arguments: build + + # The USERNAME and TOKEN need to correspond to the credentials environment variables used in + # the publishing section of your build.gradle +# - name: Publish to GitHub Packages +# uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0 +# with: +# arguments: publish +# env: +# USERNAME: ${{ github.actor }} +# TOKEN: ${{ secrets.GITHUB_TOKEN }} From 601d1747209c6c3db7f7b617e4f3143cf0d5ccf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Tue, 5 Dec 2023 19:43:48 -0700 Subject: [PATCH 031/126] pin versions and remove dead lines --- .github/workflows/gradle-build.yml | 30 ++++-------------------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/.github/workflows/gradle-build.yml b/.github/workflows/gradle-build.yml index 462e6dc9d6..73e2253ed1 100644 --- a/.github/workflows/gradle-build.yml +++ b/.github/workflows/gradle-build.yml @@ -18,24 +18,17 @@ jobs: packages: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93 with: java-version: '17' distribution: 'temurin' server-id: github # Value of the distributionManagement/repository/id field of the pom.xml settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Gradle Wrapper Validation - uses: gradle/wrapper-validation-action@v1.1.0 - - uses: burrunan/gradle-cache-action@v1 + - uses: burrunan/gradle-cache-action@03c71a8ba93d670980695505f48f49daf43704a6 name: Build PROJECT_NAME - # Extra environment variables for Gradle execution (regular GitHub Actions feature) - # Note: env must be outside of "with" - env: - VARIABLE: VALUE with: # Specifies arguments for Gradle execution # If arguments is missing or empty, then Gradle is not executed @@ -52,19 +45,4 @@ jobs: # Properties are passed as -Pname=value properties: | kotlin.js.compiler=ir - kotlin.parallel.tasks.in.project=true - -# - name: Build with Gradle -# uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0 -# with: -# arguments: build - - # The USERNAME and TOKEN need to correspond to the credentials environment variables used in - # the publishing section of your build.gradle -# - name: Publish to GitHub Packages -# uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0 -# with: -# arguments: publish -# env: -# USERNAME: ${{ github.actor }} -# TOKEN: ${{ secrets.GITHUB_TOKEN }} + kotlin.parallel.tasks.in.project=true \ No newline at end of file From e4df8dce1d02500c35f4649ec7c7396f42137a4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Tue, 5 Dec 2023 19:52:12 -0700 Subject: [PATCH 032/126] proper gradle cache --- settings.gradle.kts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/settings.gradle.kts b/settings.gradle.kts index 5791769858..c5bed6f737 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -39,3 +39,12 @@ pluginManagement { } } } + +// settings.gradle.kts +val isCiServer = System.getenv().containsKey("CI") +// Cache build artifacts, so expensive operations do not need to be re-computed +buildCache { + local { + isEnabled = !isCiServer + } +} \ No newline at end of file From b612d1c7aa0f654cc8548e866fcdf036d24a2954 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Tue, 5 Dec 2023 19:52:50 -0700 Subject: [PATCH 033/126] fix name --- .github/workflows/gradle-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle-build.yml b/.github/workflows/gradle-build.yml index 73e2253ed1..0e7edd3457 100644 --- a/.github/workflows/gradle-build.yml +++ b/.github/workflows/gradle-build.yml @@ -28,7 +28,7 @@ jobs: settings-path: ${{ github.workspace }} # location for the settings.xml file - uses: burrunan/gradle-cache-action@03c71a8ba93d670980695505f48f49daf43704a6 - name: Build PROJECT_NAME + name: Build Terra with: # Specifies arguments for Gradle execution # If arguments is missing or empty, then Gradle is not executed From cb9aa4f167d3f75e6df1b7ada45da7839cb84d31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Tue, 5 Dec 2023 19:53:05 -0700 Subject: [PATCH 034/126] fix permissions --- .github/workflows/gradle-build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/gradle-build.yml b/.github/workflows/gradle-build.yml index 0e7edd3457..0a8804cbbf 100644 --- a/.github/workflows/gradle-build.yml +++ b/.github/workflows/gradle-build.yml @@ -15,7 +15,6 @@ jobs: runs-on: ubuntu-latest permissions: contents: read - packages: write steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 From e160cae3d80a1e57a63b274be14d4213f88e88e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Tue, 5 Dec 2023 20:04:08 -0700 Subject: [PATCH 035/126] reformat --- .github/workflows/gradle-build.yml | 56 +++++++++++++++--------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/workflows/gradle-build.yml b/.github/workflows/gradle-build.yml index 0a8804cbbf..3e40fe7be0 100644 --- a/.github/workflows/gradle-build.yml +++ b/.github/workflows/gradle-build.yml @@ -7,7 +7,7 @@ name: Gradle Build -on: [pull_request] +on: [ pull_request ] jobs: build: @@ -17,31 +17,31 @@ jobs: contents: read steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - - name: Set up JDK 17 - uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93 - with: - java-version: '17' - distribution: 'temurin' - server-id: github # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 + - name: Set up JDK 17 + uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93 + with: + java-version: '17' + distribution: 'temurin' + server-id: github # Value of the distributionManagement/repository/id field of the pom.xml + settings-path: ${{ github.workspace }} # location for the settings.xml file - - uses: burrunan/gradle-cache-action@03c71a8ba93d670980695505f48f49daf43704a6 - name: Build Terra - with: - # Specifies arguments for Gradle execution - # If arguments is missing or empty, then Gradle is not executed - arguments: build - # arguments can be multi-line for better readability - # arguments: | - # --no-paralell - # build - # -x test - # Gradle version to use for execution: - # wrapper (default), current, rc, nightly, release-nightly, or - # versions like 6.6 (see https://services.gradle.org/versions/all) - gradle-version: wrapper - # Properties are passed as -Pname=value - properties: | - kotlin.js.compiler=ir - kotlin.parallel.tasks.in.project=true \ No newline at end of file + - uses: burrunan/gradle-cache-action@03c71a8ba93d670980695505f48f49daf43704a6 + name: Build Terra + with: + # Specifies arguments for Gradle execution + # If arguments is missing or empty, then Gradle is not executed + arguments: build + # arguments can be multi-line for better readability + # arguments: | + # --no-paralell + # build + # -x test + # Gradle version to use for execution: + # wrapper (default), current, rc, nightly, release-nightly, or + # versions like 6.6 (see https://services.gradle.org/versions/all) + gradle-version: wrapper + # Properties are passed as -Pname=value + properties: | + kotlin.js.compiler=ir + kotlin.parallel.tasks.in.project=true \ No newline at end of file From e4c3affb9f562560ca90dfdb9e0d8da3a0af3e1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Tue, 5 Dec 2023 20:11:00 -0700 Subject: [PATCH 036/126] pull up version range --- platforms/fabric/src/main/resources/fabric.mod.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json index bfb5727101..1aeadf282b 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -26,9 +26,9 @@ "terra.common.mixins.json" ], "depends": { - "fabricloader": ">=0.14.2", + "fabricloader": ">=0.15.0", "java": ">=17", - "minecraft": "1.20.x", + "minecraft": ">=1.20.3", "fabric": "*" } } \ No newline at end of file From fc0d7374e4c02c38afc07dfa23111a24414890ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Fri, 17 Nov 2023 13:22:10 -0700 Subject: [PATCH 037/126] remove old bukkit versions --- platforms/bukkit/build.gradle.kts | 5 - .../bukkit/nms/v1_18_R2/build.gradle.kts | 17 - .../bukkit/nms/v1_18_R2/AwfulBukkitHacks.java | 115 ------- .../bukkit/nms/v1_18_R2/NMSBiomeInfo.java | 10 - .../bukkit/nms/v1_18_R2/NMSBiomeInjector.java | 79 ----- .../bukkit/nms/v1_18_R2/NMSBiomeProvider.java | 49 --- .../v1_18_R2/NMSChunkGeneratorDelegate.java | 254 --------------- .../bukkit/nms/v1_18_R2/NMSInitializer.java | 15 - .../nms/v1_18_R2/NMSInjectListener.java | 53 ---- .../nms/v1_18_R2/NMSWorldProperties.java | 36 --- .../terra/bukkit/nms/v1_18_R2/Reflection.java | 38 --- .../terra/bukkit/nms/v1_18_R2/Registries.java | 30 -- .../bukkit/nms/v1_19_R1/build.gradle.kts | 17 - .../bukkit/nms/v1_19_R1/AwfulBukkitHacks.java | 116 ------- .../bukkit/nms/v1_19_R1/NMSBiomeInfo.java | 10 - .../bukkit/nms/v1_19_R1/NMSBiomeInjector.java | 79 ----- .../bukkit/nms/v1_19_R1/NMSBiomeProvider.java | 42 --- .../v1_19_R1/NMSChunkGeneratorDelegate.java | 291 ------------------ .../bukkit/nms/v1_19_R1/NMSInitializer.java | 15 - .../nms/v1_19_R1/NMSInjectListener.java | 51 --- .../nms/v1_19_R1/NMSWorldProperties.java | 36 --- .../terra/bukkit/nms/v1_19_R1/Reflection.java | 39 --- .../terra/bukkit/nms/v1_19_R1/Registries.java | 30 -- .../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 | 79 ----- .../bukkit/nms/v1_19_R2/NMSBiomeProvider.java | 42 --- .../v1_19_R2/NMSChunkGeneratorDelegate.java | 174 ----------- .../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 | 24 -- .../bukkit/nms/v1_19_R3/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 | 78 ----- .../bukkit/nms/v1_19_R3/NMSBiomeProvider.java | 49 --- .../v1_19_R3/NMSChunkGeneratorDelegate.java | 171 ---------- .../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 | 24 -- .../bukkit/nms/v1_20_R1/build.gradle.kts | 17 - .../bukkit/nms/v1_20_R1/AwfulBukkitHacks.java | 101 ------ .../bukkit/nms/v1_20_R1/NMSBiomeInfo.java | 10 - .../bukkit/nms/v1_20_R1/NMSBiomeInjector.java | 78 ----- .../bukkit/nms/v1_20_R1/NMSBiomeProvider.java | 49 --- .../v1_20_R1/NMSChunkGeneratorDelegate.java | 171 ---------- .../bukkit/nms/v1_20_R1/NMSInitializer.java | 15 - .../nms/v1_20_R1/NMSInjectListener.java | 48 --- .../nms/v1_20_R1/NMSWorldProperties.java | 36 --- .../terra/bukkit/nms/v1_20_R1/Reflection.java | 52 ---- .../bukkit/nms/v1_20_R1/RegistryFetcher.java | 24 -- 56 files changed, 3226 deletions(-) delete mode 100644 platforms/bukkit/nms/v1_18_R2/build.gradle.kts delete mode 100644 platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/AwfulBukkitHacks.java delete mode 100644 platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInfo.java delete mode 100644 platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java delete mode 100644 platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeProvider.java delete mode 100644 platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSChunkGeneratorDelegate.java delete mode 100644 platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInitializer.java delete mode 100644 platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInjectListener.java delete mode 100644 platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSWorldProperties.java delete mode 100644 platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Reflection.java delete mode 100644 platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Registries.java delete mode 100644 platforms/bukkit/nms/v1_19_R1/build.gradle.kts delete mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java delete mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInfo.java delete mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java delete mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeProvider.java delete mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSChunkGeneratorDelegate.java delete mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInitializer.java delete mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInjectListener.java delete mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSWorldProperties.java delete mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Reflection.java delete mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Registries.java delete mode 100644 platforms/bukkit/nms/v1_19_R2/build.gradle.kts delete mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/AwfulBukkitHacks.java delete mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInfo.java delete mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInjector.java delete mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeProvider.java delete mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSChunkGeneratorDelegate.java delete mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInitializer.java delete mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInjectListener.java delete mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSWorldProperties.java delete mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/Reflection.java delete mode 100644 platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/RegistryFetcher.java delete mode 100644 platforms/bukkit/nms/v1_19_R3/build.gradle.kts delete mode 100644 platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java delete mode 100644 platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java delete mode 100644 platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java delete mode 100644 platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java delete mode 100644 platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java delete mode 100644 platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java delete mode 100644 platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java delete mode 100644 platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java delete mode 100644 platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java delete mode 100644 platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java delete mode 100644 platforms/bukkit/nms/v1_20_R1/build.gradle.kts delete mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/AwfulBukkitHacks.java delete mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeInfo.java delete mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeInjector.java delete mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeProvider.java delete mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSChunkGeneratorDelegate.java delete mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSInitializer.java delete mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSInjectListener.java delete mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSWorldProperties.java delete mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/Reflection.java delete mode 100644 platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/RegistryFetcher.java diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 89df67efcf..68f981e1e3 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -10,11 +10,6 @@ repositories { 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(project(":platforms:bukkit:nms:v1_19_R3", configuration = "reobf")) - shaded(project(":platforms:bukkit:nms:v1_20_R1", configuration = "reobf")) shaded(project(":platforms:bukkit:nms:v1_20_R2", configuration = "reobf")) shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } diff --git a/platforms/bukkit/nms/v1_18_R2/build.gradle.kts b/platforms/bukkit/nms/v1_18_R2/build.gradle.kts deleted file mode 100644 index e3fc99195a..0000000000 --- a/platforms/bukkit/nms/v1_18_R2/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.18.2-R0.1-SNAPSHOT") - implementation("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) -} - -tasks { - assemble { - dependsOn("reobfJar") - } -} \ No newline at end of file diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/AwfulBukkitHacks.java deleted file mode 100644 index bbfae8b2c6..0000000000 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/AwfulBukkitHacks.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_18_R2; - -import com.google.common.collect.ImmutableMap; -import com.mojang.serialization.Lifecycle; -import net.minecraft.core.Holder; -import net.minecraft.core.MappedRegistry; -import net.minecraft.core.Registry; -import net.minecraft.core.WritableRegistry; -import net.minecraft.data.BuiltinRegistries; -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 com.dfsek.terra.bukkit.world.BukkitPlatformBiome; -import com.dfsek.terra.registry.master.ConfigRegistry; - - -public class AwfulBukkitHacks { - private static final Logger LOGGER = LoggerFactory.getLogger(NMSBiomeInjector.class); - private static final Map> terraBiomeMap = new HashMap<>(); - - - public static void registerBiomes(ConfigRegistry configRegistry) { - try { - LOGGER.info("Hacking biome registry..."); - WritableRegistry biomeRegistry = (WritableRegistry) Registries.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, - biomeRegistry.get(vanillaMinecraftKey) // get - ); - - ResourceKey delegateKey = ResourceKey.create(Registry.BIOME_REGISTRY, new ResourceLocation("terra", - NMSBiomeInjector.createBiomeID( - pack, key))); - - BuiltinRegistries.register(BuiltinRegistries.BIOME, delegateKey, platform); - biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); - 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.unwrapKey() - .orElseThrow() - .location() + - " (vanilla for " + - 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(); // clearTags - biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); // populateTags - - } catch(SecurityException | IllegalArgumentException exception) { - throw new RuntimeException(exception); - } - } -} diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInfo.java deleted file mode 100644 index 7e04ef1783..0000000000 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInfo.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_18_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_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java deleted file mode 100644 index f56c32b5bb..0000000000 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_18_R2; - -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSpecialEffects; - -import java.util.Locale; -import java.util.Objects; -import java.util.Optional; - -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; - - -public class NMSBiomeInjector { - - public static Optional> getEntry(Registry registry, ResourceLocation identifier) { - return registry.getOptional(identifier) - .flatMap(registry::getResourceKey) - .map(registry::getOrCreateHolder); - } - - 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 - - - builder.biomeCategory(Reflection.BIOME.getBiomeCategory(vanilla)) - .precipitation(vanilla.getPrecipitation()) // getPrecipitation - .mobSpawnSettings(vanilla.getMobSettings()) - .generationSettings(vanilla.getGenerationSettings()) - .temperature(vanilla.getBaseTemperature()) - .downfall(vanilla.getDownfall()); - - - 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 { - 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(); // 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_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeProvider.java deleted file mode 100644 index 9fb99f13fb..0000000000 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeProvider.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_18_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 BiomeSource vanilla; - private final long seed; - private final Registry biomeRegistry = Registries.biomeRegistry(); - - public NMSBiomeProvider(BiomeProvider delegate, BiomeSource vanilla, long seed) { - super(delegate.stream() - .map(biome -> Registries.biomeRegistry() - .getOrCreateHolder(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() - .get(NMSBiomeInfo.class) - .biomeKey()))); - this.delegate = delegate; - this.vanilla = vanilla; - this.seed = seed; - } - - @Override - protected Codec codec() { - return BiomeSource.CODEC; - } - - @Override - public @NotNull BiomeSource withSeed(long seed) { - return new NMSBiomeProvider(delegate, vanilla, seed); - } - - @Override - public @NotNull Holder getNoiseBiome(int x, int y, int z, @NotNull Sampler sampler) { - return biomeRegistry.getOrCreateHolder(((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed).getPlatformBiome()) - .getContext() - .get(NMSBiomeInfo.class) - .biomeKey()); - } -} diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSChunkGeneratorDelegate.java deleted file mode 100644 index 905867b62b..0000000000 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSChunkGeneratorDelegate.java +++ /dev/null @@ -1,254 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_18_R2; - -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.Codec; -import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; -import net.minecraft.core.SectionPos; -import net.minecraft.server.level.WorldGenRegion; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.NoiseColumn; -import net.minecraft.world.level.StructureFeatureManager; -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.biome.Climate; -import net.minecraft.world.level.biome.Climate.Sampler; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.blending.Blender; -import net.minecraft.world.level.levelgen.structure.StructureSet; -import net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement; -import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement; -import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Random; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; -import java.util.stream.Collectors; - -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.util.MathUtil; -import com.dfsek.terra.api.util.generic.Lazy; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import com.dfsek.terra.api.world.info.WorldProperties; - - -public class NMSChunkGeneratorDelegate extends ChunkGenerator { - private static final Logger LOGGER = LoggerFactory.getLogger(NMSChunkGeneratorDelegate.class); - private static final Lazy> EMPTY = Lazy.lazy(List::of); - private final NMSBiomeProvider biomeSource; - private final com.dfsek.terra.api.world.chunk.generation.ChunkGenerator delegate; - private final ChunkGenerator vanilla; - private final ConfigPack pack; - private final long seed; - private final Map>> ringPositions = new Object2ObjectArrayMap<>(); - private volatile boolean rings = false; - - public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, long seed) { - super(Registries.structureSet(), Optional.empty(), biomeProvider, biomeProvider, seed); - this.delegate = pack.getGeneratorProvider().newInstance(pack); - this.vanilla = vanilla; - this.biomeSource = biomeProvider; - this.pack = pack; - this.seed = seed; - } - - @Override - public void applyCarvers(@NotNull WorldGenRegion chunkRegion, long seed, @NotNull BiomeManager biomeAccess, - @NotNull StructureFeatureManager structureAccessor, - @NotNull ChunkAccess chunk, GenerationStep.@NotNull Carving generationStep) { - // no-op - } - - @Override - public void applyBiomeDecoration(@NotNull WorldGenLevel world, @NotNull ChunkAccess chunk, - @NotNull StructureFeatureManager structureAccessor) { - vanilla.applyBiomeDecoration(world, chunk, structureAccessor); - } - - @Override - public int getSeaLevel() { - return vanilla.getSeaLevel(); - } - - @Override - public @NotNull CompletableFuture fillFromNoise(@NotNull Executor executor, @NotNull Blender blender, - @NotNull StructureFeatureManager structureAccessor, - @NotNull ChunkAccess chunk) { - return vanilla.fillFromNoise(executor, blender, structureAccessor, chunk); - } - - @Override - public void buildSurface(@NotNull WorldGenRegion region, @NotNull StructureFeatureManager structures, @NotNull ChunkAccess chunk) { - // no-op - } - - @Override - protected @NotNull Codec codec() { - return ChunkGenerator.CODEC; - } - - @Override - public @NotNull NoiseColumn getBaseColumn(int x, int z, LevelHeightAccessor height) { - /* - BlockState[] array = new BlockState[height.getHeight()]; - WorldProperties properties = new NMSWorldProperties(seed, height); - 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, height); - } - - @Override // withSeed - public @NotNull ChunkGenerator withSeed(long seed) { - return new NMSChunkGeneratorDelegate(vanilla, pack, biomeSource, seed); - } - - @Override - public void spawnOriginalMobs(@NotNull WorldGenRegion regionlimitedworldaccess) { - vanilla.spawnOriginalMobs(regionlimitedworldaccess); - } - - @Override - public int getGenDepth() { - return vanilla.getGenDepth(); - } - - @Override - public @NotNull Sampler climateSampler() { - return Climate.empty(); - } - - @Override - public int getMinY() { - return vanilla.getMinY(); - } - - @Override - public int getBaseHeight(int x, int z, Heightmap.@NotNull Types heightmap, @NotNull LevelHeightAccessor world) { - 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; - } - - @Nullable - @Override - public List getRingPositionsFor(@NotNull ConcentricRingsStructurePlacement concentricringsstructureplacement) { - ensureStructuresGenerated(); - return ringPositions.getOrDefault(concentricringsstructureplacement, EMPTY).value(); - } - - @Override - public synchronized void ensureStructuresGenerated() { - if(!this.rings) { - super.ensureStructuresGenerated(); - this.populateStrongholdData(); - this.rings = true; - } - } - - private void populateStrongholdData() { - LOGGER.info("Generating safe stronghold data. This may take up to a minute."); - Set> set = this.runtimeBiomeSource.possibleBiomes(); - possibleStructureSets().map(Holder::value).forEach((holder) -> { // we dont need the spigot crap because it doesnt touch concentric. - StructurePlacement structureplacement = holder.placement(); - if(structureplacement instanceof ConcentricRingsStructurePlacement concentricringsstructureplacement) { - if(holder.structures().stream().anyMatch((structureset_a1) -> structureset_a1.generatesInMatchingBiome(set::contains))) { - this.ringPositions.put(concentricringsstructureplacement, - Lazy.lazy(() -> this.generateRingPositions(holder, concentricringsstructureplacement))); - } - } - }); - } - - private List generateRingPositions(StructureSet holder, - ConcentricRingsStructurePlacement concentricringsstructureplacement) { // Spigot - if(concentricringsstructureplacement.count() == 0) { - return List.of(); - } - - List list = new ArrayList<>(); - Set> set = holder - .structures() - .stream() - .flatMap((structureset_a) -> structureset_a.structure().value().biomes().stream()) - .collect(Collectors.toSet()); - int i = concentricringsstructureplacement.distance(); - int j = concentricringsstructureplacement.count(); - int k = concentricringsstructureplacement.spread(); - Random random = new Random(); - - // Paper start - if(this.conf.strongholdSeed != null && this.structureSets.getResourceKey(holder).orElse(null) == - net.minecraft.world.level.levelgen.structure.BuiltinStructureSets.STRONGHOLDS) { - random.setSeed(this.conf.strongholdSeed); - } else { - // Paper end - random.setSeed(this.ringPlacementSeed); - } // Paper - double d0 = random.nextDouble() * 3.141592653589793D * 2.0D; - int l = 0; - int i1 = 0; - - for(int j1 = 0; j1 < j; ++j1) { - double d1 = (double) (4 * i + i * i1 * 6) + (random.nextDouble() - 0.5D) * (double) i * 2.5D; - int k1 = (int) Math.round(MathUtil.cos(d0) * d1); - int l1 = (int) Math.round(MathUtil.sin(d0) * d1); - int i2 = SectionPos.sectionToBlockCoord(k1, 8); - int j2 = SectionPos.sectionToBlockCoord(l1, 8); - - Objects.requireNonNull(set); - Pair> pair = this.biomeSource.findBiomeHorizontal(i2, 0, j2, 112, set::contains, random, - this.climateSampler()); - - if(pair != null) { - BlockPos blockposition = pair.getFirst(); - - k1 = SectionPos.blockToSectionCoord(blockposition.getX()); - l1 = SectionPos.blockToSectionCoord(blockposition.getZ()); - } - - list.add(new ChunkPos(k1, l1)); - d0 += 6.283185307179586D / (double) k; - ++l; - if(l == k) { - ++i1; - l = 0; - k += 2 * k / (i1 + 1); - k = Math.min(k, j - j1); - d0 += random.nextDouble() * 3.141592653589793D * 2.0D; - } - } - - return list; - } - - @Override - public void addDebugScreenInfo(@NotNull List arg0, @NotNull BlockPos arg1) { - - } -} diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInitializer.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInitializer.java deleted file mode 100644 index f724b89f0f..0000000000 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInitializer.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_18_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_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInjectListener.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInjectListener.java deleted file mode 100644 index 9e055524a3..0000000000 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInjectListener.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_18_R2; - -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_18_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(), vanilla.getBiomeSource(), craftWorld.getSeed()); - NMSChunkGeneratorDelegate custom = new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()); - - custom.conf = vanilla.conf; // world config from Spigot - - serverWorld.getChunkSource().chunkMap.generator = custom; - - LOGGER.info("Successfully injected into world."); - - serverWorld.getChunkSource().chunkMap.generator.ensureStructuresGenerated(); // generate stronghold data now - - INJECT_LOCK.unlock(); - } - } -} diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSWorldProperties.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSWorldProperties.java deleted file mode 100644 index 875dc03307..0000000000 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSWorldProperties.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_18_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_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Reflection.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Reflection.java deleted file mode 100644 index c6e3351a12..0000000000 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Reflection.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_18_R2; - -import net.minecraft.core.MappedRegistry; -import net.minecraft.world.level.biome.Biome; -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 BiomeProxy BIOME; - - static { - ReflectionRemapper reflectionRemapper = ReflectionRemapper.forReobfMappingsInPaperJar(); - ReflectionProxyFactory reflectionProxyFactory = ReflectionProxyFactory.create(reflectionRemapper, - Reflection.class.getClassLoader()); - - MAPPED_REGISTRY = reflectionProxyFactory.reflectionProxy(MappedRegistryProxy.class); - BIOME = reflectionProxyFactory.reflectionProxy(BiomeProxy.class); - } - - - @Proxies(MappedRegistry.class) - public interface MappedRegistryProxy { - @FieldSetter("frozen") - void setFrozen(MappedRegistry instance, boolean frozen); - } - - - @Proxies(Biome.class) - public interface BiomeProxy { - @FieldGetter("biomeCategory") - Biome.BiomeCategory getBiomeCategory(Biome instance); - } -} diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Registries.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Registries.java deleted file mode 100644 index 652d77cab3..0000000000 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Registries.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_18_R2; - -import net.minecraft.core.Registry; -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_18_R2.CraftServer; - - -public class Registries { - private static Registry getRegistry(ResourceKey> key) { - CraftServer craftserver = (CraftServer) Bukkit.getServer(); - DedicatedServer dedicatedserver = craftserver.getServer(); - return dedicatedserver - .registryAccess() - .registryOrThrow( // getRegistry - key - ); - } - - public static Registry biomeRegistry() { - return getRegistry(Registry.BIOME_REGISTRY); - } - - public static Registry structureSet() { - return getRegistry(Registry.STRUCTURE_SET_REGISTRY); - } -} diff --git a/platforms/bukkit/nms/v1_19_R1/build.gradle.kts b/platforms/bukkit/nms/v1_19_R1/build.gradle.kts deleted file mode 100644 index 9b301aa706..0000000000 --- a/platforms/bukkit/nms/v1_19_R1/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-R0.1-SNAPSHOT") - implementation("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) -} - -tasks { - assemble { - dependsOn("reobfJar") - } -} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java deleted file mode 100644 index 92506d834d..0000000000 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R1; - -import com.google.common.collect.ImmutableMap; -import com.mojang.serialization.Lifecycle; -import net.minecraft.core.Holder; -import net.minecraft.core.MappedRegistry; -import net.minecraft.core.Registry; -import net.minecraft.core.WritableRegistry; -import net.minecraft.data.BuiltinRegistries; -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) Registries.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)) // get - ); - - ResourceKey delegateKey = ResourceKey.create(Registry.BIOME_REGISTRY, - new ResourceLocation("terra", - NMSBiomeInjector.createBiomeID(pack, key))); - - BuiltinRegistries.register(BuiltinRegistries.BIOME, delegateKey, platform); - biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); - 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.unwrapKey() - .orElseThrow() - .location() + - " (vanilla for " + - 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_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInfo.java deleted file mode 100644 index 02e67dc8d1..0000000000 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInfo.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R1; - -import com.dfsek.terra.api.properties.Properties; - -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.biome.Biome; - - -public record NMSBiomeInfo(ResourceKey biomeKey) implements Properties { -} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java deleted file mode 100644 index 39a66e468e..0000000000 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R1; - -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSpecialEffects; - -import java.util.Locale; -import java.util.Objects; -import java.util.Optional; - -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; - - -public class NMSBiomeInjector { - - public static Optional> getEntry(Registry registry, ResourceLocation identifier) { - return registry.getOptional(identifier) - .flatMap(registry::getResourceKey) - .map(registry::getOrCreateHolderOrThrow); - } - - 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_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeProvider.java deleted file mode 100644 index ee7a054434..0000000000 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeProvider.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R1; - -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 = Registries.biomeRegistry(); - - public NMSBiomeProvider(BiomeProvider delegate, long seed) { - super(delegate.stream() - .map(biome -> Registries.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_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 deleted file mode 100644 index 6e374ff8b4..0000000000 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSChunkGeneratorDelegate.java +++ /dev/null @@ -1,291 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R1; - -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.Codec; -import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; -import net.minecraft.core.HolderSet; -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.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 net.minecraft.world.level.levelgen.structure.Structure; -import net.minecraft.world.level.levelgen.structure.StructureSet; -import net.minecraft.world.level.levelgen.structure.StructureSet.StructureSelectionEntry; -import net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement; -import org.bukkit.craftbukkit.v1_19_R1.block.data.CraftBlockData; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; -import java.util.stream.Stream; - -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.util.MathUtil; -import com.dfsek.terra.api.util.generic.Lazy; -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; - private final Map>> ringPositions = new Object2ObjectArrayMap<>(); - private volatile boolean rings = false; - - public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, long seed) { - super(Registries.structureSet(), Optional.empty(), 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) { - - } - - @Override - public void ensureStructuresGenerated(@NotNull RandomState noiseConfig) { - if(!this.rings) { - super.ensureStructuresGenerated(noiseConfig); - this.populateStrongholdData(noiseConfig); - this.rings = true; - } - - } - - @Override - public List getRingPositionsFor(@NotNull ConcentricRingsStructurePlacement structurePlacement, - @NotNull RandomState noiseConfig) { - ensureStructuresGenerated(noiseConfig); - return ringPositions.get(structurePlacement).value(); - } - - private void populateStrongholdData(RandomState noiseConfig) { - LOGGER.info("Generating safe stronghold data. This may take up to a minute."); - Set> set = this.biomeSource.possibleBiomes(); - possibleStructureSets().map(Holder::value).forEach((holder) -> { - boolean match = false; - for(StructureSelectionEntry structureset_a : holder.structures()) { - Structure structure = structureset_a.structure().value(); - Stream> stream = structure.biomes().stream(); - if(stream.anyMatch(set::contains)) { - match = true; - } - } - - if(match) { - if(holder.placement() instanceof ConcentricRingsStructurePlacement concentricringsstructureplacement) { - this.ringPositions.put(concentricringsstructureplacement, Lazy.lazy( - () -> this.generateRingPositions(holder, noiseConfig, concentricringsstructureplacement))); - } - } - }); - } - - private List generateRingPositions(StructureSet holder, RandomState randomstate, - ConcentricRingsStructurePlacement concentricringsstructureplacement) { // Spigot - if(concentricringsstructureplacement.count() == 0) { - return List.of(); - } - - List list = new ArrayList<>(); - int i = concentricringsstructureplacement.distance(); - int j = concentricringsstructureplacement.count(); - int k = concentricringsstructureplacement.spread(); - HolderSet holderset = concentricringsstructureplacement.preferredBiomes(); - RandomSource randomsource = RandomSource.create(); - - if(this.conf.strongholdSeed != null && this.structureSets.getResourceKey(holder).orElse(null) == - net.minecraft.world.level.levelgen.structure.BuiltinStructureSets.STRONGHOLDS) { - randomsource.setSeed(this.conf.strongholdSeed); - } else { - randomsource.setSeed(randomstate.legacyLevelSeed()); - } - double d0 = randomsource.nextDouble() * 3.141592653589793D * 2.0D; - int l = 0; - int i1 = 0; - - for(int j1 = 0; j1 < j; ++j1) { - double d1 = (double) (4 * i + i * i1 * 6) + (randomsource.nextDouble() - 0.5D) * (double) i * 2.5D; - int k1 = (int) Math.round(MathUtil.cos(d0) * d1); - int l1 = (int) Math.round(MathUtil.sin(d0) * d1); - int i2 = SectionPos.sectionToBlockCoord(k1, 8); - int j2 = SectionPos.sectionToBlockCoord(l1, 8); - - Objects.requireNonNull(holderset); - Pair> pair = this.biomeSource.findBiomeHorizontal(i2, 0, j2, 112, holderset::contains, randomsource, - randomstate.sampler()); - - if(pair != null) { - BlockPos blockposition = pair.getFirst(); - - k1 = SectionPos.blockToSectionCoord(blockposition.getX()); - l1 = SectionPos.blockToSectionCoord(blockposition.getZ()); - } - - list.add(new ChunkPos(k1, l1)); - d0 += 6.283185307179586D / (double) k; - ++l; - if(l == k) { - ++i1; - l = 0; - k += 2 * k / (i1 + 1); - k = Math.min(k, j - j1); - d0 += randomsource.nextDouble() * 3.141592653589793D * 2.0D; - } - } - - return list; - } -} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInitializer.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInitializer.java deleted file mode 100644 index 82a293cd19..0000000000 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInitializer.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R1; - -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_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInjectListener.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInjectListener.java deleted file mode 100644 index 0f11f700d2..0000000000 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInjectListener.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R1; - -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_19_R1.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()); - NMSChunkGeneratorDelegate custom = new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()); - - custom.conf = vanilla.conf; // world config from Spigot - - serverWorld.getChunkSource().chunkMap.generator = custom; - - LOGGER.info("Successfully injected into world."); - - INJECT_LOCK.unlock(); - } - } -} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSWorldProperties.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSWorldProperties.java deleted file mode 100644 index 9348ca0478..0000000000 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSWorldProperties.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R1; - -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_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 deleted file mode 100644 index 84263a6677..0000000000 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Reflection.java +++ /dev/null @@ -1,39 +0,0 @@ -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(); - ReflectionProxyFactory reflectionProxyFactory = ReflectionProxyFactory.create(reflectionRemapper, - Reflection.class.getClassLoader()); - - MAPPED_REGISTRY = reflectionProxyFactory.reflectionProxy(MappedRegistryProxy.class); - STRUCTURE_MANAGER = reflectionProxyFactory.reflectionProxy(StructureManagerProxy.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); - } -} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Registries.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Registries.java deleted file mode 100644 index 1ff9641062..0000000000 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Registries.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R1; - -import net.minecraft.core.Registry; -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_R1.CraftServer; - - -public class Registries { - private static Registry getRegistry(ResourceKey> key) { - CraftServer craftserver = (CraftServer) Bukkit.getServer(); - DedicatedServer dedicatedserver = craftserver.getServer(); - return dedicatedserver - .registryAccess() - .registryOrThrow( // getRegistry - key - ); - } - - public static Registry biomeRegistry() { - return getRegistry(Registry.BIOME_REGISTRY); - } - - public static Registry structureSet() { - return getRegistry(Registry.STRUCTURE_SET_REGISTRY); - } -} diff --git a/platforms/bukkit/nms/v1_19_R2/build.gradle.kts b/platforms/bukkit/nms/v1_19_R2/build.gradle.kts deleted file mode 100644 index c6f6d82059..0000000000 --- a/platforms/bukkit/nms/v1_19_R2/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.3-R0.1-SNAPSHOT") - implementation("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) -} - -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 deleted file mode 100644 index 725f2fb1a1..0000000000 --- a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/AwfulBukkitHacks.java +++ /dev/null @@ -1,100 +0,0 @@ -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 deleted file mode 100644 index 639c9eaedd..0000000000 --- a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInfo.java +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 0b8c36a502..0000000000 --- a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeInjector.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R2; - -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSpecialEffects; - -import java.util.Locale; -import java.util.Objects; -import java.util.Optional; - -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; - - -public class NMSBiomeInjector { - - public static Optional> getEntry(Registry registry, ResourceLocation identifier) { - return registry.getOptional(identifier) - .flatMap(registry::getResourceKey) - .flatMap(registry::getHolder); - } - - public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) - throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { - Biome.BiomeBuilder builder = new Biome.BiomeBuilder(); - - builder - .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 deleted file mode 100644 index 4e4b9f1c5d..0000000000 --- a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSBiomeProvider.java +++ /dev/null @@ -1,42 +0,0 @@ -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 deleted file mode 100644 index 9059326cae..0000000000 --- a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSChunkGeneratorDelegate.java +++ /dev/null @@ -1,174 +0,0 @@ -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 deleted file mode 100644 index 05814cfd4d..0000000000 --- a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInitializer.java +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index 6ce184da05..0000000000 --- a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSInjectListener.java +++ /dev/null @@ -1,48 +0,0 @@ -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 deleted file mode 100644 index 9e1989451a..0000000000 --- a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/NMSWorldProperties.java +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index d0f9332583..0000000000 --- a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/Reflection.java +++ /dev/null @@ -1,52 +0,0 @@ -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; - - -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 deleted file mode 100644 index ed353eafc1..0000000000 --- a/platforms/bukkit/nms/v1_19_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R2/RegistryFetcher.java +++ /dev/null @@ -1,24 +0,0 @@ -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 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); - } -} diff --git a/platforms/bukkit/nms/v1_19_R3/build.gradle.kts b/platforms/bukkit/nms/v1_19_R3/build.gradle.kts deleted file mode 100644 index 4b2ad7d637..0000000000 --- a/platforms/bukkit/nms/v1_19_R3/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", Versions.Bukkit.reflectionRemapper) -} - -tasks { - assemble { - dependsOn("reobfJar") - } -} \ No newline at end of file diff --git a/platforms/bukkit/nms/v1_19_R3/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 deleted file mode 100644 index b2ac9d28b2..0000000000 --- a/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java +++ /dev/null @@ -1,101 +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); - } - } -} - diff --git a/platforms/bukkit/nms/v1_19_R3/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 deleted file mode 100644 index 816d96068d..0000000000 --- a/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInfo.java +++ /dev/null @@ -1,10 +0,0 @@ -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_19_R3/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 deleted file mode 100644 index 733fd38f4f..0000000000 --- a/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R3; - -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSpecialEffects; - -import java.util.Locale; -import java.util.Objects; -import java.util.Optional; - -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; - - -public class NMSBiomeInjector { - - public static Optional> getEntry(Registry registry, ResourceLocation identifier) { - return registry.getOptional(identifier) - .flatMap(registry::getResourceKey) - .flatMap(registry::getHolder); - } - - public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) - throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { - Biome.BiomeBuilder builder = new Biome.BiomeBuilder(); - - builder - .downfall(vanilla.climateSettings.downfall()) - .temperature(vanilla.getBaseTemperature()) - .mobSpawnSettings(vanilla.getMobSettings()) - .generationSettings(vanilla.getGenerationSettings()); - - - BiomeSpecialEffects.Builder effects = new BiomeSpecialEffects.Builder(); - - effects.grassColorModifier(vanilla.getSpecialEffects().getGrassColorModifier()); - - VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); - - effects.fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor())) - - .waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor())) - - .waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor())) - - .skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor())); - - if(vanillaBiomeProperties.getFoliageColor() == null) { - vanilla.getSpecialEffects().getFoliageColorOverride().ifPresent(effects::foliageColorOverride); - } else { - effects.foliageColorOverride(vanillaBiomeProperties.getFoliageColor()); - } - - if(vanillaBiomeProperties.getGrassColor() == null) { - vanilla.getSpecialEffects().getGrassColorOverride().ifPresent(effects::grassColorOverride); - } else { - // grass - effects.grassColorOverride(vanillaBiomeProperties.getGrassColor()); - } - - vanilla.getAmbientLoop().ifPresent(effects::ambientLoopSound); - vanilla.getAmbientAdditions().ifPresent(effects::ambientAdditionsSound); - vanilla.getAmbientMood().ifPresent(effects::ambientMoodSound); - vanilla.getBackgroundMusic().ifPresent(effects::backgroundMusic); - vanilla.getAmbientParticle().ifPresent(effects::ambientParticle); - - builder.specialEffects(effects.build()); - - return builder.build(); - } - - public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) { - return pack.getID() - .toLowerCase() + "/" + biomeID.getNamespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); - } -} diff --git a/platforms/bukkit/nms/v1_19_R3/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 deleted file mode 100644 index ed5ea15893..0000000000 --- a/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeProvider.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R3; - -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 java.util.stream.Stream; - -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_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 deleted file mode 100644 index c697bd0c19..0000000000 --- a/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSChunkGeneratorDelegate.java +++ /dev/null @@ -1,171 +0,0 @@ -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.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.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(); - 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); - } - - @Override - public void addDebugScreenInfo(@NotNull List text, @NotNull RandomState noiseConfig, @NotNull BlockPos pos) { - - } -} diff --git a/platforms/bukkit/nms/v1_19_R3/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 deleted file mode 100644 index 99797e8ab3..0000000000 --- a/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInitializer.java +++ /dev/null @@ -1,15 +0,0 @@ -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_19_R3/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 deleted file mode 100644 index 78da74f655..0000000000 --- a/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSInjectListener.java +++ /dev/null @@ -1,48 +0,0 @@ -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_19_R3/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 deleted file mode 100644 index 2cda90452f..0000000000 --- a/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSWorldProperties.java +++ /dev/null @@ -1,36 +0,0 @@ -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_19_R3/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 deleted file mode 100644 index 43d362ee66..0000000000 --- a/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/Reflection.java +++ /dev/null @@ -1,52 +0,0 @@ -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; - - -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_R3/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 deleted file mode 100644 index e033491bba..0000000000 --- a/platforms/bukkit/nms/v1_19_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/RegistryFetcher.java +++ /dev/null @@ -1,24 +0,0 @@ -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 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); - } -} diff --git a/platforms/bukkit/nms/v1_20_R1/build.gradle.kts b/platforms/bukkit/nms/v1_20_R1/build.gradle.kts deleted file mode 100644 index c3c0d9809b..0000000000 --- a/platforms/bukkit/nms/v1_20_R1/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.20.1-R0.1-SNAPSHOT") - implementation("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) -} - -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_20_R1/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/AwfulBukkitHacks.java deleted file mode 100644 index 7994a0074d..0000000000 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/AwfulBukkitHacks.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R1; - -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_20_R1/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeInfo.java deleted file mode 100644 index 7d8203ce31..0000000000 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeInfo.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R1; - -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_20_R1/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeInjector.java deleted file mode 100644 index 8c13d05b14..0000000000 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeInjector.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R1; - -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSpecialEffects; - -import java.util.Locale; -import java.util.Objects; -import java.util.Optional; - -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; - - -public class NMSBiomeInjector { - - public static Optional> getEntry(Registry registry, ResourceLocation identifier) { - return registry.getOptional(identifier) - .flatMap(registry::getResourceKey) - .flatMap(registry::getHolder); - } - - public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) - throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { - Biome.BiomeBuilder builder = new Biome.BiomeBuilder(); - - builder - .downfall(vanilla.climateSettings.downfall()) - .temperature(vanilla.getBaseTemperature()) - .mobSpawnSettings(vanilla.getMobSettings()) - .generationSettings(vanilla.getGenerationSettings()); - - - BiomeSpecialEffects.Builder effects = new BiomeSpecialEffects.Builder(); - - effects.grassColorModifier(vanilla.getSpecialEffects().getGrassColorModifier()); - - VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); - - effects.fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor())) - - .waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor())) - - .waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor())) - - .skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor())); - - if(vanillaBiomeProperties.getFoliageColor() == null) { - vanilla.getSpecialEffects().getFoliageColorOverride().ifPresent(effects::foliageColorOverride); - } else { - effects.foliageColorOverride(vanillaBiomeProperties.getFoliageColor()); - } - - if(vanillaBiomeProperties.getGrassColor() == null) { - vanilla.getSpecialEffects().getGrassColorOverride().ifPresent(effects::grassColorOverride); - } else { - // grass - effects.grassColorOverride(vanillaBiomeProperties.getGrassColor()); - } - - vanilla.getAmbientLoop().ifPresent(effects::ambientLoopSound); - vanilla.getAmbientAdditions().ifPresent(effects::ambientAdditionsSound); - vanilla.getAmbientMood().ifPresent(effects::ambientMoodSound); - vanilla.getBackgroundMusic().ifPresent(effects::backgroundMusic); - vanilla.getAmbientParticle().ifPresent(effects::ambientParticle); - - builder.specialEffects(effects.build()); - - return builder.build(); - } - - public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) { - return pack.getID() - .toLowerCase() + "/" + biomeID.getNamespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); - } -} diff --git a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeProvider.java deleted file mode 100644 index 48f0483180..0000000000 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSBiomeProvider.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R1; - -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 java.util.stream.Stream; - -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_20_R1/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSChunkGeneratorDelegate.java deleted file mode 100644 index 565d0cbc4d..0000000000 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSChunkGeneratorDelegate.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R1; - -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.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.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_20_R1.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(); - 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); - } - - @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_20_R1/NMSInitializer.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSInitializer.java deleted file mode 100644 index 6fb689ee78..0000000000 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSInitializer.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R1; - -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_20_R1/NMSInjectListener.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSInjectListener.java deleted file mode 100644 index 3f7c9e060b..0000000000 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSInjectListener.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R1; - -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_20_R1.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_20_R1/NMSWorldProperties.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSWorldProperties.java deleted file mode 100644 index 48effeb5fc..0000000000 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/NMSWorldProperties.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R1; - -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_20_R1/Reflection.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/Reflection.java deleted file mode 100644 index a11dd1b15c..0000000000 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/Reflection.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R1; - -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; - - -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_20_R1/RegistryFetcher.java b/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/RegistryFetcher.java deleted file mode 100644 index c7d77462d3..0000000000 --- a/platforms/bukkit/nms/v1_20_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R1/RegistryFetcher.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R1; - -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 org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_20_R1.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 5048bc8edeefc8c56c96224fead389d544457ec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Wed, 6 Dec 2023 10:52:31 -0700 Subject: [PATCH 038/126] Remove folialib --- buildSrc/src/main/kotlin/Versions.kt | 6 +++--- platforms/bukkit/build.gradle.kts | 1 - platforms/bukkit/common/build.gradle.kts | 4 +--- .../com/dfsek/terra/bukkit/PlatformImpl.java | 4 ++-- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 18 +++++++++++++----- .../com/dfsek/terra/bukkit/util/PaperUtil.java | 6 ++++-- 6 files changed, 23 insertions(+), 16 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 34cb058db1..85ad3361b7 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -49,12 +49,12 @@ object Versions { // } object Bukkit { - const val paper = "1.18.2-R0.1-20220920.010157-167" + const val paperBuild = "1.20.2-R0.1-20231203.034718" + const val paper = "$paperBuild-122" const val paperLib = "1.0.8" - const val foliaLib = "0.2.5" const val minecraft = "1.20.2" const val reflectionRemapper = "0.1.0" - const val paperDevBundle = "1.20.2-R0.1-20231203.034718-121" + const val paperDevBundle = "$paperBuild-121" const val runPaper = "2.2.2" const val paperWeight = "1.5.10" } diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 68f981e1e3..cdbc60d00a 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -17,7 +17,6 @@ dependencies { tasks { shadowJar { relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") - relocate("com.tcoded.folialib", "com.dfsek.terra.lib.folialib") relocate("com.google.common", "com.dfsek.terra.lib.google.common") relocate("org.apache.logging.slf4j", "com.dfsek.terra.lib.slf4j-over-log4j") exclude("org/slf4j/**") diff --git a/platforms/bukkit/common/build.gradle.kts b/platforms/bukkit/common/build.gradle.kts index 1324e038d6..f47415da4c 100644 --- a/platforms/bukkit/common/build.gradle.kts +++ b/platforms/bukkit/common/build.gradle.kts @@ -8,9 +8,7 @@ dependencies { compileOnly("io.papermc.paper", "paper-api", Versions.Bukkit.paper) shadedApi("io.papermc", "paperlib", Versions.Bukkit.paperLib) - // TODO: 2023-11-08 When we drop support for 1.18 and 1.19, we can remove FoliaLib and instead use `RegionScheduler`, - // AsyncScheduler, or GlobalRegionScheduler. - shadedApi("com.tcoded", "FoliaLib", Versions.Bukkit.foliaLib) + shadedApi("com.google.guava", "guava", Versions.Libraries.Internal.guava) shadedApi("cloud.commandframework", "cloud-paper", Versions.Libraries.cloud) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java index 0ef6164d81..45a82c5cbb 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java @@ -84,8 +84,8 @@ public boolean reload() { } @Override - public void runPossiblyUnsafeTask(@NotNull Runnable task) { - plugin.getFoliaLib().getImpl().runAsync(task); + public void runPossiblyUnsafeTask(@NotNull Runnable runnable) { + plugin.getGlobalRegionScheduler().run(plugin, task -> runnable.run()); } @Override diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index dd910d48cd..8c362e908c 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -21,7 +21,8 @@ import cloud.commandframework.bukkit.CloudBukkitCapabilities; import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.paper.PaperCommandManager; -import com.tcoded.folialib.FoliaLib; +import io.papermc.paper.threadedregions.scheduler.AsyncScheduler; +import io.papermc.paper.threadedregions.scheduler.GlobalRegionScheduler; import org.bukkit.Bukkit; import org.bukkit.generator.ChunkGenerator; import org.bukkit.plugin.java.JavaPlugin; @@ -32,6 +33,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.concurrent.TimeUnit; import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.config.ConfigPack; @@ -51,7 +53,9 @@ public class TerraBukkitPlugin extends JavaPlugin { private final PlatformImpl platform = new PlatformImpl(this); private final Map generatorMap = new HashMap<>(); - private final FoliaLib foliaLib = new FoliaLib(this); + private AsyncScheduler asyncScheduler = this.getServer().getAsyncScheduler(); + + private GlobalRegionScheduler globalRegionScheduler = this.getServer().getGlobalRegionScheduler(); @Override public void onEnable() { @@ -159,7 +163,7 @@ private boolean doVersionCheck() { """.strip()); }; runnable.run(); - foliaLib.getImpl().runLaterAsync(runnable, 200L); + asyncScheduler.runDelayed(this, task -> runnable.run(), 200L, TimeUnit.SECONDS); // Bukkit.shutdown(); // we're not *that* evil Bukkit.getPluginManager().disablePlugin(this); return false; @@ -187,7 +191,11 @@ ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, String id) { }), platform.getRawConfigRegistry().getByID(id).orElseThrow(), platform.getWorldHandle().air()); } - public FoliaLib getFoliaLib() { - return foliaLib; + public AsyncScheduler getAsyncScheduler() { + return asyncScheduler; + } + + public GlobalRegionScheduler getGlobalRegionScheduler() { + return globalRegionScheduler; } } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java index 2cde19b1f5..c687fb0002 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java @@ -19,6 +19,8 @@ import io.papermc.lib.PaperLib; +import java.util.concurrent.TimeUnit; + import com.dfsek.terra.bukkit.TerraBukkitPlugin; import static io.papermc.lib.PaperLib.suggestPaper; @@ -26,10 +28,10 @@ public final class PaperUtil { public static void checkPaper(TerraBukkitPlugin plugin) { - plugin.getFoliaLib().getImpl().runLaterAsync(() -> { + plugin.getAsyncScheduler().runDelayed(plugin, task -> { if(!PaperLib.isPaper()) { suggestPaper(plugin); } - }, 100L); + }, 100L, TimeUnit.SECONDS); } } From 80c52870f53ae84b01b9e8514482801ae6a004fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Wed, 6 Dec 2023 12:00:03 -0700 Subject: [PATCH 039/126] add additional spigot warning --- .../main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 8c362e908c..68d3e01ac3 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -120,6 +120,9 @@ private boolean doVersionCheck() { if(!VersionUtil.getSpigotVersionInfo().isSpigot()) logger.error("YOU ARE RUNNING A CRAFTBUKKIT OR BUKKIT SERVER. PLEASE UPGRADE TO PAPER."); + if(!VersionUtil.getSpigotVersionInfo().isPaper()) + logger.error("YOU ARE RUNNING A SPIGOT SERVER. PLEASE UPGRADE TO PAPER."); + if(VersionUtil.getSpigotVersionInfo().isMohist()) { if(System.getProperty("IKnowMohistCausesLotsOfIssuesButIWillUseItAnyways") == null) { Runnable runnable = () -> { // scary big block of text From db8df9741f693e161709b289e2e1bd7a2b4f12e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Wed, 6 Dec 2023 22:22:18 -0700 Subject: [PATCH 040/126] bukkit 1.20.3 --- buildSrc/src/main/kotlin/Versions.kt | 6 +++--- platforms/bukkit/build.gradle.kts | 2 +- .../bukkit/nms/{v1_20_R2 => v1_20_R3}/build.gradle.kts | 0 .../dfsek/terra/bukkit/nms/v1_20_R3}/AwfulBukkitHacks.java | 2 +- .../com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSBiomeInfo.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R3}/NMSBiomeInjector.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R3}/NMSBiomeProvider.java | 2 +- .../bukkit/nms/v1_20_R3}/NMSChunkGeneratorDelegate.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R3}/NMSInitializer.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R3}/NMSInjectListener.java | 2 +- .../terra/bukkit/nms/v1_20_R3}/NMSWorldProperties.java | 2 +- .../com/dfsek/terra/bukkit/nms/v1_20_R3}/Reflection.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R3}/RegistryFetcher.java | 2 +- 13 files changed, 14 insertions(+), 14 deletions(-) rename platforms/bukkit/nms/{v1_20_R2 => v1_20_R3}/build.gradle.kts (100%) rename platforms/bukkit/nms/{v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/AwfulBukkitHacks.java (99%) rename platforms/bukkit/nms/{v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSBiomeInfo.java (83%) rename platforms/bukkit/nms/{v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSBiomeInjector.java (98%) rename platforms/bukkit/nms/{v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSBiomeProvider.java (97%) rename platforms/bukkit/nms/{v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSChunkGeneratorDelegate.java (99%) rename platforms/bukkit/nms/{v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSInitializer.java (90%) rename platforms/bukkit/nms/{v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSInjectListener.java (97%) rename platforms/bukkit/nms/{v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSWorldProperties.java (94%) rename platforms/bukkit/nms/{v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/Reflection.java (97%) rename platforms/bukkit/nms/{v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/RegistryFetcher.java (94%) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 85ad3361b7..a24b1638fa 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -49,12 +49,12 @@ object Versions { // } object Bukkit { - const val paperBuild = "1.20.2-R0.1-20231203.034718" - const val paper = "$paperBuild-122" + const val paperBuild = "1.20.3-R0.1-20231207.043048-3" + const val paper = paperBuild const val paperLib = "1.0.8" const val minecraft = "1.20.2" const val reflectionRemapper = "0.1.0" - const val paperDevBundle = "$paperBuild-121" + const val paperDevBundle = paperBuild const val runPaper = "2.2.2" const val paperWeight = "1.5.10" } diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index cdbc60d00a..6f75b01330 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -10,7 +10,7 @@ repositories { dependencies { shaded(project(":platforms:bukkit:common")) - shaded(project(":platforms:bukkit:nms:v1_20_R2", configuration = "reobf")) + shaded(project(":platforms:bukkit:nms:v1_20_R3", configuration = "reobf")) shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } diff --git a/platforms/bukkit/nms/v1_20_R2/build.gradle.kts b/platforms/bukkit/nms/v1_20_R3/build.gradle.kts similarity index 100% rename from platforms/bukkit/nms/v1_20_R2/build.gradle.kts rename to platforms/bukkit/nms/v1_20_R3/build.gradle.kts diff --git a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/AwfulBukkitHacks.java similarity index 99% rename from platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/AwfulBukkitHacks.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/AwfulBukkitHacks.java index 8023ae4522..fa2cc9907b 100644 --- a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/AwfulBukkitHacks.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R2; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import com.google.common.collect.ImmutableMap; import com.mojang.serialization.Lifecycle; diff --git a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInfo.java similarity index 83% rename from platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSBiomeInfo.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInfo.java index fd415fb208..f47d21c56e 100644 --- a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSBiomeInfo.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInfo.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R2; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; diff --git a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInjector.java similarity index 98% rename from platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSBiomeInjector.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInjector.java index b798ba4b8c..e75b6fc0a6 100644 --- a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInjector.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R2; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import net.minecraft.core.Holder; import net.minecraft.core.Registry; diff --git a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeProvider.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSBiomeProvider.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeProvider.java index 1521a3582e..875a77fb52 100644 --- a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSBiomeProvider.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeProvider.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R2; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import com.mojang.serialization.Codec; import net.minecraft.core.Holder; diff --git a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java similarity index 99% rename from platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSChunkGeneratorDelegate.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java index 8ecc904acc..922974e875 100644 --- a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R2; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import com.mojang.serialization.Codec; import net.minecraft.core.BlockPos; diff --git a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSInitializer.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInitializer.java similarity index 90% rename from platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSInitializer.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInitializer.java index 89cf3b8786..084c5c30a0 100644 --- a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSInitializer.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInitializer.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R2; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import org.bukkit.Bukkit; diff --git a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSInjectListener.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSInjectListener.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java index ace83ddc7d..bcbad11e0e 100644 --- a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R2; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkGenerator; diff --git a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSWorldProperties.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSWorldProperties.java similarity index 94% rename from platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSWorldProperties.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSWorldProperties.java index 441a1847d0..60f6cee46c 100644 --- a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/NMSWorldProperties.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSWorldProperties.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R2; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import net.minecraft.world.level.LevelHeightAccessor; diff --git a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/Reflection.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/Reflection.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/Reflection.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/Reflection.java index da7b5c01d9..32243da54d 100644 --- a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/Reflection.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/Reflection.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R2; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; diff --git a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/RegistryFetcher.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java similarity index 94% rename from platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/RegistryFetcher.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java index 52bec1b1b2..6e38225314 100644 --- a/platforms/bukkit/nms/v1_20_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R2/RegistryFetcher.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R2; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; From 4e5b066b916631a3858fda28cf846ae4211fdec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Wed, 6 Dec 2023 22:24:55 -0700 Subject: [PATCH 041/126] add bukkit grass workaround --- .../terra/bukkit/handles/BukkitWorldHandle.java | 12 ++++++++++++ .../bukkit/common/src/main/resources/plugin.yml | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) 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 d28798518e..7008192322 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 @@ -29,16 +29,28 @@ import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; import com.dfsek.terra.bukkit.world.entity.BukkitEntityType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class BukkitWorldHandle implements WorldHandle { private final BlockState air; + private static final Logger logger = LoggerFactory.getLogger(BukkitWorldHandle.class); + public BukkitWorldHandle() { this.air = BukkitBlockState.newInstance(Material.AIR.createBlockData()); } @Override public synchronized @NotNull BlockState createBlockState(@NotNull String data) { + if(data.equals("minecraft:grass")) { //TODO: remove in 7.0 + data = "minecraft:short_grass"; + logger.warn( + "Translating minecraft:grass to minecraft:short_grass. In 1.20.3 minecraft:grass was renamed to minecraft:short_grass" + + ". You are advised to preform this rename in your config backs as this translation will be removed in the next major " + + "version of Terra."); + } org.bukkit.block.data.BlockData bukkitData = Bukkit.createBlockData( data); // somehow bukkit managed to make this not thread safe! :) return BukkitBlockState.newInstance(bukkitData); diff --git a/platforms/bukkit/common/src/main/resources/plugin.yml b/platforms/bukkit/common/src/main/resources/plugin.yml index d4bfd55340..4db59a81e2 100644 --- a/platforms/bukkit/common/src/main/resources/plugin.yml +++ b/platforms/bukkit/common/src/main/resources/plugin.yml @@ -4,6 +4,6 @@ version: "@VERSION@" load: "STARTUP" author: dfsek website: "@WIKI@" -api-version: "1.13" +api-version: "1.20.3" description: "@DESCRIPTION@" folia-supported: true From 46ca45cb1d5e3a60bd95f6830a5ac76243ef3396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Wed, 6 Dec 2023 22:25:53 -0700 Subject: [PATCH 042/126] fix bukkit build --- .../terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java | 2 +- .../com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java | 2 +- .../com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java index 922974e875..4338dc140c 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java @@ -19,7 +19,7 @@ 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_20_R2.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java index bcbad11e0e..a81e93a3f3 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java @@ -3,7 +3,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_20_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R3.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_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java index 6e38225314..6dbbecbc77 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java @@ -6,7 +6,7 @@ import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.world.level.biome.Biome; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_20_R2.CraftServer; +import org.bukkit.craftbukkit.v1_20_R3.CraftServer; public class RegistryFetcher { From 11b03eb93d9bcb7f21eb9b63d21491832acf8b98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Wed, 6 Dec 2023 22:26:55 -0700 Subject: [PATCH 043/126] actually bump bukkit version --- buildSrc/src/main/kotlin/Versions.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index a24b1638fa..79b5d43dd4 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -49,10 +49,10 @@ object Versions { // } object Bukkit { - const val paperBuild = "1.20.3-R0.1-20231207.043048-3" + const val minecraft = "1.20.3" + const val paperBuild = "$minecraft-R0.1-20231207.043048-3" const val paper = paperBuild const val paperLib = "1.0.8" - const val minecraft = "1.20.2" const val reflectionRemapper = "0.1.0" const val paperDevBundle = paperBuild const val runPaper = "2.2.2" From 0ba0d472e6b69df93fad7ce74a1e01d2f5d869bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Wed, 6 Dec 2023 22:47:35 -0700 Subject: [PATCH 044/126] seems arch loom auto uses vineflower now --- buildSrc/src/main/kotlin/Versions.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 79b5d43dd4..7b711fc868 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -39,9 +39,7 @@ object Versions { const val architecuryLoom = "1.4.367" const val architecturyPlugin = "3.4.151" - - const val loomVineflower = "1.11.0" - } + } // // object Forge { // const val forge = "${Mod.minecraft}-48.0.13" From 554887ab54e15bd2c27c9befe3f1639a9df8d170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Thu, 7 Dec 2023 11:27:06 -0700 Subject: [PATCH 045/126] build fabric against 1.20.4 --- buildSrc/src/main/kotlin/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 7b711fc868..083da4119b 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -33,7 +33,7 @@ object Versions { object Mod { const val mixin = "0.12.5+mixin.0.8.5" - const val minecraft = "1.20.3" + const val minecraft = "1.20.4" const val yarn = "$minecraft+build.1" const val fabricLoader = "0.15.0" From 80438141382fd8838cc2e99a1e89c77cd8cf1c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Thu, 7 Dec 2023 11:29:19 -0700 Subject: [PATCH 046/126] pull up version range of fabric --- 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 1aeadf282b..46a2c12acd 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -28,7 +28,7 @@ "depends": { "fabricloader": ">=0.15.0", "java": ">=17", - "minecraft": ">=1.20.3", + "minecraft": ">=1.20.4", "fabric": "*" } } \ No newline at end of file From d88e4f1f9bd1ca264f4cbb5f305344600d0954c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Fri, 8 Dec 2023 19:57:05 -0700 Subject: [PATCH 047/126] fix stupid error thank you caffeine mc peeps --- .../terra/block/entity/MobSpawnerBlockEntityMixin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 8004b903f7..bf85dd1599 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 @@ -50,7 +50,7 @@ private MobSpawnerBlockEntityMixin(BlockEntityType type, BlockPos pos, BlockS public abstract MobSpawnerLogic getLogic(); @Shadow - public abstract void setEntityType(net.minecraft.entity.EntityType entityType, Random random); + public abstract void method_46408(net.minecraft.entity.EntityType entityType, Random random); public EntityType terra$getSpawnedType() { return (EntityType) Registries.ENTITY_TYPE.get( @@ -58,7 +58,7 @@ private MobSpawnerBlockEntityMixin(BlockEntityType type, BlockPos pos, BlockS } public void terra$setSpawnedType(@NotNull EntityType creatureType) { - setEntityType((net.minecraft.entity.EntityType) creatureType, world.getRandom()); + method_46408((net.minecraft.entity.EntityType) creatureType, world.getRandom()); } public int terra$getDelay() { From 017876475e94d8d33992b2e98e7d0cc41897a8f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Fri, 8 Dec 2023 22:11:48 -0700 Subject: [PATCH 048/126] Add Vale config to gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 63dda43600..f30f239880 100644 --- a/.gitignore +++ b/.gitignore @@ -249,3 +249,5 @@ nbdist/ platforms/**/run/** +#Vale Config File +platforms/mixin-common/src/main/.vale.ini From 8af299d09cc66a8ce9ed8753a52be03d7bcc8aa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Fri, 8 Dec 2023 22:31:04 -0700 Subject: [PATCH 049/126] fix path of vale ignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f30f239880..8a964f70b2 100644 --- a/.gitignore +++ b/.gitignore @@ -250,4 +250,4 @@ nbdist/ platforms/**/run/** #Vale Config File -platforms/mixin-common/src/main/.vale.ini +**/.vale.ini From 3142c2a4f0c5451afa12a01816b0ba767a487b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Fri, 8 Dec 2023 22:57:01 -0700 Subject: [PATCH 050/126] update paper to 1.20.4 --- buildSrc/src/main/kotlin/Versions.kt | 4 ++-- platforms/bukkit/build.gradle.kts | 2 +- platforms/bukkit/common/src/main/resources/plugin.yml | 2 +- platforms/bukkit/nms/{v1_20_R3 => v1_20_R4}/build.gradle.kts | 0 .../dfsek/terra/bukkit/nms/v1_20_R4}/AwfulBukkitHacks.java | 2 +- .../com/dfsek/terra/bukkit/nms/v1_20_R4}/NMSBiomeInfo.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R4}/NMSBiomeInjector.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R4}/NMSBiomeProvider.java | 2 +- .../terra/bukkit/nms/v1_20_R4}/NMSChunkGeneratorDelegate.java | 2 +- .../com/dfsek/terra/bukkit/nms/v1_20_R4}/NMSInitializer.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R4}/NMSInjectListener.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R4}/NMSWorldProperties.java | 2 +- .../java/com/dfsek/terra/bukkit/nms/v1_20_R4}/Reflection.java | 2 +- .../com/dfsek/terra/bukkit/nms/v1_20_R4}/RegistryFetcher.java | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) rename platforms/bukkit/nms/{v1_20_R3 => v1_20_R4}/build.gradle.kts (100%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4}/AwfulBukkitHacks.java (99%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4}/NMSBiomeInfo.java (83%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4}/NMSBiomeInjector.java (98%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4}/NMSBiomeProvider.java (97%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4}/NMSChunkGeneratorDelegate.java (99%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4}/NMSInitializer.java (90%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4}/NMSInjectListener.java (97%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4}/NMSWorldProperties.java (94%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4}/Reflection.java (97%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4}/RegistryFetcher.java (94%) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 083da4119b..78249fec35 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -47,8 +47,8 @@ object Versions { // } object Bukkit { - const val minecraft = "1.20.3" - const val paperBuild = "$minecraft-R0.1-20231207.043048-3" + const val minecraft = "1.20.4" + const val paperBuild = "$minecraft-R0.1-20231207.202833-1" const val paper = paperBuild const val paperLib = "1.0.8" const val reflectionRemapper = "0.1.0" diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 6f75b01330..45621ad9a4 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -10,7 +10,7 @@ repositories { dependencies { shaded(project(":platforms:bukkit:common")) - shaded(project(":platforms:bukkit:nms:v1_20_R3", configuration = "reobf")) + shaded(project(":platforms:bukkit:nms:v1_20_R4", configuration = "reobf")) shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } diff --git a/platforms/bukkit/common/src/main/resources/plugin.yml b/platforms/bukkit/common/src/main/resources/plugin.yml index 4db59a81e2..8e9b471fa6 100644 --- a/platforms/bukkit/common/src/main/resources/plugin.yml +++ b/platforms/bukkit/common/src/main/resources/plugin.yml @@ -4,6 +4,6 @@ version: "@VERSION@" load: "STARTUP" author: dfsek website: "@WIKI@" -api-version: "1.20.3" +api-version: "1.20.4" description: "@DESCRIPTION@" folia-supported: true diff --git a/platforms/bukkit/nms/v1_20_R3/build.gradle.kts b/platforms/bukkit/nms/v1_20_R4/build.gradle.kts similarity index 100% rename from platforms/bukkit/nms/v1_20_R3/build.gradle.kts rename to platforms/bukkit/nms/v1_20_R4/build.gradle.kts diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/AwfulBukkitHacks.java similarity index 99% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/AwfulBukkitHacks.java rename to platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/AwfulBukkitHacks.java index fa2cc9907b..04dc78db4c 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/AwfulBukkitHacks.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R4; import com.google.common.collect.ImmutableMap; import com.mojang.serialization.Lifecycle; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeInfo.java similarity index 83% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInfo.java rename to platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeInfo.java index f47d21c56e..5f8854d776 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInfo.java +++ b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeInfo.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R4; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeInjector.java similarity index 98% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInjector.java rename to platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeInjector.java index e75b6fc0a6..ed6f560aeb 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeInjector.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R4; import net.minecraft.core.Holder; import net.minecraft.core.Registry; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeProvider.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeProvider.java rename to platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeProvider.java index 875a77fb52..5faeab1cb5 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeProvider.java +++ b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeProvider.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R4; import com.mojang.serialization.Codec; import net.minecraft.core.Holder; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSChunkGeneratorDelegate.java similarity index 99% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java rename to platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSChunkGeneratorDelegate.java index 4338dc140c..f0c6e98e88 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSChunkGeneratorDelegate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R4; import com.mojang.serialization.Codec; import net.minecraft.core.BlockPos; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInitializer.java b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSInitializer.java similarity index 90% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInitializer.java rename to platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSInitializer.java index 084c5c30a0..8ca4a59d0f 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInitializer.java +++ b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSInitializer.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R4; import org.bukkit.Bukkit; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSInjectListener.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java rename to platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSInjectListener.java index a81e93a3f3..8fa4899683 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSInjectListener.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R4; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkGenerator; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSWorldProperties.java b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSWorldProperties.java similarity index 94% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSWorldProperties.java rename to platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSWorldProperties.java index 60f6cee46c..03e84d7d49 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSWorldProperties.java +++ b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSWorldProperties.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R4; import net.minecraft.world.level.LevelHeightAccessor; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/Reflection.java b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/Reflection.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/Reflection.java rename to platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/Reflection.java index 32243da54d..2889527e45 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/Reflection.java +++ b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/Reflection.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R4; import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/RegistryFetcher.java similarity index 94% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java rename to platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/RegistryFetcher.java index 6dbbecbc77..8f73a7db7b 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java +++ b/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/RegistryFetcher.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R4; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; From f9c9789016484bf11f985750ce6510273bbc6c16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sat, 9 Dec 2023 01:16:38 -0700 Subject: [PATCH 051/126] remove unused maven repo --- buildSrc/src/main/kotlin/DependencyConfig.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/buildSrc/src/main/kotlin/DependencyConfig.kt b/buildSrc/src/main/kotlin/DependencyConfig.kt index 84c5e19e47..58bde514ce 100644 --- a/buildSrc/src/main/kotlin/DependencyConfig.kt +++ b/buildSrc/src/main/kotlin/DependencyConfig.kt @@ -48,9 +48,6 @@ fun Project.configureDependencies() { maven("https://jitpack.io") { name = "JitPack" } - maven("https://nexuslite.gcnt.net/repos/other/") { - name = "GCNT" - } } dependencies { From 687ad5db59bbea75b6e39a4413f8be875d1aa471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sat, 9 Dec 2023 14:58:23 -0700 Subject: [PATCH 052/126] Final dep update confirmed working on paper and fabric --- buildSrc/build.gradle.kts | 4 ++-- buildSrc/src/main/kotlin/Versions.kt | 12 +++++++----- common/api/build.gradle.kts | 2 +- platforms/bukkit/build.gradle.kts | 2 +- .../bukkit/common/src/main/resources/plugin.yml | 2 +- .../nms/{v1_20_R4 => v1_20_R3}/build.gradle.kts | 0 .../terra/bukkit/nms/v1_20_R3}/AwfulBukkitHacks.java | 2 +- .../terra/bukkit/nms/v1_20_R3}/NMSBiomeInfo.java | 2 +- .../terra/bukkit/nms/v1_20_R3}/NMSBiomeInjector.java | 2 +- .../terra/bukkit/nms/v1_20_R3}/NMSBiomeProvider.java | 2 +- .../nms/v1_20_R3}/NMSChunkGeneratorDelegate.java | 2 +- .../terra/bukkit/nms/v1_20_R3}/NMSInitializer.java | 2 +- .../bukkit/nms/v1_20_R3}/NMSInjectListener.java | 2 +- .../bukkit/nms/v1_20_R3}/NMSWorldProperties.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R3}/Reflection.java | 2 +- .../terra/bukkit/nms/v1_20_R3}/RegistryFetcher.java | 2 +- platforms/fabric/src/main/resources/fabric.mod.json | 2 +- 17 files changed, 23 insertions(+), 21 deletions(-) rename platforms/bukkit/nms/{v1_20_R4 => v1_20_R3}/build.gradle.kts (100%) rename platforms/bukkit/nms/{v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/AwfulBukkitHacks.java (99%) rename platforms/bukkit/nms/{v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSBiomeInfo.java (83%) rename platforms/bukkit/nms/{v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSBiomeInjector.java (98%) rename platforms/bukkit/nms/{v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSBiomeProvider.java (97%) rename platforms/bukkit/nms/{v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSChunkGeneratorDelegate.java (99%) rename platforms/bukkit/nms/{v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSInitializer.java (90%) rename platforms/bukkit/nms/{v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSInjectListener.java (97%) rename platforms/bukkit/nms/{v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/NMSWorldProperties.java (94%) rename platforms/bukkit/nms/{v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/Reflection.java (97%) rename platforms/bukkit/nms/{v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4 => v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3}/RegistryFetcher.java (94%) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 47b630e2f4..3bdfddef0f 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -17,10 +17,10 @@ repositories { dependencies { //TODO Allow pulling from Versions.kt implementation("com.github.johnrengelman", "shadow", "8.1.1") - implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.5.10") + implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.5.11") implementation("org.ow2.asm", "asm", "9.6") implementation("org.ow2.asm", "asm-tree", "9.6") - implementation("com.dfsek.tectonic", "common", "4.2.0") + implementation("com.dfsek.tectonic", "common", "4.2.1") implementation("org.yaml", "snakeyaml", "2.2") } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 78249fec35..8dc1151f5f 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -6,6 +6,8 @@ object Versions { const val cloud = "1.8.4" + const val caffeine = "3.1.8" + const val slf4j = "2.0.9" const val log4j_slf4j_impl = "2.20.0" @@ -22,7 +24,7 @@ object Versions { } object Fabric { - const val fabricAPI = "0.91.1+${Mod.minecraft}" + const val fabricAPI = "0.91.2+${Mod.minecraft}" } // // object Quilt { @@ -35,9 +37,9 @@ object Versions { const val minecraft = "1.20.4" const val yarn = "$minecraft+build.1" - const val fabricLoader = "0.15.0" + const val fabricLoader = "0.15.1" - const val architecuryLoom = "1.4.367" + const val architecuryLoom = "1.4.369" const val architecturyPlugin = "3.4.151" } // @@ -48,13 +50,13 @@ object Versions { object Bukkit { const val minecraft = "1.20.4" - const val paperBuild = "$minecraft-R0.1-20231207.202833-1" + const val paperBuild = "$minecraft-R0.1-20231209.173338-2" const val paper = paperBuild const val paperLib = "1.0.8" const val reflectionRemapper = "0.1.0" const val paperDevBundle = paperBuild const val runPaper = "2.2.2" - const val paperWeight = "1.5.10" + const val paperWeight = "1.5.11" } // diff --git a/common/api/build.gradle.kts b/common/api/build.gradle.kts index 68a2f0d757..4f88c83e39 100644 --- a/common/api/build.gradle.kts +++ b/common/api/build.gradle.kts @@ -6,6 +6,6 @@ dependencies { api("com.dfsek.tectonic", "common", Versions.Libraries.tectonic) - api("com.github.ben-manes.caffeine:caffeine:3.1.0") + api("com.github.ben-manes.caffeine", "caffeine", Versions.Libraries.caffeine) } \ No newline at end of file diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 45621ad9a4..6f75b01330 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -10,7 +10,7 @@ repositories { dependencies { shaded(project(":platforms:bukkit:common")) - shaded(project(":platforms:bukkit:nms:v1_20_R4", configuration = "reobf")) + shaded(project(":platforms:bukkit:nms:v1_20_R3", configuration = "reobf")) shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } diff --git a/platforms/bukkit/common/src/main/resources/plugin.yml b/platforms/bukkit/common/src/main/resources/plugin.yml index 8e9b471fa6..e965d7deed 100644 --- a/platforms/bukkit/common/src/main/resources/plugin.yml +++ b/platforms/bukkit/common/src/main/resources/plugin.yml @@ -4,6 +4,6 @@ version: "@VERSION@" load: "STARTUP" author: dfsek website: "@WIKI@" -api-version: "1.20.4" +api-version: "1.20" description: "@DESCRIPTION@" folia-supported: true diff --git a/platforms/bukkit/nms/v1_20_R4/build.gradle.kts b/platforms/bukkit/nms/v1_20_R3/build.gradle.kts similarity index 100% rename from platforms/bukkit/nms/v1_20_R4/build.gradle.kts rename to platforms/bukkit/nms/v1_20_R3/build.gradle.kts diff --git a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/AwfulBukkitHacks.java similarity index 99% rename from platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/AwfulBukkitHacks.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/AwfulBukkitHacks.java index 04dc78db4c..fa2cc9907b 100644 --- a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/AwfulBukkitHacks.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R4; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import com.google.common.collect.ImmutableMap; import com.mojang.serialization.Lifecycle; diff --git a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInfo.java similarity index 83% rename from platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeInfo.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInfo.java index 5f8854d776..f47d21c56e 100644 --- a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeInfo.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInfo.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R4; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; diff --git a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInjector.java similarity index 98% rename from platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeInjector.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInjector.java index ed6f560aeb..e75b6fc0a6 100644 --- a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInjector.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R4; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import net.minecraft.core.Holder; import net.minecraft.core.Registry; diff --git a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeProvider.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeProvider.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeProvider.java index 5faeab1cb5..875a77fb52 100644 --- a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSBiomeProvider.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeProvider.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R4; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import com.mojang.serialization.Codec; import net.minecraft.core.Holder; diff --git a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java similarity index 99% rename from platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSChunkGeneratorDelegate.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java index f0c6e98e88..4338dc140c 100644 --- a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R4; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import com.mojang.serialization.Codec; import net.minecraft.core.BlockPos; diff --git a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSInitializer.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInitializer.java similarity index 90% rename from platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSInitializer.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInitializer.java index 8ca4a59d0f..084c5c30a0 100644 --- a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSInitializer.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInitializer.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R4; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import org.bukkit.Bukkit; diff --git a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSInjectListener.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSInjectListener.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java index 8fa4899683..a81e93a3f3 100644 --- a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R4; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkGenerator; diff --git a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSWorldProperties.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSWorldProperties.java similarity index 94% rename from platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSWorldProperties.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSWorldProperties.java index 03e84d7d49..60f6cee46c 100644 --- a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/NMSWorldProperties.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSWorldProperties.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R4; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import net.minecraft.world.level.LevelHeightAccessor; diff --git a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/Reflection.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/Reflection.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/Reflection.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/Reflection.java index 2889527e45..32243da54d 100644 --- a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/Reflection.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/Reflection.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R4; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; diff --git a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/RegistryFetcher.java b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java similarity index 94% rename from platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/RegistryFetcher.java rename to platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java index 8f73a7db7b..6dbbecbc77 100644 --- a/platforms/bukkit/nms/v1_20_R4/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R4/RegistryFetcher.java +++ b/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R4; +package com.dfsek.terra.bukkit.nms.v1_20_R3; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json index 46a2c12acd..8b67c7b547 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -26,7 +26,7 @@ "terra.common.mixins.json" ], "depends": { - "fabricloader": ">=0.15.0", + "fabricloader": ">=0.15.1", "java": ">=17", "minecraft": ">=1.20.4", "fabric": "*" From 1e55074cface27a32c79aed82e1515f7cde24595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sun, 10 Dec 2023 15:46:00 -0700 Subject: [PATCH 053/126] Enforce NMS bindings --- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 7 +++-- .../dfsek/terra/bukkit/nms/Initializer.java | 30 +++++++++++++------ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 68d3e01ac3..bfb89b3cdf 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -63,6 +63,11 @@ public void onEnable() { return; } + if(!Initializer.init(platform)) { + Bukkit.getPluginManager().disablePlugin(this); + return; + } + platform.getEventManager().callEvent(new PlatformInitializationEvent()); @@ -84,8 +89,6 @@ public void onEnable() { Bukkit.getPluginManager().registerEvents(new CommonListener(), this); // Register master event listener PaperUtil.checkPaper(this); - - Initializer.init(platform); } @NotNull diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java index d2ae2f04b8..b53c7fd7a9 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java @@ -1,6 +1,7 @@ package com.dfsek.terra.bukkit.nms; import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,7 +12,7 @@ public interface Initializer { String NMS = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; String TERRA_PACKAGE = Initializer.class.getPackageName(); - static void init(PlatformImpl platform) { + static boolean init(PlatformImpl platform) { Logger logger = LoggerFactory.getLogger(Initializer.class); try { Class initializerClass = Class.forName(TERRA_PACKAGE + "." + NMS + ".NMSInitializer"); @@ -24,16 +25,27 @@ static void init(PlatformImpl platform) { } catch(ClassNotFoundException e) { logger.error("NMS bindings for version {} do not exist. Support for this version is limited.", NMS); logger.error("This is usually due to running Terra on an unsupported Minecraft version."); - logger.error(""); - logger.error(""); - for(int i = 0; i < 20; i++) { - logger.error("PROCEEDING WITH AN EXISTING TERRA WORLD WILL RESULT IN CORRUPTION!!!"); + String bypassKey = "IKnowThereAreNoNMSBindingsFor" + NMS + "ButIWillProceedAnyway"; + if(System.getProperty(bypassKey) == null) { + logger.error("Because of this **TERRA HAS BEEN DISABLED**."); + logger.error("Do not come ask us why it is not working."); + logger.error("If you wish to proceed anyways, you can add the JVM System Property \"{}\" to enable the plugin.", bypassKey); + return false; + } else { + logger.error(""); + logger.error(""); + for(int i = 0; i < 20; i++) { + logger.error("PROCEEDING WITH AN EXISTING TERRA WORLD WILL RESULT IN CORRUPTION!!!"); + } + logger.error(""); + logger.error(""); + logger.error("NMS bindings for version {} do not exist. Support for this version is limited.", NMS); + logger.error("This is usually due to running Terra on an unsupported Minecraft version."); + logger.error("We will not give you any support for issues that may arise."); + logger.error("Since you enabled the \"{}\" flag, we won't disable Terra. But be warned.", bypassKey); } - logger.error(""); - logger.error(""); - logger.error("NMS bindings for version {} do not exist. Support for this version is limited.", NMS); - logger.error("This is usually due to running Terra on an unsupported Minecraft version."); } + return true; } void initialize(PlatformImpl plugin); From 0ad7ee4f9f91d4b517a55e63d22026fc5bb60594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sun, 10 Dec 2023 16:57:27 -0700 Subject: [PATCH 054/126] fix CME --- .../addons/terrascript/script/functions/BlockFunction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java index c4518b47c3..28de644816 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java @@ -10,8 +10,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; @@ -32,7 +32,7 @@ public class BlockFunction implements Function { protected final Returnable x, y, z; protected final Returnable blockData; protected final Platform platform; - private final Map data = new HashMap<>(); + private final Map data = new ConcurrentHashMap<>(); private final Returnable overwrite; private final Returnable physics; private final Position position; From f408faaa80c7aa3def0efbaf27a9e2baf86f1af6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sun, 10 Dec 2023 17:07:18 -0700 Subject: [PATCH 055/126] reformat --- buildSrc/src/main/kotlin/Versions.kt | 2 +- .../java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java | 8 ++++---- .../com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java | 8 +++----- .../main/java/com/dfsek/terra/bukkit/nms/Initializer.java | 1 - 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 8dc1151f5f..16590cef2d 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -41,7 +41,7 @@ object Versions { const val architecuryLoom = "1.4.369" const val architecturyPlugin = "3.4.151" - } + } // // object Forge { // const val forge = "${Mod.minecraft}-48.0.13" diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index bfb89b3cdf..8540f64e5d 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -63,10 +63,10 @@ public void onEnable() { return; } - if(!Initializer.init(platform)) { - Bukkit.getPluginManager().disablePlugin(this); - return; - } + if(!Initializer.init(platform)) { + Bukkit.getPluginManager().disablePlugin(this); + return; + } platform.getEventManager().callEvent(new PlatformInitializationEvent()); 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 7008192322..d49841a7b7 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 @@ -20,6 +20,8 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.Locale; @@ -29,14 +31,10 @@ import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; import com.dfsek.terra.bukkit.world.entity.BukkitEntityType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class BukkitWorldHandle implements WorldHandle { - private final BlockState air; - private static final Logger logger = LoggerFactory.getLogger(BukkitWorldHandle.class); + private final BlockState air; public BukkitWorldHandle() { this.air = BukkitBlockState.newInstance(Material.AIR.createBlockData()); diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java index b53c7fd7a9..413250d57b 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java @@ -1,7 +1,6 @@ package com.dfsek.terra.bukkit.nms; import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 22c46f2f80333a1a5b43a248296c3f13c3b56beb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sun, 10 Dec 2023 17:45:52 -0700 Subject: [PATCH 056/126] Pin OWConfig Version --- buildSrc/src/main/kotlin/DistributionConfig.kt | 2 +- buildSrc/src/main/kotlin/Versions.kt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/DistributionConfig.kt b/buildSrc/src/main/kotlin/DistributionConfig.kt index df003b078d..80e59104e9 100644 --- a/buildSrc/src/main/kotlin/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/DistributionConfig.kt @@ -27,7 +27,7 @@ fun Project.configureDistribution() { group = "terra" doFirst { file("${buildDir}/resources/main/packs/").deleteRecursively() - val defaultPackUrl = URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/latest/default.zip") + val defaultPackUrl = URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/" + Versions.Terra.overworldConfig + "/default.zip") downloadPack(defaultPackUrl, project) } } diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 16590cef2d..a150ac3b26 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -1,4 +1,8 @@ object Versions { + object Terra { + const val overworldConfig = "v1.3.4" + } + object Libraries { const val tectonic = "4.2.1" const val paralithic = "0.7.1" From fc764a0fb3552752e6f3ec6f533f6e7890c45291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sun, 10 Dec 2023 18:40:43 -0700 Subject: [PATCH 057/126] fix issues with spawners and entity parsing --- .../com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java | 7 +++++++ .../com/dfsek/terra/mod/handle/MinecraftWorldHandle.java | 8 ++++++++ .../terra/block/entity/MobSpawnerBlockEntityMixin.java | 8 +++++++- 3 files changed, 22 insertions(+), 1 deletion(-) 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 d49841a7b7..1d8744bcf8 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 @@ -61,6 +61,13 @@ public BukkitWorldHandle() { @Override public @NotNull EntityType getEntity(@NotNull String id) { + if (!id.contains(":")) { //TODO: remove in 7.0 + String newid = "minecraft:" + id.toLowerCase();; + logger.warn( + "Translating " + id + " to " + newid + ". In 1.20.3 entity parsing was reworked" + + ". You are advised to preform this rename in your config backs as this translation will be removed in the next major " + + "version of Terra."); + } if(!id.startsWith("minecraft:")) throw new IllegalArgumentException("Invalid entity identifier " + id); String entityID = id.toUpperCase(Locale.ROOT).substring(10); diff --git a/platforms/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 5380414176..4dfa940ac0 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 @@ -64,6 +64,14 @@ public class MinecraftWorldHandle implements WorldHandle { @Override public @NotNull EntityType getEntity(@NotNull String id) { + if (!id.contains(":")) { //TODO: remove in 7.0 + String newid = "minecraft:" + id.toLowerCase();; + logger.warn( + "Translating " + id + " to " + newid + ". In 1.20.3 entity parsing was reworked" + + ". You are advised to preform this rename in your config backs as this translation will be removed in the next major " + + "version of Terra."); + } + if(!id.startsWith("minecraft:")) throw new IllegalArgumentException("Invalid entity identifier " + id); Identifier identifier = Identifier.tryParse(id); if(identifier == null) identifier = Identifier.tryParse(id); 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 bf85dd1599..ccc8b738a5 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 @@ -58,7 +58,13 @@ private MobSpawnerBlockEntityMixin(BlockEntityType type, BlockPos pos, BlockS } public void terra$setSpawnedType(@NotNull EntityType creatureType) { - method_46408((net.minecraft.entity.EntityType) creatureType, world.getRandom()); + Random rand; + if (hasWorld()) { + rand = world.getRandom(); + } else { + rand = Random.create(); + } + method_46408((net.minecraft.entity.EntityType) creatureType, rand); } public int terra$getDelay() { From 4a83f01c1f0d0129219320e05c20720599cc17b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sun, 10 Dec 2023 18:44:26 -0700 Subject: [PATCH 058/126] fix incase mods are used --- .../java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4dfa940ac0..01cd5ba2a8 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 @@ -71,7 +71,7 @@ public class MinecraftWorldHandle implements WorldHandle { ". You are advised to preform this rename in your config backs as this translation will be removed in the next major " + "version of Terra."); } - if(!id.startsWith("minecraft:")) throw new IllegalArgumentException("Invalid entity identifier " + id); + if(!id.contains(":")) throw new IllegalArgumentException("Invalid entity identifier " + id); Identifier identifier = Identifier.tryParse(id); if(identifier == null) identifier = Identifier.tryParse(id); return (EntityType) Registries.ENTITY_TYPE.get(identifier); From 41045ae8aa7c639d056e7e8a8b528cb778a0b528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sun, 10 Dec 2023 18:47:12 -0700 Subject: [PATCH 059/126] literally forgor the most important part --- .../java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java | 1 + 1 file changed, 1 insertion(+) 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 01cd5ba2a8..c8df3ba84c 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 @@ -70,6 +70,7 @@ public class MinecraftWorldHandle implements WorldHandle { "Translating " + id + " to " + newid + ". In 1.20.3 entity parsing was reworked" + ". You are advised to preform this rename in your config backs as this translation will be removed in the next major " + "version of Terra."); + id = newid; } if(!id.contains(":")) throw new IllegalArgumentException("Invalid entity identifier " + id); Identifier identifier = Identifier.tryParse(id); From 0091e5b78546d3207d5899de799ff45d8ec0a39c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sun, 10 Dec 2023 18:50:40 -0700 Subject: [PATCH 060/126] spell check --- .../java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 c8df3ba84c..bc00f3a125 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 @@ -45,7 +45,7 @@ public class MinecraftWorldHandle implements WorldHandle { data = "minecraft:short_grass"; logger.warn( "Translating minecraft:grass to minecraft:short_grass. In 1.20.3 minecraft:grass was renamed to minecraft:short_grass" + - ". You are advised to preform this rename in your config backs as this translation will be removed in the next major " + + ". You are advised to preform this rename in your config packs as this translation will be removed in the next major " + "version of Terra."); } net.minecraft.block.BlockState state = BlockArgumentParser.block(Registries.BLOCK.getReadOnlyWrapper(), data, true) @@ -68,7 +68,7 @@ public class MinecraftWorldHandle implements WorldHandle { String newid = "minecraft:" + id.toLowerCase();; logger.warn( "Translating " + id + " to " + newid + ". In 1.20.3 entity parsing was reworked" + - ". You are advised to preform this rename in your config backs as this translation will be removed in the next major " + + ". You are advised to preform this rename in your config packs as this translation will be removed in the next major " + "version of Terra."); id = newid; } From fd20837b555293902a15cf634b654d8ea74d51ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sun, 17 Dec 2023 15:29:18 -0700 Subject: [PATCH 061/126] fix error on startup --- .../main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 8540f64e5d..a8701da17e 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -63,14 +63,13 @@ public void onEnable() { return; } + platform.getEventManager().callEvent(new PlatformInitializationEvent()); + if(!Initializer.init(platform)) { Bukkit.getPluginManager().disablePlugin(this); return; } - platform.getEventManager().callEvent(new PlatformInitializationEvent()); - - try { PaperCommandManager commandManager = getCommandSenderPaperCommandManager(); From 3745c3e947c8b1f955e9c934f12ea402ef29907f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sun, 17 Dec 2023 15:32:35 -0700 Subject: [PATCH 062/126] fix typos --- .../com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java | 4 ++-- .../java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java | 4 ++-- 2 files changed, 4 insertions(+), 4 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 1d8744bcf8..e3b92b069d 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 @@ -46,7 +46,7 @@ public BukkitWorldHandle() { data = "minecraft:short_grass"; logger.warn( "Translating minecraft:grass to minecraft:short_grass. In 1.20.3 minecraft:grass was renamed to minecraft:short_grass" + - ". You are advised to preform this rename in your config backs as this translation will be removed in the next major " + + ". You are advised to perform this rename in your config backs as this translation will be removed in the next major " + "version of Terra."); } org.bukkit.block.data.BlockData bukkitData = Bukkit.createBlockData( @@ -65,7 +65,7 @@ public BukkitWorldHandle() { String newid = "minecraft:" + id.toLowerCase();; logger.warn( "Translating " + id + " to " + newid + ". In 1.20.3 entity parsing was reworked" + - ". You are advised to preform this rename in your config backs as this translation will be removed in the next major " + + ". You are advised to perform this rename in your config backs as this translation will be removed in the next major " + "version of Terra."); } if(!id.startsWith("minecraft:")) throw new IllegalArgumentException("Invalid entity identifier " + id); 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 bc00f3a125..3b5e1fe49b 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 @@ -45,7 +45,7 @@ public class MinecraftWorldHandle implements WorldHandle { data = "minecraft:short_grass"; logger.warn( "Translating minecraft:grass to minecraft:short_grass. In 1.20.3 minecraft:grass was renamed to minecraft:short_grass" + - ". You are advised to preform this rename in your config packs as this translation will be removed in the next major " + + ". You are advised to perform this rename in your config packs as this translation will be removed in the next major " + "version of Terra."); } net.minecraft.block.BlockState state = BlockArgumentParser.block(Registries.BLOCK.getReadOnlyWrapper(), data, true) @@ -68,7 +68,7 @@ public class MinecraftWorldHandle implements WorldHandle { String newid = "minecraft:" + id.toLowerCase();; logger.warn( "Translating " + id + " to " + newid + ". In 1.20.3 entity parsing was reworked" + - ". You are advised to preform this rename in your config packs as this translation will be removed in the next major " + + ". You are advised to perform this rename in your config packs as this translation will be removed in the next major " + "version of Terra."); id = newid; } From 84cd96ecf7748cfe82f7048542e6ca4123c65bc4 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 24 Dec 2023 01:53:05 -0700 Subject: [PATCH 063/126] fix BrownianMotionSampler lerp usage --- .../noise/samplers/noise/fractal/BrownianMotionSampler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java index 64f4ede055..bc766c7316 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java @@ -24,7 +24,7 @@ public double getNoiseRaw(long seed, double x, double y) { for(int i = 0; i < octaves; i++) { double noise = input.noise(seed++, x, y); sum += noise * amp; - amp *= MathUtil.lerp(1.0, Math.min(noise + 1, 2) * 0.5, weightedStrength); + amp *= MathUtil.lerp(weightedStrength, 1.0, Math.min(noise + 1, 2) * 0.5); x *= lacunarity; y *= lacunarity; @@ -42,7 +42,7 @@ public double getNoiseRaw(long seed, double x, double y, double z) { for(int i = 0; i < octaves; i++) { double noise = input.noise(seed++, x, y, z); sum += noise * amp; - amp *= MathUtil.lerp(1.0, (noise + 1) * 0.5, weightedStrength); + amp *= MathUtil.lerp(weightedStrength, 1.0, (noise + 1) * 0.5); x *= lacunarity; y *= lacunarity; From 3622003a39d71c9ae792e9fcd79a379117db740c Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 24 Dec 2023 02:02:46 -0700 Subject: [PATCH 064/126] fix other lerp issues --- .../noise/fractal/PingPongSampler.java | 4 ++-- .../noise/fractal/RidgedFractalSampler.java | 4 ++-- .../samplers/noise/simplex/PerlinSampler.java | 20 +++++++++---------- .../samplers/noise/value/ValueSampler.java | 20 +++++++++---------- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java index 653484fa11..761a5deaa3 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java @@ -36,7 +36,7 @@ public double getNoiseRaw(long seed, double x, double y) { for(int i = 0; i < octaves; i++) { double noise = pingPong((input.noise(seed++, x, y) + 1) * pingPongStrength); sum += (noise - 0.5) * 2 * amp; - amp *= MathUtil.lerp(1.0, noise, weightedStrength); + amp *= MathUtil.lerp(weightedStrength, 1.0, noise); x *= lacunarity; y *= lacunarity; @@ -54,7 +54,7 @@ public double getNoiseRaw(long seed, double x, double y, double z) { for(int i = 0; i < octaves; i++) { double noise = pingPong((input.noise(seed++, x, y, z) + 1) * pingPongStrength); sum += (noise - 0.5) * 2 * amp; - amp *= MathUtil.lerp(1.0, noise, weightedStrength); + amp *= MathUtil.lerp(weightedStrength, 1.0, noise); x *= lacunarity; y *= lacunarity; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java index 9ebb20ba08..1b45ed8206 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java @@ -25,7 +25,7 @@ public double getNoiseRaw(long seed, double x, double y) { for(int i = 0; i < octaves; i++) { double noise = Math.abs(input.noise(seed++, x, y)); sum += (noise * -2 + 1) * amp; - amp *= MathUtil.lerp(1.0, 1 - noise, weightedStrength); + amp *= MathUtil.lerp(weightedStrength, 1.0, 1 - noise); x *= lacunarity; y *= lacunarity; @@ -43,7 +43,7 @@ public double getNoiseRaw(long seed, double x, double y, double z) { for(int i = 0; i < octaves; i++) { double noise = Math.abs(input.noise(seed++, x, y, z)); sum += (noise * -2 + 1) * amp; - amp *= MathUtil.lerp(1.0, 1 - noise, weightedStrength); + amp *= MathUtil.lerp(weightedStrength, 1.0, 1 - noise); x *= lacunarity; y *= lacunarity; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java index 46ca9af30b..8ce0c19dc5 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java @@ -33,10 +33,10 @@ public double getNoiseRaw(long sl, double x, double y) { int x1 = x0 + PRIME_X; int y1 = y0 + PRIME_Y; - double xf0 = MathUtil.lerp(gradCoord(seed, x0, y0, xd0, yd0), gradCoord(seed, x1, y0, xd1, yd0), xs); - double xf1 = MathUtil.lerp(gradCoord(seed, x0, y1, xd0, yd1), gradCoord(seed, x1, y1, xd1, yd1), xs); + double xf0 = MathUtil.lerp(xs, gradCoord(seed, x0, y0, xd0, yd0), gradCoord(seed, x1, y0, xd1, yd0)); + double xf1 = MathUtil.lerp(xs, gradCoord(seed, x0, y1, xd0, yd1), gradCoord(seed, x1, y1, xd1, yd1)); - return MathUtil.lerp(xf0, xf1, ys) * 1.4247691104677813; + return MathUtil.lerp(ys, xf0, xf1) * 1.4247691104677813; } @Override @@ -64,14 +64,14 @@ public double getNoiseRaw(long sl, double x, double y, double z) { int y1 = y0 + PRIME_Y; int z1 = z0 + PRIME_Z; - double xf00 = MathUtil.lerp(gradCoord(seed, x0, y0, z0, xd0, yd0, zd0), gradCoord(seed, x1, y0, z0, xd1, yd0, zd0), xs); - double xf10 = MathUtil.lerp(gradCoord(seed, x0, y1, z0, xd0, yd1, zd0), gradCoord(seed, x1, y1, z0, xd1, yd1, zd0), xs); - double xf01 = MathUtil.lerp(gradCoord(seed, x0, y0, z1, xd0, yd0, zd1), gradCoord(seed, x1, y0, z1, xd1, yd0, zd1), xs); - double xf11 = MathUtil.lerp(gradCoord(seed, x0, y1, z1, xd0, yd1, zd1), gradCoord(seed, x1, y1, z1, xd1, yd1, zd1), xs); + double xf00 = MathUtil.lerp(xs, gradCoord(seed, x0, y0, z0, xd0, yd0, zd0), gradCoord(seed, x1, y0, z0, xd1, yd0, zd0)); + double xf10 = MathUtil.lerp(xs, gradCoord(seed, x0, y1, z0, xd0, yd1, zd0), gradCoord(seed, x1, y1, z0, xd1, yd1, zd0)); + double xf01 = MathUtil.lerp(xs, gradCoord(seed, x0, y0, z1, xd0, yd0, zd1), gradCoord(seed, x1, y0, z1, xd1, yd0, zd1)); + double xf11 = MathUtil.lerp(xs, gradCoord(seed, x0, y1, z1, xd0, yd1, zd1), gradCoord(seed, x1, y1, z1, xd1, yd1, zd1)); - double yf0 = MathUtil.lerp(xf00, xf10, ys); - double yf1 = MathUtil.lerp(xf01, xf11, ys); + double yf0 = MathUtil.lerp(ys, xf00, xf10); + double yf1 = MathUtil.lerp(ys, xf01, xf11); - return MathUtil.lerp(yf0, yf1, zs) * 0.964921414852142333984375; + return MathUtil.lerp(zs, yf0, yf1) * 0.964921414852142333984375; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java index 09b0574cf2..f0ce724036 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java @@ -25,10 +25,10 @@ public double getNoiseRaw(long sl, double x, double y) { int x1 = x0 + PRIME_X; int y1 = y0 + PRIME_Y; - double xf0 = MathUtil.lerp(valCoord(seed, x0, y0), valCoord(seed, x1, y0), xs); - double xf1 = MathUtil.lerp(valCoord(seed, x0, y1), valCoord(seed, x1, y1), xs); + double xf0 = MathUtil.lerp(xs, valCoord(seed, x0, y0), valCoord(seed, x1, y0)); + double xf1 = MathUtil.lerp(xs, valCoord(seed, x0, y1), valCoord(seed, x1, y1)); - return MathUtil.lerp(xf0, xf1, ys); + return MathUtil.lerp(ys, xf0, xf1); } @Override @@ -49,14 +49,14 @@ public double getNoiseRaw(long sl, double x, double y, double z) { int y1 = y0 + PRIME_Y; int z1 = z0 + PRIME_Z; - double xf00 = MathUtil.lerp(valCoord(seed, x0, y0, z0), valCoord(seed, x1, y0, z0), xs); - double xf10 = MathUtil.lerp(valCoord(seed, x0, y1, z0), valCoord(seed, x1, y1, z0), xs); - double xf01 = MathUtil.lerp(valCoord(seed, x0, y0, z1), valCoord(seed, x1, y0, z1), xs); - double xf11 = MathUtil.lerp(valCoord(seed, x0, y1, z1), valCoord(seed, x1, y1, z1), xs); + double xf00 = MathUtil.lerp(xs, valCoord(seed, x0, y0, z0), valCoord(seed, x1, y0, z0)); + double xf10 = MathUtil.lerp(xs, valCoord(seed, x0, y1, z0), valCoord(seed, x1, y1, z0)); + double xf01 = MathUtil.lerp(xs, valCoord(seed, x0, y0, z1), valCoord(seed, x1, y0, z1)); + double xf11 = MathUtil.lerp(xs, valCoord(seed, x0, y1, z1), valCoord(seed, x1, y1, z1)); - double yf0 = MathUtil.lerp(xf00, xf10, ys); - double yf1 = MathUtil.lerp(xf01, xf11, ys); + double yf0 = MathUtil.lerp(ys, xf00, xf10); + double yf1 = MathUtil.lerp(ys, xf01, xf11); - return MathUtil.lerp(yf0, yf1, zs); + return MathUtil.lerp(zs, yf0, yf1); } } From d8ba9e10164e642422295fdcbc911e422f40158d Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 24 Dec 2023 02:06:11 -0700 Subject: [PATCH 065/126] bump version --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0088d805e2..6d51c74f80 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.4.2")) -versionProjects(":common:implementation", version("6.4.2")) -versionProjects(":platforms", version("6.4.2")) +versionProjects(":common:api", version("6.4.3")) +versionProjects(":common:implementation", version("6.4.3")) +versionProjects(":platforms", version("6.4.3")) allprojects { From 271e7f3c693244825c3dd92358e097624c64daa8 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 5 Jan 2024 18:42:35 +1100 Subject: [PATCH 066/126] Fix empty slant holders attempting to calculate slant This occurs when the NoiseChunkGenerator3D#getSlant method is invoked at a position where the biome has an empty slant holder, currently possible when using the slant locator addon. This is fixed by making slant calculation independent of SlantHolders. Some minor refactoring has also been done as a result of this change. --- .../NoiseChunkGenerator3DAddon.java | 7 +- ...NoiseChunkGeneratorPackConfigTemplate.java | 6 +- .../config/palette/BiomePaletteTemplate.java | 5 +- .../generation/NoiseChunkGenerator3D.java | 33 +++++--- .../generation/math/PaletteUtil.java | 29 ------- .../math/SlantCalculationMethod.java | 69 +++++++++++++++++ .../palette/slant/MultipleSlantHolder.java | 3 +- .../palette/slant/SingleSlantHolder.java | 3 +- .../palette/slant/SlantHolder.java | 77 +------------------ .../palette/slant/SlantHolderImpl.java | 11 +-- 10 files changed, 110 insertions(+), 133 deletions(-) delete mode 100644 common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/PaletteUtil.java create mode 100644 common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/SlantCalculationMethod.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 89f6e038ce..ca2d8bc697 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 @@ -13,6 +13,7 @@ import com.dfsek.terra.addons.chunkgenerator.config.palette.BiomePaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.slant.SlantLayerTemplate; import com.dfsek.terra.addons.chunkgenerator.generation.NoiseChunkGenerator3D; +import com.dfsek.terra.addons.chunkgenerator.generation.math.SlantCalculationMethod; 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; @@ -45,8 +46,8 @@ public void initialize() { .priority(1000) .then(event -> { - event.getPack().applyLoader(SlantHolder.CalculationMethod.class, - (type, o, loader, depthTracker) -> SlantHolder.CalculationMethod.valueOf((String) o)); + event.getPack().applyLoader(SlantCalculationMethod.class, + (type, o, loader, depthTracker) -> SlantCalculationMethod.valueOf((String) o)); NoiseChunkGeneratorPackConfigTemplate config = event.loadTemplate(new NoiseChunkGeneratorPackConfigTemplate()); event.getPack().getContext().put(config); @@ -57,7 +58,7 @@ public void initialize() { pack -> new NoiseChunkGenerator3D(pack, platform, config.getElevationBlend(), config.getHorizontalRes(), config.getVerticalRes(), noisePropertiesPropertyKey, - paletteInfoPropertyKey)); + paletteInfoPropertyKey, config.getSlantCalculationMethod())); event.getPack() .applyLoader(SlantHolder.Layer.class, SlantLayerTemplate::new); }) 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 c3828bbbf2..b1f32c68a5 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,7 +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.chunkgenerator.palette.slant.SlantHolder; +import com.dfsek.terra.addons.chunkgenerator.generation.math.SlantCalculationMethod; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.properties.Properties; @@ -24,7 +24,7 @@ public class NoiseChunkGeneratorPackConfigTemplate implements ConfigTemplate, Pr @Value("slant.calculation-method") @Default - private SlantHolder.@Meta CalculationMethod slantCalculationMethod = SlantHolder.CalculationMethod.Derivative; + private @Meta SlantCalculationMethod slantCalculationMethod = SlantCalculationMethod.Derivative; public int getElevationBlend() { return elevationBlend; @@ -38,7 +38,7 @@ public int getVerticalRes() { return verticalRes; } - public SlantHolder.CalculationMethod getSlantCalculationMethod() { + public SlantCalculationMethod 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 2d479f1a21..a4ff986e44 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 @@ -16,6 +16,7 @@ import java.util.List; import java.util.Map; +import com.dfsek.terra.addons.chunkgenerator.generation.math.SlantCalculationMethod; import com.dfsek.terra.addons.chunkgenerator.palette.BiomePaletteInfo; import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; import com.dfsek.terra.addons.chunkgenerator.palette.slant.SlantHolder; @@ -27,7 +28,7 @@ public class BiomePaletteTemplate implements ObjectTemplate { private final Platform platform; - private final SlantHolder.CalculationMethod slantCalculationMethod; + private final SlantCalculationMethod slantCalculationMethod; @Value("slant") @Default @Description("The slant palettes to use in this biome.") @@ -56,7 +57,7 @@ public BlockState get(int layer, double x, double y, double z, long seed) { @Default private @Meta boolean updatePalette = false; - public BiomePaletteTemplate(Platform platform, SlantHolder.CalculationMethod slantCalculationMethod) { + public BiomePaletteTemplate(Platform platform, SlantCalculationMethod slantCalculationMethod) { this.platform = platform; this.slantCalculationMethod = slantCalculationMethod; } 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 08dc93cbee..13cf69acee 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 @@ -8,10 +8,13 @@ package com.dfsek.terra.addons.chunkgenerator.generation; +import com.dfsek.terra.addons.chunkgenerator.palette.slant.SlantHolder; + +import com.dfsek.terra.addons.chunkgenerator.generation.math.SlantCalculationMethod; + import org.jetbrains.annotations.NotNull; import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties; -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; import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.SamplerProvider; @@ -42,16 +45,19 @@ public class NoiseChunkGenerator3D implements ChunkGenerator { private final PropertyKey paletteInfoPropertyKey; private final PropertyKey noisePropertiesKey; + private final SlantCalculationMethod slantCalculationMethod; + public NoiseChunkGenerator3D(ConfigPack pack, Platform platform, int elevationBlend, int carverHorizontalResolution, int carverVerticalResolution, PropertyKey noisePropertiesKey, - PropertyKey paletteInfoPropertyKey) { + PropertyKey paletteInfoPropertyKey, SlantCalculationMethod slantCalculationMethod) { this.platform = platform; this.air = platform.getWorldHandle().air(); this.carverHorizontalResolution = carverHorizontalResolution; this.carverVerticalResolution = carverVerticalResolution; this.paletteInfoPropertyKey = paletteInfoPropertyKey; this.noisePropertiesKey = noisePropertiesKey; + this.slantCalculationMethod = slantCalculationMethod; int maxBlend = pack .getBiomeProvider() .stream() @@ -63,6 +69,17 @@ public NoiseChunkGenerator3D(ConfigPack pack, Platform platform, int elevationBl this.samplerCache = new SamplerProvider(platform, elevationBlend, noisePropertiesKey, maxBlend); } + private Palette paletteAt(int x, int y, int z, Sampler3D sampler, BiomePaletteInfo paletteInfo, int depth) { + SlantHolder slantHolder = paletteInfo.slantHolder(); + if(slantHolder.isAboveDepth(depth)) { + double slant = slantCalculationMethod.slant(sampler, x, y, z); + if(slantHolder.isInSlantThreshold(slant)) { + return slantHolder.getPalette(slant).getPalette(y); + } + } + return paletteInfo.paletteHolder().getPalette(y); + } + @Override @SuppressWarnings("try") public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldProperties world, @@ -103,8 +120,7 @@ public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldPropertie if(sampler.sample(x, y, z) > 0) { if(carver.sample(x, y, z) <= 0) { - data = PaletteUtil - .getPalette(x, y, z, sampler, paletteInfo, paletteLevel) + data = paletteAt(x, y, z, sampler, paletteInfo, paletteLevel) .get(paletteLevel, cx, y, cz, seed); chunk.setBlock(x, y, z, data); paletteLevel++; @@ -135,7 +151,7 @@ public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProv int fdX = Math.floorMod(x, 16); int fdZ = Math.floorMod(z, 16); - Palette palette = PaletteUtil.getPalette(fdX, y, fdZ, sampler, paletteInfo, 0); + Palette palette = paletteAt(fdX, y, fdZ, sampler, paletteInfo, 0); double noise = sampler.sample(fdX, y, fdZ); if(noise > 0) { int level = 0; @@ -157,11 +173,8 @@ public Palette getPalette(int x, int y, int z, WorldProperties world, BiomeProvi public double getSlant(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { int fdX = Math.floorMod(x, 16); int fdZ = Math.floorMod(z, 16); - return biomeProvider.getBiome(x, y, z, world.getSeed()) - .getContext() - .get(paletteInfoPropertyKey) - .slantHolder() - .calculateSlant(samplerCache.get(x, z, world, biomeProvider), fdX, y, fdZ); + Sampler3D sampler = samplerCache.get(x, z, world, biomeProvider); + return slantCalculationMethod.slant(sampler, fdX, y, fdZ); } public SamplerProvider samplerProvider() { 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 deleted file mode 100644 index e7c20784cd..0000000000 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/PaletteUtil.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2020-2023 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.chunkgenerator.generation.math; - -import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D; -import com.dfsek.terra.addons.chunkgenerator.palette.BiomePaletteInfo; -import com.dfsek.terra.addons.chunkgenerator.palette.slant.SlantHolder; -import com.dfsek.terra.api.world.chunk.generation.util.Palette; - - -public final class PaletteUtil { - - 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); - } -} \ No newline at end of file diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/SlantCalculationMethod.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/SlantCalculationMethod.java new file mode 100644 index 0000000000..1c03a038ad --- /dev/null +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/SlantCalculationMethod.java @@ -0,0 +1,69 @@ +package com.dfsek.terra.addons.chunkgenerator.generation.math; + +import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D; +import com.dfsek.terra.api.util.vector.Vector3; + + +public enum SlantCalculationMethod { + 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(); +} diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/MultipleSlantHolder.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/MultipleSlantHolder.java index 895c026980..08f1d16fea 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/MultipleSlantHolder.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/slant/MultipleSlantHolder.java @@ -14,6 +14,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import com.dfsek.terra.addons.chunkgenerator.generation.math.SlantCalculationMethod; import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; @@ -21,7 +22,7 @@ public class MultipleSlantHolder extends SlantHolderImpl { private final NavigableMap layers; private final double slantThreshold; - MultipleSlantHolder(List slant, int slantDepth, CalculationMethod calculationMethod) { + MultipleSlantHolder(List slant, int slantDepth, SlantCalculationMethod calculationMethod) { super(slantDepth, calculationMethod); NavigableMap layers = new TreeMap<>( slant.stream().collect(Collectors.toMap(SlantHolder.Layer::threshold, SlantHolder.Layer::palette))); 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 index 12f29ef18d..3f8ab5408a 100644 --- 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 @@ -1,5 +1,6 @@ package com.dfsek.terra.addons.chunkgenerator.palette.slant; +import com.dfsek.terra.addons.chunkgenerator.generation.math.SlantCalculationMethod; import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; @@ -7,7 +8,7 @@ final class SingleSlantHolder extends SlantHolderImpl { private final SlantHolder.Layer layer; - public SingleSlantHolder(SlantHolder.Layer layer, int slantDepth, CalculationMethod calculationMethod) { + public SingleSlantHolder(SlantHolder.Layer layer, int slantDepth, SlantCalculationMethod calculationMethod) { super(slantDepth, calculationMethod); this.layer = layer; } 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 index 359913d418..d4c2855cde 100644 --- 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 @@ -2,19 +2,13 @@ import java.util.List; -import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D; +import com.dfsek.terra.addons.chunkgenerator.generation.math.SlantCalculationMethod; import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; -import com.dfsek.terra.api.util.vector.Vector3; public interface SlantHolder { 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; @@ -31,7 +25,7 @@ public PaletteHolder getPalette(double slant) { } }; - static SlantHolder of(List layers, int slantDepth, CalculationMethod calculationMethod) { + static SlantHolder of(List layers, int slantDepth, SlantCalculationMethod calculationMethod) { if(layers.isEmpty()) { return EMPTY; } else if(layers.size() == 1) { @@ -40,8 +34,6 @@ static SlantHolder of(List layers, int slantDepth, Calculatio return new MultipleSlantHolder(layers, slantDepth, calculationMethod); } - double calculateSlant(Sampler3D sampler, double x, double y, double z); - boolean isAboveDepth(int depth); boolean isInSlantThreshold(double slant); @@ -49,71 +41,6 @@ static SlantHolder of(List layers, int slantDepth, Calculatio PaletteHolder getPalette(double slant); - 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(); - } - - record Layer(PaletteHolder palette, double threshold) { } } 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 index 13fc68ef13..bef21cdba9 100644 --- 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 @@ -1,26 +1,19 @@ package com.dfsek.terra.addons.chunkgenerator.palette.slant; -import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D; +import com.dfsek.terra.addons.chunkgenerator.generation.math.SlantCalculationMethod; public abstract class SlantHolderImpl implements SlantHolder { protected final boolean floorToThreshold; - private final SlantHolder.CalculationMethod calculationMethod; private final int slantDepth; - protected SlantHolderImpl(int slantDepth, CalculationMethod calculationMethod) { + protected SlantHolderImpl(int slantDepth, SlantCalculationMethod 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; From 9c181f7ee123bdf60cfecc3a8472b3359cf396a7 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 6 Jan 2024 09:13:02 +1100 Subject: [PATCH 067/126] Add ability to disable slant palettes globally --- .../addons/chunkgenerator/NoiseChunkGenerator3DAddon.java | 3 ++- .../config/NoiseChunkGeneratorPackConfigTemplate.java | 8 ++++++++ .../chunkgenerator/generation/NoiseChunkGenerator3D.java | 8 ++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) 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 ca2d8bc697..f2f0c9386d 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 @@ -58,7 +58,8 @@ public void initialize() { pack -> new NoiseChunkGenerator3D(pack, platform, config.getElevationBlend(), config.getHorizontalRes(), config.getVerticalRes(), noisePropertiesPropertyKey, - paletteInfoPropertyKey, config.getSlantCalculationMethod())); + paletteInfoPropertyKey, config.getSlantCalculationMethod(), + config.isSlantPalettesEnabled())); event.getPack() .applyLoader(SlantHolder.Layer.class, SlantLayerTemplate::new); }) 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 b1f32c68a5..ae1f1ca4a5 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 @@ -26,6 +26,10 @@ public class NoiseChunkGeneratorPackConfigTemplate implements ConfigTemplate, Pr @Default private @Meta SlantCalculationMethod slantCalculationMethod = SlantCalculationMethod.Derivative; + @Value("slant.disable-palettes") + @Default + private @Meta boolean disableSlantPalettes = false; + public int getElevationBlend() { return elevationBlend; } @@ -41,4 +45,8 @@ public int getVerticalRes() { public SlantCalculationMethod getSlantCalculationMethod() { return slantCalculationMethod; } + + public boolean isSlantPalettesEnabled() { + return !disableSlantPalettes; + } } 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 13cf69acee..95c2891cc3 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 @@ -47,10 +47,13 @@ public class NoiseChunkGenerator3D implements ChunkGenerator { private final SlantCalculationMethod slantCalculationMethod; + private final boolean useSlantPalettes; + public NoiseChunkGenerator3D(ConfigPack pack, Platform platform, int elevationBlend, int carverHorizontalResolution, int carverVerticalResolution, PropertyKey noisePropertiesKey, - PropertyKey paletteInfoPropertyKey, SlantCalculationMethod slantCalculationMethod) { + PropertyKey paletteInfoPropertyKey, + SlantCalculationMethod slantCalculationMethod, boolean useSlantPalettes) { this.platform = platform; this.air = platform.getWorldHandle().air(); this.carverHorizontalResolution = carverHorizontalResolution; @@ -58,6 +61,7 @@ public NoiseChunkGenerator3D(ConfigPack pack, Platform platform, int elevationBl this.paletteInfoPropertyKey = paletteInfoPropertyKey; this.noisePropertiesKey = noisePropertiesKey; this.slantCalculationMethod = slantCalculationMethod; + this.useSlantPalettes = useSlantPalettes; int maxBlend = pack .getBiomeProvider() .stream() @@ -71,7 +75,7 @@ public NoiseChunkGenerator3D(ConfigPack pack, Platform platform, int elevationBl private Palette paletteAt(int x, int y, int z, Sampler3D sampler, BiomePaletteInfo paletteInfo, int depth) { SlantHolder slantHolder = paletteInfo.slantHolder(); - if(slantHolder.isAboveDepth(depth)) { + if(useSlantPalettes && slantHolder.isAboveDepth(depth)) { double slant = slantCalculationMethod.slant(sampler, x, y, z); if(slantHolder.isInSlantThreshold(slant)) { return slantHolder.getPalette(slant).getPalette(y); From f3476c5cc8ca220d976686778bcf0a598582dcd7 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 7 Jan 2024 17:02:08 +1100 Subject: [PATCH 068/126] Add feature stage blending --- .../feature/FeatureGenerationStage.java | 15 +++++++++++-- .../feature/config/FeatureStageTemplate.java | 21 ++++++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java index 6baf88b7a0..123107d150 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java @@ -12,6 +12,7 @@ import com.dfsek.terra.addons.generation.feature.config.BiomeFeatures; import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.properties.PropertyKey; import com.dfsek.terra.api.registry.key.StringIdentifiable; import com.dfsek.terra.api.util.Rotation; @@ -31,13 +32,20 @@ public class FeatureGenerationStage implements GenerationStage, StringIdentifiab private final int resolution; private final PropertyKey biomeFeaturesKey; + private final NoiseSampler blendSampler; + private final boolean doBlending; + private final double blendAmplitude; - public FeatureGenerationStage(Platform platform, String id, int resolution, PropertyKey biomeFeaturesKey) { + public FeatureGenerationStage(Platform platform, String id, int resolution, PropertyKey biomeFeaturesKey, + NoiseSampler blendSampler, double blendAmplitude) { this.platform = platform; this.id = id; this.profile = "feature_stage:" + id; this.resolution = resolution; this.biomeFeaturesKey = biomeFeaturesKey; + this.blendSampler = blendSampler; + this.doBlending = blendAmplitude != 0d; + this.blendAmplitude = blendAmplitude; } @Override @@ -52,7 +60,10 @@ public void populate(ProtoWorld world) { int tx = cx + chunkX; int tz = cz + chunkZ; world.getBiomeProvider() - .getColumn(tx, tz, world) + .getColumn( + tx + (doBlending ? (int) (blendSampler.noise(seed, tx, tz) * blendAmplitude) : 0), + tz + (doBlending ? (int) (blendSampler.noise(seed+1, tx, tz) * blendAmplitude) : 0), + world) .forRanges(resolution, (min, max, biome) -> { for(int subChunkX = 0; subChunkX < resolution; subChunkX++) { for(int subChunkZ = 0; subChunkZ < resolution; subChunkZ++) { diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/FeatureStageTemplate.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/FeatureStageTemplate.java index ffc077f1a8..d0fae0e1f2 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/FeatureStageTemplate.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/FeatureStageTemplate.java @@ -8,6 +8,7 @@ import com.dfsek.terra.addons.generation.feature.FeatureGenerationStage; import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.properties.PropertyKey; import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; @@ -22,6 +23,24 @@ public class FeatureStageTemplate implements ObjectTemplate, Va @Default private int resolution = 4; + @Value("blend.sampler") + @Default + private NoiseSampler blendSampler = new NoiseSampler() { + @Override + public double noise(long seed, double x, double y) { + return 0; + } + + @Override + public double noise(long seed, double x, double y, double z) { + return 0; + } + }; + + @Value("blend.amplitude") + @Default + private double blendAmplitude = 0d; + public FeatureStageTemplate(Platform platform, PropertyKey biomeFeaturesKey) { this.platform = platform; this.biomeFeaturesKey = biomeFeaturesKey; @@ -30,7 +49,7 @@ public FeatureStageTemplate(Platform platform, PropertyKey biomeF @Override public FeatureGenerationStage get() { - return new FeatureGenerationStage(platform, id, resolution, biomeFeaturesKey); + return new FeatureGenerationStage(platform, id, resolution, biomeFeaturesKey, blendSampler, blendAmplitude); } @Override From c52ad56cccb4590726f3fb744b94153983e68c2a Mon Sep 17 00:00:00 2001 From: Browsit <80560008+Browsit@users.noreply.github.com> Date: Fri, 2 Feb 2024 08:15:37 -0500 Subject: [PATCH 069/126] Return null for empty generator IDs --- .../src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index a8701da17e..555d073c7a 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -189,6 +189,7 @@ private boolean doVersionCheck() { @Override public @Nullable ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, String id) { + if (id == null || id.trim().equals("")) { return null; } return new BukkitChunkGeneratorWrapper(generatorMap.computeIfAbsent(worldName, name -> { ConfigPack pack = platform.getConfigRegistry().getByID(id).orElseThrow( () -> new IllegalArgumentException("No such config pack \"" + id + "\"")); From 01e011a9edec3884bade363b03394a72922b41c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Fri, 5 Jan 2024 14:46:01 -0700 Subject: [PATCH 070/126] UX tweaks to biome config --- .../java/com/dfsek/terra/mod/ModPlatform.java | 53 +++++++++---------- .../terra/mod/config/SpawnGroupTemplate.java | 18 ------- .../mod/config/SpawnSettingsTemplate.java | 7 ++- .../terra/mod/config/SpawnTypeConfig.java | 14 ++--- 4 files changed, 40 insertions(+), 52 deletions(-) delete mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnGroupTemplate.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 25c78c228c..d6d35508a9 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 @@ -44,7 +44,6 @@ import com.dfsek.terra.mod.config.SoundEventTemplate; import com.dfsek.terra.mod.config.SpawnCostConfig; import com.dfsek.terra.mod.config.SpawnEntryTemplate; -import com.dfsek.terra.mod.config.SpawnGroupTemplate; import com.dfsek.terra.mod.config.SpawnSettingsTemplate; import com.dfsek.terra.mod.config.SpawnTypeConfig; import com.dfsek.terra.mod.config.VillagerTypeTemplate; @@ -68,32 +67,32 @@ public void registerWorldTypes(BiConsumer registerFunct public void register(TypeRegistry registry) { super.register(registry); registry.registerLoader(PlatformBiome.class, (type, o, loader, depthTracker) -> parseBiome((String) o, depthTracker)) - .registerLoader(Identifier.class, (type, o, loader, depthTracker) -> { - Identifier identifier = Identifier.tryParse((String) o); - if(identifier == null) - throw new LoadException("Invalid identifier: " + o, depthTracker); - return identifier; - }) - .registerLoader(Precipitation.class, (type, o, loader, depthTracker) -> Precipitation.valueOf(((String) o).toUpperCase( - Locale.ROOT))) - .registerLoader(GrassColorModifier.class, - (type, o, loader, depthTracker) -> GrassColorModifier.valueOf(((String) o).toUpperCase( - Locale.ROOT))) - .registerLoader(GrassColorModifier.class, - (type, o, loader, depthTracker) -> TemperatureModifier.valueOf(((String) o).toUpperCase( - Locale.ROOT))) - .registerLoader(BiomeParticleConfig.class, BiomeParticleConfigTemplate::new) - .registerLoader(SoundEvent.class, SoundEventTemplate::new) - .registerLoader(BiomeMoodSound.class, BiomeMoodSoundTemplate::new) - .registerLoader(BiomeAdditionsSound.class, BiomeAdditionsSoundTemplate::new) - .registerLoader(MusicSound.class, MusicSoundTemplate::new) - .registerLoader(EntityType.class, EntityTypeTemplate::new) - .registerLoader(SpawnCostConfig.class, SpawnCostConfig::new) - .registerLoader(SpawnEntry.class, SpawnEntryTemplate::new) - .registerLoader(SpawnGroup.class, SpawnGroupTemplate::new) - .registerLoader(SpawnTypeConfig.class, SpawnTypeConfig::new) - .registerLoader(SpawnSettings.class, SpawnSettingsTemplate::new) - .registerLoader(VillagerType.class, VillagerTypeTemplate::new); + .registerLoader(Identifier.class, (type, o, loader, depthTracker) -> { + Identifier identifier = Identifier.tryParse((String) o); + if(identifier == null) + throw new LoadException("Invalid identifier: " + o, depthTracker); + return identifier; + }) + .registerLoader(Precipitation.class, (type, o, loader, depthTracker) -> Precipitation.valueOf(((String) o).toUpperCase( + Locale.ROOT))) + .registerLoader(GrassColorModifier.class, + (type, o, loader, depthTracker) -> GrassColorModifier.valueOf(((String) o).toUpperCase( + Locale.ROOT))) + .registerLoader(GrassColorModifier.class, + (type, o, loader, depthTracker) -> TemperatureModifier.valueOf(((String) o).toUpperCase( + Locale.ROOT))) + .registerLoader(SpawnGroup.class,(type, o, loader, depthTracker) -> SpawnGroup.valueOf((String) o)) + .registerLoader(BiomeParticleConfig.class, BiomeParticleConfigTemplate::new) + .registerLoader(SoundEvent.class, SoundEventTemplate::new) + .registerLoader(BiomeMoodSound.class, BiomeMoodSoundTemplate::new) + .registerLoader(BiomeAdditionsSound.class, BiomeAdditionsSoundTemplate::new) + .registerLoader(MusicSound.class, MusicSoundTemplate::new) + .registerLoader(EntityType.class, EntityTypeTemplate::new) + .registerLoader(SpawnCostConfig.class, SpawnCostConfig::new) + .registerLoader(SpawnEntry.class, SpawnEntryTemplate::new) + .registerLoader(SpawnTypeConfig.class, SpawnTypeConfig::new) + .registerLoader(SpawnSettings.class, SpawnSettingsTemplate::new) + .registerLoader(VillagerType.class, VillagerTypeTemplate::new); } private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnGroupTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnGroupTemplate.java deleted file mode 100644 index 0ae2047f2c..0000000000 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnGroupTemplate.java +++ /dev/null @@ -1,18 +0,0 @@ -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.entity.SpawnGroup; - - -public class SpawnGroupTemplate implements ObjectTemplate { - @Value("group") - @Default - private String group = null; - - @Override - public SpawnGroup get() { - return SpawnGroup.valueOf(group); - } -} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnSettingsTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnSettingsTemplate.java index 9392e94e10..86e9de0076 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnSettingsTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnSettingsTemplate.java @@ -3,7 +3,9 @@ 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.entity.SpawnGroup; import net.minecraft.world.biome.SpawnSettings; +import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import java.util.List; @@ -25,7 +27,10 @@ public class SpawnSettingsTemplate implements ObjectTemplate { public SpawnSettings get() { SpawnSettings.Builder builder = new SpawnSettings.Builder(); for(SpawnTypeConfig spawn : spawns) { - builder.spawn(spawn.getGroup(), spawn.getEntry()); + SpawnGroup group = spawn.getGroup(); + for (SpawnEntry entry : spawn.getEntry()) { + builder.spawn(group, entry); + } } for(SpawnCostConfig cost : costs) { builder.spawnCost(cost.getType(), cost.getMass(), cost.getGravity()); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnTypeConfig.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnTypeConfig.java index 9384f991d3..b18c87e624 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnTypeConfig.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnTypeConfig.java @@ -6,21 +6,23 @@ import net.minecraft.entity.SpawnGroup; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; +import java.util.List; + public class SpawnTypeConfig implements ObjectTemplate { @Value("group") @Default private SpawnGroup group = null; - - @Value("entry") + + @Value("entries") @Default - private SpawnEntry entry = null; - + private List entry = null; + public SpawnGroup getGroup() { return group; } - - public SpawnEntry getEntry() { + + public List getEntry() { return entry; } From 142d3646821f2c084deaa692dde96dcb2881f675 Mon Sep 17 00:00:00 2001 From: Astrash Date: Wed, 17 Apr 2024 09:54:07 +1000 Subject: [PATCH 071/126] WIP fractal-gavoro-pseudoerosion --- .../dfsek/terra/addons/noise/NoiseAddon.java | 10 +- .../DerivativeNoiseSamplerTemplate.java | 25 +++ .../noise/DerivativeFractalTemplate.java | 32 ++++ .../noise/PseudoErosionTemplate.java | 62 ++++++ .../noise/simplex/DerivativeFractal.java | 104 ++++++++++ .../samplers/noise/simplex/PseudoErosion.java | 179 ++++++++++++++++++ .../api/noise/DerivativeNoiseSampler.java | 22 +++ 7 files changed, 432 insertions(+), 2 deletions(-) create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeFractalTemplate.java create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java create mode 100644 common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.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 ca3aa1a448..53b5ef555e 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 @@ -17,6 +17,7 @@ import com.dfsek.terra.addons.noise.config.CubicSplinePointTemplate; 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.DerivativeNoiseSamplerTemplate; 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; @@ -25,9 +26,11 @@ 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.DerivativeFractalTemplate; 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.PseudoErosionTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.SimpleNoiseTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.fractal.BrownianMotionTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.fractal.PingPongTemplate; @@ -63,6 +66,7 @@ import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.inject.annotations.Inject; +import com.dfsek.terra.api.noise.DerivativeNoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; @@ -94,7 +98,8 @@ public void initialize() { (type, o, loader, depthTracker) -> DistanceSampler.DistanceFunction.valueOf((String) o)) .applyLoader(DimensionApplicableNoiseSampler.class, DimensionApplicableNoiseSampler::new) .applyLoader(FunctionTemplate.class, FunctionTemplate::new) - .applyLoader(CubicSpline.Point.class, CubicSplinePointTemplate::new); + .applyLoader(CubicSpline.Point.class, CubicSplinePointTemplate::new) + .applyLoader(DerivativeNoiseSampler.class, DerivativeNoiseSamplerTemplate::new); noiseRegistry.register(addon.key("LINEAR"), LinearNormalizerTemplate::new); noiseRegistry.register(addon.key("NORMAL"), NormalNormalizerTemplate::new); @@ -117,7 +122,8 @@ public void initialize() { noiseRegistry.register(addon.key("PERLIN"), () -> new SimpleNoiseTemplate(PerlinSampler::new)); noiseRegistry.register(addon.key("SIMPLEX"), () -> new SimpleNoiseTemplate(SimplexSampler::new)); noiseRegistry.register(addon.key("GABOR"), GaborNoiseTemplate::new); - + noiseRegistry.register(addon.key("PSEUDOEROSION"), PseudoErosionTemplate::new); + noiseRegistry.register(addon.key("DERIVATIVE"), DerivativeFractalTemplate::new); noiseRegistry.register(addon.key("VALUE"), () -> new SimpleNoiseTemplate(ValueSampler::new)); noiseRegistry.register(addon.key("VALUE_CUBIC"), () -> new SimpleNoiseTemplate(ValueCubicSampler::new)); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java new file mode 100644 index 0000000000..4d01cc58be --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.addons.noise.config.templates; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.exception.ValidationException; + +import com.dfsek.terra.api.noise.DerivativeNoiseSampler; +import com.dfsek.terra.api.noise.NoiseSampler; + + +public class DerivativeNoiseSamplerTemplate extends SamplerTemplate { + + @Value(".") + private NoiseSampler sampler; + + @Override + public boolean validate() throws ValidationException { + if (!(sampler instanceof DerivativeNoiseSampler)) throw new ValidationException("Provided sampler does not support calculating a derivative"); + return super.validate(); + } + + @Override + public DerivativeNoiseSampler get() { + return (DerivativeNoiseSampler) sampler; + } +} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeFractalTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeFractalTemplate.java new file mode 100644 index 0000000000..9387651a28 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeFractalTemplate.java @@ -0,0 +1,32 @@ +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.simplex.DerivativeFractal; + + +public class DerivativeFractalTemplate extends SamplerTemplate { + + @Value("octaves") + @Default + private int octaves = 3; + + @Value("gain") + @Default + private double gain = 0.5; + + @Value("lacunarity") + @Default + private double lacunarity = 2.0; + + @Value("frequency") + @Default + private double frequency = 0.02; + + @Override + public DerivativeFractal get() { + return new DerivativeFractal(octaves, gain, lacunarity, frequency); + } +} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java new file mode 100644 index 0000000000..b81c053f7c --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java @@ -0,0 +1,62 @@ +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.simplex.PseudoErosion; +import com.dfsek.terra.api.noise.DerivativeNoiseSampler; + + +public class PseudoErosionTemplate extends SamplerTemplate { + + @Value("octaves") + @Default + private int octaves = 4; + + @Value("lacunarity") + @Default + private double lacunarity = 2.0; + + @Value("gain") + @Default + private double gain = 0.5; + + @Value("slope-strength") + @Default + private double slopeStrength = 1.0; + + @Value("branch-strength") + @Default + private double branchStrength = 1.0; + + @Value("strength") + @Default + private double strength = 0.04; + + @Value("erosion-frequency") + @Default + private double erosionFrequency = 0.02; + + @Value("sampler") + private DerivativeNoiseSampler heightSampler; + + @Value("slope-mask.enable") + @Default + private boolean slopeMask = true; + + @Value("slope-mask.none") + @Default + private double slopeMaskNone = -0.5; + + @Value("slope-mask.full") + @Default + private double slopeMaskFull = 1; + + @Override + public PseudoErosion get() { + return new PseudoErosion(octaves, gain, lacunarity, + slopeStrength, branchStrength, strength, + erosionFrequency, heightSampler, slopeMask, slopeMaskFull, slopeMaskNone); + } +} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java new file mode 100644 index 0000000000..45928a619f --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java @@ -0,0 +1,104 @@ +package com.dfsek.terra.addons.noise.samplers.noise.simplex; + +import com.dfsek.terra.api.noise.DerivativeNoiseSampler; + +import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.dot; +import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.hash; +import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.hashX; +import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.hashY; + + +/** + * Temporary sampler that provides derivatives to test pseudoerosion, should be replaced with + * derivative versions of existing samplers + */ +public class DerivativeFractal implements DerivativeNoiseSampler { + + private final int heightOctaves; + private final double heightGain; + private final double heightLacunarity; + private final double frequency; + + public DerivativeFractal(int octaves, double gain, double lacunarity, double frequency) { + this.heightOctaves = octaves; + this.heightGain = gain; + this.heightLacunarity = lacunarity; + this.frequency = frequency; + } + + private static float[] baseNoise(float px, float py) { + float ix = (float)Math.floor(px); + float iy = (float)Math.floor(py); + float fx = px - ix; + float fy = py - iy; + + float ux = fx * fx * fx * (fx * (fx * 6.0f - 15.0f) + 10.0f); + float uy = fy * fy * fy * (fy * (fy * 6.0f - 15.0f) + 10.0f); + float dux = fx * fx * 30.0f * (fx * (fx - 2.0f) + 1.0f); + float duy = fy * fy * 30.0f * (fy * (fy - 2.0f) + 1.0f); + + float gan = hash(ix, iy); + float gax = hashX(gan); + float gay = hashY(gan); + + float gbn = hash(ix + 1, iy); + float gbx = hashX(gbn); + float gby = hashY(gbn); + + float gcn = hash(ix, iy + 1); + float gcx = hashX(gcn); + float gcy = hashY(gcn); + + float gdn = hash(ix + 1, iy + 1); + float gdx = hashX(gdn); + float gdy = hashY(gdn); + + float va = dot(gax, gay, fx, fy); + float vb = dot(gbx, gby, fx - 1, fy); + float vc = dot(gcx, gcy, fx, fy - 1); + float vd = dot(gdx, gdy, fx - 1, fy - 1); + + float u2x = gax + (gbx - gax) * ux + (gcx - gax) * uy + (gax - gbx - gcx + gdx) * ux * uy + dux * (uy * (va - vb - vc + vd) + vb - va); + float u2y = gay + (gby - gay) * ux + (gcy - gay) * uy + (gay - gby - gcy + gdy) * ux * uy + duy * (ux * (va - vb - vc + vd) + vc - va); + + return new float[] { va + ux * (vb - va) + uy * (vc - va) + ux * uy * (va - vb - vc + vd), u2x, u2y }; + } + + @Override + public double[] noised(long seed, double x, double y) { + x *= frequency; + y *= frequency; + double[] out = { 0.0f, 0.0f, 0.0f }; + float heightFreq = 1.0f; + float heightAmp = 1f; + float cumAmp = 0.0f; + for (int i = 0; i < heightOctaves; i++) { + float[] noise = baseNoise((float) (x * heightFreq), (float) (y * heightFreq)); + out[0] += noise[0] * heightAmp; + out[1] += noise[1] * heightAmp * heightFreq; + out[2] += noise[2] * heightAmp * heightFreq; + cumAmp += heightAmp; + heightAmp *= heightGain; + heightFreq *= heightLacunarity; + } + out[0] /= cumAmp; + out[1] /= cumAmp; + out[2] /= cumAmp; + return out; + } + + @Override + public double[] noised(long seed, double x, double y, double z) { + return noised(seed, x, z); + } + + @Override + public double noise(long seed, double x, double y) { + return noised(seed, x, y)[0]; + } + + @Override + public double noise(long seed, double x, double y, double z) { + return noised(seed, x, y, z)[0]; + } +} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java new file mode 100644 index 0000000000..ca4ce82120 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java @@ -0,0 +1,179 @@ +package com.dfsek.terra.addons.noise.samplers.noise.simplex; + + +import com.dfsek.terra.api.noise.DerivativeNoiseSampler; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.util.MathUtil; + + +public class PseudoErosion implements NoiseSampler { + public static final float TAU = (float) (2.0 * Math.PI); + private static final float HASH_X = 0.3183099f; + private static final float HASH_Y = 0.3678794f; + private final int octaves; + public final double gain; + public final double lacunarity; + public final double slopeStrength; + public final double branchStrength; + public final double erosionStrength; + private final double erosionFrequency; + private final DerivativeNoiseSampler sampler; + private final boolean slopeMask; + private final double slopeMaskFullSq; + private final double slopeMaskNoneSq; + + public PseudoErosion(int octaves, double gain, double lacunarity, double slopeStrength, double branchStrength, double erosionStrength, double erosionFrequency, DerivativeNoiseSampler sampler, + boolean slopeMask, double slopeMaskFull, double slopeMaskNone) { + this.octaves = octaves; + this.gain = gain; + this.lacunarity = lacunarity; + this.slopeStrength = slopeStrength; + this.branchStrength = branchStrength; + this.erosionStrength = erosionStrength; + this.erosionFrequency = erosionFrequency; + this.sampler = sampler; + this.slopeMask = slopeMask; + // Square these values and maintain sign since they're compared to a + // squared value, otherwise a sqrt would need to be used + this.slopeMaskFullSq = slopeMaskFull * slopeMaskFull * Math.signum(slopeMaskFull); + this.slopeMaskNoneSq = slopeMaskNone * slopeMaskNone * Math.signum((slopeMaskNone)); + } + + public static float hash(float x, float y) { + float xx = x * HASH_X + HASH_Y; + float yy = y * HASH_Y + HASH_X; + + // Swapped the components here + return 16 * (xx * yy * (xx + yy)); + } + + public static float hashX(float n) { + // Swapped the components here + float nx = HASH_X * n; + return -1.0f + 2.0f * fract(nx); + } + + public static float hashY(float n) { + float ny = HASH_Y * n; + return -1.0f + 2.0f * fract(ny); + } + + public static float fract(float x) { + return (x - (float)Math.floor(x)); + } + + public static float[] erosion(float x, float y, float dirX, float dirY) { + float gridX = (float) Math.floor(x); + float gridY = (float) Math.floor(y); + float localX = x - gridX; + float localY = y - gridY; + float noise = 0.0f; + float dirOutX = 0.0f; + float dirOutY = 0.0f; + float cumAmp = 0.0f; + + for (int cellX = -2; cellX < 2; cellX++) { + for (int cellY = -2; cellY < 2; cellY++) { + // TODO - Make seed affect hashing + float cellHash = hash(gridX - (float) cellX, gridY - (float) cellY); + float cellOffsetX = hashX(cellHash) * 0.5f; + float cellOffsetY = hashY(cellHash) * 0.5f; + float cellOriginDeltaX = cellX - cellOffsetX + localX; + float cellOriginDeltaY = cellY - cellOffsetY + localY; + float cellOriginDistSq = dot(cellOriginDeltaX, cellOriginDeltaY, cellOriginDeltaX, cellOriginDeltaY); + float amp = (float)exp(-cellOriginDistSq * 2.0); // Exponentially decrease amplitude further from cell center + cumAmp += amp; + float directionalStrength = dot(cellOriginDeltaX, cellOriginDeltaY, dirX, dirY) * TAU; + noise += (float) (MathUtil.cos(directionalStrength) * amp); + float sinAngle = (float) MathUtil.sin(directionalStrength) * amp; + dirOutX -= sinAngle * (cellOriginDeltaX + dirX); + dirOutY -= sinAngle * (cellOriginDeltaY + dirY); + } + } + + noise /= cumAmp; + dirOutX /= cumAmp; + dirOutY /= cumAmp; + + return new float[] {noise, dirOutX, dirOutY}; + } + + public static double exp(double val) { + final long tmp = (long) (1512775 * val + 1072632447); + return Double.longBitsToDouble(tmp << 32); + } + + public static float smoothstep(float edge0, float edge1, float x) { + // Scale, bias and saturate x to 0..1 range + x = clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f); + // Evaluate polynomial + return x * x * (3 - 2 * x); + } + + public static float clamp(float x, float minVal, float maxVal) { + return Math.max(minVal, Math.min(maxVal, x)); + } + + public float heightMap(long seed, float x, float y) { + double[] sample = sampler.noised(seed, x, y); + float height = (float) sample[0]; + float heightDirX = (float) sample[1]; + float heightDirY = (float) sample[2]; + + // Take the curl of the normal to get the gradient facing down the slope + float baseDirX = heightDirY * (float) slopeStrength; + float baseDirY = -heightDirX * (float) slopeStrength; + + float erosion = 0.0f; + float dirX = 0.0f; + float dirY = 0.0f; + float amp = 1.0f; + float cumAmp = 0.0f; + float freq = 1.0f; + + // Stack erosion octaves + for (int i = 0; i < octaves; i++) { + float[] erosionResult = erosion( + x * freq * (float) erosionFrequency, + y * freq * (float) erosionFrequency, + baseDirX + dirY * (float) branchStrength, + baseDirY - dirX * (float) branchStrength); + erosion += erosionResult[0] * amp; + dirX += erosionResult[1] * amp * freq; + dirY += erosionResult[2] * amp * freq; + cumAmp += amp; + amp *= gain; + freq *= lacunarity; + } + + // TODO - Test different output ranges, see how they affect visuals + // Normalize erosion noise + erosion /= cumAmp; + // [-1, 1] -> [0, 1] + erosion = erosion * 0.5F + 0.5F; + + // Without masking, erosion noise in areas with small gradients tend to produce mounds, + // this reduces erosion amplitude towards smaller gradients to avoid this + if (slopeMask) { + float dirMagSq = dot(baseDirX, baseDirY, baseDirX, baseDirY); + float flatness = smoothstep((float) slopeMaskNoneSq, (float) slopeMaskFullSq, dirMagSq); + erosion *= flatness; + } + + return (float) (height + erosion * erosionStrength); + } + + public static float dot(float x1, float y1, float x2, float y2) { + return x1 * x2 + y1 * y2; + } + + @Override + public double noise(long seed, double x, double y) { + return heightMap(seed, (float) x, (float) y); + } + + @Override + public double noise(long seed, double x, double y, double z) { + return noise(seed, x, z); + } +} \ No newline at end of file diff --git a/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java b/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java new file mode 100644 index 0000000000..12bc1e36d7 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.api.noise; + +/** + * A NoiseSampler which additionally provides directional derivatives + */ +public interface DerivativeNoiseSampler extends NoiseSampler { + + static boolean providesDerivative(NoiseSampler sampler) { + if (sampler instanceof DerivativeNoiseSampler dSampler) { + return dSampler.isDerivable(); + } + return false; + } + + default boolean isDerivable() { + return false; + } + + double[] noised(long seed, double x, double y); + + double[] noised(long seed, double x, double y, double z); +} From 41652d29dfa4dc6e95911ab10e4e3919f7504433 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 19 Apr 2024 21:05:52 +1000 Subject: [PATCH 072/126] Use proper check for derivative sampler validation --- .../noise/config/templates/DerivativeNoiseSamplerTemplate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java index 4d01cc58be..de6dbac3a0 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java @@ -14,7 +14,7 @@ public class DerivativeNoiseSamplerTemplate extends SamplerTemplate Date: Fri, 19 Apr 2024 21:07:53 +1000 Subject: [PATCH 073/126] Require implementing derivable check --- .../noise/samplers/noise/simplex/DerivativeFractal.java | 5 +++++ .../com/dfsek/terra/api/noise/DerivativeNoiseSampler.java | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java index 45928a619f..bbf5d8e5cc 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java @@ -64,6 +64,11 @@ private static float[] baseNoise(float px, float py) { return new float[] { va + ux * (vb - va) + uy * (vc - va) + ux * uy * (va - vb - vc + vd), u2x, u2y }; } + @Override + public boolean isDerivable() { + return true; + } + @Override public double[] noised(long seed, double x, double y) { x *= frequency; diff --git a/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java b/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java index 12bc1e36d7..5f341ada28 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java +++ b/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java @@ -12,9 +12,7 @@ static boolean providesDerivative(NoiseSampler sampler) { return false; } - default boolean isDerivable() { - return false; - } + boolean isDerivable(); double[] noised(long seed, double x, double y); From ff03b38b814ef4db4e1fcfe8fd559365735ada28 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 19 Apr 2024 21:25:16 +1000 Subject: [PATCH 074/126] Derivative API documentation --- .../DerivativeNoiseSamplerTemplate.java | 2 +- .../noise/simplex/DerivativeFractal.java | 2 +- .../api/noise/DerivativeNoiseSampler.java | 31 ++++++++++++++++--- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java index de6dbac3a0..d93054ac9a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java @@ -14,7 +14,7 @@ public class DerivativeNoiseSamplerTemplate extends SamplerTemplate Date: Sat, 20 Apr 2024 15:55:59 +1000 Subject: [PATCH 075/126] Reduce number of erosion impulses A reduction of impulse evaluations from 5^2 to 3^2, original algorithm used exponential falloff function which required evaluating impulses from further away to avoid artifacts. I've changed it to a parabolic falloff function which is exactly 0 at the largest possible distance from a cell origin, meaning any cells further than that will not have an effect, preventing said artifacting from occurring. The parabolic function could be replaced with an exponential function (or any other similar easing function) as long as it has an x-intercept at maxCellDistSq. In addition, an option to control whether averaging impulses has been added as it has more of a visual impact with the aforementioned changes. --- .../noise/PseudoErosionTemplate.java | 10 +++- .../samplers/noise/simplex/PseudoErosion.java | 48 +++++++++++-------- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java index b81c053f7c..f5e1ac46c9 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java @@ -53,10 +53,18 @@ public class PseudoErosionTemplate extends SamplerTemplate { @Default private double slopeMaskFull = 1; + @Value("jitter") + @Default + private double jitterModifier = 1; + + @Value("average-impulses") + @Default + private boolean averageErosionImpulses = true; + @Override public PseudoErosion get() { return new PseudoErosion(octaves, gain, lacunarity, slopeStrength, branchStrength, strength, - erosionFrequency, heightSampler, slopeMask, slopeMaskFull, slopeMaskNone); + erosionFrequency, heightSampler, slopeMask, slopeMaskFull, slopeMaskNone, jitterModifier, averageErosionImpulses); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java index ca4ce82120..41b1e2db86 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java @@ -21,9 +21,14 @@ public class PseudoErosion implements NoiseSampler { private final boolean slopeMask; private final double slopeMaskFullSq; private final double slopeMaskNoneSq; + private final double jitter; + private final double maxCellDistSq; + private final double maxCellDistSqRecip; + private final boolean averageErosionImpulses; public PseudoErosion(int octaves, double gain, double lacunarity, double slopeStrength, double branchStrength, double erosionStrength, double erosionFrequency, DerivativeNoiseSampler sampler, - boolean slopeMask, double slopeMaskFull, double slopeMaskNone) { + boolean slopeMask, double slopeMaskFull, double slopeMaskNone, double jitterModifier, + boolean averageErosionImpulses) { this.octaves = octaves; this.gain = gain; this.lacunarity = lacunarity; @@ -37,6 +42,10 @@ public PseudoErosion(int octaves, double gain, double lacunarity, double slopeSt // squared value, otherwise a sqrt would need to be used this.slopeMaskFullSq = slopeMaskFull * slopeMaskFull * Math.signum(slopeMaskFull); this.slopeMaskNoneSq = slopeMaskNone * slopeMaskNone * Math.signum((slopeMaskNone)); + this.jitter = 0.43701595 * jitterModifier; + this.averageErosionImpulses = averageErosionImpulses; + this.maxCellDistSq = 1 + jitter * jitter; + this.maxCellDistSqRecip = 1 / maxCellDistSq; } public static float hash(float x, float y) { @@ -62,26 +71,25 @@ public static float fract(float x) { return (x - (float)Math.floor(x)); } - public static float[] erosion(float x, float y, float dirX, float dirY) { - float gridX = (float) Math.floor(x); - float gridY = (float) Math.floor(y); - float localX = x - gridX; - float localY = y - gridY; + public float[] erosion(float x, float y, float dirX, float dirY) { + int gridX = Math.round(x); + int gridY = Math.round(y); float noise = 0.0f; float dirOutX = 0.0f; float dirOutY = 0.0f; float cumAmp = 0.0f; - for (int cellX = -2; cellX < 2; cellX++) { - for (int cellY = -2; cellY < 2; cellY++) { + for (int cellX = gridX - 1; cellX <= gridX + 1; cellX++) { + for (int cellY = gridY - 1; cellY <= gridY + 1; cellY++) { // TODO - Make seed affect hashing - float cellHash = hash(gridX - (float) cellX, gridY - (float) cellY); - float cellOffsetX = hashX(cellHash) * 0.5f; - float cellOffsetY = hashY(cellHash) * 0.5f; - float cellOriginDeltaX = cellX - cellOffsetX + localX; - float cellOriginDeltaY = cellY - cellOffsetY + localY; - float cellOriginDistSq = dot(cellOriginDeltaX, cellOriginDeltaY, cellOriginDeltaX, cellOriginDeltaY); - float amp = (float)exp(-cellOriginDistSq * 2.0); // Exponentially decrease amplitude further from cell center + float cellHash = hash(cellX, cellY); + float cellOffsetX = (float) (hashX(cellHash) * jitter); + float cellOffsetY = (float) (hashY(cellHash) * jitter); + float cellOriginDeltaX = (x - cellX) + cellOffsetX; + float cellOriginDeltaY = (y - cellY) + cellOffsetY; + float cellOriginDistSq = cellOriginDeltaX * cellOriginDeltaX + cellOriginDeltaY * cellOriginDeltaY; + if (cellOriginDistSq > maxCellDistSq) continue; // Skip calculating cells too far away + float ampTmp = (float) ((cellOriginDistSq * maxCellDistSqRecip) - 1); float amp = ampTmp * ampTmp; // Decrease cell amplitude further away cumAmp += amp; float directionalStrength = dot(cellOriginDeltaX, cellOriginDeltaY, dirX, dirY) * TAU; noise += (float) (MathUtil.cos(directionalStrength) * amp); @@ -90,11 +98,11 @@ public static float[] erosion(float x, float y, float dirX, float dirY) { dirOutY -= sinAngle * (cellOriginDeltaY + dirY); } } - - noise /= cumAmp; - dirOutX /= cumAmp; - dirOutY /= cumAmp; - + if (averageErosionImpulses && cumAmp != 0) { + noise /= cumAmp; + dirOutX /= cumAmp; + dirOutY /= cumAmp; + } return new float[] {noise, dirOutX, dirOutY}; } From 62317a2f3f4a2b03e0749e5e0a4bca6a284dee83 Mon Sep 17 00:00:00 2001 From: Gavin Tran Date: Sun, 21 Apr 2024 14:48:46 -0400 Subject: [PATCH 076/126] Add SaltedNoiseFunctions --- .../noise/SaltedNoiseFunction2.java | 38 +++++++++++++++++++ .../noise/SaltedNoiseFunction3.java | 38 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction3.java diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java new file mode 100644 index 0000000000..16f3b2a8e1 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.addons.noise.paralithic.noise; + +import com.dfsek.paralithic.functions.dynamic.Context; +import com.dfsek.paralithic.functions.dynamic.DynamicFunction; +import com.dfsek.paralithic.node.Statefulness; + +import com.dfsek.terra.api.noise.NoiseSampler; + +import org.jetbrains.annotations.NotNull; + + +public class SaltedNoiseFunction2 implements DynamicFunction { + private final NoiseSampler gen; + + public SaltedNoiseFunction2(NoiseSampler gen) { + this.gen = gen; + } + + @Override + public double eval(double... args) { + throw new UnsupportedOperationException("Cannot evaluate seeded function without seed context."); + } + + @Override + public double eval(Context context, double... args) { + return gen.noise(((SeedContext) context).getSeed() + (long) args[2], args[0], args[1]); + } + + @Override + public int getArgNumber() { + return 3; + } + + @Override + public @NotNull Statefulness statefulness() { + return Statefulness.CONTEXTUAL; + } +} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction3.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction3.java new file mode 100644 index 0000000000..5dc483d5c8 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction3.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.addons.noise.paralithic.noise; + +import com.dfsek.paralithic.functions.dynamic.Context; +import com.dfsek.paralithic.functions.dynamic.DynamicFunction; +import com.dfsek.paralithic.node.Statefulness; + +import com.dfsek.terra.api.noise.NoiseSampler; + +import org.jetbrains.annotations.NotNull; + + +public class SaltedNoiseFunction3 implements DynamicFunction { + private final NoiseSampler gen; + + public SaltedNoiseFunction3(NoiseSampler gen) { + this.gen = gen; + } + + @Override + public double eval(double... args) { + throw new UnsupportedOperationException("Cannot evaluate seeded function without seed context."); + } + + @Override + public double eval(Context context, double... args) { + return gen.noise(((SeedContext) context).getSeed() + (long) args[3], args[0], args[1], args[2]); + } + + @Override + public int getArgNumber() { + return 4; + } + + @Override + public @NotNull Statefulness statefulness() { + return Statefulness.CONTEXTUAL; + } +} From 72f761678af082d8f8a13d2d34ca920afae0c80e Mon Sep 17 00:00:00 2001 From: Gavin Tran Date: Sun, 21 Apr 2024 14:54:45 -0400 Subject: [PATCH 077/126] Add SaltedNoiseFunctions in sampler conversion --- .../addons/noise/paralithic/FunctionUtil.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java index 5dbc740ecf..ef4fe2aeb2 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java @@ -11,6 +11,8 @@ import com.dfsek.terra.addons.noise.paralithic.defined.UserDefinedFunction; import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction2; import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction3; +import com.dfsek.terra.addons.noise.paralithic.noise.SaltedNoiseFunction2; +import com.dfsek.terra.addons.noise.paralithic.noise.SaltedNoiseFunction3; public class FunctionUtil { @@ -23,10 +25,15 @@ public static Map convertFunctionsAndSamplers(Map 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()))); + samplers.forEach((id, sampler) -> { + if (sampler.getDimensions() == 2) { + functionMap.put(id, new NoiseFunction2(sampler.getSampler())); + functionMap.put(id + "Salted", new SaltedNoiseFunction2(sampler.getSampler())); + } else { + functionMap.put(id, new NoiseFunction3(sampler.getSampler())); + functionMap.put(id + "Salted", new SaltedNoiseFunction3(sampler.getSampler())); + } + }); return functionMap; } } From c20b1eaf107f9f616d20f4429c6d746118f14b8d Mon Sep 17 00:00:00 2001 From: Gavin Tran Date: Sun, 21 Apr 2024 15:39:48 -0400 Subject: [PATCH 078/126] Apply code style fixes --- .../com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java | 2 +- .../addons/noise/paralithic/noise/SaltedNoiseFunction2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java index ef4fe2aeb2..d47693cde8 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/FunctionUtil.java @@ -26,7 +26,7 @@ public static Map convertFunctionsAndSamplers(Map { - if (sampler.getDimensions() == 2) { + if(sampler.getDimensions() == 2) { functionMap.put(id, new NoiseFunction2(sampler.getSampler())); functionMap.put(id + "Salted", new SaltedNoiseFunction2(sampler.getSampler())); } else { diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java index 16f3b2a8e1..2e8f729298 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java @@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull; -public class SaltedNoiseFunction2 implements DynamicFunction { +public class SaltedNoiseFunction2 implements DynamicFunction { private final NoiseSampler gen; public SaltedNoiseFunction2(NoiseSampler gen) { From dd272bce64131b3470a3f30ecedbdb7be0d7fe4d Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Wed, 1 May 2024 17:04:34 -0600 Subject: [PATCH 079/126] WIP 1.20.6 --- buildSrc/build.gradle.kts | 6 ++-- buildSrc/src/main/kotlin/Versions.kt | 35 +++++++++---------- gradle/wrapper/gradle-wrapper.properties | 4 +-- .../config/BiomeParticleConfigTemplate.java | 3 +- .../java/com/dfsek/terra/mod/data/Codecs.java | 9 ++--- .../MinecraftChunkGeneratorWrapper.java | 3 +- .../mod/generation/TerraBiomeSource.java | 3 +- .../entity/MobSpawnerBlockEntityMixin.java | 4 +-- .../terra/block/state/BlockStateMixin.java | 3 +- .../src/main/resources/terra.accesswidener | 1 + 10 files changed, 38 insertions(+), 33 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 3bdfddef0f..6b56f288f3 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -17,10 +17,10 @@ repositories { dependencies { //TODO Allow pulling from Versions.kt implementation("com.github.johnrengelman", "shadow", "8.1.1") - implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.5.11") + implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.7.0") - implementation("org.ow2.asm", "asm", "9.6") - implementation("org.ow2.asm", "asm-tree", "9.6") + implementation("org.ow2.asm", "asm", "9.7") + implementation("org.ow2.asm", "asm-tree", "9.7") implementation("com.dfsek.tectonic", "common", "4.2.1") implementation("org.yaml", "snakeyaml", "2.2") } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index a150ac3b26..ba9195cc7c 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -12,23 +12,22 @@ object Versions { const val caffeine = "3.1.8" - const val slf4j = "2.0.9" - const val log4j_slf4j_impl = "2.20.0" - + const val slf4j = "2.0.13" + object Internal { const val shadow = "8.1.1" - const val apacheText = "1.11.0" - const val apacheIO = "2.15.1" - const val guava = "32.1.3-jre" - const val asm = "9.6" + const val apacheText = "1.12.0" + const val apacheIO = "2.16.1" + const val guava = "33.1.0-jre" + const val asm = "9.7" const val snakeYml = "2.2" const val jetBrainsAnnotations = "24.1.0" - const val junit = "5.10.1" + const val junit = "5.10.2" } } object Fabric { - const val fabricAPI = "0.91.2+${Mod.minecraft}" + const val fabricAPI = "0.97.8+${Mod.minecraft}" } // // object Quilt { @@ -39,12 +38,12 @@ object Versions { object Mod { const val mixin = "0.12.5+mixin.0.8.5" - const val minecraft = "1.20.4" + const val minecraft = "1.20.6" const val yarn = "$minecraft+build.1" - const val fabricLoader = "0.15.1" + const val fabricLoader = "0.15.10" - const val architecuryLoom = "1.4.369" - const val architecturyPlugin = "3.4.151" + const val architecuryLoom = "1.6.395" + const val architecturyPlugin = "3.4.155" } // // object Forge { @@ -53,14 +52,14 @@ object Versions { // } object Bukkit { - const val minecraft = "1.20.4" - const val paperBuild = "$minecraft-R0.1-20231209.173338-2" + const val minecraft = "1.20.6" + const val paperBuild = "$minecraft-R0.1-20240501.172135-12" const val paper = paperBuild const val paperLib = "1.0.8" - const val reflectionRemapper = "0.1.0" + const val reflectionRemapper = "0.1.1" const val paperDevBundle = paperBuild - const val runPaper = "2.2.2" - const val paperWeight = "1.5.11" + const val runPaper = "2.3.0" + const val paperWeight = "1.7.0" } // diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index db8c3baafe..381baa9cef 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME 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 97c8c8ed7a..3bc4474b60 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 @@ -7,6 +7,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.command.argument.ParticleEffectArgumentType; import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryWrapper; import net.minecraft.world.biome.BiomeParticleConfig; @@ -27,7 +28,7 @@ public BiomeParticleConfig get() { try { return new BiomeParticleConfig( - ParticleEffectArgumentType.readParameters(new StringReader(particle), Registries.PARTICLE_TYPE.getReadOnlyWrapper()), + ParticleEffectArgumentType.readParameters(new StringReader(particle), (RegistryWrapper.WrapperLookup) Registries.PARTICLE_TYPE.getReadOnlyWrapper()), probability); } catch(CommandSyntaxException e) { throw new RuntimeException(e); 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 595f5ec5b8..ab7604fe50 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 @@ -1,6 +1,7 @@ package com.dfsek.terra.mod.data; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; @@ -32,15 +33,15 @@ public final class Codecs { "No such config pack " + id))))); - public static final Codec TERRA_BIOME_SOURCE = RecordCodecBuilder - .create(instance -> instance.group( + public static final MapCodec TERRA_BIOME_SOURCE = RecordCodecBuilder + .mapCodec(instance -> instance.group( CONFIG_PACK.fieldOf("pack") .stable() .forGetter(TerraBiomeSource::getPack)) .apply(instance, instance.stable(TerraBiomeSource::new))); - public static final Codec MINECRAFT_CHUNK_GENERATOR_WRAPPER = RecordCodecBuilder - .create( + public static final MapCodec MINECRAFT_CHUNK_GENERATOR_WRAPPER = RecordCodecBuilder + .mapCodec( instance -> instance.group( TERRA_BIOME_SOURCE.fieldOf("biome_source") .stable() 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 899b007f0b..8ac07a6888 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 @@ -18,6 +18,7 @@ package com.dfsek.terra.mod.generation; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.registry.entry.RegistryEntry; @@ -85,7 +86,7 @@ public MinecraftChunkGeneratorWrapper(TerraBiomeSource biomeSource, ConfigPack c } @Override - protected Codec getCodec() { + protected MapCodec getCodec() { return Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER; } 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 7aa5d8aea2..533a8c98bd 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,6 +18,7 @@ package com.dfsek.terra.mod.generation; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeSource; @@ -47,7 +48,7 @@ public TerraBiomeSource(ConfigPack pack) { } @Override - protected Codec getCodec() { + protected MapCodec getCodec() { return Codecs.TERRA_BIOME_SOURCE; } 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 ccc8b738a5..2ec582417f 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 @@ -50,7 +50,7 @@ private MobSpawnerBlockEntityMixin(BlockEntityType type, BlockPos pos, BlockS public abstract MobSpawnerLogic getLogic(); @Shadow - public abstract void method_46408(net.minecraft.entity.EntityType entityType, Random random); + public abstract void setEntityType(net.minecraft.entity.EntityType entityType, Random random); public EntityType terra$getSpawnedType() { return (EntityType) Registries.ENTITY_TYPE.get( @@ -64,7 +64,7 @@ private MobSpawnerBlockEntityMixin(BlockEntityType type, BlockPos pos, BlockS } else { rand = Random.create(); } - method_46408((net.minecraft.entity.EntityType) creatureType, rand); + setEntityType((net.minecraft.entity.EntityType) creatureType, rand); } 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 7053dd4f51..9ecb3eccc6 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 @@ -3,6 +3,7 @@ import com.google.common.collect.ImmutableMap; import com.mojang.serialization.MapCodec; +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; import net.minecraft.block.AbstractBlock.AbstractBlockState; import net.minecraft.block.Block; import net.minecraft.registry.Registries; @@ -24,7 +25,7 @@ @Mixin(AbstractBlockState.class) @Implements(@Interface(iface = BlockState.class, prefix = "terra$")) public abstract class BlockStateMixin extends State { - private BlockStateMixin(Block owner, ImmutableMap, Comparable> entries, + private BlockStateMixin(Block owner, Reference2ObjectArrayMap, Comparable> entries, MapCodec codec) { super(owner, entries, codec); } diff --git a/platforms/mixin-common/src/main/resources/terra.accesswidener b/platforms/mixin-common/src/main/resources/terra.accesswidener index d638bbf457..50cba4f7d0 100644 --- a/platforms/mixin-common/src/main/resources/terra.accesswidener +++ b/platforms/mixin-common/src/main/resources/terra.accesswidener @@ -1,3 +1,4 @@ accessWidener v1 named accessible class net/minecraft/world/biome/Biome$Weather accessible class net/minecraft/world/gen/WorldPresets$Registrar +accessible method net/minecraft/block/FluidBlock getFluidState (Lnet/minecraft/block/BlockState;)Lnet/minecraft/fluid/FluidState From 17acde09a31d81063a29b877d0bfdd9381e09b68 Mon Sep 17 00:00:00 2001 From: Oak Date: Fri, 31 May 2024 12:11:07 +0100 Subject: [PATCH 080/126] Updated Bukkit to 1.20.6 --- .github/workflows/gradle-build.yml | 4 ++-- buildSrc/build.gradle.kts | 2 +- buildSrc/src/main/kotlin/Versions.kt | 4 ++-- platforms/bukkit/build.gradle.kts | 2 +- platforms/bukkit/nms/{v1_20_R3 => v1_20_R6}/build.gradle.kts | 0 .../dfsek/terra/bukkit/nms/v1_20_R6}/AwfulBukkitHacks.java | 2 +- .../com/dfsek/terra/bukkit/nms/v1_20_R6}/NMSBiomeInfo.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R6}/NMSBiomeInjector.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R6}/NMSBiomeProvider.java | 2 +- .../bukkit/nms/v1_20_R6}/NMSChunkGeneratorDelegate.java | 4 ++-- .../com/dfsek/terra/bukkit/nms/v1_20_R6}/NMSInitializer.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R6}/NMSInjectListener.java | 4 ++-- .../dfsek/terra/bukkit/nms/v1_20_R6}/NMSWorldProperties.java | 2 +- .../com/dfsek/terra/bukkit/nms/v1_20_R6}/Reflection.java | 2 +- .../dfsek/terra/bukkit/nms/v1_20_R6}/RegistryFetcher.java | 5 ++--- 15 files changed, 19 insertions(+), 20 deletions(-) rename platforms/bukkit/nms/{v1_20_R3 => v1_20_R6}/build.gradle.kts (100%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6}/AwfulBukkitHacks.java (99%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6}/NMSBiomeInfo.java (83%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6}/NMSBiomeInjector.java (98%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6}/NMSBiomeProvider.java (97%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6}/NMSChunkGeneratorDelegate.java (98%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6}/NMSInitializer.java (90%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6}/NMSInjectListener.java (95%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6}/NMSWorldProperties.java (94%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6}/Reflection.java (97%) rename platforms/bukkit/nms/{v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3 => v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6}/RegistryFetcher.java (84%) diff --git a/.github/workflows/gradle-build.yml b/.github/workflows/gradle-build.yml index 3e40fe7be0..2117c7eee2 100644 --- a/.github/workflows/gradle-build.yml +++ b/.github/workflows/gradle-build.yml @@ -18,10 +18,10 @@ jobs: steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93 with: - java-version: '17' + java-version: '21' distribution: 'temurin' server-id: github # Value of the distributionManagement/repository/id field of the pom.xml settings-path: ${{ github.workspace }} # location for the settings.xml file diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 6b56f288f3..2bf3aa5a73 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -17,7 +17,7 @@ repositories { dependencies { //TODO Allow pulling from Versions.kt implementation("com.github.johnrengelman", "shadow", "8.1.1") - implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.7.0") + implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.7.1") implementation("org.ow2.asm", "asm", "9.7") implementation("org.ow2.asm", "asm-tree", "9.7") diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index ba9195cc7c..5169834f0a 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -53,13 +53,13 @@ object Versions { object Bukkit { const val minecraft = "1.20.6" - const val paperBuild = "$minecraft-R0.1-20240501.172135-12" + const val paperBuild = "$minecraft-R0.1-20240530.204353-104" const val paper = paperBuild const val paperLib = "1.0.8" const val reflectionRemapper = "0.1.1" const val paperDevBundle = paperBuild const val runPaper = "2.3.0" - const val paperWeight = "1.7.0" + const val paperWeight = "1.7.1" } // diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 6f75b01330..a63703c558 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -10,7 +10,7 @@ repositories { dependencies { shaded(project(":platforms:bukkit:common")) - shaded(project(":platforms:bukkit:nms:v1_20_R3", configuration = "reobf")) + shaded(project(":platforms:bukkit:nms:v1_20_R6", configuration = "reobf")) shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } diff --git a/platforms/bukkit/nms/v1_20_R3/build.gradle.kts b/platforms/bukkit/nms/v1_20_R6/build.gradle.kts similarity index 100% rename from platforms/bukkit/nms/v1_20_R3/build.gradle.kts rename to platforms/bukkit/nms/v1_20_R6/build.gradle.kts diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/AwfulBukkitHacks.java similarity index 99% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/AwfulBukkitHacks.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/AwfulBukkitHacks.java index fa2cc9907b..d6352afb8d 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/AwfulBukkitHacks.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R6; import com.google.common.collect.ImmutableMap; import com.mojang.serialization.Lifecycle; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeInfo.java similarity index 83% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInfo.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeInfo.java index f47d21c56e..fe3cbcf77c 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInfo.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeInfo.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R6; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeInjector.java similarity index 98% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInjector.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeInjector.java index e75b6fc0a6..77b3c2701b 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeInjector.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R6; import net.minecraft.core.Holder; import net.minecraft.core.Registry; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeProvider.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeProvider.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeProvider.java index 875a77fb52..e72819aba5 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSBiomeProvider.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeProvider.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R6; import com.mojang.serialization.Codec; import net.minecraft.core.Holder; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSChunkGeneratorDelegate.java similarity index 98% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSChunkGeneratorDelegate.java index 4338dc140c..49c956eda0 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSChunkGeneratorDelegate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R6; import com.mojang.serialization.Codec; import net.minecraft.core.BlockPos; @@ -19,7 +19,7 @@ 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_20_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInitializer.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSInitializer.java similarity index 90% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInitializer.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSInitializer.java index 084c5c30a0..625275cf0f 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInitializer.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSInitializer.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R6; import org.bukkit.Bukkit; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSInjectListener.java similarity index 95% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSInjectListener.java index a81e93a3f3..fddc03f9c2 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSInjectListener.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R6; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; +import org.bukkit.craftbukkit.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_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSWorldProperties.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSWorldProperties.java similarity index 94% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSWorldProperties.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSWorldProperties.java index 60f6cee46c..d322a2bffc 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/NMSWorldProperties.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSWorldProperties.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R6; import net.minecraft.world.level.LevelHeightAccessor; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/Reflection.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/Reflection.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/Reflection.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/Reflection.java index 32243da54d..0b229acd23 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/Reflection.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/Reflection.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R6; import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; diff --git a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/RegistryFetcher.java similarity index 84% rename from platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/RegistryFetcher.java index 6dbbecbc77..de2258d09a 100644 --- a/platforms/bukkit/nms/v1_20_R3/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R3/RegistryFetcher.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/RegistryFetcher.java @@ -1,12 +1,11 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R3; +package com.dfsek.terra.bukkit.nms.v1_20_R6; 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 org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; +import org.bukkit.craftbukkit.CraftServer; public class RegistryFetcher { From 3fa4b21247c15de31208d24ef921cb9908793188 Mon Sep 17 00:00:00 2001 From: Oak Date: Sun, 2 Jun 2024 21:27:07 +0100 Subject: [PATCH 081/126] Attempted to fix paper versions --- buildSrc/src/main/kotlin/Versions.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 5169834f0a..ada0b61478 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -53,11 +53,11 @@ object Versions { object Bukkit { const val minecraft = "1.20.6" - const val paperBuild = "$minecraft-R0.1-20240530.204353-104" + const val paperBuild = "$minecraft-R0.1-20240601.143523-106" const val paper = paperBuild const val paperLib = "1.0.8" const val reflectionRemapper = "0.1.1" - const val paperDevBundle = paperBuild + const val paperDevBundle = "$minecraft-R0.1-20240601.143523-105" const val runPaper = "2.3.0" const val paperWeight = "1.7.1" } From 4536767794d36174e1fe46cb1dfa0f3f36833aed Mon Sep 17 00:00:00 2001 From: Oak Date: Mon, 3 Jun 2024 11:36:50 +0100 Subject: [PATCH 082/126] Updated to 1.20.6 --- buildSrc/build.gradle.kts | 2 +- buildSrc/src/main/kotlin/CompilationConfig.kt | 4 ++-- buildSrc/src/main/kotlin/DependencyConfig.kt | 2 +- buildSrc/src/main/kotlin/Versions.kt | 2 +- .../terra/bukkit/handles/BukkitWorldHandle.java | 2 +- .../java/com/dfsek/terra/bukkit/nms/Initializer.java | 2 +- .../nms/{v1_20_R6 => v1_20_6}/AwfulBukkitHacks.java | 6 +++--- .../nms/{v1_20_R6 => v1_20_6}/NMSBiomeInfo.java | 2 +- .../nms/{v1_20_R6 => v1_20_6}/NMSBiomeInjector.java | 2 +- .../nms/{v1_20_R6 => v1_20_6}/NMSBiomeProvider.java | 12 ++++++++---- .../NMSChunkGeneratorDelegate.java | 8 ++++---- .../nms/{v1_20_R6 => v1_20_6}/NMSInitializer.java | 2 +- .../nms/{v1_20_R6 => v1_20_6}/NMSInjectListener.java | 2 +- .../{v1_20_R6 => v1_20_6}/NMSWorldProperties.java | 2 +- .../bukkit/nms/{v1_20_R6 => v1_20_6}/Reflection.java | 2 +- .../nms/{v1_20_R6 => v1_20_6}/RegistryFetcher.java | 3 ++- 16 files changed, 30 insertions(+), 25 deletions(-) rename platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/{v1_20_R6 => v1_20_6}/AwfulBukkitHacks.java (97%) rename platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/{v1_20_R6 => v1_20_6}/NMSBiomeInfo.java (83%) rename platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/{v1_20_R6 => v1_20_6}/NMSBiomeInjector.java (98%) rename platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/{v1_20_R6 => v1_20_6}/NMSBiomeProvider.java (75%) rename platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/{v1_20_R6 => v1_20_6}/NMSChunkGeneratorDelegate.java (97%) rename platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/{v1_20_R6 => v1_20_6}/NMSInitializer.java (90%) rename platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/{v1_20_R6 => v1_20_6}/NMSInjectListener.java (97%) rename platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/{v1_20_R6 => v1_20_6}/NMSWorldProperties.java (94%) rename platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/{v1_20_R6 => v1_20_6}/Reflection.java (97%) rename platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/{v1_20_R6 => v1_20_6}/RegistryFetcher.java (91%) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 2bf3aa5a73..3d319e8c73 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -9,7 +9,7 @@ repositories { maven("https://repo.codemc.org/repository/maven-public") { name = "CodeMC" } - maven("https://papermc.io/repo/repository/maven-public/") { + maven("https://repo.papermc.io/repository/maven-public/") { name = "PaperMC" } } diff --git a/buildSrc/src/main/kotlin/CompilationConfig.kt b/buildSrc/src/main/kotlin/CompilationConfig.kt index 952b910918..f0d1e78294 100644 --- a/buildSrc/src/main/kotlin/CompilationConfig.kt +++ b/buildSrc/src/main/kotlin/CompilationConfig.kt @@ -22,8 +22,8 @@ fun Project.configureCompilation() { apply() configure { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } tasks.withType { diff --git a/buildSrc/src/main/kotlin/DependencyConfig.kt b/buildSrc/src/main/kotlin/DependencyConfig.kt index 58bde514ce..0778808d84 100644 --- a/buildSrc/src/main/kotlin/DependencyConfig.kt +++ b/buildSrc/src/main/kotlin/DependencyConfig.kt @@ -36,7 +36,7 @@ fun Project.configureDependencies() { maven("https://repo.codemc.org/repository/maven-public") { name = "CodeMC" } - maven("https://papermc.io/repo/repository/maven-public/") { + maven("https://repo.papermc.io/repository/maven-public/") { name = "PaperMC" } maven("https://files.minecraftforge.net/maven/") { diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index ada0b61478..7483995123 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -53,7 +53,7 @@ object Versions { object Bukkit { const val minecraft = "1.20.6" - const val paperBuild = "$minecraft-R0.1-20240601.143523-106" + const val paperBuild = "$minecraft-R0.1-20240602.222958-107" const val paper = paperBuild const val paperLib = "1.0.8" const val reflectionRemapper = "0.1.1" 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 e3b92b069d..c6113bbd7a 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 @@ -72,7 +72,7 @@ public BukkitWorldHandle() { String entityID = id.toUpperCase(Locale.ROOT).substring(10); return new BukkitEntityType(switch(entityID) { - case "END_CRYSTAL" -> org.bukkit.entity.EntityType.ENDER_CRYSTAL; + case "END_CRYSTAL" -> org.bukkit.entity.EntityType.END_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); diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java index 413250d57b..2b92178478 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java @@ -8,7 +8,7 @@ public interface Initializer { - String NMS = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; + String NMS = "v" + Bukkit.getServer().getMinecraftVersion().replace(".", "_"); String TERRA_PACKAGE = Initializer.class.getPackageName(); static boolean init(PlatformImpl platform) { diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/AwfulBukkitHacks.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/AwfulBukkitHacks.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/AwfulBukkitHacks.java index d6352afb8d..d052b81090 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/AwfulBukkitHacks.java @@ -1,10 +1,10 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R6; +package com.dfsek.terra.bukkit.nms.v1_20_6; 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.RegistrationInfo; import net.minecraft.core.WritableRegistry; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; @@ -49,7 +49,7 @@ public static void registerBiomes(ConfigRegistry configRegistry) { new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key)) ); - Reference holder = biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); + Reference holder = biomeRegistry.register(delegateKey, platform, RegistrationInfo.BUILT_IN); Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder. platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeInfo.java similarity index 83% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeInfo.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeInfo.java index fe3cbcf77c..a62604447f 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeInfo.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeInfo.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R6; +package com.dfsek.terra.bukkit.nms.v1_20_6; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeInjector.java similarity index 98% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeInjector.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeInjector.java index 77b3c2701b..deba15dece 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeInjector.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R6; +package com.dfsek.terra.bukkit.nms.v1_20_6; import net.minecraft.core.Holder; import net.minecraft.core.Registry; diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeProvider.java similarity index 75% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeProvider.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeProvider.java index e72819aba5..79861c7e44 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSBiomeProvider.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeProvider.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R6; +package com.dfsek.terra.bukkit.nms.v1_20_6; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.world.level.biome.Biome; @@ -35,8 +35,12 @@ protected Stream> collectPossibleBiomes() { } @Override - protected @NotNull Codec codec() { - return BiomeSource.CODEC; + protected @NotNull MapCodec codec() { + return MapCodec.assumeMapUnsafe(BiomeSource.CODEC); +// return MapCodec.unit(null); +// BuiltInRegistries.BIOME_SOURCE.byNameCodec().dispatchMap(this::codec, Function.identity()); +// BuiltInRegistries.BIOME_SOURCE.byNameCodec().dispatchStable(BiomeSource::codec, Function.identity()); +// return BiomeSource.CODEC; } @Override diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSChunkGeneratorDelegate.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSChunkGeneratorDelegate.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSChunkGeneratorDelegate.java index 49c956eda0..0aadfcb9e7 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSChunkGeneratorDelegate.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R6; +package com.dfsek.terra.bukkit.nms.v1_20_6; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; import net.minecraft.server.level.WorldGenRegion; import net.minecraft.world.level.LevelAccessor; @@ -54,8 +54,8 @@ public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBio } @Override - protected @NotNull Codec codec() { - return ChunkGenerator.CODEC; + protected @NotNull MapCodec codec() { + return MapCodec.assumeMapUnsafe(ChunkGenerator.CODEC); } @Override diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSInitializer.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSInitializer.java similarity index 90% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSInitializer.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSInitializer.java index 625275cf0f..8ac1b46c91 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSInitializer.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSInitializer.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R6; +package com.dfsek.terra.bukkit.nms.v1_20_6; import org.bukkit.Bukkit; diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSInjectListener.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSInjectListener.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSInjectListener.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSInjectListener.java index fddc03f9c2..22e153139c 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSInjectListener.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R6; +package com.dfsek.terra.bukkit.nms.v1_20_6; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkGenerator; diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSWorldProperties.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSWorldProperties.java similarity index 94% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSWorldProperties.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSWorldProperties.java index d322a2bffc..386192103a 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/NMSWorldProperties.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSWorldProperties.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R6; +package com.dfsek.terra.bukkit.nms.v1_20_6; import net.minecraft.world.level.LevelHeightAccessor; diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/Reflection.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/Reflection.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/Reflection.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/Reflection.java index 0b229acd23..77652cd6e7 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/Reflection.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/Reflection.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R6; +package com.dfsek.terra.bukkit.nms.v1_20_6; import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/RegistryFetcher.java b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/RegistryFetcher.java similarity index 91% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/RegistryFetcher.java rename to platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/RegistryFetcher.java index de2258d09a..ca511dffaa 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_R6/RegistryFetcher.java +++ b/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/RegistryFetcher.java @@ -1,10 +1,11 @@ -package com.dfsek.terra.bukkit.nms.v1_20_R6; +package com.dfsek.terra.bukkit.nms.v1_20_6; 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 org.bukkit.Bukkit; import org.bukkit.craftbukkit.CraftServer; From 9e60db4b0da03f59c7991a93659b9c4ea40f8362 Mon Sep 17 00:00:00 2001 From: Oak Date: Mon, 10 Jun 2024 11:07:24 +0100 Subject: [PATCH 083/126] Updated MinecraftVersionInfo --- .../main/java/com/dfsek/terra/bukkit/util/VersionUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java index 6bc06a4371..848befc600 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java @@ -77,13 +77,13 @@ public boolean isSpigot() { public static final class MinecraftVersionInfo { private static final Logger logger = LoggerFactory.getLogger(MinecraftVersionInfo.class); - private static final Pattern VERSION_PATTERN = Pattern.compile("v?(\\d+)_(\\d+)_R(\\d+)"); + private static final Pattern VERSION_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)"); private final int major; private final int minor; private final int patch; private MinecraftVersionInfo() { - this(Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]); + this(Bukkit.getServer().getMinecraftVersion()); } private MinecraftVersionInfo(int major, int minor, int patch) { From 4e7de501c038be60df2f18004de6d7323e5a4282 Mon Sep 17 00:00:00 2001 From: Oak Date: Sun, 16 Jun 2024 19:21:34 +0100 Subject: [PATCH 084/126] Updated bukkit platform to 1.21 --- buildSrc/src/main/kotlin/Versions.kt | 6 ++--- platforms/bukkit/build.gradle.kts | 2 +- .../nms/{v1_20_R6 => v1_21}/build.gradle.kts | 0 .../bukkit/nms/v1_21}/AwfulBukkitHacks.java | 6 ++--- .../terra/bukkit/nms/v1_21}/NMSBiomeInfo.java | 2 +- .../bukkit/nms/v1_21}/NMSBiomeInjector.java | 2 +- .../bukkit/nms/v1_21}/NMSBiomeProvider.java | 2 +- .../nms/v1_21}/NMSChunkGeneratorDelegate.java | 11 ++++----- .../bukkit/nms/v1_21}/NMSInitializer.java | 2 +- .../bukkit/nms/v1_21}/NMSInjectListener.java | 23 +++++++++++++++++-- .../bukkit/nms/v1_21}/NMSWorldProperties.java | 2 +- .../terra/bukkit/nms/v1_21}/Reflection.java | 2 +- .../bukkit/nms/v1_21}/RegistryFetcher.java | 2 +- 13 files changed, 40 insertions(+), 22 deletions(-) rename platforms/bukkit/nms/{v1_20_R6 => v1_21}/build.gradle.kts (100%) rename platforms/bukkit/nms/{v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6 => v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21}/AwfulBukkitHacks.java (93%) rename platforms/bukkit/nms/{v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6 => v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21}/NMSBiomeInfo.java (83%) rename platforms/bukkit/nms/{v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6 => v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21}/NMSBiomeInjector.java (98%) rename platforms/bukkit/nms/{v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6 => v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21}/NMSBiomeProvider.java (97%) rename platforms/bukkit/nms/{v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6 => v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21}/NMSChunkGeneratorDelegate.java (93%) rename platforms/bukkit/nms/{v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6 => v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21}/NMSInitializer.java (90%) rename platforms/bukkit/nms/{v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6 => v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21}/NMSInjectListener.java (61%) rename platforms/bukkit/nms/{v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6 => v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21}/NMSWorldProperties.java (94%) rename platforms/bukkit/nms/{v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6 => v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21}/Reflection.java (97%) rename platforms/bukkit/nms/{v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6 => v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21}/RegistryFetcher.java (94%) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 7483995123..512af9721c 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -52,12 +52,12 @@ object Versions { // } object Bukkit { - const val minecraft = "1.20.6" - const val paperBuild = "$minecraft-R0.1-20240602.222958-107" + const val minecraft = "1.21" + const val paperBuild = "$minecraft-R0.1-20240615.005026-1" const val paper = paperBuild const val paperLib = "1.0.8" const val reflectionRemapper = "0.1.1" - const val paperDevBundle = "$minecraft-R0.1-20240601.143523-105" + const val paperDevBundle = paperBuild const val runPaper = "2.3.0" const val paperWeight = "1.7.1" } diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index a63703c558..95924dadde 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -10,7 +10,7 @@ repositories { dependencies { shaded(project(":platforms:bukkit:common")) - shaded(project(":platforms:bukkit:nms:v1_20_R6", configuration = "reobf")) + shaded(project(":platforms:bukkit:nms:v1_21", configuration = "reobf")) shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } diff --git a/platforms/bukkit/nms/v1_20_R6/build.gradle.kts b/platforms/bukkit/nms/v1_21/build.gradle.kts similarity index 100% rename from platforms/bukkit/nms/v1_20_R6/build.gradle.kts rename to platforms/bukkit/nms/v1_21/build.gradle.kts diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java similarity index 93% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/AwfulBukkitHacks.java rename to platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java index d052b81090..d16bbbf30a 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_6; +package com.dfsek.terra.bukkit.nms.v1_21; import com.google.common.collect.ImmutableMap; import net.minecraft.core.Holder; @@ -41,12 +41,12 @@ public static void registerBiomes(ConfigRegistry configRegistry) { try { BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome(); NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey(); - ResourceLocation vanillaMinecraftKey = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); + ResourceLocation vanillaMinecraftKey = ResourceLocation.fromNamespaceAndPath(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)) + ResourceLocation.fromNamespaceAndPath("terra", NMSBiomeInjector.createBiomeID(pack, key)) ); Reference holder = biomeRegistry.register(delegateKey, platform, RegistrationInfo.BUILT_IN); diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInfo.java similarity index 83% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeInfo.java rename to platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInfo.java index a62604447f..5bf85aa6de 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeInfo.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInfo.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_6; +package com.dfsek.terra.bukkit.nms.v1_21; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInjector.java similarity index 98% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeInjector.java rename to platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInjector.java index deba15dece..e6d1f78695 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInjector.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_6; +package com.dfsek.terra.bukkit.nms.v1_21; import net.minecraft.core.Holder; import net.minecraft.core.Registry; diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeProvider.java rename to platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java index 79861c7e44..18184144fa 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSBiomeProvider.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_6; +package com.dfsek.terra.bukkit.nms.v1_21; import com.mojang.serialization.MapCodec; import net.minecraft.core.Holder; diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSChunkGeneratorDelegate.java similarity index 93% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSChunkGeneratorDelegate.java rename to platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSChunkGeneratorDelegate.java index 0aadfcb9e7..16097df272 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSChunkGeneratorDelegate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_6; +package com.dfsek.terra.bukkit.nms.v1_21; import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; @@ -26,7 +26,6 @@ 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; @@ -87,10 +86,10 @@ public int 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) + public CompletableFuture fillFromNoise(@NotNull Blender blender, + @NotNull RandomState noiseConfig, + @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk) { + return vanilla.fillFromNoise(blender, noiseConfig, structureAccessor, chunk) .thenApply(c -> { LevelAccessor level = Reflection.STRUCTURE_MANAGER.getLevel(structureAccessor); BiomeProvider biomeProvider = pack.getBiomeProvider(); diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSInitializer.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInitializer.java similarity index 90% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSInitializer.java rename to platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInitializer.java index 8ac1b46c91..18f1a058f9 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSInitializer.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInitializer.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_6; +package com.dfsek.terra.bukkit.nms.v1_21; import org.bukkit.Bukkit; diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSInjectListener.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java similarity index 61% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSInjectListener.java rename to platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java index 22e153139c..98510ff88a 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java @@ -1,7 +1,9 @@ -package com.dfsek.terra.bukkit.nms.v1_20_6; +package com.dfsek.terra.bukkit.nms.v1_21; +import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.status.WorldGenContext; import org.bukkit.World; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.event.EventHandler; @@ -10,6 +12,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.lang.reflect.Field; import java.util.HashSet; import java.util.Set; import java.util.concurrent.locks.ReentrantLock; @@ -37,8 +40,24 @@ public void onWorldInit(WorldInitEvent event) { ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator(); NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed()); + ChunkMap chunkMap = serverWorld.getChunkSource().chunkMap; - serverWorld.getChunkSource().chunkMap.generator = new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()); + try { + Field worldGenContextField = chunkMap.getClass().getDeclaredField("worldGenContext"); + worldGenContextField.setAccessible(true); + + WorldGenContext worldGenContext = (WorldGenContext) worldGenContextField.get(chunkMap); + worldGenContextField.set(chunkMap, + new WorldGenContext( + worldGenContext.level(), + new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()), + worldGenContext.structureManager(), + worldGenContext.lightEngine(), + worldGenContext.mainThreadMailBox() + )); + } catch(NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } LOGGER.info("Successfully injected into world."); diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSWorldProperties.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSWorldProperties.java similarity index 94% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSWorldProperties.java rename to platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSWorldProperties.java index 386192103a..7860cf5308 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/NMSWorldProperties.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSWorldProperties.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_6; +package com.dfsek.terra.bukkit.nms.v1_21; import net.minecraft.world.level.LevelHeightAccessor; diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/Reflection.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java similarity index 97% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/Reflection.java rename to platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java index 77652cd6e7..57e1b8c9c9 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/Reflection.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_6; +package com.dfsek.terra.bukkit.nms.v1_21; import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; diff --git a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/RegistryFetcher.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/RegistryFetcher.java similarity index 94% rename from platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/RegistryFetcher.java rename to platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/RegistryFetcher.java index ca511dffaa..0377eea0fe 100644 --- a/platforms/bukkit/nms/v1_20_R6/src/main/java/com/dfsek/terra/bukkit/nms/v1_20_6/RegistryFetcher.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/RegistryFetcher.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms.v1_20_6; +package com.dfsek.terra.bukkit.nms.v1_21; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; From d810cad8d05b77a9a344751800ed3cf79c791611 Mon Sep 17 00:00:00 2001 From: Oak Date: Mon, 17 Jun 2024 15:50:06 +0100 Subject: [PATCH 085/126] Adjusted code for Spigot compatibility --- .../main/java/com/dfsek/terra/bukkit/nms/Initializer.java | 5 +++-- .../main/java/com/dfsek/terra/bukkit/util/VersionUtil.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java index 2b92178478..db50be3258 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java @@ -1,6 +1,7 @@ package com.dfsek.terra.bukkit.nms; -import org.bukkit.Bukkit; +import com.dfsek.terra.bukkit.util.VersionUtil; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -8,7 +9,7 @@ public interface Initializer { - String NMS = "v" + Bukkit.getServer().getMinecraftVersion().replace(".", "_"); + String NMS = "v" + VersionUtil.getMinecraftVersionInfo().toString().replace(".", "_"); String TERRA_PACKAGE = Initializer.class.getPackageName(); static boolean init(PlatformImpl platform) { diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java index 848befc600..97f4b713fc 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java @@ -83,7 +83,7 @@ public static final class MinecraftVersionInfo { private final int patch; private MinecraftVersionInfo() { - this(Bukkit.getServer().getMinecraftVersion()); + this(Bukkit.getServer().getBukkitVersion().split("-")[0]); } private MinecraftVersionInfo(int major, int minor, int patch) { From 0758e13bc76fd1276ee6f81a3a57dca8b03c7e35 Mon Sep 17 00:00:00 2001 From: Oak Date: Wed, 19 Jun 2024 13:33:55 +0100 Subject: [PATCH 086/126] Made patch version optional as not all Minecraft versions have a patch number --- .../java/com/dfsek/terra/bukkit/nms/Initializer.java | 2 +- .../java/com/dfsek/terra/bukkit/util/VersionUtil.java | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java index db50be3258..1ca6f8c3f2 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java @@ -9,7 +9,7 @@ public interface Initializer { - String NMS = "v" + VersionUtil.getMinecraftVersionInfo().toString().replace(".", "_"); + String NMS = VersionUtil.getMinecraftVersionInfo().toString().replace(".", "_"); String TERRA_PACKAGE = Initializer.class.getPackageName(); static boolean init(PlatformImpl platform) { diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java index 97f4b713fc..6a8c662e05 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java @@ -77,7 +77,7 @@ public boolean isSpigot() { public static final class MinecraftVersionInfo { private static final Logger logger = LoggerFactory.getLogger(MinecraftVersionInfo.class); - private static final Pattern VERSION_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)"); + private static final Pattern VERSION_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)(?:\\.(\\d+))?"); private final int major; private final int minor; private final int patch; @@ -97,7 +97,7 @@ private MinecraftVersionInfo(String versionString) { if(versionMatcher.find()) { major = Integer.parseInt(versionMatcher.group(1)); minor = Integer.parseInt(versionMatcher.group(2)); - patch = Integer.parseInt(versionMatcher.group(3)); + patch = versionMatcher.group(3) != null ? Integer.parseInt(versionMatcher.group(3)) : -1; } else { logger.warn("Error while parsing minecraft version info. Continuing launch, but setting all versions to -1."); @@ -112,7 +112,11 @@ public String toString() { if(major == -1 && minor == -1 && patch == -1) return "Unknown"; - return String.format("v%d.%d.%d", major, minor, patch); + if (patch >= 0) { + return String.format("v%d.%d.%d", major, minor, patch); + } else { + return String.format("v%d.%d", major, minor); + } } public int getMajor() { From fddc9a52b94eb326c95513adc63cb2cf0e560ec8 Mon Sep 17 00:00:00 2001 From: Oak Date: Wed, 19 Jun 2024 13:34:35 +0100 Subject: [PATCH 087/126] Temporarily disabled commands whilst awaiting Cloud Framework update --- .../com/dfsek/terra/bukkit/TerraBukkitPlugin.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 555d073c7a..b6c9a6e1dc 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -96,13 +96,14 @@ private PaperCommandManager getCommandSenderPaperCommandManager() CommandExecutionCoordinator.simpleCoordinator(), BukkitAdapter::adapt, BukkitAdapter::adapt); - if(commandManager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { - commandManager.registerBrigadier(); - final CloudBrigadierManager brigManager = commandManager.brigadierManager(); - if(brigManager != null) { - brigManager.setNativeNumberSuggestions(false); - } - } + // TODO: Uncomment once Cloud has updated for 1.21 +// if(commandManager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { +// commandManager.registerBrigadier(); +// final CloudBrigadierManager brigManager = commandManager.brigadierManager(); +// if(brigManager != null) { +// brigManager.setNativeNumberSuggestions(false); +// } +// } if(commandManager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) { commandManager.registerAsynchronousCompletions(); From e7cc2753401d7ca67739a036b26665492fd3d185 Mon Sep 17 00:00:00 2001 From: Oak Date: Sun, 23 Jun 2024 14:16:50 +0100 Subject: [PATCH 088/126] Corrected issues with worldGenContext not correctly being set (Ref: https://stackoverflow.com/questions/56039341/get-declared-fields-of-java-lang-reflect-fields-in-jdk12/56043252#56043252) --- .../api/util/reflection/ReflectionUtil.java | 21 +++++++++++++++ .../bukkit/nms/v1_21/NMSInjectListener.java | 26 +++++++++---------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java index 8e35c3f9f3..6b0c8fd28b 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java @@ -8,6 +8,7 @@ package com.dfsek.terra.api.util.reflection; import org.jetbrains.annotations.NotNull; +import sun.misc.Unsafe; import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; @@ -26,6 +27,18 @@ public final class ReflectionUtil { + private static final Unsafe UNSAFE; + + static { + try{ + final Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + UNSAFE = (Unsafe) unsafeField.get(null); + } catch(NoSuchFieldException | IllegalAccessException e){ + throw new RuntimeException(e); + } + } + public static Field[] getFields(@NotNull Class type) { Field[] result = type.getDeclaredFields(); Class parentClass = type.getSuperclass(); @@ -35,6 +48,14 @@ public static Field[] getFields(@NotNull Class type) { return result; } + public static void setFinalField(Object obj, String fieldName, Object value) throws NoSuchFieldException { + Field field = obj.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + long fieldOffset = UNSAFE.objectFieldOffset(field); + + UNSAFE.putObject(obj, fieldOffset, value); + } + public static Method[] getMethods(@NotNull Class type) { Method[] result = type.getDeclaredMethods(); Class parentClass = type.getSuperclass(); diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java index 98510ff88a..b471faa88f 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java @@ -1,9 +1,12 @@ package com.dfsek.terra.bukkit.nms.v1_21; +import com.dfsek.terra.api.util.reflection.ReflectionUtil; + import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.status.WorldGenContext; +import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.event.EventHandler; @@ -12,7 +15,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.lang.reflect.Field; import java.util.HashSet; import java.util.Set; import java.util.concurrent.locks.ReentrantLock; @@ -41,21 +43,17 @@ public void onWorldInit(WorldInitEvent event) { ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator(); NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed()); ChunkMap chunkMap = serverWorld.getChunkSource().chunkMap; + WorldGenContext worldGenContext = chunkMap.worldGenContext; try { - Field worldGenContextField = chunkMap.getClass().getDeclaredField("worldGenContext"); - worldGenContextField.setAccessible(true); - - WorldGenContext worldGenContext = (WorldGenContext) worldGenContextField.get(chunkMap); - worldGenContextField.set(chunkMap, - new WorldGenContext( - worldGenContext.level(), - new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()), - worldGenContext.structureManager(), - worldGenContext.lightEngine(), - worldGenContext.mainThreadMailBox() - )); - } catch(NoSuchFieldException | IllegalAccessException e) { + ReflectionUtil.setFinalField(chunkMap, "worldGenContext", new WorldGenContext( + worldGenContext.level(), + new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()), + worldGenContext.structureManager(), + worldGenContext.lightEngine(), + worldGenContext.mainThreadMailBox() + )); + } catch(NoSuchFieldException e) { throw new RuntimeException(e); } From 44d23573b3c2c4f19f8b56492ac9c8218a83cfac Mon Sep 17 00:00:00 2001 From: Oak Date: Sat, 20 Jul 2024 20:17:25 +0100 Subject: [PATCH 089/126] Updated dependencies to Paper 1.21 snapshot --- buildSrc/src/main/kotlin/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 512af9721c..933986d540 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -53,7 +53,7 @@ object Versions { object Bukkit { const val minecraft = "1.21" - const val paperBuild = "$minecraft-R0.1-20240615.005026-1" + const val paperBuild = "$minecraft-R0.1-SNAPSHOT" const val paper = paperBuild const val paperLib = "1.0.8" const val reflectionRemapper = "0.1.1" From 922cd35e84f2968e559051542f7b652bf612ebf8 Mon Sep 17 00:00:00 2001 From: OakLoaf Date: Fri, 16 Aug 2024 11:07:03 +0100 Subject: [PATCH 090/126] Updated Cloud dependency to v2 --- buildSrc/src/main/kotlin/Versions.kt | 4 +- .../commands/addons/AddonsCommandAddon.java | 12 +- .../commands/packs/PacksCommandAddon.java | 20 +-- .../profiler/ProfilerCommandAddon.java | 28 ++--- .../structure/StructureCommandAddon.java | 25 ++-- common/api/build.gradle.kts | 2 +- .../command/arguments/RegistryArgument.java | 117 ++++++++---------- .../platform/CommandRegistrationEvent.java | 4 +- platforms/bukkit/common/build.gradle.kts | 2 +- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 42 ++++--- platforms/fabric/build.gradle.kts | 10 +- platforms/mixin-lifecycle/build.gradle.kts | 2 +- .../terra/lifecycle/LifecycleEntryPoint.java | 3 +- 13 files changed, 133 insertions(+), 138 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 933986d540..f6e2606e0a 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -8,7 +8,9 @@ object Versions { const val paralithic = "0.7.1" const val strata = "1.3.2" - const val cloud = "1.8.4" + const val cloud = "2.0.0-rc.2" + const val cloudPaper = "2.0.0-beta.9" + const val cloudFabric = "2.0.0-beta.7" const val caffeine = "3.1.8" diff --git a/common/addons/command-addons/src/main/java/com/dfsek/terra/addons/commands/addons/AddonsCommandAddon.java b/common/addons/command-addons/src/main/java/com/dfsek/terra/addons/commands/addons/AddonsCommandAddon.java index 58a22ef7a1..3277c00891 100644 --- a/common/addons/command-addons/src/main/java/com/dfsek/terra/addons/commands/addons/AddonsCommandAddon.java +++ b/common/addons/command-addons/src/main/java/com/dfsek/terra/addons/commands/addons/AddonsCommandAddon.java @@ -1,8 +1,5 @@ package com.dfsek.terra.addons.commands.addons; -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.CommandManager; - import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; @@ -12,6 +9,9 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.inject.annotations.Inject; +import org.incendo.cloud.CommandManager; +import org.incendo.cloud.description.Description; + public class AddonsCommandAddon implements AddonInitializer { @Inject @@ -30,7 +30,7 @@ public void initialize() { CommandManager manager = event.getCommandManager(); manager.command( - manager.commandBuilder("addons", ArgumentDescription.of("List installed Terra addons")) + manager.commandBuilder("addons", Description.of("List installed Terra addons")) .permission("terra.addons") .handler(context -> { StringBuilder addons = new StringBuilder("Installed addons:\n"); @@ -41,7 +41,7 @@ public void initialize() { .append('@') .append(addon.getVersion().getFormatted()) .append('\n')); - context.getSender().sendMessage(addons.toString()); + context.sender().sendMessage(addons.toString()); }) ) .command( @@ -61,7 +61,7 @@ public void initialize() { .append('@') .append(versions.getFormatted()) .append('\n')); - context.getSender().sendMessage(addonInfo.toString()); + context.sender().sendMessage(addonInfo.toString()); }) ); }); diff --git a/common/addons/command-packs/src/main/java/com/dfsek/terra/addons/commands/packs/PacksCommandAddon.java b/common/addons/command-packs/src/main/java/com/dfsek/terra/addons/commands/packs/PacksCommandAddon.java index 1d99af328a..6b840ef1f7 100644 --- a/common/addons/command-packs/src/main/java/com/dfsek/terra/addons/commands/packs/PacksCommandAddon.java +++ b/common/addons/command-packs/src/main/java/com/dfsek/terra/addons/commands/packs/PacksCommandAddon.java @@ -1,7 +1,7 @@ package com.dfsek.terra.addons.commands.packs; -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.CommandManager; +import org.incendo.cloud.CommandManager; +import org.incendo.cloud.description.Description; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,7 +35,7 @@ public void initialize() { CommandManager manager = event.getCommandManager(); manager.command( - manager.commandBuilder("packs", ArgumentDescription.of("List installed config packs")) + manager.commandBuilder("packs", Description.of("List installed config packs")) .permission("terra.packs") .handler(context -> { StringBuilder packs = new StringBuilder("Installed packs:\n"); @@ -43,12 +43,12 @@ public void initialize() { .append(pack.getID()) .append('@') .append(pack.getVersion().getFormatted())); - context.getSender().sendMessage(packs.toString()); + context.sender().sendMessage(packs.toString()); }) ) .command( manager.commandBuilder("packs") - .literal("info", ArgumentDescription.of("Get information about a pack")) + .literal("info", Description.of("Get information about a pack")) .permission("terra.packs.info") .argument(RegistryArgument.of("pack", platform.getConfigRegistry())) .handler(context -> { @@ -65,21 +65,21 @@ public void initialize() { .append('@') .append(versions.getFormatted()) .append('\n')); - context.getSender().sendMessage(packInfo.toString()); + context.sender().sendMessage(packInfo.toString()); })) .command( manager.commandBuilder("packs") - .literal("reload", ArgumentDescription.of("Reload config packs")) + .literal("reload", Description.of("Reload config packs")) .permission("terra.packs.reload") .handler(context -> { - context.getSender().sendMessage("Reloading Terra..."); + context.sender().sendMessage("Reloading Terra..."); logger.info("Reloading Terra..."); if(platform.reload()) { logger.info("Terra reloaded successfully."); - context.getSender().sendMessage("Terra reloaded successfully."); + context.sender().sendMessage("Terra reloaded successfully."); } else { logger.error("Terra failed to reload."); - context.getSender().sendMessage( + context.sender().sendMessage( "Terra failed to reload. See logs for more information."); } })); diff --git a/common/addons/command-profiler/src/main/java/com/dfsek/terra/addons/commands/profiler/ProfilerCommandAddon.java b/common/addons/command-profiler/src/main/java/com/dfsek/terra/addons/commands/profiler/ProfilerCommandAddon.java index 2376c919bb..a1559c8c51 100644 --- a/common/addons/command-profiler/src/main/java/com/dfsek/terra/addons/commands/profiler/ProfilerCommandAddon.java +++ b/common/addons/command-profiler/src/main/java/com/dfsek/terra/addons/commands/profiler/ProfilerCommandAddon.java @@ -1,7 +1,7 @@ package com.dfsek.terra.addons.commands.profiler; -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.CommandManager; +import org.incendo.cloud.CommandManager; +import org.incendo.cloud.description.Description; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,24 +33,24 @@ public void initialize() { CommandManager manager = event.getCommandManager(); manager .command( - manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler")) - .literal("start", ArgumentDescription.of("Start profiling"), "st") + manager.commandBuilder("profiler", Description.of("Access the profiler")) + .literal("start", Description.of("Start profiling"), "st") .permission("terra.profiler.start") .handler(context -> { platform.getProfiler().start(); - context.getSender().sendMessage("Profiling started."); + context.sender().sendMessage("Profiling started."); })) .command( - manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler")) - .literal("stop", ArgumentDescription.of("Stop profiling"), "s") + manager.commandBuilder("profiler", Description.of("Access the profiler")) + .literal("stop", Description.of("Stop profiling"), "s") .permission("terra.profiler.stop") .handler(context -> { platform.getProfiler().stop(); - context.getSender().sendMessage("Profiling stopped."); + context.sender().sendMessage("Profiling stopped."); })) .command( - manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler")) - .literal("query", ArgumentDescription.of("Query profiler results"), "q") + manager.commandBuilder("profiler", Description.of("Access the profiler")) + .literal("query", Description.of("Query profiler results"), "q") .permission("terra.profiler.query") .handler(context -> { StringBuilder data = new StringBuilder("Terra Profiler data: \n"); @@ -59,15 +59,15 @@ public void initialize() { .append(timings.toString()) .append('\n')); logger.info(data.toString()); - context.getSender().sendMessage("Profiling data dumped to console."); + context.sender().sendMessage("Profiling data dumped to console."); })) .command( - manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler")) - .literal("reset", ArgumentDescription.of("Reset the profiler"), "r") + manager.commandBuilder("profiler", Description.of("Access the profiler")) + .literal("reset", Description.of("Reset the profiler"), "r") .permission("terra.profiler.reset") .handler(context -> { platform.getProfiler().reset(); - context.getSender().sendMessage("Profiler reset."); + context.sender().sendMessage("Profiler reset."); })); }); } diff --git a/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java b/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java index 438546137c..67e9106617 100644 --- a/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java +++ b/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java @@ -1,11 +1,5 @@ package com.dfsek.terra.addons.commands.structure; -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.CommandManager; -import cloud.commandframework.arguments.standard.EnumArgument; -import cloud.commandframework.arguments.standard.LongArgument; -import cloud.commandframework.context.CommandContext; - import java.util.Random; import com.dfsek.terra.addons.manifest.api.AddonInitializer; @@ -22,6 +16,13 @@ import com.dfsek.terra.api.util.Rotation; import com.dfsek.terra.api.util.reflection.TypeKey; +import org.incendo.cloud.CommandManager; +import org.incendo.cloud.component.DefaultValue; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.description.Description; +import org.incendo.cloud.parser.standard.EnumParser; +import org.incendo.cloud.parser.standard.LongParser; + public class StructureCommandAddon implements AddonInitializer { @Inject @@ -31,7 +32,7 @@ public class StructureCommandAddon implements AddonInitializer { private BaseAddon addon; private static Registry getStructureRegistry(CommandContext sender) { - return sender.getSender().getEntity().orElseThrow().world().getPack().getRegistry(Structure.class); + return sender.sender().getEntity().orElseThrow().world().getPack().getRegistry(Structure.class); } @Override @@ -43,16 +44,16 @@ public void initialize() { CommandManager manager = event.getCommandManager(); manager.command( - manager.commandBuilder("structures", ArgumentDescription.of("Manage or generate structures")) + manager.commandBuilder("structures", Description.of("Manage or generate structures")) .literal("generate") - .argument(RegistryArgument.builder("structure", + .optional(RegistryArgument.builder("structure", StructureCommandAddon::getStructureRegistry, TypeKey.of(Structure.class))) - .argument(LongArgument.optional("seed", 0)) - .argument(EnumArgument.optional(Rotation.class, "rotation", Rotation.NONE)) + .optional("seed", LongParser.longParser(), DefaultValue.constant(0L)) + .optional("rotation", EnumParser.enumParser(Rotation.class), DefaultValue.constant(Rotation.NONE)) .handler(context -> { Structure structure = context.get("structure"); - Entity sender = context.getSender().getEntity().orElseThrow(); + Entity sender = context.sender().getEntity().orElseThrow(); structure.generate( sender.position().toInt(), sender.world(), diff --git a/common/api/build.gradle.kts b/common/api/build.gradle.kts index 4f88c83e39..898f8bdcd6 100644 --- a/common/api/build.gradle.kts +++ b/common/api/build.gradle.kts @@ -2,7 +2,7 @@ dependencies { api("ca.solo-studios", "strata", Versions.Libraries.strata) compileOnlyApi("org.slf4j", "slf4j-api", Versions.Libraries.slf4j) testImplementation("org.slf4j", "slf4j-api", Versions.Libraries.slf4j) - api("cloud.commandframework", "cloud-core", Versions.Libraries.cloud) + api("org.incendo", "cloud-core", Versions.Libraries.cloud) api("com.dfsek.tectonic", "common", Versions.Libraries.tectonic) diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java index e89298751e..91d6b56b91 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java @@ -1,18 +1,10 @@ package com.dfsek.terra.api.command.arguments; -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.context.CommandContext; import io.leangen.geantyref.TypeToken; import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.util.Optional; -import java.util.Queue; -import java.util.function.BiFunction; +import java.util.concurrent.CompletableFuture; import java.util.function.Function; import java.util.stream.Collectors; @@ -21,40 +13,33 @@ import com.dfsek.terra.api.registry.key.RegistryKey; import com.dfsek.terra.api.util.reflection.TypeKey; +import org.incendo.cloud.component.CommandComponent; +import org.incendo.cloud.component.DefaultValue; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; -public class RegistryArgument extends CommandArgument { - private RegistryArgument( - boolean required, - @NonNull String name, - Function, Registry> registryFunction, - TypeToken typeToken, - @NonNull String defaultValue, - @Nullable BiFunction, String, List> suggestionsProvider, - @NonNull ArgumentDescription description - ) { - super(required, - name, - new RegistryArgumentParser<>(registryFunction), - defaultValue, - typeToken, - suggestionsProvider, - description); - } + +public class RegistryArgument { public static Builder builder(String name, Registry registry) { return new Builder<>(name, registry); } - public static CommandArgument of(String name, Registry registry) { + public static CommandComponent of(String name, Registry registry) { return RegistryArgument.builder(name, registry).build(); } - public static CommandArgument optional(String name, Registry registry) { - return RegistryArgument.builder(name, registry).asOptional().build(); + public static CommandComponent optional(String name, Registry registry) { + return RegistryArgument.builder(name, registry).optional().build(); } - public static CommandArgument optional(String name, Registry registry, String defaultKey) { - return RegistryArgument.builder(name, registry).asOptionalWithDefault(defaultKey).build(); + public static CommandComponent optional(String name, Registry registry, DefaultValue defaultKey) { + return RegistryArgument.builder(name, registry).optional(defaultKey).build(); } @SuppressWarnings("unchecked") @@ -63,49 +48,36 @@ public static Builder builder(String name, Function(name, registryFunction, (TypeToken) TypeToken.get(registryType.getType())); } - public static CommandArgument of(String name, Function, Registry> registryFunction, + public static CommandComponent of(String name, Function, Registry> registryFunction, TypeKey registryType) { return RegistryArgument.builder(name, registryFunction, registryType).build(); } - public static CommandArgument optional(String name, Function, Registry> registryFunction, + public static CommandComponent optional(String name, Function, Registry> registryFunction, TypeKey registryType) { - return RegistryArgument.builder(name, registryFunction, registryType).asOptional().build(); + return RegistryArgument.builder(name, registryFunction, registryType).optional().build(); } - public static CommandArgument optional(String name, Function, Registry> registryFunction, - TypeKey registryType, String defaultKey) { - return RegistryArgument.builder(name, registryFunction, registryType).asOptionalWithDefault(defaultKey).build(); + public static CommandComponent optional(String name, Function, Registry> registryFunction, + TypeKey registryType, DefaultValue defaultKey) { + return RegistryArgument.builder(name, registryFunction, registryType).optional(defaultKey).build(); } - public static final class Builder extends CommandArgument.Builder { - private final Function, Registry> registryFunction; - private final TypeToken typeToken; + public static final class Builder extends CommandComponent.Builder { @SuppressWarnings("unchecked") private Builder(@NonNull String name, Registry registry) { - super((TypeToken) TypeToken.get(registry.getType().getType()), name); - this.registryFunction = commandContext -> registry; - this.typeToken = (TypeToken) TypeToken.get(registry.getType().getType()); + super(); + this.name(name); + this.parser(ParserDescriptor.of( + new RegistryArgumentParser<>(commandContext -> registry), + (TypeToken) TypeToken.get(registry.getType().getType()))); } private Builder(@NonNull String name, Function, Registry> registryFunction, TypeToken typeToken) { - super(typeToken, name); - this.typeToken = typeToken; - this.registryFunction = registryFunction; - } - - @Override - public @NonNull RegistryArgument build() { - return new RegistryArgument<>( - isRequired(), - getName(), - registryFunction, - typeToken, - getDefaultValue(), - getSuggestionsProvider(), - getDefaultDescription() - ); + super(); + this.name(name); + this.parser(ParserDescriptor.of(new RegistryArgumentParser<>(registryFunction), typeToken)); } } @@ -119,12 +91,12 @@ private RegistryArgumentParser(Function, Registry> registry @Override public @NonNull ArgumentParseResult<@NonNull R> parse(@NonNull CommandContext<@NonNull T> commandContext, - @NonNull Queue<@NonNull String> inputQueue) { - String input = inputQueue.remove(); - String next = inputQueue.peek(); - if(next != null && next.equals(":")) { - input += inputQueue.remove(); - input += inputQueue.remove(); + @NonNull CommandInput commandInput) { + String input = commandInput.readString(); + String next = commandInput.peekString(); + if(next.equals(":")) { + input += commandInput.readString(); + input += commandInput.readString(); } Registry registry = registryFunction.apply(commandContext); @@ -146,8 +118,17 @@ private RegistryArgumentParser(Function, Registry> registry } @Override - public @NonNull List<@NonNull String> suggestions(@NonNull CommandContext commandContext, @NonNull String input) { - return registryFunction.apply(commandContext).keys().stream().map(RegistryKey::toString).sorted().collect(Collectors.toList()); + public @NonNull SuggestionProvider suggestionProvider() { + return new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture( + @NonNull CommandContext context, @NonNull CommandInput input) { + + // TODO: Verify whether this is correct + return CompletableFuture.completedFuture(registryFunction.apply(context).keys().stream().map( + registryKey -> Suggestion.suggestion(registryKey.toString())).sorted().collect(Collectors.toList())); + } + }; } } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java index de13f061a2..3ad041c9bd 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java @@ -1,10 +1,10 @@ package com.dfsek.terra.api.event.events.platform; -import cloud.commandframework.CommandManager; - import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.event.events.Event; +import org.incendo.cloud.CommandManager; + public class CommandRegistrationEvent implements Event { private final CommandManager commandManager; diff --git a/platforms/bukkit/common/build.gradle.kts b/platforms/bukkit/common/build.gradle.kts index f47415da4c..eaf1956cbe 100644 --- a/platforms/bukkit/common/build.gradle.kts +++ b/platforms/bukkit/common/build.gradle.kts @@ -11,5 +11,5 @@ dependencies { shadedApi("com.google.guava", "guava", Versions.Libraries.Internal.guava) - shadedApi("cloud.commandframework", "cloud-paper", Versions.Libraries.cloud) + shadedApi("org.incendo", "cloud-paper", Versions.Libraries.cloudPaper) } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index b6c9a6e1dc..6ae24afc3c 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -17,15 +17,16 @@ package com.dfsek.terra.bukkit; -import cloud.commandframework.brigadier.CloudBrigadierManager; -import cloud.commandframework.bukkit.CloudBukkitCapabilities; -import cloud.commandframework.execution.CommandExecutionCoordinator; -import cloud.commandframework.paper.PaperCommandManager; import io.papermc.paper.threadedregions.scheduler.AsyncScheduler; import io.papermc.paper.threadedregions.scheduler.GlobalRegionScheduler; import org.bukkit.Bukkit; import org.bukkit.generator.ChunkGenerator; import org.bukkit.plugin.java.JavaPlugin; +import org.incendo.cloud.SenderMapper; +import org.incendo.cloud.brigadier.CloudBrigadierManager; +import org.incendo.cloud.bukkit.CloudBukkitCapabilities; +import org.incendo.cloud.execution.ExecutionCoordinator; +import org.incendo.cloud.paper.LegacyPaperCommandManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @@ -71,7 +72,7 @@ public void onEnable() { } try { - PaperCommandManager commandManager = getCommandSenderPaperCommandManager(); + LegacyPaperCommandManager commandManager = getCommandSenderPaperCommandManager(); platform.getEventManager().callEvent(new CommandRegistrationEvent(commandManager)); @@ -91,23 +92,28 @@ public void onEnable() { } @NotNull - private PaperCommandManager getCommandSenderPaperCommandManager() throws Exception { - PaperCommandManager commandManager = new PaperCommandManager<>(this, - CommandExecutionCoordinator.simpleCoordinator(), - BukkitAdapter::adapt, - BukkitAdapter::adapt); - // TODO: Uncomment once Cloud has updated for 1.21 -// if(commandManager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { -// commandManager.registerBrigadier(); -// final CloudBrigadierManager brigManager = commandManager.brigadierManager(); -// if(brigManager != null) { -// brigManager.setNativeNumberSuggestions(false); -// } -// } + private LegacyPaperCommandManager getCommandSenderPaperCommandManager() throws Exception { + // TODO: Update to PaperCommandManager + LegacyPaperCommandManager commandManager = new LegacyPaperCommandManager<>( + this, + ExecutionCoordinator.simpleCoordinator(), + SenderMapper.create( + BukkitAdapter::adapt, + BukkitAdapter::adapt + )); + + if(commandManager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { + commandManager.registerBrigadier(); + final CloudBrigadierManager brigManager = commandManager.brigadierManager(); + if(brigManager != null) { + brigManager.setNativeNumberSuggestions(false); + } + } if(commandManager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) { commandManager.registerAsynchronousCompletions(); } + return commandManager; } diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index dba2687289..58e892e991 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -10,6 +10,12 @@ architectury { loader("fabric") } +repositories { + maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") { + name = "Sonatype Snapshots" + } +} + dependencies { shadedApi(project(":common:implementation:base")) @@ -26,8 +32,8 @@ dependencies { modImplementation("net.fabricmc:fabric-loader:${Versions.Mod.fabricLoader}") - modImplementation("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) - include("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) + modImplementation("org.incendo", "cloud-fabric", Versions.Libraries.cloudFabric) + include("org.incendo", "cloud-fabric", Versions.Libraries.cloudFabric) modRuntimeOnly("net.fabricmc.fabric-api", "fabric-api", Versions.Fabric.fabricAPI) } diff --git a/platforms/mixin-lifecycle/build.gradle.kts b/platforms/mixin-lifecycle/build.gradle.kts index a4e7004121..824d3cb46c 100644 --- a/platforms/mixin-lifecycle/build.gradle.kts +++ b/platforms/mixin-lifecycle/build.gradle.kts @@ -15,7 +15,7 @@ dependencies { minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}") mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2") - modImplementation("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) { + modImplementation("org.incendo", "cloud-fabric", Versions.Libraries.cloudFabric) { exclude("net.fabricmc") exclude("net.fabricmc.fabric-api") } diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java index f20038e5ef..7815367735 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java @@ -1,8 +1,7 @@ package com.dfsek.terra.lifecycle; -import cloud.commandframework.execution.CommandExecutionCoordinator; -import cloud.commandframework.fabric.FabricServerCommandManager; import net.minecraft.server.command.ServerCommandSource; +import org.incendo.cloud.fabric.FabricServerCommandManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 08df5fc2789c71d5134339a6286fcf38fac0e334 Mon Sep 17 00:00:00 2001 From: OakLoaf Date: Mon, 26 Aug 2024 11:24:04 +0100 Subject: [PATCH 091/126] Added 1.21.1 support --- .../main/java/com/dfsek/terra/bukkit/nms/Initializer.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java index 1ca6f8c3f2..3f7375bc4c 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java @@ -15,7 +15,12 @@ public interface Initializer { static boolean init(PlatformImpl platform) { Logger logger = LoggerFactory.getLogger(Initializer.class); try { - Class initializerClass = Class.forName(TERRA_PACKAGE + "." + NMS + ".NMSInitializer"); + String packageVersion = NMS; + if (NMS.equals("v1_21_1")) { + packageVersion = "v1_21"; + } + + Class initializerClass = Class.forName(TERRA_PACKAGE + "." + packageVersion + ".NMSInitializer"); try { Initializer initializer = (Initializer) initializerClass.getConstructor().newInstance(); initializer.initialize(platform); From 3bef7d8572558066c2db8e8b3088d4811db167f5 Mon Sep 17 00:00:00 2001 From: OakLoaf Date: Mon, 26 Aug 2024 12:34:08 +0100 Subject: [PATCH 092/126] Resolved errors when tab completing --- .../main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 6ae24afc3c..8c392dba11 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -102,15 +102,13 @@ private LegacyPaperCommandManager getCommandSenderPaperCommandMan BukkitAdapter::adapt )); - if(commandManager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { + if (commandManager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { commandManager.registerBrigadier(); final CloudBrigadierManager brigManager = commandManager.brigadierManager(); if(brigManager != null) { brigManager.setNativeNumberSuggestions(false); } - } - - if(commandManager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) { + } else if (commandManager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) { commandManager.registerAsynchronousCompletions(); } From 664d1a3191e301975bea973fecaa6105483c15e8 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Tue, 17 Sep 2024 16:34:30 -0600 Subject: [PATCH 093/126] working 1.20.6 --- build.gradle.kts | 3 +- buildSrc/build.gradle.kts | 6 +- buildSrc/src/main/kotlin/DependencyConfig.kt | 3 + .../src/main/kotlin/DistributionConfig.kt | 2 +- buildSrc/src/main/kotlin/Versions.kt | 34 +++++----- gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 43453 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 2 +- gradlew.bat | 20 +++--- platforms/bukkit/build.gradle.kts | 6 -- platforms/bukkit/nms/v1_21/build.gradle.kts | 4 -- .../bukkit/nms/v1_21/AwfulBukkitHacks.java | 1 + platforms/fabric/build.gradle.kts | 10 --- .../fabric/src/main/resources/fabric.mod.json | 6 +- .../main/resources/terra.fabric.mixins.json | 2 +- .../main/resources/terra.forge.mixins.json | 2 +- .../terra/mod/handle/MinecraftItemHandle.java | 12 +++- .../entity/MobSpawnerBlockEntityMixin.java | 4 +- .../terra/inventory/item/ItemMixin.java | 5 +- .../terra/inventory/item/ItemStackMixin.java | 20 +++++- .../inventory/meta/ItemStackMetaMixin.java | 10 +-- .../terra/world/ChunkRegionMixin.java | 4 +- .../mod/mixin/invoke/FluidBlockInvoker.java | 14 ++++ .../lifecycle/DataPackContentsMixin.java | 11 ++- .../src/main/resources/terra.accesswidener | 2 +- .../main/resources/terra.common.mixins.json | 2 +- platforms/mixin-lifecycle/build.gradle.kts | 4 -- .../terra/lifecycle/LifecycleEntryPoint.java | 7 +- .../terra/lifecycle/LifecyclePlatform.java | 2 +- .../mixin/lifecycle/RegistryLoaderMixin.java | 64 +++++++++++------- .../mixin/lifecycle/SaveLoadingMixin.java | 16 ++--- .../resources/terra.lifecycle.mixins.json | 2 +- .../main/resources/terra.quilt.mixins.json | 2 +- 33 files changed, 167 insertions(+), 119 deletions(-) create mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/invoke/FluidBlockInvoker.java diff --git a/build.gradle.kts b/build.gradle.kts index a8a497a85f..67b22ccb55 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,6 +15,7 @@ allprojects { tasks.withType().configureEach { options.isFork = true options.isIncremental = true + options.release.set(21) } tasks.withType().configureEach { @@ -44,7 +45,7 @@ afterEvaluate { } project(":platforms:bukkit:common").configureDistribution() forSubProjects(":common:addons") { - apply(plugin = "com.github.johnrengelman.shadow") + apply(plugin = "com.gradleup.shadow") tasks.named("build") { finalizedBy(tasks.named("shadowJar")) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 3d319e8c73..cec2d002d2 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -16,11 +16,11 @@ repositories { dependencies { //TODO Allow pulling from Versions.kt - implementation("com.github.johnrengelman", "shadow", "8.1.1") - implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.7.1") + implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.1") + implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.7.2") implementation("org.ow2.asm", "asm", "9.7") implementation("org.ow2.asm", "asm-tree", "9.7") implementation("com.dfsek.tectonic", "common", "4.2.1") - implementation("org.yaml", "snakeyaml", "2.2") + implementation("org.yaml", "snakeyaml", "2.3") } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/DependencyConfig.kt b/buildSrc/src/main/kotlin/DependencyConfig.kt index 0778808d84..0df8e29f20 100644 --- a/buildSrc/src/main/kotlin/DependencyConfig.kt +++ b/buildSrc/src/main/kotlin/DependencyConfig.kt @@ -48,6 +48,9 @@ fun Project.configureDependencies() { maven("https://jitpack.io") { name = "JitPack" } + maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") { + name = "Sonatype Snapshots" + } } dependencies { diff --git a/buildSrc/src/main/kotlin/DistributionConfig.kt b/buildSrc/src/main/kotlin/DistributionConfig.kt index 80e59104e9..12ebd8376b 100644 --- a/buildSrc/src/main/kotlin/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/DistributionConfig.kt @@ -21,7 +21,7 @@ import kotlin.io.path.exists fun Project.configureDistribution() { - apply(plugin = "com.github.johnrengelman.shadow") + apply(plugin = "com.gradleup.shadow") val downloadDefaultPacks = tasks.create("downloadDefaultPacks") { group = "terra" diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index f6e2606e0a..d1b7f40247 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -8,23 +8,23 @@ object Versions { const val paralithic = "0.7.1" const val strata = "1.3.2" - const val cloud = "2.0.0-rc.2" - const val cloudPaper = "2.0.0-beta.9" - const val cloudFabric = "2.0.0-beta.7" + const val cloud = "2.0.0" + const val cloudPaper = "2.0.0-beta.10" + const val cloudFabric = "2.0.0-beta.9" const val caffeine = "3.1.8" - const val slf4j = "2.0.13" + const val slf4j = "2.0.16" object Internal { - const val shadow = "8.1.1" + const val shadow = "8.3.1" const val apacheText = "1.12.0" const val apacheIO = "2.16.1" - const val guava = "33.1.0-jre" + const val guava = "33.3.0-jre" const val asm = "9.7" - const val snakeYml = "2.2" + const val snakeYml = "2.3" const val jetBrainsAnnotations = "24.1.0" - const val junit = "5.10.2" + const val junit = "5.11.0" } } @@ -38,14 +38,14 @@ object Versions { // } object Mod { - const val mixin = "0.12.5+mixin.0.8.5" + const val mixin = "0.15.3+mixin.0.8.7" const val minecraft = "1.20.6" const val yarn = "$minecraft+build.1" - const val fabricLoader = "0.15.10" + const val fabricLoader = "0.16.5" - const val architecuryLoom = "1.6.395" - const val architecturyPlugin = "3.4.155" + const val architecuryLoom = "1.7.413" + const val architecturyPlugin = "3.4.159" } // // object Forge { @@ -54,14 +54,14 @@ object Versions { // } object Bukkit { - const val minecraft = "1.21" - const val paperBuild = "$minecraft-R0.1-SNAPSHOT" + const val minecraft = "1.21.1" + const val paperBuild = "$minecraft-R0.1-20240917.151311-80" const val paper = paperBuild const val paperLib = "1.0.8" const val reflectionRemapper = "0.1.1" const val paperDevBundle = paperBuild - const val runPaper = "2.3.0" - const val paperWeight = "1.7.1" + const val runPaper = "2.3.1" + const val paperWeight = "1.7.2" } // @@ -73,6 +73,6 @@ object Versions { // object CLI { const val nbt = "6.1" - const val logback = "1.4.14" + const val logback = "1.5.8" } } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch delta 34118 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 delta 34176 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 SGW6ptSs!X7{rG*o_g?|vpSEZK diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 381baa9cef..8e876e1c55 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionSha256Sum=1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a4269..b740cf1339 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f13..25da30dbde 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 95924dadde..08a75dc125 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -2,12 +2,6 @@ plugins { id("xyz.jpenilla.run-paper") version Versions.Bukkit.runPaper } -repositories { - maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") { - name = "Sonatype" - } -} - dependencies { shaded(project(":platforms:bukkit:common")) shaded(project(":platforms:bukkit:nms:v1_21", configuration = "reobf")) diff --git a/platforms/bukkit/nms/v1_21/build.gradle.kts b/platforms/bukkit/nms/v1_21/build.gradle.kts index 6881c96ca1..d52f1d1691 100644 --- a/platforms/bukkit/nms/v1_21/build.gradle.kts +++ b/platforms/bukkit/nms/v1_21/build.gradle.kts @@ -1,9 +1,5 @@ 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) diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java index d16bbbf30a..fc5cc03672 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java @@ -10,6 +10,7 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.biome.Biome; import org.bukkit.NamespacedKey; import org.slf4j.Logger; diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 58e892e991..6314246998 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -10,12 +10,6 @@ architectury { loader("fabric") } -repositories { - maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") { - name = "Sonatype Snapshots" - } -} - dependencies { shadedApi(project(":common:implementation:base")) @@ -51,10 +45,6 @@ loom { addonDir(project.file("./run/config/Terra/addons"), tasks.named("configureLaunch").get()) tasks { - compileJava { - options.release.set(17) - } - remapJar { dependsOn("installAddons") diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json index 8b67c7b547..bc53194528 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -26,9 +26,9 @@ "terra.common.mixins.json" ], "depends": { - "fabricloader": ">=0.15.1", - "java": ">=17", - "minecraft": ">=1.20.4", + "fabricloader": ">=0.16.5", + "java": ">=21", + "minecraft": ">=1.20.6", "fabric": "*" } } \ No newline at end of file diff --git a/platforms/fabric/src/main/resources/terra.fabric.mixins.json b/platforms/fabric/src/main/resources/terra.fabric.mixins.json index f97889f6d9..4778acf1b3 100644 --- a/platforms/fabric/src/main/resources/terra.fabric.mixins.json +++ b/platforms/fabric/src/main/resources/terra.fabric.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "com.dfsek.terra.fabric.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "mixins": [ ], "client": [ diff --git a/platforms/forge/src/main/resources/terra.forge.mixins.json b/platforms/forge/src/main/resources/terra.forge.mixins.json index 25c1c470ed..095ea92348 100644 --- a/platforms/forge/src/main/resources/terra.forge.mixins.json +++ b/platforms/forge/src/main/resources/terra.forge.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "com.dfsek.terra.forge.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "mixins": [ "lifecycle.NoiseConfigMixin" ], 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 541e764aba..f260ba3f25 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 @@ -25,10 +25,13 @@ import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryWrapper; +import net.minecraft.registry.RegistryWrapper.Impl; import net.minecraft.util.Identifier; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import com.dfsek.terra.api.handle.ItemHandle; import com.dfsek.terra.api.inventory.Item; @@ -43,8 +46,13 @@ public Item createItem(String data) { try { return (Item) new ItemStackArgumentType(new CommandRegistryAccess() { @Override - public RegistryWrapper createWrapper(RegistryKey> registryRef) { - return CommonPlatform.get().getServer().getRegistryManager().getWrapperOrThrow(registryRef); + public Stream>> streamAllRegistryKeys() { + return CommonPlatform.get().getServer().getRegistryManager().streamAllRegistryKeys(); + } + + @Override + public Optional> getOptionalWrapper(RegistryKey> registryRef) { + return Optional.of(CommonPlatform.get().getServer().getRegistryManager().getWrapperOrThrow(registryRef)); } }).parse(new StringReader(data)).getItem(); } catch(CommandSyntaxException e) { 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 2ec582417f..ccc8b738a5 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 @@ -50,7 +50,7 @@ private MobSpawnerBlockEntityMixin(BlockEntityType type, BlockPos pos, BlockS public abstract MobSpawnerLogic getLogic(); @Shadow - public abstract void setEntityType(net.minecraft.entity.EntityType entityType, Random random); + public abstract void method_46408(net.minecraft.entity.EntityType entityType, Random random); public EntityType terra$getSpawnedType() { return (EntityType) Registries.ENTITY_TYPE.get( @@ -64,7 +64,7 @@ private MobSpawnerBlockEntityMixin(BlockEntityType type, BlockPos pos, BlockS } else { rand = Random.create(); } - setEntityType((net.minecraft.entity.EntityType) creatureType, rand); + method_46408((net.minecraft.entity.EntityType) creatureType, rand); } public int terra$getDelay() { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemMixin.java index 78593ecb1a..e8832c2149 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemMixin.java @@ -30,7 +30,7 @@ @Implements(@Interface(iface = com.dfsek.terra.api.inventory.Item.class, prefix = "terra$")) public abstract class ItemMixin { @Shadow - public abstract int getMaxDamage(); + public abstract net.minecraft.item.ItemStack getDefaultStack(); @SuppressWarnings("ConstantConditions") public ItemStack terra$newItemStack(int amount) { @@ -38,6 +38,7 @@ public abstract class ItemMixin { } public double terra$getMaxDurability() { - return getMaxDamage(); + //TODO verify this is correct + return getDefaultStack().getMaxDamage(); } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java index 089a6db1dc..1558368375 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java @@ -17,9 +17,15 @@ package com.dfsek.terra.mod.mixin.implementations.terra.inventory.item; +import net.minecraft.component.Component; +import net.minecraft.component.ComponentChanges; +import net.minecraft.component.ComponentMap; +import net.minecraft.component.ComponentMapImpl; +import net.minecraft.component.DataComponentType; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Intrinsic; @@ -46,7 +52,11 @@ public abstract class ItemStackMixin { public abstract boolean isDamageable(); @Shadow - public abstract void setNbt(@Nullable NbtCompound tag); + public abstract ComponentMap getComponents(); + + @Shadow + @Final + private ComponentMapImpl components; public int terra$getAmount() { return getCount(); @@ -66,7 +76,13 @@ public abstract class ItemStackMixin { @SuppressWarnings("ConstantConditions") public void terra$setItemMeta(ItemMeta meta) { - setNbt(((ItemStack) (Object) meta).getNbt()); + ComponentChanges.Builder builder = ComponentChanges.builder(); + this.getComponents().getTypes().forEach(builder::remove); + + ComponentMap components = ((ItemStack) (Object) meta).getComponents(); + components.forEach(builder::add); + + this.components.applyChanges(builder.build()); } @Intrinsic 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 a6307b02ca..5617f494c0 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 @@ -17,6 +17,7 @@ package com.dfsek.terra.mod.mixin.implementations.terra.inventory.meta; +import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtList; @@ -42,7 +43,7 @@ public abstract class ItemStackMetaMixin { public abstract boolean hasEnchantments(); @Shadow - public abstract NbtList getEnchantments(); + public abstract ItemEnchantmentsComponent getEnchantments(); @Shadow public abstract void addEnchantment(net.minecraft.enchantment.Enchantment enchantment, int level); @@ -56,9 +57,10 @@ public abstract class ItemStackMetaMixin { if(!hasEnchantments()) return Collections.emptyMap(); Map map = new HashMap<>(); - getEnchantments().forEach(enchantment -> { - NbtCompound eTag = (NbtCompound) enchantment; - map.put((Enchantment) Registries.ENCHANTMENT.get(eTag.getInt("id")), eTag.getInt("lvl")); + ItemEnchantmentsComponent enchantments = getEnchantments(); + enchantments.getEnchantments().forEach(enchantment -> { + net.minecraft.enchantment.Enchantment enchantmentValue = enchantment.value(); + map.put((Enchantment) enchantmentValue, enchantments.getLevel(enchantmentValue)); }); return map; } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java index 82080579ba..1a0e9e0df0 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java @@ -17,6 +17,8 @@ package com.dfsek.terra.mod.mixin.implementations.terra.world; +import com.dfsek.terra.mod.mixin.invoke.FluidBlockInvoker; + import net.minecraft.block.FluidBlock; import net.minecraft.fluid.Fluid; import net.minecraft.util.math.BlockPos; @@ -88,7 +90,7 @@ public void injectConstructor(net.minecraft.server.world.ServerWorld world, List ((ChunkRegion) (Object) this).setBlockState(pos, (net.minecraft.block.BlockState) data, physics ? 3 : 1042); if(physics && ((net.minecraft.block.BlockState) data).getBlock() instanceof FluidBlock) { fluidTickScheduler.scheduleTick( - OrderedTick.create(((FluidBlock) ((net.minecraft.block.BlockState) data).getBlock()).getFluidState( + OrderedTick.create((((FluidBlockInvoker) ((net.minecraft.block.BlockState) data).getBlock())).invokeGetFluidState( (net.minecraft.block.BlockState) data).getFluid(), pos)); } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/invoke/FluidBlockInvoker.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/invoke/FluidBlockInvoker.java new file mode 100644 index 0000000000..a6b50409c3 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/invoke/FluidBlockInvoker.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.mod.mixin.invoke; + +import net.minecraft.block.BlockState; +import net.minecraft.block.FluidBlock; +import net.minecraft.fluid.FluidState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + + +@Mixin(FluidBlock.class) +public interface FluidBlockInvoker { + @Invoker("getFluidState") + public FluidState invokeGetFluidState(BlockState state); +} 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 48ea985192..305f7f024c 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 @@ -3,9 +3,12 @@ import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.ReloadableRegistries; import net.minecraft.server.DataPackContents; import net.minecraft.world.biome.Biome; +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.callback.CallbackInfo; @@ -16,11 +19,15 @@ @Mixin(DataPackContents.class) public class DataPackContentsMixin { + @Shadow + @Final + private ReloadableRegistries.Lookup reloadableRegistries; /* * #refresh populates all tags in the registries */ - @Inject(method = "refresh(Lnet/minecraft/registry/DynamicRegistryManager;)V", at = @At("RETURN")) - private void injectReload(DynamicRegistryManager dynamicRegistryManager, CallbackInfo ci) { + @Inject(method = "refresh()V", at = @At("RETURN")) + private void injectReload(CallbackInfo ci) { + DynamicRegistryManager.Immutable dynamicRegistryManager = this.reloadableRegistries.getRegistryManager(); TagUtil.registerWorldPresetTags(dynamicRegistryManager.get(RegistryKeys.WORLD_PRESET)); Registry biomeRegistry = dynamicRegistryManager.get(RegistryKeys.BIOME); diff --git a/platforms/mixin-common/src/main/resources/terra.accesswidener b/platforms/mixin-common/src/main/resources/terra.accesswidener index 50cba4f7d0..46f1b986e5 100644 --- a/platforms/mixin-common/src/main/resources/terra.accesswidener +++ b/platforms/mixin-common/src/main/resources/terra.accesswidener @@ -1,4 +1,4 @@ accessWidener v1 named accessible class net/minecraft/world/biome/Biome$Weather accessible class net/minecraft/world/gen/WorldPresets$Registrar -accessible method net/minecraft/block/FluidBlock getFluidState (Lnet/minecraft/block/BlockState;)Lnet/minecraft/fluid/FluidState +accessible class net/minecraft/registry/RegistryLoader$Loader \ No newline at end of file diff --git a/platforms/mixin-common/src/main/resources/terra.common.mixins.json b/platforms/mixin-common/src/main/resources/terra.common.mixins.json index d4402241c5..f8d0718e48 100644 --- a/platforms/mixin-common/src/main/resources/terra.common.mixins.json +++ b/platforms/mixin-common/src/main/resources/terra.common.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "com.dfsek.terra.mod.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "mixins": [ "access.BiomeAccessor", "access.MobSpawnerLogicAccessor", diff --git a/platforms/mixin-lifecycle/build.gradle.kts b/platforms/mixin-lifecycle/build.gradle.kts index 824d3cb46c..b7d209b7ff 100644 --- a/platforms/mixin-lifecycle/build.gradle.kts +++ b/platforms/mixin-lifecycle/build.gradle.kts @@ -30,10 +30,6 @@ loom { } tasks { - compileJava { - options.release.set(17) - } - remapJar { inputFile.set(shadowJar.get().archiveFile) } diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java index 7815367735..65d86febf1 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java @@ -1,6 +1,8 @@ package com.dfsek.terra.lifecycle; import net.minecraft.server.command.ServerCommandSource; +import org.incendo.cloud.SenderMapper; +import org.incendo.cloud.execution.ExecutionCoordinator; import org.incendo.cloud.fabric.FabricServerCommandManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,9 +18,10 @@ public static void initialize(String modName, LifecyclePlatform platform) { logger.info("Initializing Terra {} mod...", modName); FabricServerCommandManager manager = new FabricServerCommandManager<>( - CommandExecutionCoordinator.simpleCoordinator(), + ExecutionCoordinator.simpleCoordinator(), + SenderMapper.create( serverCommandSource -> (CommandSender) serverCommandSource, - commandSender -> (ServerCommandSource) commandSender + commandSender -> (ServerCommandSource) commandSender) ); 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 be845eb191..41a57b4483 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 @@ -69,7 +69,7 @@ public boolean reload() { if(server != null) { BiomeUtil.registerBiomes(server.getRegistryManager().get(RegistryKeys.BIOME)); - server.reloadResources(server.getDataPackManager().getNames()).exceptionally(throwable -> { + server.reloadResources(server.getDataPackManager().getEnabledIds()).exceptionally(throwable -> { LOGGER.warn("Failed to execute reload", throwable); return null; }).join(); 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 052598ac25..b54ee9a022 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,11 +1,14 @@ package com.dfsek.terra.lifecycle.mixin.lifecycle; import com.mojang.datafixers.util.Pair; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.DynamicRegistryManager.Immutable; import net.minecraft.registry.MutableRegistry; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryLoader; +import net.minecraft.registry.RegistryLoader.Loader; import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.WorldPreset; @@ -14,7 +17,9 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; 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; @@ -25,48 +30,61 @@ import com.dfsek.terra.lifecycle.util.LifecycleUtil; import com.dfsek.terra.lifecycle.util.RegistryHack; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + @Mixin(RegistryLoader.class) public class RegistryLoaderMixin { + private static boolean initialized = false; @Shadow @Final private static Logger LOGGER; - +// @Inject( +// method = "load(Lnet/minecraft/registry/RegistryLoader$RegistryLoadable;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 grabRegiestry(RegistryLoader.RegistryLoadable loadable, DynamicRegistryManager baseRegistryManager, +// List> entries, CallbackInfoReturnable cir) { +// entries.forEach((loader) -> { +// Registry registry = loader.registry(); +// } @Redirect( - method = "load(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)" + - "Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", + method = "load(Lnet/minecraft/registry/RegistryLoader$RegistryLoadable;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) { - 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(); - MutableRegistry multiNoiseBiomeSourceParameterLists = extractRegistry(instance, - RegistryKeys.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST).orElseThrow(); + private static void grabManager(List> instance, Consumer> consumer) { + if (!initialized) { + 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(); + MutableRegistry multiNoiseBiomeSourceParameterLists = extractRegistry(instance, + RegistryKeys.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST).orElseThrow(); - LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings, multiNoiseBiomeSourceParameterLists); - LifecycleUtil.initialize(biomes, worldPresets); - }); + LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings, multiNoiseBiomeSourceParameterLists); + LifecycleUtil.initialize(biomes, worldPresets); + }); + initialized = true; + } instance.forEach(consumer); } + @Unique @SuppressWarnings("unchecked") - private static Optional> extractRegistry(List, Object>> instance, + private static Optional> extractRegistry(List> instance, RegistryKey> key) { List> matches = instance - .stream() - .map(Pair::getFirst) + .stream().map(RegistryLoader.Loader::registry) .filter(r -> r.getKey().equals(key)) .toList(); if(matches.size() > 1) { @@ -74,7 +92,7 @@ private static Optional> extractRegistry(List registry = (MutableRegistry) matches.get(0); + MutableRegistry registry = (MutableRegistry) matches.getFirst(); ((RegistryHack) registry).terra_bind(); return Optional.of(registry); } 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 6f373130fe..0bf675fc25 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 @@ -13,18 +13,14 @@ @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;", + method = "load(Lnet/minecraft/server/SaveLoading$ServerConfig;Lnet/minecraft/server/SaveLoading$LoadContextSupplier;Lnet/minecraft/server/SaveLoading$SaveApplierFactory;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;", at = @At( value = "INVOKE", - target = "Lnet/minecraft/server/DataPackContents;refresh(Lnet/minecraft/registry/DynamicRegistryManager;)V" - ), - index = 0 + target = "Lnet/minecraft/registry/RegistryLoader;loadFromResource(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)Lnet/minecraft/registry/DynamicRegistryManager$Immutable;" ), + index = 1 ) - private static DynamicRegistryManager grabManager(DynamicRegistryManager in) { - MinecraftUtil.registerFlora(in.get(RegistryKeys.BIOME)); - return in; + private static DynamicRegistryManager grabManager(DynamicRegistryManager registryManager) { + MinecraftUtil.registerFlora(registryManager.get(RegistryKeys.BIOME)); + return registryManager; } } 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 33695db0eb..2e4708bd49 100644 --- a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "com.dfsek.terra.lifecycle.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "mixins": [ "NoiseConfigMixin", "RegistryEntryReferenceInvoker", diff --git a/platforms/quilt/src/main/resources/terra.quilt.mixins.json b/platforms/quilt/src/main/resources/terra.quilt.mixins.json index 91f51b3445..84ca8264ae 100644 --- a/platforms/quilt/src/main/resources/terra.quilt.mixins.json +++ b/platforms/quilt/src/main/resources/terra.quilt.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "com.dfsek.terra.quilt.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "mixins": [ ], "client": [ From 15a298304e72938ddb5ce7017a47cb62393a7b1a Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Tue, 17 Sep 2024 17:40:56 -0600 Subject: [PATCH 094/126] working 1.21.1 --- buildSrc/src/main/kotlin/Versions.kt | 6 +++--- .../main/java/com/dfsek/terra/mod/ModPlatform.java | 5 +++++ .../generation/MinecraftChunkGeneratorWrapper.java | 5 ++--- .../terra/mod/handle/MinecraftItemHandle.java | 4 ++-- .../block/entity/MobSpawnerBlockEntityMixin.java | 6 +++--- .../implementations/terra/entity/EntityMixin.java | 4 ++-- .../terra/inventory/item/ItemStackMixin.java | 1 - .../terra/inventory/meta/EnchantmentMixin.java | 14 +++++++++++--- .../terra/inventory/meta/ItemStackMetaMixin.java | 9 +++++---- .../terra/world/ChunkRegionMixin.java | 9 +++++---- .../java/com/dfsek/terra/mod/util/PresetUtil.java | 2 +- .../dfsek/terra/lifecycle/LifecyclePlatform.java | 11 ++++++++++- .../mixin/lifecycle/RegistryLoaderMixin.java | 4 +++- .../com/dfsek/terra/lifecycle/util/BiomeUtil.java | 2 +- .../dfsek/terra/lifecycle/util/RegistryUtil.java | 4 ++-- 15 files changed, 55 insertions(+), 31 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index d1b7f40247..1e48e716a6 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -29,7 +29,7 @@ object Versions { } object Fabric { - const val fabricAPI = "0.97.8+${Mod.minecraft}" + const val fabricAPI = "0.104.0+${Mod.minecraft}" } // // object Quilt { @@ -40,8 +40,8 @@ object Versions { object Mod { const val mixin = "0.15.3+mixin.0.8.7" - const val minecraft = "1.20.6" - const val yarn = "$minecraft+build.1" + const val minecraft = "1.21.1" + const val yarn = "$minecraft+build.3" const val fabricLoader = "0.16.5" const val architecuryLoom = "1.7.413" 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 d6d35508a9..308f7913cb 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 @@ -3,6 +3,7 @@ import com.dfsek.tectonic.api.TypeRegistry; import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; +import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; import net.minecraft.registry.Registry; @@ -116,6 +117,8 @@ protected Iterable platformAddon() { public abstract Registry multiNoiseBiomeSourceParameterListRegistry(); + public abstract Registry enchantmentRegistry(); + @Override public @NotNull WorldHandle getWorldHandle() { return worldHandle; @@ -125,4 +128,6 @@ protected Iterable platformAddon() { public @NotNull ItemHandle getItemHandle() { return itemHandle; } + + } 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 8ac07a6888..c73ad3f3b9 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 @@ -111,10 +111,9 @@ public int getWorldHeight() { return settings.value().generationShapeConfig().height(); } - @Override - public CompletableFuture populateNoise(Executor executor, Blender blender, NoiseConfig noiseConfig, - StructureAccessor structureAccessor, Chunk chunk) { + public CompletableFuture populateNoise(Blender blender, NoiseConfig noiseConfig, StructureAccessor structureAccessor, + Chunk chunk) { return CompletableFuture.supplyAsync(() -> { ProtoWorld world = (ProtoWorld) ((StructureAccessorAccessor) structureAccessor).getWorld(); BiomeProvider biomeProvider = 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 f260ba3f25..e9a5f5ae42 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 @@ -62,11 +62,11 @@ public Optional> getOptionalWrapper(RegistryKey getEnchantments() { - return Registries.ENCHANTMENT.stream().map(enchantment -> (Enchantment) enchantment).collect(Collectors.toSet()); + return CommonPlatform.get().enchantmentRegistry().stream().map(enchantment -> (Enchantment) (Object) enchantment).collect(Collectors.toSet()); } } 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 ccc8b738a5..caf918d1dd 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 @@ -48,9 +48,9 @@ private MobSpawnerBlockEntityMixin(BlockEntityType type, BlockPos pos, BlockS @Shadow public abstract MobSpawnerLogic getLogic(); - +//method_46408 @Shadow - public abstract void method_46408(net.minecraft.entity.EntityType entityType, Random random); + public abstract void setEntityType(net.minecraft.entity.EntityType entityType, Random random); public EntityType terra$getSpawnedType() { return (EntityType) Registries.ENTITY_TYPE.get( @@ -64,7 +64,7 @@ private MobSpawnerBlockEntityMixin(BlockEntityType type, BlockPos pos, BlockS } else { rand = Random.create(); } - method_46408((net.minecraft.entity.EntityType) creatureType, rand); + setEntityType((net.minecraft.entity.EntityType) creatureType, rand); } public int terra$getDelay() { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityMixin.java index 3225cd4a6a..0b2f470176 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityMixin.java @@ -39,14 +39,14 @@ public abstract class EntityMixin { private BlockPos blockPos; @Shadow - public abstract void teleport(double destX, double destY, double destZ); + public abstract void updatePosition(double destX, double destY, double destZ); public Vector3 terra$position() { return MinecraftAdapter.adapt(blockPos); } public void terra$position(Vector3 location) { - teleport(location.getX(), location.getY(), location.getZ()); + updatePosition(location.getX(), location.getY(), location.getZ()); } public ServerWorld terra$world() { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java index 1558368375..70177be1fa 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java @@ -21,7 +21,6 @@ import net.minecraft.component.ComponentChanges; import net.minecraft.component.ComponentMap; import net.minecraft.component.ComponentMapImpl; -import net.minecraft.component.DataComponentType; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import org.jetbrains.annotations.Nullable; 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 24b096c856..dd7cfbce08 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 @@ -17,8 +17,13 @@ package com.dfsek.terra.mod.mixin.implementations.terra.inventory.meta; +import com.dfsek.terra.mod.CommonPlatform; + import net.minecraft.enchantment.Enchantment; import net.minecraft.registry.Registries; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.entry.RegistryEntryList; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @@ -28,6 +33,8 @@ import com.dfsek.terra.api.inventory.ItemStack; +import static net.minecraft.enchantment.Enchantment.canBeCombined; + @Mixin(Enchantment.class) @Implements(@Interface(iface = com.dfsek.terra.api.inventory.item.Enchantment.class, prefix = "terra$")) @@ -36,7 +43,8 @@ public abstract class EnchantmentMixin { public abstract boolean isAcceptableItem(net.minecraft.item.ItemStack stack); @Shadow - public abstract boolean canCombine(Enchantment other); + @Final + private RegistryEntryList exclusiveSet; @SuppressWarnings("ConstantConditions") public boolean terra$canEnchantItem(ItemStack itemStack) { @@ -44,10 +52,10 @@ public abstract class EnchantmentMixin { } public boolean terra$conflictsWith(com.dfsek.terra.api.inventory.item.Enchantment other) { - return !canCombine((Enchantment) other); + return canBeCombined(RegistryEntry.of((Enchantment) (Object) this), RegistryEntry.of((Enchantment) (Object) other)); } public String terra$getID() { - return Objects.requireNonNull(Registries.ENCHANTMENT.getId((Enchantment) (Object) this)).toString(); + return Objects.requireNonNull(CommonPlatform.get().enchantmentRegistry().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 5617f494c0..a3bcf54dfa 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 @@ -22,6 +22,7 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtList; import net.minecraft.registry.Registries; +import net.minecraft.registry.entry.RegistryEntry; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Intrinsic; @@ -46,10 +47,10 @@ public abstract class ItemStackMetaMixin { public abstract ItemEnchantmentsComponent getEnchantments(); @Shadow - public abstract void addEnchantment(net.minecraft.enchantment.Enchantment enchantment, int level); + public abstract void addEnchantment(RegistryEntry enchantment, int level); - public void terra$addEnchantment(Enchantment enchantment, int level) { - addEnchantment((net.minecraft.enchantment.Enchantment) enchantment, level); + public void terra$addEnchantment(Enchantment enchantment, int level) { ; + addEnchantment(RegistryEntry.of((net.minecraft.enchantment.Enchantment) (Object) enchantment), level); } @Intrinsic(displace = true) @@ -60,7 +61,7 @@ public abstract class ItemStackMetaMixin { ItemEnchantmentsComponent enchantments = getEnchantments(); enchantments.getEnchantments().forEach(enchantment -> { net.minecraft.enchantment.Enchantment enchantmentValue = enchantment.value(); - map.put((Enchantment) enchantmentValue, enchantments.getLevel(enchantmentValue)); + map.put((Enchantment) (Object) enchantmentValue, enchantments.getLevel(RegistryEntry.of(enchantmentValue))); }); return map; } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java index 1a0e9e0df0..7ae5441d05 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java @@ -21,10 +21,12 @@ import net.minecraft.block.FluidBlock; import net.minecraft.fluid.Fluid; +import net.minecraft.util.collection.BoundedRegionArray; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ChunkRegion; import net.minecraft.world.WorldAccess; import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.ChunkGenerationStep; import net.minecraft.world.chunk.ChunkStatus; import net.minecraft.world.tick.MultiTickScheduler; import net.minecraft.world.tick.OrderedTick; @@ -76,10 +78,9 @@ public abstract class ChunkRegionMixin { @Inject(at = @At("RETURN"), - method = "(Lnet/minecraft/server/world/ServerWorld;Ljava/util/List;Lnet/minecraft/world/chunk/ChunkStatus;I)V") - public void injectConstructor(net.minecraft.server.world.ServerWorld world, List list, - ChunkStatus chunkStatus, int i, - CallbackInfo ci) { + method = "(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/util/collection/BoundedRegionArray;Lnet/minecraft/world/chunk/ChunkGenerationStep;Lnet/minecraft/world/chunk/Chunk;)V") + public void injectConstructor(net.minecraft.server.world.ServerWorld world, BoundedRegionArray chunks, + ChunkGenerationStep generationStep, Chunk centerPos, CallbackInfo ci) { this.terra$config = ((ServerWorld) world).getPack(); } 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 1c86273644..de147c509c 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 @@ -45,7 +45,7 @@ public static Pair createDefault(ConfigPack pack, ModPl .orElseThrow(); - Identifier generatorID = Identifier.of("terra", pack.getID().toLowerCase(Locale.ROOT) + "/" + pack.getNamespace().toLowerCase( + Identifier generatorID = Identifier.tryParse("terra:" + pack.getID().toLowerCase(Locale.ROOT) + "/" + pack.getNamespace().toLowerCase( Locale.ROOT)); PRESETS.add(generatorID); 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 41a57b4483..3918423117 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,6 +4,7 @@ import ca.solostudios.strata.parser.tokenizer.ParseException; import ca.solostudios.strata.version.Version; import net.minecraft.MinecraftVersion; +import net.minecraft.enchantment.Enchantment; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; @@ -34,6 +35,7 @@ public abstract class LifecyclePlatform extends ModPlatform { private static final AtomicReference> DIMENSIONS = new AtomicReference<>(); private static final AtomicReference> SETTINGS = new AtomicReference<>(); private static final AtomicReference> NOISE = new AtomicReference<>(); + private static final AtomicReference> ENCHANTMENT = new AtomicReference<>(); private static MinecraftServer server; public LifecyclePlatform() { @@ -44,11 +46,13 @@ public LifecyclePlatform() { public static void setRegistries(Registry biomeRegistry, Registry dimensionTypeRegistry, Registry chunkGeneratorSettingsRegistry, - Registry multiNoiseBiomeSourceParameterListRegistry) { + Registry multiNoiseBiomeSourceParameterListRegistry, + Registry enchantmentRegistry) { BIOMES.set(biomeRegistry); DIMENSIONS.set(dimensionTypeRegistry); SETTINGS.set(chunkGeneratorSettingsRegistry); NOISE.set(multiNoiseBiomeSourceParameterListRegistry); + ENCHANTMENT.set(enchantmentRegistry); } @Override @@ -141,5 +145,10 @@ public Registry multiNoiseBiomeSourceParamet return NOISE.get(); } + @Override + public Registry enchantmentRegistry() { + return ENCHANTMENT.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 b54ee9a022..a5d2a9bdea 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,6 +1,7 @@ package com.dfsek.terra.lifecycle.mixin.lifecycle; import com.mojang.datafixers.util.Pair; +import net.minecraft.enchantment.Enchantment; import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.DynamicRegistryManager.Immutable; import net.minecraft.registry.MutableRegistry; @@ -70,8 +71,9 @@ private static void grabManager(List> instance, Consume RegistryKeys.CHUNK_GENERATOR_SETTINGS).orElseThrow(); MutableRegistry multiNoiseBiomeSourceParameterLists = extractRegistry(instance, RegistryKeys.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST).orElseThrow(); + MutableRegistry enchantments = extractRegistry(instance, RegistryKeys.ENCHANTMENT).orElseThrow(); - LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings, multiNoiseBiomeSourceParameterLists); + LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings, multiNoiseBiomeSourceParameterLists, enchantments); LifecycleUtil.initialize(biomes, worldPresets); }); initialized = true; 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 5d5ab11c08..b32e129358 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 @@ -58,7 +58,7 @@ private static void registerBiome(Biome biome, ConfigPack pack, net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, Objects.requireNonNull(registry.get(vanilla)), vanillaBiomeProperties); - Identifier identifier = new Identifier("terra", MinecraftUtil.createBiomeID(pack, id)); + Identifier identifier = Identifier.of("terra", MinecraftUtil.createBiomeID(pack, id)); if(registry.containsId(identifier)) { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(MinecraftUtil.getEntry(registry, identifier) 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 03f0639c7c..69bc2ce21a 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 @@ -13,7 +13,7 @@ private RegistryUtil() { } public static void register() { - 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); + Registry.register(Registries.CHUNK_GENERATOR, Identifier.of("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER); + Registry.register(Registries.BIOME_SOURCE, Identifier.of("terra:terra"), Codecs.TERRA_BIOME_SOURCE); } } From b63f5f4a8fd72587aa0e450a7823fc1b0ffe65d8 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Wed, 18 Sep 2024 12:43:41 -0600 Subject: [PATCH 095/126] Reformat --- .../src/main/kotlin/DistributionConfig.kt | 3 +- .../v2/config/BiomePipelineTemplate.java | 2 +- .../pipeline/api/delegate/SelfDelegate.java | 4 +- .../config/BiomePipelineTemplate.java | 2 +- .../config/BiomeProviderTemplate.java | 2 +- .../generation/NoiseChunkGenerator3D.java | 6 +-- .../commands/addons/AddonsCommandAddon.java | 6 +-- .../structure/StructureCommandAddon.java | 14 ++--- .../dfsek/terra/addons/noise/NoiseAddon.java | 39 +++----------- .../templates/ImageSamplerTemplate.java | 9 ++-- .../noise/SaltedNoiseFunction2.java | 3 +- .../noise/SaltedNoiseFunction3.java | 3 +- .../feature/FeatureGenerationStage.java | 2 +- .../addons/terrascript/parser/ParserUtil.java | 8 +-- .../command/arguments/RegistryArgument.java | 25 +++++---- .../platform/CommandRegistrationEvent.java | 4 +- .../api/util/reflection/ReflectionUtil.java | 4 +- .../event/FunctionalEventHandlerImpl.java | 17 +++--- .../com/dfsek/terra/bukkit/BukkitEntity.java | 6 +-- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 10 ++-- .../bukkit/handles/BukkitWorldHandle.java | 5 +- .../dfsek/terra/bukkit/nms/Initializer.java | 5 +- .../dfsek/terra/bukkit/util/VersionUtil.java | 2 +- .../bukkit/nms/v1_21/AwfulBukkitHacks.java | 4 +- .../bukkit/nms/v1_21/NMSBiomeProvider.java | 8 +-- .../bukkit/nms/v1_21/NMSInjectListener.java | 4 +- .../java/com/dfsek/terra/mod/ModPlatform.java | 52 +++++++++---------- .../config/BiomeParticleConfigTemplate.java | 3 +- .../mod/config/SpawnSettingsTemplate.java | 2 +- .../terra/mod/config/SpawnTypeConfig.java | 6 +-- .../MinecraftChunkGeneratorWrapper.java | 2 - .../mod/generation/TerraBiomeSource.java | 1 - .../terra/mod/handle/MinecraftItemHandle.java | 5 +- .../mod/handle/MinecraftWorldHandle.java | 5 +- .../entity/MobSpawnerBlockEntityMixin.java | 5 +- .../terra/block/state/BlockStateMixin.java | 1 - .../terra/inventory/item/ItemStackMixin.java | 11 ++-- .../inventory/meta/EnchantmentMixin.java | 10 ++-- .../inventory/meta/ItemStackMetaMixin.java | 6 +-- .../terra/world/ChunkRegionMixin.java | 9 ++-- .../lifecycle/DataPackContentsMixin.java | 1 + .../com/dfsek/terra/mod/util/PresetUtil.java | 5 +- .../terra/lifecycle/LifecycleEntryPoint.java | 4 +- .../mixin/lifecycle/RegistryLoaderMixin.java | 49 ++++++----------- .../mixin/lifecycle/SaveLoadingMixin.java | 8 ++- 45 files changed, 163 insertions(+), 219 deletions(-) diff --git a/buildSrc/src/main/kotlin/DistributionConfig.kt b/buildSrc/src/main/kotlin/DistributionConfig.kt index 12ebd8376b..0a1c2d060b 100644 --- a/buildSrc/src/main/kotlin/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/DistributionConfig.kt @@ -27,7 +27,8 @@ fun Project.configureDistribution() { group = "terra" doFirst { file("${buildDir}/resources/main/packs/").deleteRecursively() - val defaultPackUrl = URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/" + Versions.Terra.overworldConfig + "/default.zip") + val defaultPackUrl = + URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/" + Versions.Terra.overworldConfig + "/default.zip") downloadPack(defaultPackUrl, project) } } 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 937a1b7dfc..75ffb8d65a 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 @@ -29,7 +29,7 @@ public class BiomePipelineTemplate implements ObjectTemplate { @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; 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 index 6b62818d23..c6762334a4 100644 --- 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 @@ -1,10 +1,10 @@ package com.dfsek.terra.addons.biome.pipeline.api.delegate; +import com.dfsek.terra.api.world.biome.Biome; + 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(); 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 491f019baf..1566de5245 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 @@ -28,7 +28,7 @@ public class BiomePipelineTemplate extends BiomeProviderTemplate { @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 diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java index f42fd7c209..93f84e80a4 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java @@ -22,7 +22,7 @@ public abstract class BiomeProviderTemplate implements ObjectTemplate>> NOISE_SAMPLER_TOKEN = new TypeKey<>() { diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java index c7359426c5..5503533d40 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java @@ -8,15 +8,16 @@ 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; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.awt.image.BufferedImage; + @SuppressWarnings({ "unused", "FieldMayBeFinal" }) public class ImageSamplerTemplate extends SamplerTemplate { diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java index 2e8f729298..41ddd12479 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction2.java @@ -3,11 +3,10 @@ import com.dfsek.paralithic.functions.dynamic.Context; import com.dfsek.paralithic.functions.dynamic.DynamicFunction; import com.dfsek.paralithic.node.Statefulness; +import org.jetbrains.annotations.NotNull; import com.dfsek.terra.api.noise.NoiseSampler; -import org.jetbrains.annotations.NotNull; - public class SaltedNoiseFunction2 implements DynamicFunction { private final NoiseSampler gen; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction3.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction3.java index 5dc483d5c8..d4549127cc 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction3.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SaltedNoiseFunction3.java @@ -3,11 +3,10 @@ import com.dfsek.paralithic.functions.dynamic.Context; import com.dfsek.paralithic.functions.dynamic.DynamicFunction; import com.dfsek.paralithic.node.Statefulness; +import org.jetbrains.annotations.NotNull; import com.dfsek.terra.api.noise.NoiseSampler; -import org.jetbrains.annotations.NotNull; - public class SaltedNoiseFunction3 implements DynamicFunction { private final NoiseSampler gen; diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java index 123107d150..11a1e3ca7f 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java @@ -62,7 +62,7 @@ public void populate(ProtoWorld world) { world.getBiomeProvider() .getColumn( tx + (doBlending ? (int) (blendSampler.noise(seed, tx, tz) * blendAmplitude) : 0), - tz + (doBlending ? (int) (blendSampler.noise(seed+1, tx, tz) * blendAmplitude) : 0), + tz + (doBlending ? (int) (blendSampler.noise(seed + 1, tx, tz) * blendAmplitude) : 0), world) .forRanges(resolution, (min, max, biome) -> { for(int subChunkX = 0; subChunkX < resolution; subChunkX++) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java index 4fc805a8f5..b982b09798 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java @@ -7,15 +7,15 @@ package com.dfsek.terra.addons.terrascript.parser; +import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; +import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; +import com.dfsek.terra.addons.terrascript.tokenizer.Token; + import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; -import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; -import com.dfsek.terra.addons.terrascript.tokenizer.Token; - public class ParserUtil { diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java index 91d6b56b91..8e15c18ceb 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java @@ -2,6 +2,15 @@ import io.leangen.geantyref.TypeToken; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.component.CommandComponent; +import org.incendo.cloud.component.DefaultValue; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -13,16 +22,6 @@ import com.dfsek.terra.api.registry.key.RegistryKey; import com.dfsek.terra.api.util.reflection.TypeKey; -import org.incendo.cloud.component.CommandComponent; -import org.incendo.cloud.component.DefaultValue; -import org.incendo.cloud.context.CommandContext; -import org.incendo.cloud.context.CommandInput; -import org.incendo.cloud.parser.ArgumentParseResult; -import org.incendo.cloud.parser.ArgumentParser; -import org.incendo.cloud.parser.ParserDescriptor; -import org.incendo.cloud.suggestion.Suggestion; -import org.incendo.cloud.suggestion.SuggestionProvider; - public class RegistryArgument { @@ -49,17 +48,17 @@ public static Builder builder(String name, Function CommandComponent of(String name, Function, Registry> registryFunction, - TypeKey registryType) { + TypeKey registryType) { return RegistryArgument.builder(name, registryFunction, registryType).build(); } public static CommandComponent optional(String name, Function, Registry> registryFunction, - TypeKey registryType) { + TypeKey registryType) { return RegistryArgument.builder(name, registryFunction, registryType).optional().build(); } public static CommandComponent optional(String name, Function, Registry> registryFunction, - TypeKey registryType, DefaultValue defaultKey) { + TypeKey registryType, DefaultValue defaultKey) { return RegistryArgument.builder(name, registryFunction, registryType).optional(defaultKey).build(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java index 3ad041c9bd..80088ff6d0 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java @@ -1,10 +1,10 @@ package com.dfsek.terra.api.event.events.platform; +import org.incendo.cloud.CommandManager; + import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.event.events.Event; -import org.incendo.cloud.CommandManager; - public class CommandRegistrationEvent implements Event { private final CommandManager commandManager; diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java index 6b0c8fd28b..2583b9ab6b 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java @@ -30,11 +30,11 @@ public final class ReflectionUtil { private static final Unsafe UNSAFE; static { - try{ + try { final Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); unsafeField.setAccessible(true); UNSAFE = (Unsafe) unsafeField.get(null); - } catch(NoSuchFieldException | IllegalAccessException e){ + } catch(NoSuchFieldException | IllegalAccessException e) { throw new RuntimeException(e); } } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java index 67f9846461..a35bf9366e 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java @@ -17,17 +17,6 @@ package com.dfsek.terra.event; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.Event; import com.dfsek.terra.api.event.events.FailThroughEvent; @@ -36,6 +25,12 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.util.reflection.TypeKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Type; +import java.util.*; + public class FunctionalEventHandlerImpl implements FunctionalEventHandler { private static final Logger logger = LoggerFactory.getLogger(FunctionalEventHandlerImpl.class); diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java index 6df2681803..98f44e2ec4 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java @@ -17,14 +17,14 @@ package com.dfsek.terra.bukkit; -import io.papermc.lib.PaperLib; -import org.bukkit.Location; - import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.bukkit.world.BukkitAdapter; +import io.papermc.lib.PaperLib; +import org.bukkit.Location; + public class BukkitEntity implements Entity { private final org.bukkit.entity.Entity entity; diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 8c392dba11..e3bc1d8376 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -79,7 +79,7 @@ public void onEnable() { } catch(Exception e) { // This should never happen. logger.error(""" TERRA HAS BEEN DISABLED - + Errors occurred while registering commands. Please report this to Terra. """.strip(), e); @@ -102,13 +102,13 @@ private LegacyPaperCommandManager getCommandSenderPaperCommandMan BukkitAdapter::adapt )); - if (commandManager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { + if(commandManager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { commandManager.registerBrigadier(); final CloudBrigadierManager brigManager = commandManager.brigadierManager(); if(brigManager != null) { brigManager.setNativeNumberSuggestions(false); } - } else if (commandManager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) { + } else if(commandManager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) { commandManager.registerAsynchronousCompletions(); } @@ -181,7 +181,7 @@ private boolean doVersionCheck() { logger.warn(""" You are using Mohist, so we will not give you any support for issues that may arise. Since you enabled the "IKnowMohistCausesLotsOfIssuesButIWillUseItAnyways" flag, we won't disable Terra. But be warned. - + > I felt a great disturbance in the JVM, as if millions of plugins suddenly cried out in stack traces and were suddenly silenced. > I fear something terrible has happened. > - Astrash @@ -194,7 +194,7 @@ private boolean doVersionCheck() { @Override public @Nullable ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, String id) { - if (id == null || id.trim().equals("")) { return null; } + if(id == null || id.trim().equals("")) { return null; } return new BukkitChunkGeneratorWrapper(generatorMap.computeIfAbsent(worldName, name -> { ConfigPack pack = platform.getConfigRegistry().getByID(id).orElseThrow( () -> new IllegalArgumentException("No such config pack \"" + id + "\"")); diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java index c6113bbd7a..97f932c81c 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 @@ -61,8 +61,9 @@ public BukkitWorldHandle() { @Override public @NotNull EntityType getEntity(@NotNull String id) { - if (!id.contains(":")) { //TODO: remove in 7.0 - String newid = "minecraft:" + id.toLowerCase();; + if(!id.contains(":")) { //TODO: remove in 7.0 + String newid = "minecraft:" + id.toLowerCase(); + ; logger.warn( "Translating " + id + " to " + newid + ". In 1.20.3 entity parsing was reworked" + ". You are advised to perform this rename in your config backs as this translation will be removed in the next major " + diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java index 3f7375bc4c..fc28e4bc38 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java @@ -1,11 +1,10 @@ package com.dfsek.terra.bukkit.nms; -import com.dfsek.terra.bukkit.util.VersionUtil; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.dfsek.terra.bukkit.PlatformImpl; +import com.dfsek.terra.bukkit.util.VersionUtil; public interface Initializer { @@ -16,7 +15,7 @@ static boolean init(PlatformImpl platform) { Logger logger = LoggerFactory.getLogger(Initializer.class); try { String packageVersion = NMS; - if (NMS.equals("v1_21_1")) { + if(NMS.equals("v1_21_1")) { packageVersion = "v1_21"; } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java index 6a8c662e05..3f32b6be2b 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java @@ -112,7 +112,7 @@ public String toString() { if(major == -1 && minor == -1 && patch == -1) return "Unknown"; - if (patch >= 0) { + if(patch >= 0) { return String.format("v%d.%d.%d", major, minor, patch); } else { return String.format("v%d.%d", major, minor); diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java index fc5cc03672..42d6833942 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java @@ -10,7 +10,6 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.biome.Biome; import org.bukkit.NamespacedKey; import org.slf4j.Logger; @@ -42,7 +41,8 @@ public static void registerBiomes(ConfigRegistry configRegistry) { try { BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome(); NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey(); - ResourceLocation vanillaMinecraftKey = ResourceLocation.fromNamespaceAndPath(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); + ResourceLocation vanillaMinecraftKey = ResourceLocation.fromNamespaceAndPath(vanillaBukkitKey.getNamespace(), + vanillaBukkitKey.getKey()); Biome platform = NMSBiomeInjector.createBiome(biome, Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey))); ResourceKey delegateKey = ResourceKey.create( diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java index 18184144fa..8abe26a51b 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java @@ -37,10 +37,10 @@ protected Stream> collectPossibleBiomes() { @Override protected @NotNull MapCodec codec() { return MapCodec.assumeMapUnsafe(BiomeSource.CODEC); -// return MapCodec.unit(null); -// BuiltInRegistries.BIOME_SOURCE.byNameCodec().dispatchMap(this::codec, Function.identity()); -// BuiltInRegistries.BIOME_SOURCE.byNameCodec().dispatchStable(BiomeSource::codec, Function.identity()); -// return BiomeSource.CODEC; + // return MapCodec.unit(null); + // BuiltInRegistries.BIOME_SOURCE.byNameCodec().dispatchMap(this::codec, Function.identity()); + // BuiltInRegistries.BIOME_SOURCE.byNameCodec().dispatchStable(BiomeSource::codec, Function.identity()); + // return BiomeSource.CODEC; } @Override diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java index b471faa88f..927b019ed5 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java @@ -1,12 +1,9 @@ package com.dfsek.terra.bukkit.nms.v1_21; -import com.dfsek.terra.api.util.reflection.ReflectionUtil; - import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.status.WorldGenContext; -import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.event.EventHandler; @@ -20,6 +17,7 @@ import java.util.concurrent.locks.ReentrantLock; import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.util.reflection.ReflectionUtil; import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; 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 308f7913cb..09681f6b61 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 @@ -68,32 +68,32 @@ public void registerWorldTypes(BiConsumer registerFunct public void register(TypeRegistry registry) { super.register(registry); registry.registerLoader(PlatformBiome.class, (type, o, loader, depthTracker) -> parseBiome((String) o, depthTracker)) - .registerLoader(Identifier.class, (type, o, loader, depthTracker) -> { - Identifier identifier = Identifier.tryParse((String) o); - if(identifier == null) - throw new LoadException("Invalid identifier: " + o, depthTracker); - return identifier; - }) - .registerLoader(Precipitation.class, (type, o, loader, depthTracker) -> Precipitation.valueOf(((String) o).toUpperCase( - Locale.ROOT))) - .registerLoader(GrassColorModifier.class, - (type, o, loader, depthTracker) -> GrassColorModifier.valueOf(((String) o).toUpperCase( - Locale.ROOT))) - .registerLoader(GrassColorModifier.class, - (type, o, loader, depthTracker) -> TemperatureModifier.valueOf(((String) o).toUpperCase( - Locale.ROOT))) - .registerLoader(SpawnGroup.class,(type, o, loader, depthTracker) -> SpawnGroup.valueOf((String) o)) - .registerLoader(BiomeParticleConfig.class, BiomeParticleConfigTemplate::new) - .registerLoader(SoundEvent.class, SoundEventTemplate::new) - .registerLoader(BiomeMoodSound.class, BiomeMoodSoundTemplate::new) - .registerLoader(BiomeAdditionsSound.class, BiomeAdditionsSoundTemplate::new) - .registerLoader(MusicSound.class, MusicSoundTemplate::new) - .registerLoader(EntityType.class, EntityTypeTemplate::new) - .registerLoader(SpawnCostConfig.class, SpawnCostConfig::new) - .registerLoader(SpawnEntry.class, SpawnEntryTemplate::new) - .registerLoader(SpawnTypeConfig.class, SpawnTypeConfig::new) - .registerLoader(SpawnSettings.class, SpawnSettingsTemplate::new) - .registerLoader(VillagerType.class, VillagerTypeTemplate::new); + .registerLoader(Identifier.class, (type, o, loader, depthTracker) -> { + Identifier identifier = Identifier.tryParse((String) o); + if(identifier == null) + throw new LoadException("Invalid identifier: " + o, depthTracker); + return identifier; + }) + .registerLoader(Precipitation.class, (type, o, loader, depthTracker) -> Precipitation.valueOf(((String) o).toUpperCase( + Locale.ROOT))) + .registerLoader(GrassColorModifier.class, + (type, o, loader, depthTracker) -> GrassColorModifier.valueOf(((String) o).toUpperCase( + Locale.ROOT))) + .registerLoader(GrassColorModifier.class, + (type, o, loader, depthTracker) -> TemperatureModifier.valueOf(((String) o).toUpperCase( + Locale.ROOT))) + .registerLoader(SpawnGroup.class, (type, o, loader, depthTracker) -> SpawnGroup.valueOf((String) o)) + .registerLoader(BiomeParticleConfig.class, BiomeParticleConfigTemplate::new) + .registerLoader(SoundEvent.class, SoundEventTemplate::new) + .registerLoader(BiomeMoodSound.class, BiomeMoodSoundTemplate::new) + .registerLoader(BiomeAdditionsSound.class, BiomeAdditionsSoundTemplate::new) + .registerLoader(MusicSound.class, MusicSoundTemplate::new) + .registerLoader(EntityType.class, EntityTypeTemplate::new) + .registerLoader(SpawnCostConfig.class, SpawnCostConfig::new) + .registerLoader(SpawnEntry.class, SpawnEntryTemplate::new) + .registerLoader(SpawnTypeConfig.class, SpawnTypeConfig::new) + .registerLoader(SpawnSettings.class, SpawnSettingsTemplate::new) + .registerLoader(VillagerType.class, VillagerTypeTemplate::new); } private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { 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 3bc4474b60..457566444d 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 @@ -28,7 +28,8 @@ public BiomeParticleConfig get() { try { return new BiomeParticleConfig( - ParticleEffectArgumentType.readParameters(new StringReader(particle), (RegistryWrapper.WrapperLookup) Registries.PARTICLE_TYPE.getReadOnlyWrapper()), + ParticleEffectArgumentType.readParameters(new StringReader(particle), + (RegistryWrapper.WrapperLookup) Registries.PARTICLE_TYPE.getReadOnlyWrapper()), probability); } catch(CommandSyntaxException e) { throw new RuntimeException(e); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnSettingsTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnSettingsTemplate.java index 86e9de0076..a0e8932e50 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnSettingsTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnSettingsTemplate.java @@ -28,7 +28,7 @@ public SpawnSettings get() { SpawnSettings.Builder builder = new SpawnSettings.Builder(); for(SpawnTypeConfig spawn : spawns) { SpawnGroup group = spawn.getGroup(); - for (SpawnEntry entry : spawn.getEntry()) { + for(SpawnEntry entry : spawn.getEntry()) { builder.spawn(group, entry); } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnTypeConfig.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnTypeConfig.java index b18c87e624..0eba7ca67a 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnTypeConfig.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnTypeConfig.java @@ -13,15 +13,15 @@ public class SpawnTypeConfig implements ObjectTemplate { @Value("group") @Default private SpawnGroup group = null; - + @Value("entries") @Default private List entry = null; - + public SpawnGroup getGroup() { return group; } - + public List getEntry() { return entry; } 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 c73ad3f3b9..46f5601ded 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,7 +17,6 @@ package com.dfsek.terra.mod.generation; -import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -49,7 +48,6 @@ 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; 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 533a8c98bd..81651ece8c 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 @@ -17,7 +17,6 @@ package com.dfsek.terra.mod.generation; -import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.world.biome.Biome; 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 e9a5f5ae42..c9ef02f378 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,10 +21,8 @@ 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.Registry; import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryWrapper; import net.minecraft.registry.RegistryWrapper.Impl; import net.minecraft.util.Identifier; @@ -67,6 +65,7 @@ public Enchantment getEnchantment(String id) { @Override public Set getEnchantments() { - return CommonPlatform.get().enchantmentRegistry().stream().map(enchantment -> (Enchantment) (Object) enchantment).collect(Collectors.toSet()); + return CommonPlatform.get().enchantmentRegistry().stream().map(enchantment -> (Enchantment) (Object) 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 3b5e1fe49b..c36744d183 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 @@ -64,8 +64,9 @@ public class MinecraftWorldHandle implements WorldHandle { @Override public @NotNull EntityType getEntity(@NotNull String id) { - if (!id.contains(":")) { //TODO: remove in 7.0 - String newid = "minecraft:" + id.toLowerCase();; + if(!id.contains(":")) { //TODO: remove in 7.0 + String newid = "minecraft:" + id.toLowerCase(); + ; logger.warn( "Translating " + id + " to " + newid + ". In 1.20.3 entity parsing was reworked" + ". You are advised to perform this rename in your config packs as this translation will be removed in the next major " + 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 caf918d1dd..15e8fab349 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 @@ -48,7 +48,8 @@ private MobSpawnerBlockEntityMixin(BlockEntityType type, BlockPos pos, BlockS @Shadow public abstract MobSpawnerLogic getLogic(); -//method_46408 + + //method_46408 @Shadow public abstract void setEntityType(net.minecraft.entity.EntityType entityType, Random random); @@ -59,7 +60,7 @@ private MobSpawnerBlockEntityMixin(BlockEntityType type, BlockPos pos, BlockS public void terra$setSpawnedType(@NotNull EntityType creatureType) { Random rand; - if (hasWorld()) { + if(hasWorld()) { rand = world.getRandom(); } else { rand = Random.create(); 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 9ecb3eccc6..4243bf9428 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 @@ -1,7 +1,6 @@ package com.dfsek.terra.mod.mixin.implementations.terra.block.state; -import com.google.common.collect.ImmutableMap; import com.mojang.serialization.MapCodec; import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; import net.minecraft.block.AbstractBlock.AbstractBlockState; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java index 70177be1fa..76121f64b8 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java @@ -17,13 +17,10 @@ package com.dfsek.terra.mod.mixin.implementations.terra.inventory.item; -import net.minecraft.component.Component; import net.minecraft.component.ComponentChanges; import net.minecraft.component.ComponentMap; import net.minecraft.component.ComponentMapImpl; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; @@ -38,6 +35,10 @@ @Mixin(ItemStack.class) @Implements(@Interface(iface = com.dfsek.terra.api.inventory.ItemStack.class, prefix = "terra$")) public abstract class ItemStackMixin { + @Shadow + @Final + private ComponentMapImpl components; + @Shadow public abstract int getCount(); @@ -53,10 +54,6 @@ public abstract class ItemStackMixin { @Shadow public abstract ComponentMap getComponents(); - @Shadow - @Final - private ComponentMapImpl components; - public int terra$getAmount() { return getCount(); } 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 dd7cfbce08..8f58fb9d88 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 @@ -17,10 +17,7 @@ package com.dfsek.terra.mod.mixin.implementations.terra.inventory.meta; -import com.dfsek.terra.mod.CommonPlatform; - import net.minecraft.enchantment.Enchantment; -import net.minecraft.registry.Registries; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.entry.RegistryEntryList; import org.spongepowered.asm.mixin.Final; @@ -32,6 +29,7 @@ import java.util.Objects; import com.dfsek.terra.api.inventory.ItemStack; +import com.dfsek.terra.mod.CommonPlatform; import static net.minecraft.enchantment.Enchantment.canBeCombined; @@ -39,13 +37,13 @@ @Mixin(Enchantment.class) @Implements(@Interface(iface = com.dfsek.terra.api.inventory.item.Enchantment.class, prefix = "terra$")) public abstract class EnchantmentMixin { - @Shadow - public abstract boolean isAcceptableItem(net.minecraft.item.ItemStack stack); - @Shadow @Final private RegistryEntryList exclusiveSet; + @Shadow + public abstract boolean isAcceptableItem(net.minecraft.item.ItemStack stack); + @SuppressWarnings("ConstantConditions") public boolean terra$canEnchantItem(ItemStack itemStack) { return isAcceptableItem((net.minecraft.item.ItemStack) (Object) itemStack); 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 a3bcf54dfa..91a487d0b1 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 @@ -19,9 +19,6 @@ import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtList; -import net.minecraft.registry.Registries; import net.minecraft.registry.entry.RegistryEntry; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; @@ -49,7 +46,8 @@ public abstract class ItemStackMetaMixin { @Shadow public abstract void addEnchantment(RegistryEntry enchantment, int level); - public void terra$addEnchantment(Enchantment enchantment, int level) { ; + public void terra$addEnchantment(Enchantment enchantment, int level) { + ; addEnchantment(RegistryEntry.of((net.minecraft.enchantment.Enchantment) (Object) enchantment), level); } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java index 7ae5441d05..70a62ae797 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java @@ -17,8 +17,6 @@ package com.dfsek.terra.mod.mixin.implementations.terra.world; -import com.dfsek.terra.mod.mixin.invoke.FluidBlockInvoker; - import net.minecraft.block.FluidBlock; import net.minecraft.fluid.Fluid; import net.minecraft.util.collection.BoundedRegionArray; @@ -27,7 +25,6 @@ import net.minecraft.world.WorldAccess; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.ChunkGenerationStep; -import net.minecraft.world.chunk.ChunkStatus; import net.minecraft.world.tick.MultiTickScheduler; import net.minecraft.world.tick.OrderedTick; import org.spongepowered.asm.mixin.Final; @@ -40,8 +37,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.List; - import com.dfsek.terra.api.block.entity.BlockEntity; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.ConfigPack; @@ -52,6 +47,7 @@ import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; import com.dfsek.terra.api.world.chunk.generation.ProtoWorld; import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; +import com.dfsek.terra.mod.mixin.invoke.FluidBlockInvoker; import com.dfsek.terra.mod.util.MinecraftUtil; @@ -78,7 +74,8 @@ public abstract class ChunkRegionMixin { @Inject(at = @At("RETURN"), - method = "(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/util/collection/BoundedRegionArray;Lnet/minecraft/world/chunk/ChunkGenerationStep;Lnet/minecraft/world/chunk/Chunk;)V") + method = "(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/util/collection/BoundedRegionArray;" + + "Lnet/minecraft/world/chunk/ChunkGenerationStep;Lnet/minecraft/world/chunk/Chunk;)V") public void injectConstructor(net.minecraft.server.world.ServerWorld world, BoundedRegionArray chunks, ChunkGenerationStep generationStep, Chunk centerPos, CallbackInfo ci) { this.terra$config = ((ServerWorld) world).getPack(); 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 305f7f024c..680c1833c8 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 @@ -22,6 +22,7 @@ public class DataPackContentsMixin { @Shadow @Final private ReloadableRegistries.Lookup reloadableRegistries; + /* * #refresh populates all tags in the registries */ 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 de147c509c..32c19a4056 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 @@ -45,8 +45,9 @@ public static Pair createDefault(ConfigPack pack, ModPl .orElseThrow(); - Identifier generatorID = Identifier.tryParse("terra:" + pack.getID().toLowerCase(Locale.ROOT) + "/" + pack.getNamespace().toLowerCase( - Locale.ROOT)); + Identifier generatorID = Identifier.tryParse( + "terra:" + pack.getID().toLowerCase(Locale.ROOT) + "/" + pack.getNamespace().toLowerCase( + Locale.ROOT)); PRESETS.add(generatorID); diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java index 65d86febf1..0cbfa77b41 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java @@ -20,8 +20,8 @@ public static void initialize(String modName, LifecyclePlatform platform) { FabricServerCommandManager manager = new FabricServerCommandManager<>( ExecutionCoordinator.simpleCoordinator(), SenderMapper.create( - serverCommandSource -> (CommandSender) serverCommandSource, - commandSender -> (ServerCommandSource) commandSender) + serverCommandSource -> (CommandSender) serverCommandSource, + commandSender -> (ServerCommandSource) commandSender) ); 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 a5d2a9bdea..b1ff483968 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,15 +1,13 @@ package com.dfsek.terra.lifecycle.mixin.lifecycle; -import com.mojang.datafixers.util.Pair; import net.minecraft.enchantment.Enchantment; -import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.registry.DynamicRegistryManager.Immutable; import net.minecraft.registry.MutableRegistry; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryLoader; import net.minecraft.registry.RegistryLoader.Loader; +import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.WorldPreset; @@ -20,7 +18,6 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; 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; @@ -31,8 +28,6 @@ import com.dfsek.terra.lifecycle.util.LifecycleUtil; import com.dfsek.terra.lifecycle.util.RegistryHack; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - @Mixin(RegistryLoader.class) public class RegistryLoaderMixin { @@ -40,21 +35,10 @@ public class RegistryLoaderMixin { @Shadow @Final private static Logger LOGGER; -// @Inject( -// method = "load(Lnet/minecraft/registry/RegistryLoader$RegistryLoadable;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 grabRegiestry(RegistryLoader.RegistryLoadable loadable, DynamicRegistryManager baseRegistryManager, -// List> entries, CallbackInfoReturnable cir) { -// entries.forEach((loader) -> { -// Registry registry = loader.registry(); -// } + @Redirect( - method = "load(Lnet/minecraft/registry/RegistryLoader$RegistryLoadable;Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", + method = "load(Lnet/minecraft/registry/RegistryLoader$RegistryLoadable;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", @@ -62,20 +46,19 @@ public class RegistryLoaderMixin { ) ) private static void grabManager(List> instance, Consumer> consumer) { - if (!initialized) { - 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(); - MutableRegistry multiNoiseBiomeSourceParameterLists = extractRegistry(instance, - RegistryKeys.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST).orElseThrow(); - MutableRegistry enchantments = extractRegistry(instance, RegistryKeys.ENCHANTMENT).orElseThrow(); + if(!initialized) { + MutableRegistry biomes = extractRegistry(instance, RegistryKeys.BIOME).orElseThrow(); + 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(); + MutableRegistry multiNoiseBiomeSourceParameterLists = extractRegistry(instance, + RegistryKeys.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST).orElseThrow(); + MutableRegistry enchantments = extractRegistry(instance, RegistryKeys.ENCHANTMENT).orElseThrow(); - LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings, multiNoiseBiomeSourceParameterLists, enchantments); - LifecycleUtil.initialize(biomes, worldPresets); - }); + LifecyclePlatform.setRegistries(biomes, dimensionTypes, chunkGeneratorSettings, multiNoiseBiomeSourceParameterLists, + enchantments); + LifecycleUtil.initialize(biomes, worldPresets); initialized = true; } 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 index 0bf675fc25..89490ef415 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 @@ -13,10 +13,14 @@ @Mixin(SaveLoading.class) public class SaveLoadingMixin { @ModifyArg( - method = "load(Lnet/minecraft/server/SaveLoading$ServerConfig;Lnet/minecraft/server/SaveLoading$LoadContextSupplier;Lnet/minecraft/server/SaveLoading$SaveApplierFactory;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;", + method = "load(Lnet/minecraft/server/SaveLoading$ServerConfig;Lnet/minecraft/server/SaveLoading$LoadContextSupplier;" + + "Lnet/minecraft/server/SaveLoading$SaveApplierFactory;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)" + + "Ljava/util/concurrent/CompletableFuture;", at = @At( value = "INVOKE", - target = "Lnet/minecraft/registry/RegistryLoader;loadFromResource(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)Lnet/minecraft/registry/DynamicRegistryManager$Immutable;" ), + target = "Lnet/minecraft/registry/RegistryLoader;loadFromResource(Lnet/minecraft/resource/ResourceManager;" + + "Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)" + + "Lnet/minecraft/registry/DynamicRegistryManager$Immutable;"), index = 1 ) private static DynamicRegistryManager grabManager(DynamicRegistryManager registryManager) { From 06457bf3ced441619bc9ac0994b7842dc33ea323 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Wed, 18 Sep 2024 15:43:31 -0600 Subject: [PATCH 096/126] some fixes --- .../com/dfsek/terra/mod/mixin/invoke/FluidBlockInvoker.java | 2 +- .../src/main/resources/terra.common.mixins.json | 1 + .../lifecycle/mixin/lifecycle/MinecraftServerMixin.java | 6 ++++++ .../lifecycle/mixin/lifecycle/RegistryLoaderMixin.java | 4 +++- .../java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java | 1 + 5 files changed, 12 insertions(+), 2 deletions(-) diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/invoke/FluidBlockInvoker.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/invoke/FluidBlockInvoker.java index a6b50409c3..620d03ec16 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/invoke/FluidBlockInvoker.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/invoke/FluidBlockInvoker.java @@ -10,5 +10,5 @@ @Mixin(FluidBlock.class) public interface FluidBlockInvoker { @Invoker("getFluidState") - public FluidState invokeGetFluidState(BlockState state); + FluidState invokeGetFluidState(BlockState state); } 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 f8d0718e48..e25cb7da45 100644 --- a/platforms/mixin-common/src/main/resources/terra.common.mixins.json +++ b/platforms/mixin-common/src/main/resources/terra.common.mixins.json @@ -36,6 +36,7 @@ "implementations.terra.inventory.meta.ItemStackMetaMixin", "implementations.terra.world.ChunkRegionMixin", "implementations.terra.world.ServerWorldMixin", + "invoke.FluidBlockInvoker", "lifecycle.DataPackContentsMixin" ], "client": [ diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java index 25ac340d01..63a8b81706 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java @@ -16,6 +16,7 @@ import com.dfsek.terra.lifecycle.LifecyclePlatform; +import static com.dfsek.terra.lifecycle.util.LifecycleUtil.initialized; @Mixin(MinecraftServer.class) public class MinecraftServerMixin { @@ -29,4 +30,9 @@ private void injectConstructor(Thread serverThread, LevelStorage.Session session WorldGenerationProgressListenerFactory worldGenerationProgressListenerFactory, CallbackInfo ci) { LifecyclePlatform.setServer((MinecraftServer) (Object) this); } + + @Inject(method = "shutdown()V", at = @At("RETURN")) + private void injectShutdown(CallbackInfo ci) { + initialized = false; + } } diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java index b1ff483968..739c084f37 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 @@ -28,10 +28,12 @@ import com.dfsek.terra.lifecycle.util.LifecycleUtil; import com.dfsek.terra.lifecycle.util.RegistryHack; +import static com.dfsek.terra.lifecycle.util.LifecycleUtil.initialized; + @Mixin(RegistryLoader.class) public class RegistryLoaderMixin { - private static boolean initialized = false; + @Shadow @Final private static Logger LOGGER; 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 a251bedbd1..28346a6eb4 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java @@ -12,6 +12,7 @@ public final class LifecycleUtil { + public static boolean initialized = false; private LifecycleUtil() { } From 3644ee7fca671dc2ca095f7c0eb6b898eb1345f7 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 16:28:34 -0600 Subject: [PATCH 097/126] Implement DerivateNoiseFunction --- .../noise/DerivativeFractalTemplate.java | 11 ++-- .../noise/DerivativeNoiseTemplate.java | 8 +++ .../noise/DerivativeNoiseFunction.java | 24 ++++++++ .../noise/simplex/DerivativeFractal.java | 57 ++++++++++++------- 4 files changed, 72 insertions(+), 28 deletions(-) create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeNoiseTemplate.java create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DerivativeNoiseFunction.java diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeFractalTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeFractalTemplate.java index 9387651a28..68e8c803db 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeFractalTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeFractalTemplate.java @@ -7,7 +7,7 @@ import com.dfsek.terra.addons.noise.samplers.noise.simplex.DerivativeFractal; -public class DerivativeFractalTemplate extends SamplerTemplate { +public class DerivativeFractalTemplate extends DerivativeNoiseTemplate { @Value("octaves") @Default @@ -21,12 +21,11 @@ public class DerivativeFractalTemplate extends SamplerTemplate extends NoiseTemplate { + +} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DerivativeNoiseFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DerivativeNoiseFunction.java new file mode 100644 index 0000000000..c5caa0d3a8 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DerivativeNoiseFunction.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.addons.noise.samplers.noise; + +import com.dfsek.terra.api.noise.DerivativeNoiseSampler; + +public abstract class DerivativeNoiseFunction extends NoiseFunction implements DerivativeNoiseSampler { + @Override + public boolean isDifferentiable() { + return true; + } + + @Override + public double[] noised(long seed, double x, double y) { + return getNoiseDerivativeRaw(seed + salt, x * frequency, y * frequency); + } + + @Override + public double[] noised(long seed, double x, double y, double z) { + return getNoiseDerivativeRaw(seed + salt, x * frequency, y * frequency, z * frequency); + } + + public abstract double[] getNoiseDerivativeRaw(long seed, double x, double y); + + public abstract double[] getNoiseDerivativeRaw(long seed, double x, double y, double z); +} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java index 91fa69e0ef..4d7edc2fec 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java @@ -1,29 +1,49 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; -import com.dfsek.terra.api.noise.DerivativeNoiseSampler; +import com.dfsek.terra.addons.noise.samplers.noise.DerivativeNoiseFunction; import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.dot; -import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.hash; -import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.hashX; -import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.hashY; /** * Temporary sampler that provides derivatives to test pseudoerosion, should be replaced with * derivative versions of existing samplers */ -public class DerivativeFractal implements DerivativeNoiseSampler { +public class DerivativeFractal extends DerivativeNoiseFunction { private final int heightOctaves; private final double heightGain; private final double heightLacunarity; - private final double frequency; + private static final float HASH_X = 0.3183099f; + private static final float HASH_Y = 0.3678794f; - public DerivativeFractal(int octaves, double gain, double lacunarity, double frequency) { + public DerivativeFractal(int octaves, double gain, double lacunarity) { this.heightOctaves = octaves; this.heightGain = gain; this.heightLacunarity = lacunarity; - this.frequency = frequency; + } + + public static float hash(float x, float y) { + float xx = x * HASH_X + HASH_Y; + float yy = y * HASH_Y + HASH_X; + + // Swapped the components here + return 16 * (xx * yy * (xx + yy)); + } + + public static float hashX(float n) { + // Swapped the components here + float nx = HASH_X * n; + return -1.0f + 2.0f * fract(nx); + } + + public static float hashY(float n) { + float ny = HASH_Y * n; + return -1.0f + 2.0f * fract(ny); + } + + public static float fract(float x) { + return (x - (float)Math.floor(x)); } private static float[] baseNoise(float px, float py) { @@ -65,14 +85,7 @@ private static float[] baseNoise(float px, float py) { } @Override - public boolean isDifferentiable() { - return true; - } - - @Override - public double[] noised(long seed, double x, double y) { - x *= frequency; - y *= frequency; + public double[] getNoiseDerivativeRaw(long seed, double x, double y) { double[] out = { 0.0f, 0.0f, 0.0f }; float heightFreq = 1.0f; float heightAmp = 1f; @@ -93,17 +106,17 @@ public double[] noised(long seed, double x, double y) { } @Override - public double[] noised(long seed, double x, double y, double z) { - return noised(seed, x, z); + public double[] getNoiseDerivativeRaw(long seed, double x, double y, double z) { + return getNoiseDerivativeRaw(seed, x, y); } @Override - public double noise(long seed, double x, double y) { - return noised(seed, x, y)[0]; + public double getNoiseRaw(long seed, double x, double y) { + return getNoiseDerivativeRaw(seed, x, y)[0]; } @Override - public double noise(long seed, double x, double y, double z) { - return noised(seed, x, y, z)[0]; + public double getNoiseRaw(long seed, double x, double y, double z) { + return getNoiseRaw(seed, x, y); } } From b1ad820e1ca188218c08fd8d9433b9f1fe437759 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 16:37:42 -0600 Subject: [PATCH 098/126] Move pseudoerosion to NoiseFunction --- .../templates/noise/PseudoErosionTemplate.java | 13 ++++++++++--- .../samplers/noise/simplex/PseudoErosion.java | 14 +++++--------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java index f5e1ac46c9..d7f6b7562c 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java @@ -3,12 +3,12 @@ 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.simplex.PseudoErosion; +import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.DerivativeNoiseSampler; -public class PseudoErosionTemplate extends SamplerTemplate { +public class PseudoErosionTemplate extends NoiseTemplate { @Value("octaves") @Default @@ -61,10 +61,17 @@ public class PseudoErosionTemplate extends SamplerTemplate { @Default private boolean averageErosionImpulses = true; + @Value("frequency") + @Default + protected @Meta double frequency = 1d; + @Override public PseudoErosion get() { - return new PseudoErosion(octaves, gain, lacunarity, + PseudoErosion pseudoErosion = new PseudoErosion(octaves, gain, lacunarity, slopeStrength, branchStrength, strength, erosionFrequency, heightSampler, slopeMask, slopeMaskFull, slopeMaskNone, jitterModifier, averageErosionImpulses); + pseudoErosion.setFrequency(frequency); + pseudoErosion.setSalt(salt); + return pseudoErosion; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java index 41b1e2db86..29a6d8e8b7 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java @@ -1,12 +1,13 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; +import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; import com.dfsek.terra.api.noise.DerivativeNoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.MathUtil; -public class PseudoErosion implements NoiseSampler { +public class PseudoErosion extends NoiseFunction { public static final float TAU = (float) (2.0 * Math.PI); private static final float HASH_X = 0.3183099f; private static final float HASH_Y = 0.3678794f; @@ -106,11 +107,6 @@ public float[] erosion(float x, float y, float dirX, float dirY) { return new float[] {noise, dirOutX, dirOutY}; } - public static double exp(double val) { - final long tmp = (long) (1512775 * val + 1072632447); - return Double.longBitsToDouble(tmp << 32); - } - public static float smoothstep(float edge0, float edge1, float x) { // Scale, bias and saturate x to 0..1 range x = clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f); @@ -176,12 +172,12 @@ public static float dot(float x1, float y1, float x2, float y2) { } @Override - public double noise(long seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y) { return heightMap(seed, (float) x, (float) y); } @Override - public double noise(long seed, double x, double y, double z) { - return noise(seed, x, z); + public double getNoiseRaw(long seed, double x, double y, double z) { + return getNoiseRaw(seed, x, z); } } \ No newline at end of file From 07e3d0058d3c39e92bc0a4a19dbbba30f823e499 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 16:46:48 -0600 Subject: [PATCH 099/126] Refractor PseudoErosion --- .../templates/noise/PseudoErosionTemplate.java | 8 ++++---- .../PseudoErosion.java => PseudoErosionSampler.java} | 12 +++++------- .../samplers/noise/simplex/DerivativeFractal.java | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) rename common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/{simplex/PseudoErosion.java => PseudoErosionSampler.java} (92%) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java index d7f6b7562c..f815cd40c5 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java @@ -3,12 +3,12 @@ import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; -import com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion; +import com.dfsek.terra.addons.noise.samplers.noise.PseudoErosionSampler; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.DerivativeNoiseSampler; -public class PseudoErosionTemplate extends NoiseTemplate { +public class PseudoErosionTemplate extends NoiseTemplate { @Value("octaves") @Default @@ -66,8 +66,8 @@ public class PseudoErosionTemplate extends NoiseTemplate { protected @Meta double frequency = 1d; @Override - public PseudoErosion get() { - PseudoErosion pseudoErosion = new PseudoErosion(octaves, gain, lacunarity, + public PseudoErosionSampler get() { + PseudoErosionSampler pseudoErosion = new PseudoErosionSampler(octaves, gain, lacunarity, slopeStrength, branchStrength, strength, erosionFrequency, heightSampler, slopeMask, slopeMaskFull, slopeMaskNone, jitterModifier, averageErosionImpulses); pseudoErosion.setFrequency(frequency); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java similarity index 92% rename from common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java rename to common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java index 29a6d8e8b7..7aeff49ac7 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PseudoErosion.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java @@ -1,13 +1,11 @@ -package com.dfsek.terra.addons.noise.samplers.noise.simplex; +package com.dfsek.terra.addons.noise.samplers.noise; -import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; import com.dfsek.terra.api.noise.DerivativeNoiseSampler; -import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.MathUtil; -public class PseudoErosion extends NoiseFunction { +public class PseudoErosionSampler extends NoiseFunction { public static final float TAU = (float) (2.0 * Math.PI); private static final float HASH_X = 0.3183099f; private static final float HASH_Y = 0.3678794f; @@ -27,9 +25,9 @@ public class PseudoErosion extends NoiseFunction { private final double maxCellDistSqRecip; private final boolean averageErosionImpulses; - public PseudoErosion(int octaves, double gain, double lacunarity, double slopeStrength, double branchStrength, double erosionStrength, double erosionFrequency, DerivativeNoiseSampler sampler, - boolean slopeMask, double slopeMaskFull, double slopeMaskNone, double jitterModifier, - boolean averageErosionImpulses) { + public PseudoErosionSampler(int octaves, double gain, double lacunarity, double slopeStrength, double branchStrength, double erosionStrength, double erosionFrequency, DerivativeNoiseSampler sampler, + boolean slopeMask, double slopeMaskFull, double slopeMaskNone, double jitterModifier, + boolean averageErosionImpulses) { this.octaves = octaves; this.gain = gain; this.lacunarity = lacunarity; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java index 4d7edc2fec..9a9e7f922c 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java @@ -2,7 +2,7 @@ import com.dfsek.terra.addons.noise.samplers.noise.DerivativeNoiseFunction; -import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.dot; +import static com.dfsek.terra.addons.noise.samplers.noise.PseudoErosionSampler.dot; /** From 699d5d1d62dd2b4ac22afc61e31cf6912b9e2c38 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 19:42:50 -0600 Subject: [PATCH 100/126] Derivable OpenSimplex2S Impl baased on https://gist.github.com/KdotJPG/882f36b2ae5ae56a8fc91627ec1c87f4 --- .../noise/simplex/OpenSimplex2SSampler.java | 418 ++++++++++++++++++ .../noise/simplex/SimplexStyleSampler.java | 44 +- 2 files changed, 454 insertions(+), 8 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java index e3488a6769..d9aec851e7 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java @@ -276,4 +276,422 @@ public double getNoiseRaw(long sl, double x, double y, double z) { return value * 9.046026385208288; } + @Override + public boolean isDifferentiable() { + return true; + } + + @Override + public double[] getNoiseDerivativeRaw(long sl, double x, double y) { + int seed = (int) sl; + // 2D OpenSimplex2S case is a modified 2D simplex noise. + + final double SQRT3 = 1.7320508075688772935274463415059; + final double G2 = (3 - SQRT3) / 6; + + final double F2 = 0.5f * (SQRT3 - 1); + double s = (x + y) * F2; + x += s; + y += s; + + + int i = (int) Math.floor(x); + int j = (int) Math.floor(y); + double xi = x - i; + double yi = y - j; + + i *= PRIME_X; + j *= PRIME_Y; + int i1 = i + PRIME_X; + int j1 = j + PRIME_Y; + + double t = (xi + yi) * G2; + double x0 = xi - t; + double y0 = yi - t; + + double[] out = { 0.0f, 0.0f, 0.0f }; + + double a0 = (2.0 / 3.0) - x0 * x0 - y0 * y0; + double aa0 = a0 * a0, aaa0 = aa0 * a0, aaaa0 = aa0 * aa0; + int gi0 = gradCoordIndex(seed, i, j); + double gx0 = GRADIENTS_2_D[gi0], gy0 = GRADIENTS_2_D[gi0 | 1]; + double rampValue0 = gx0 * x0 + gy0 * y0; + out[0] = aaaa0 * rampValue0; + out[1] = gx0 * aaaa0 - 8 * rampValue0 * aaa0 * x0; + out[2] = gy0 * aaaa0 - 8 * rampValue0 * aaa0 * y0; + + + + double a1 = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a0); + double x1 = x0 - (1 - 2 * G2); + double y1 = y0 - (1 - 2 * G2); + double aa1 = a1 * a1, aaa1 = aa1 * a1, aaaa1 = aa1 * aa1; + int gi1 = gradCoordIndex(seed, i1, j1); + double gx1 = GRADIENTS_2_D[gi1], gy1 = GRADIENTS_2_D[gi1 | 1]; + double rampValue1 = gx1 * x1 + gy1 * y1; + out[0] += aaaa1 * rampValue1; + out[1] += gx1 * aaaa1 - 8 * rampValue1 * aaa1 * x1; + out[2] += gy1 * aaaa1 - 8 * rampValue1 * aaa1 * y1; + + // Nested conditionals were faster than compact bit logic/arithmetic. + double xmyi = xi - yi; + if(t > G2) { + if(xi + xmyi > 1) { + double x2 = x0 + (3 * G2 - 2); + double y2 = y0 + (3 * G2 - 1); + double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; + if(a2 > 0) { + double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; + int gi2 = gradCoordIndex(seed, i + (PRIME_X << 1), j + PRIME_Y); + double gx2 = GRADIENTS_2_D[gi2 | 0], gy2 = GRADIENTS_2_D[gi2 | 1]; + double rampValue2 = gx2 * x2 + gy2 * y2; + out[0] += aaaa2 * rampValue2; + out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; + out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; + } + } else { + double x2 = x0 + G2; + double y2 = y0 + (G2 - 1); + double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; + if(a2 > 0) { + double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; + int gi2 = gradCoordIndex(seed, i, j + PRIME_Y); + double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; + double rampValue2 = gx2 * x2 + gy2 * y2; + out[0] += aaaa2 * rampValue2; + out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; + out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; + } + } + + if(yi - xmyi > 1) { + double x3 = x0 + (3 * G2 - 1); + double y3 = y0 + (3 * G2 - 2); + double a3 = (2.0 / 3.0) - x3 * x3 - y3 * y3; + if(a3 > 0) { + double aa3 = a3 * a3, aaa3 = aa3 * a3, aaaa3 = aa3 * aa3; + int gi3 = gradCoordIndex(seed, i + PRIME_X, j + (PRIME_Y << 1)); + double gx3 = GRADIENTS_2_D[gi3], gy3 = GRADIENTS_2_D[gi3 | 1]; + double rampValue3 = gx3 * x3 + gy3 * y3; + out[0] += aaaa3 * rampValue3; + out[1] += gx3 * aaaa3 - 8 * rampValue3 * aaa3 * x3; + out[2] += gy3 * aaaa3 - 8 * rampValue3 * aaa3 * y3; + } + } else { + double x3 = x0 + (G2 - 1); + double y3 = y0 + G2; + double a3 = (2.0 / 3.0) - x3 * x3 - y3 * y3; + if(a3 > 0) { + double aa3 = a3 * a3, aaa3 = aa3 * a3, aaaa3 = aa3 * aa3; + int gi3 = gradCoordIndex(seed, i + PRIME_X, j); + double gx3 = GRADIENTS_2_D[gi3], gy3 = GRADIENTS_2_D[gi3 | 1]; + double rampValue3 = gx3 * x3 + gy3 * y3; + out[0] += aaaa3 * rampValue3; + out[1] += gx3 * aaaa3 - 8 * rampValue3 * aaa3 * x3; + out[2] += gy3 * aaaa3 - 8 * rampValue3 * aaa3 * y3; + } + } + } else { + if(xi + xmyi < 0) { + double x2 = x0 + (1 - G2); + double y2 = y0 - G2; + double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; + if(a2 > 0) { + double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; + int gi2 = gradCoordIndex(seed, i - PRIME_X, j); + double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; + double rampValue2 = gx2 * x2 + gy2 * y2; + out[0] += aaaa2 * rampValue2; + out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; + out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; } + } else { + double x2 = x0 + (G2 - 1); + double y2 = y0 + G2; + double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; + if(a2 > 0) { + double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; + int gi2 = gradCoordIndex(seed, i + PRIME_X, j); + double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; + double rampValue2 = gx2 * x2 + gy2 * y2; + out[0] += aaaa2 * rampValue2; + out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; + out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; + } + } + + if(yi < xmyi) { + double x2 = x0 - G2; + double y2 = y0 - (G2 - 1); + double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; + if(a2 > 0) { + double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; + int gi2 = gradCoordIndex(seed, i, j - PRIME_Y); + double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; + double rampValue2 = gx2 * x2 + gy2 * y2; + out[0] += aaaa2 * rampValue2; + out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; + out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; } + } else { + double x2 = x0 + G2; + double y2 = y0 + (G2 - 1); + double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; + if(a2 > 0) { + double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; + int gi2 = gradCoordIndex(seed, i, j + PRIME_Y); + double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; + double rampValue2 = gx2 * x2 + gy2 * y2; + out[0] += aaaa2 * rampValue2; + out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; + out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; + } + } + } + out[0] *= 18.24196194486065; + out[1] *= 18.24196194486065; + out[2] *= 18.24196194486065; + return out; + } + + @Override + public double[] getNoiseDerivativeRaw(long sl, double x, double y, double z) { + int seed = (int) sl; + // 3D OpenSimplex2S case uses two offset rotated cube grids. + final double R3 = (2.0 / 3.0); + double r = (x + y + z) * R3; // Rotation, not skew + x = r - x; + y = r - y; + z = r - z; + + + int i = (int) Math.floor(x); + int j = (int) Math.floor(y); + int k = (int) Math.floor(z); + double xi = x - i; + double yi = y - j; + double zi = z - k; + + i *= PRIME_X; + j *= PRIME_Y; + k *= PRIME_Z; + int seed2 = seed + 1293373; + + int xNMask = (int) (-0.5 - xi); + int yNMask = (int) (-0.5 - yi); + int zNMask = (int) (-0.5 - zi); + + double[] out = { 0.0f, 0.0f, 0.0f }; + + double x0 = xi + xNMask; + double y0 = yi + yNMask; + double z0 = zi + zNMask; + double a0 = 0.75 - x0 * x0 - y0 * y0 - z0 * z0; + double aa0 = a0 * a0, aaa0 = aa0 * a0, aaaa0 = aa0 * aa0; + int gi0 = gradCoordIndex(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z)); + double gx0 = GRADIENTS_3D[gi0], gy0 = GRADIENTS_3D[gi0 | 1], gz0 = GRADIENTS_3D[gi0 | 2]; + double rampValue0 = gx0 * x0 + gy0 * y0 + gz0 * z0; + out[0] = aaaa0 * rampValue0; + out[1] = gx0 * aaaa0 - 8 * rampValue0 * aaa0 * x0; + out[2] = gy0 * aaaa0 - 8 * rampValue0 * aaa0 * y0; + out[3] = gz0 * aaaa0 - 8 * rampValue0 * aaa0 * z0; + + double x1 = xi - 0.5; + double y1 = yi - 0.5; + double z1 = zi - 0.5; + double a1 = 0.75 - x1 * x1 - y1 * y1 - z1 * z1; + double aa1 = a1 * a1, aaa1 = aa1 * a1, aaaa1 = aa1 * aa1; + int gi1 = gradCoordIndex(seed2, i + PRIME_X, j + PRIME_Y, k + PRIME_Z); + double gx1 = GRADIENTS_3D[gi1], gy1 = GRADIENTS_3D[gi1 | 1], gz1 = GRADIENTS_3D[gi1 | 2]; + double rampValue1 = gx1 * x1 + gy1 * y1 + gz1 * z1; + out[0] += aaaa1 * rampValue1; + out[1] += gx1 * aaaa1 - 8 * rampValue1 * aaa1 * x1; + out[2] += gy1 * aaaa1 - 8 * rampValue1 * aaa1 * y1; + out[3] += gz1 * aaaa1 - 8 * rampValue1 * aaa1 * z1; + + double xAFlipMask0 = ((xNMask | 1) << 1) * x1; + double yAFlipMask0 = ((yNMask | 1) << 1) * y1; + double zAFlipMask0 = ((zNMask | 1) << 1) * z1; + double xAFlipMask1 = (-2 - (xNMask << 2)) * x1 - 1.0; + double yAFlipMask1 = (-2 - (yNMask << 2)) * y1 - 1.0; + double zAFlipMask1 = (-2 - (zNMask << 2)) * z1 - 1.0; + + boolean skip5 = false; + double a2 = xAFlipMask0 + a0; + if(a2 > 0) { + double x2 = x0 - (xNMask | 1); + double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; + int gi2 = gradCoordIndex(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z)); + double gx2 = GRADIENTS_3D[gi2], gy2 = GRADIENTS_3D[gi2 | 1], gz2 = GRADIENTS_3D[gi2 | 2]; + double rampValue2 = gx2 * x2 + gy2 * y0 + gz2 * z0; + out[0] += aaaa2 * rampValue2; + out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; + out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y0; + out[3] += gz2 * aaaa2 - 8 * rampValue2 * aaa2 * z0; + } else { + double a3 = yAFlipMask0 + zAFlipMask0 + a0; + if(a3 > 0) { + double y3 = y0 - (yNMask | 1); + double z3 = z0 - (zNMask | 1); + double aa3 = a3 * a3, aaa3 = aa3 * a3, aaaa3 = aa3 * aa3; + int gi3 = gradCoordIndex(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (~zNMask & PRIME_Z)); + double gx3 = GRADIENTS_3D[gi3], gy3 = GRADIENTS_3D[gi3 | 1], gz3 = GRADIENTS_3D[gi3 | 2]; + double rampValue3 = gx3 * x0 + gy3 * y3 + gz3 * z3; + out[0] += aaaa3 * rampValue3; + out[1] += gx3 * aaaa3 - 8 * rampValue3 * aaa3 * x0; + out[2] += gy3 * aaaa3 - 8 * rampValue3 * aaa3 * y3; + out[3] += gz3 * aaaa3 - 8 * rampValue3 * aaa3 * z3; + } + + double a4 = xAFlipMask1 + a1; + if(a4 > 0) { + double x4 = (xNMask | 1) + x1; + double aa4 = a4 * a4, aaa4 = aa4 * a4, aaaa4 = aa4 * aa4; + int gi4 = gradCoordIndex(seed2, i + (xNMask & (PRIME_X << 1)), j + PRIME_Y, k + PRIME_Z); + double gx4 = GRADIENTS_3D[gi4], gy4 = GRADIENTS_3D[gi4 | 1], gz4 = GRADIENTS_3D[gi4 | 2]; + double rampValue4 = gx4 * x4 + gy4 * y1 + gz4 * z1; + out[0] += aaaa4 * rampValue4; + out[1] += gx4 * aaaa4 - 8 * rampValue4 * aaa4 * x4; + out[2] += gy4 * aaaa4 - 8 * rampValue4 * aaa4 * y1; + out[3] += gz4 * aaaa4 - 8 * rampValue4 * aaa4 * z1; + skip5 = true; + } + } + + boolean skip9 = false; + double a6 = yAFlipMask0 + a0; + if(a6 > 0) { + double y6 = y0 - (yNMask | 1); + double aa6 = a6 * a6, aaa6 = aa6 * a6, aaaa6 = aa6 * aa6; + int gi6 = gradCoordIndex(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z)); + double gx6 = GRADIENTS_3D[gi6], gy6 = GRADIENTS_3D[gi6 | 1], gz6 = GRADIENTS_3D[gi6 | 2]; + double rampValue6 = gx6 * x0 + gy6 * y6 + gz6 * z0; + out[0] += aaaa6 * rampValue6; + out[1] += gx6 * aaaa6 - 8 * rampValue6 * aaa6 * x0; + out[2] += gy6 * aaaa6 - 8 * rampValue6 * aaa6 * y6; + out[3] += gz6 * aaaa6 - 8 * rampValue6 * aaa6 * z0; + } else { + double a7 = xAFlipMask0 + zAFlipMask0 + a0; + if(a7 > 0) { + double x7 = x0 - (xNMask | 1); + double z7 = z0 - (zNMask | 1); + double aa7 = a7 * a7, aaa7 = aa7 * a7, aaaa7 = aa7 * aa7; + int gi7 = gradCoordIndex(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z)); + double gx7 = GRADIENTS_3D[gi7], gy7 = GRADIENTS_3D[gi7 | 1], gz7 = GRADIENTS_3D[gi7 | 2]; + double rampValue7 = gx7 * x7 + gy7 * y0 + gz7 * z7; + out[0] += aaaa7 * rampValue7; + out[1] += gx7 * aaaa7 - 8 * rampValue7 * aaa7 * x7; + out[2] += gy7 * aaaa7 - 8 * rampValue7 * aaa7 * y0; + out[3] += gz7 * aaaa7 - 8 * rampValue7 * aaa7 * z7; + } + + double a8 = yAFlipMask1 + a1; + if(a8 > 0) { + double y8 = (yNMask | 1) + y1; + double aa8 = a8 * a8, aaa8 = aa8 * a8, aaaa8 = aa8 * aa8; + int gi8 = gradCoordIndex(seed2, i + PRIME_X, j + (yNMask & (PRIME_Y << 1)), k + PRIME_Z); + double gx8 = GRADIENTS_3D[gi8], gy8 = GRADIENTS_3D[gi8 | 1], gz8 = GRADIENTS_3D[gi8 | 2]; + double rampValue8 = gx8 * x1 + gy8 * y8 + gz8 * z1; + out[0] += aaaa8 * rampValue8; + out[1] += gx8 * aaaa8 - 8 * rampValue8 * aaa8 * x1; + out[2] += gy8 * aaaa8 - 8 * rampValue8 * aaa8 * y8; + out[3] += gz8 * aaaa8 - 8 * rampValue8 * aaa8 * z1; + skip9 = true; + } + } + + boolean skipD = false; + double aA = zAFlipMask0 + a0; + if(aA > 0) { + double zA = z0 - (zNMask | 1); + double aaA = aA * aA, aaaA = aaA * aA, aaaaA = aaA * aaA; + int giA = gradCoordIndex(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z)); + double gxA = GRADIENTS_3D[giA], gyA = GRADIENTS_3D[giA | 1], gzA = GRADIENTS_3D[giA | 2]; + double rampValueA = gxA * x0 + gyA * y0 + gzA * zA; + out[0] += aaaaA * rampValueA; + out[1] += gxA * aaaaA - 8 * rampValueA * aaaA * x0; + out[2] += gyA * aaaaA - 8 * rampValueA * aaaA * y0; + out[3] += gzA * aaaaA - 8 * rampValueA * aaaA * zA; + } else { + double aB = xAFlipMask0 + yAFlipMask0 + a0; + if(aB > 0) { + double xB = x0 - (xNMask | 1); + double yB = y0 - (yNMask | 1); + double aaB = aB * aB, aaaB = aaB * aB, aaaaB = aaB * aaB; + int giB = gradCoordIndex(seed, i + (~xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z)); + double gxB = GRADIENTS_3D[giB], gyB = GRADIENTS_3D[giB | 1], gzB = GRADIENTS_3D[giB | 2]; + double rampValueB = gxB * xB + gyB * yB + gzB * z0; + out[0] += aaaaB * rampValueB; + out[1] += gxB * aaaaB - 8 * rampValueB * aaaB * xB; + out[2] += gyB * aaaaB - 8 * rampValueB * aaaB * yB; + out[3] += gzB * aaaaB - 8 * rampValueB * aaaB * z0; + } + + double aC = zAFlipMask1 + a1; + if(aC > 0) { + double zC = (zNMask | 1) + z1; + double aaC = aC * aC, aaaC = aaC * aC, aaaaC = aaC * aaC; + int giC = gradCoordIndex(seed2, i + PRIME_X, j + PRIME_Y, k + (zNMask & (PRIME_Z << 1))); + double gxC = GRADIENTS_3D[giC], gyC = GRADIENTS_3D[giC | 1], gzC = GRADIENTS_3D[giC | 2]; + double rampValueC = gxC * x1 + gyC * y1 + gzC * zC; + out[0] += aaaaC * rampValueC; + out[1] += gxC * aaaaC - 8 * rampValueC * aaaC * x1; + out[2] += gyC * aaaaC - 8 * rampValueC * aaaC * y1; + out[3] += gzC * aaaaC - 8 * rampValueC * aaaC * zC; + skipD = true; + } + } + + if(!skip5) { + double a5 = yAFlipMask1 + zAFlipMask1 + a1; + if(a5 > 0) { + double y5 = (yNMask | 1) + y1; + double z5 = (zNMask | 1) + z1; + double aa5 = a5 * a5, aaa5 = aa5 * a5, aaaa5 = aa5 * aa5; + int gi5 = gradCoordIndex(seed2, i + PRIME_X, j + (yNMask & (PRIME_Y << 1)), k + (zNMask & (PRIME_Z << 1))); + double gx5 = GRADIENTS_3D[gi5], gy5 = GRADIENTS_3D[gi5 | 1], gz5 = GRADIENTS_3D[gi5 | 2]; + double rampValue5 = gx5 * x1 + gy5 * y5 + gz5 * z5; + out[0] += aaaa5 * rampValue5; + out[1] += gx5 * aaaa5 - 8 * rampValue5 * aaa5 * x1; + out[2] += gy5 * aaaa5 - 8 * rampValue5 * aaa5 * y5; + out[3] += gz5 * aaaa5 - 8 * rampValue5 * aaa5 * z5; + } + } + + if(!skip9) { + double a9 = xAFlipMask1 + zAFlipMask1 + a1; + if(a9 > 0) { + double x9 = (xNMask | 1) + x1; + double z9 = (zNMask | 1) + z1; + double aa9 = a9 * a9, aaa9 = aa9 * a9, aaaa9 = aa9 * aa9; + int gi9 = gradCoordIndex(seed2, i + (xNMask & (PRIME_X << 1)), j + PRIME_Y, k + (zNMask & (PRIME_Z << 1))); + double gx9 = GRADIENTS_3D[gi9], gy9 = GRADIENTS_3D[gi9 | 1], gz9 = GRADIENTS_3D[gi9 | 2]; + double rampValue9 = gx9 * x9 + gy9 * y1 + gz9 * z9; + out[0] += aaaa9 * rampValue9; + out[1] += gx9 * aaaa9 - 8 * rampValue9 * aaa9 * x9; + out[2] += gy9 * aaaa9 - 8 * rampValue9 * aaa9 * y1; + out[3] += gz9 * aaaa9 - 8 * rampValue9 * aaa9 * z9; + } + } + + if(!skipD) { + double aD = xAFlipMask1 + yAFlipMask1 + a1; + if(aD > 0) { + double xD = (xNMask | 1) + x1; + double yD = (yNMask | 1) + y1; + double aaD = aD * aD, aaaD = aaD * aD, aaaaD = aaD * aaD; + int giD = gradCoordIndex(seed2, i + (xNMask & (PRIME_X << 1)), j + (yNMask & (PRIME_Y << 1)), k + PRIME_Z); + double gxD = GRADIENTS_3D[giD], gyD = GRADIENTS_3D[giD | 1], gzD = GRADIENTS_3D[giD | 2]; + double rampValueD = gxD * xD + gyD * yD + gzD * z1; + out[0] += aaaaD * rampValueD; + out[1] += gxD * aaaaD - 8 * rampValueD * aaaD * xD; + out[2] += gyD * aaaaD - 8 * rampValueD * aaaD * yD; + out[3] += gzD * aaaaD - 8 * rampValueD * aaaD * z1; + } + } + + out[0] *= 9.046026385208288; + out[1] *= 9.046026385208288; + out[2] *= 9.046026385208288; + out[3] *= 9.046026385208288; + return out; + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java index eda599a347..a5fd3f3bf3 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java @@ -7,13 +7,14 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; +import com.dfsek.terra.addons.noise.samplers.noise.DerivativeNoiseFunction; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; /** * Abstract NoiseSampler implementation for simplex-style noise functions. */ -public abstract class SimplexStyleSampler extends NoiseFunction { +public abstract class SimplexStyleSampler extends DerivativeNoiseFunction { protected static final double[] GRADIENTS_2_D = { 0.130526192220052d, 0.99144486137381d, 0.38268343236509d, 0.923879532511287d, 0.608761429008721d, 0.793353340291235d, 0.793353340291235d, 0.608761429008721d, 0.923879532511287d, 0.38268343236509d, 0.99144486137381d, 0.130526192220051d, @@ -79,26 +80,53 @@ public abstract class SimplexStyleSampler extends NoiseFunction { 1, 1, 0, 0, 0, -1, 1, 0, -1, 1, 0, 0, 0, -1, -1, 0 }; - protected static double gradCoord(int seed, int xPrimed, int yPrimed, double xd, double yd) { + protected static int gradCoordIndex(int seed, int xPrimed, int yPrimed) { int hash = hash(seed, xPrimed, yPrimed); hash ^= hash >> 15; hash &= 127 << 1; - double xg = GRADIENTS_2_D[hash]; - double yg = GRADIENTS_2_D[hash | 1]; + return hash; + } + + protected static double gradCoord(int seed, int xPrimed, int yPrimed, double xd, double yd) { + int index = gradCoordIndex(seed, xPrimed, yPrimed); + + double xg = GRADIENTS_2_D[index]; + double yg = GRADIENTS_2_D[index | 1]; return xd * xg + yd * yg; } - protected static double gradCoord(int seed, int xPrimed, int yPrimed, int zPrimed, double xd, double yd, double zd) { + protected static int gradCoordIndex(int seed, int xPrimed, int yPrimed, int zPrimed) { int hash = hash(seed, xPrimed, yPrimed, zPrimed); hash ^= hash >> 15; hash &= 63 << 2; - double xg = GRADIENTS_3D[hash]; - double yg = GRADIENTS_3D[hash | 1]; - double zg = GRADIENTS_3D[hash | 2]; + return hash; + } + + protected static double gradCoord(int seed, int xPrimed, int yPrimed, int zPrimed, double xd, double yd, double zd) { + int index = gradCoordIndex(seed, xPrimed, yPrimed, zPrimed); + + double xg = GRADIENTS_3D[index]; + double yg = GRADIENTS_3D[index | 1]; + double zg = GRADIENTS_3D[index | 2]; return xd * xg + yd * yg + zd * zg; } + + @Override + public double[] getNoiseDerivativeRaw(long seed, double x, double y) { + return new double[]{0, 0, 0}; + } + + @Override + public double[] getNoiseDerivativeRaw(long seed, double x, double y, double z) { + return new double[]{0, 0, 0, 0}; + } + + @Override + public boolean isDifferentiable() { + return false; + } } From 5b35eb041b286eb0c910fe79ca7525fdc6389b32 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 19:43:56 -0600 Subject: [PATCH 101/126] Remove temp DerivativeFractl nose --- .../noise/DerivativeFractalTemplate.java | 31 ----- .../noise/simplex/DerivativeFractal.java | 122 ------------------ 2 files changed, 153 deletions(-) delete mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeFractalTemplate.java delete mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeFractalTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeFractalTemplate.java deleted file mode 100644 index 68e8c803db..0000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/DerivativeFractalTemplate.java +++ /dev/null @@ -1,31 +0,0 @@ -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.simplex.DerivativeFractal; - - -public class DerivativeFractalTemplate extends DerivativeNoiseTemplate { - - @Value("octaves") - @Default - private int octaves = 3; - - @Value("gain") - @Default - private double gain = 0.5; - - @Value("lacunarity") - @Default - private double lacunarity = 2.0; - - @Override - public DerivativeFractal get() { - DerivativeFractal derivativeFractal = new DerivativeFractal(octaves, gain, lacunarity); - derivativeFractal.setFrequency(frequency); - derivativeFractal.setSalt(salt); - return derivativeFractal; - } -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java deleted file mode 100644 index 9a9e7f922c..0000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/DerivativeFractal.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.dfsek.terra.addons.noise.samplers.noise.simplex; - -import com.dfsek.terra.addons.noise.samplers.noise.DerivativeNoiseFunction; - -import static com.dfsek.terra.addons.noise.samplers.noise.PseudoErosionSampler.dot; - - -/** - * Temporary sampler that provides derivatives to test pseudoerosion, should be replaced with - * derivative versions of existing samplers - */ -public class DerivativeFractal extends DerivativeNoiseFunction { - - private final int heightOctaves; - private final double heightGain; - private final double heightLacunarity; - private static final float HASH_X = 0.3183099f; - private static final float HASH_Y = 0.3678794f; - - public DerivativeFractal(int octaves, double gain, double lacunarity) { - this.heightOctaves = octaves; - this.heightGain = gain; - this.heightLacunarity = lacunarity; - } - - public static float hash(float x, float y) { - float xx = x * HASH_X + HASH_Y; - float yy = y * HASH_Y + HASH_X; - - // Swapped the components here - return 16 * (xx * yy * (xx + yy)); - } - - public static float hashX(float n) { - // Swapped the components here - float nx = HASH_X * n; - return -1.0f + 2.0f * fract(nx); - } - - public static float hashY(float n) { - float ny = HASH_Y * n; - return -1.0f + 2.0f * fract(ny); - } - - public static float fract(float x) { - return (x - (float)Math.floor(x)); - } - - private static float[] baseNoise(float px, float py) { - float ix = (float)Math.floor(px); - float iy = (float)Math.floor(py); - float fx = px - ix; - float fy = py - iy; - - float ux = fx * fx * fx * (fx * (fx * 6.0f - 15.0f) + 10.0f); - float uy = fy * fy * fy * (fy * (fy * 6.0f - 15.0f) + 10.0f); - float dux = fx * fx * 30.0f * (fx * (fx - 2.0f) + 1.0f); - float duy = fy * fy * 30.0f * (fy * (fy - 2.0f) + 1.0f); - - float gan = hash(ix, iy); - float gax = hashX(gan); - float gay = hashY(gan); - - float gbn = hash(ix + 1, iy); - float gbx = hashX(gbn); - float gby = hashY(gbn); - - float gcn = hash(ix, iy + 1); - float gcx = hashX(gcn); - float gcy = hashY(gcn); - - float gdn = hash(ix + 1, iy + 1); - float gdx = hashX(gdn); - float gdy = hashY(gdn); - - float va = dot(gax, gay, fx, fy); - float vb = dot(gbx, gby, fx - 1, fy); - float vc = dot(gcx, gcy, fx, fy - 1); - float vd = dot(gdx, gdy, fx - 1, fy - 1); - - float u2x = gax + (gbx - gax) * ux + (gcx - gax) * uy + (gax - gbx - gcx + gdx) * ux * uy + dux * (uy * (va - vb - vc + vd) + vb - va); - float u2y = gay + (gby - gay) * ux + (gcy - gay) * uy + (gay - gby - gcy + gdy) * ux * uy + duy * (ux * (va - vb - vc + vd) + vc - va); - - return new float[] { va + ux * (vb - va) + uy * (vc - va) + ux * uy * (va - vb - vc + vd), u2x, u2y }; - } - - @Override - public double[] getNoiseDerivativeRaw(long seed, double x, double y) { - double[] out = { 0.0f, 0.0f, 0.0f }; - float heightFreq = 1.0f; - float heightAmp = 1f; - float cumAmp = 0.0f; - for (int i = 0; i < heightOctaves; i++) { - float[] noise = baseNoise((float) (x * heightFreq), (float) (y * heightFreq)); - out[0] += noise[0] * heightAmp; - out[1] += noise[1] * heightAmp * heightFreq; - out[2] += noise[2] * heightAmp * heightFreq; - cumAmp += heightAmp; - heightAmp *= heightGain; - heightFreq *= heightLacunarity; - } - out[0] /= cumAmp; - out[1] /= cumAmp; - out[2] /= cumAmp; - return out; - } - - @Override - public double[] getNoiseDerivativeRaw(long seed, double x, double y, double z) { - return getNoiseDerivativeRaw(seed, x, y); - } - - @Override - public double getNoiseRaw(long seed, double x, double y) { - return getNoiseDerivativeRaw(seed, x, y)[0]; - } - - @Override - public double getNoiseRaw(long seed, double x, double y, double z) { - return getNoiseRaw(seed, x, y); - } -} From 5f340f8ffdbf26253b6a42604a5b80f66230f00d Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 19:48:22 -0600 Subject: [PATCH 102/126] slight open simplex 2s op\pt --- .../noise/simplex/OpenSimplex2Sampler.java | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java index e4da85a5bb..d3e80cc7e7 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java @@ -37,41 +37,37 @@ public double getNoiseRaw(long sl, double x, double y) { i *= PRIME_X; j *= PRIME_Y; - double n0, n1, n2; + double value = 0; double a = 0.5 - x0 * x0 - y0 * y0; - if(a <= 0) n0 = 0; - else { - n0 = (a * a) * (a * a) * gradCoord(seed, i, j, x0, y0); + if(a > 0) { + value = (a * a) * (a * a) * gradCoord(seed, i, j, x0, y0); } double c = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); - if(c <= 0) n2 = 0; - else { + if(c > 0) { double x2 = x0 + (2 * G2 - 1); double y2 = y0 + (2 * G2 - 1); - n2 = (c * c) * (c * c) * gradCoord(seed, i + PRIME_X, j + PRIME_Y, x2, y2); + value += (c * c) * (c * c) * gradCoord(seed, i + PRIME_X, j + PRIME_Y, x2, y2); } if(y0 > x0) { double x1 = x0 + G2; double y1 = y0 + (G2 - 1); double b = 0.5 - x1 * x1 - y1 * y1; - if(b <= 0) n1 = 0; - else { - n1 = (b * b) * (b * b) * gradCoord(seed, i, j + PRIME_Y, x1, y1); + if(b > 0) { + value += (b * b) * (b * b) * gradCoord(seed, i, j + PRIME_Y, x1, y1); } } else { double x1 = x0 + (G2 - 1); double y1 = y0 + G2; double b = 0.5 - x1 * x1 - y1 * y1; - if(b <= 0) n1 = 0; - else { - n1 = (b * b) * (b * b) * gradCoord(seed, i + PRIME_X, j, x1, y1); + if(b <= 0) { + value += (b * b) * (b * b) * gradCoord(seed, i + PRIME_X, j, x1, y1); } } - return (n0 + n1 + n2) * 99.83685446303647f; + return value * 99.83685446303647f; } @Override From 017b4608bcb149221d61992c053c43aacfac190f Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 19:49:16 -0600 Subject: [PATCH 103/126] Fix build --- .../src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 59fc635a6d..16e1d80407 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 @@ -97,8 +97,7 @@ public void initialize() { noiseRegistry.register(addon.key("SIMPLEX"), () -> new SimpleNoiseTemplate(SimplexSampler::new)); noiseRegistry.register(addon.key("GABOR"), GaborNoiseTemplate::new); noiseRegistry.register(addon.key("PSEUDOEROSION"), PseudoErosionTemplate::new); - noiseRegistry.register(addon.key("DERIVATIVE"), DerivativeFractalTemplate::new); - + noiseRegistry.register(addon.key("VALUE"), () -> new SimpleNoiseTemplate(ValueSampler::new)); noiseRegistry.register(addon.key("VALUE_CUBIC"), () -> new SimpleNoiseTemplate(ValueCubicSampler::new)); From bd73427072ad5a23fb8eb13041711cfbbb95a1c3 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 20:29:41 -0600 Subject: [PATCH 104/126] OpenSimplex 2 Derivative Impl --- .../noise/simplex/OpenSimplex2SSampler.java | 2 +- .../noise/simplex/OpenSimplex2Sampler.java | 199 ++++++++++++++++++ 2 files changed, 200 insertions(+), 1 deletion(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java index d9aec851e7..ef81ff1391 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java @@ -479,7 +479,7 @@ public double[] getNoiseDerivativeRaw(long sl, double x, double y, double z) { int yNMask = (int) (-0.5 - yi); int zNMask = (int) (-0.5 - zi); - double[] out = { 0.0f, 0.0f, 0.0f }; + double[] out = { 0.0f, 0.0f, 0.0f, 0.0f }; double x0 = xi + xNMask; double y0 = yi + yNMask; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java index d3e80cc7e7..443146a9b3 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java @@ -153,4 +153,203 @@ public double getNoiseRaw(long sl, double x, double y, double z) { return value * 32.69428253173828125; } + + @Override + public boolean isDifferentiable() { + return true; + } + + @Override + public double[] getNoiseDerivativeRaw(long sl, double x, double y) { + int seed = (int) sl; + // 2D OpenSimplex2 case uses the same algorithm as ordinary Simplex. + final double G2 = (3 - SQRT3) / 6; + + final double F2 = 0.5f * (SQRT3 - 1); + double s = (x + y) * F2; + x += s; + y += s; + + + int i = (int) Math.floor(x); + int j = (int) Math.floor(y); + double xi = x - i; + double yi = y - j; + + double t = (xi + yi) * G2; + double x0 = xi - t; + double y0 = yi - t; + + i *= PRIME_X; + j *= PRIME_Y; + + double[] out = { 0.0f, 0.0f, 0.0f }; + + double a = 0.5 - x0 * x0 - y0 * y0; + if(a > 0) { + double aa = a * a, aaa = aa * a, aaaa = aa * aa; + int gi = gradCoordIndex(seed, i, j); + double gx = GRADIENTS_2_D[gi], gy = GRADIENTS_2_D[gi | 1]; + double rampValue = gx * x0 + gy * y0; + out[0] += aaaa * rampValue; + out[1] += gx * aaaa - 8 * rampValue * aaa * x0; + out[2] += gy * aaaa - 8 * rampValue * aaa * y0; + } + + double c = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); + if(c > 0) { + double x2 = x0 + (2 * G2 - 1); + double y2 = y0 + (2 * G2 - 1); + double cc = c * c, ccc = cc * c, cccc = cc * cc; + int gi = gradCoordIndex(seed, i + PRIME_X, j + PRIME_Y); + double gx = GRADIENTS_2_D[gi], gy = GRADIENTS_2_D[gi | 1]; + double rampValue = gx * x2 + gy * y2; + out[0] += cccc * rampValue; + out[1] += gx * cccc - 8 * rampValue * ccc * x2; + out[2] += gy * cccc - 8 * rampValue * ccc * y2; } + + if(y0 > x0) { + double x1 = x0 + G2; + double y1 = y0 + (G2 - 1); + double b = 0.5 - x1 * x1 - y1 * y1; + if(b > 0) { + double bb = b * b, bbb = bb * b, bbbb = bb * bb; + int gi = gradCoordIndex(seed, i, j + PRIME_Y); + double gx = GRADIENTS_2_D[gi], gy = GRADIENTS_2_D[gi | 1]; + double rampValue = gx * x1 + gy * y1; + out[0] += bbbb * rampValue; + out[1] += gx * bbbb - 8 * rampValue * bbb * x1; + out[2] += gy * bbbb - 8 * rampValue * bbb * y1; } + } else { + double x1 = x0 + (G2 - 1); + double y1 = y0 + G2; + double b = 0.5 - x1 * x1 - y1 * y1; + if(b > 0) { + double bb = b * b, bbb = bb * b, bbbb = bb * bb; + int gi = gradCoordIndex(seed, i + PRIME_X, j); + double gx = GRADIENTS_2_D[gi], gy = GRADIENTS_2_D[gi | 1]; + double rampValue = gx * x1 + gy * y1; + out[0] += bbbb * rampValue; + out[1] += gx * bbbb - 8 * rampValue * bbb * x1; + out[2] += gy * bbbb - 8 * rampValue * bbb * y1; } + } + + out[0] *= 99.83685446303647f; + out[1] *= 99.83685446303647f; + out[2] *= 99.83685446303647f; + return out; + } + + @Override + public double[] getNoiseDerivativeRaw(long sl, double x, double y, double z) { + int seed = (int) sl; + // 3D OpenSimplex2Sampler case uses two offset rotated cube grids. + final double R3 = (2.0 / 3.0); + double r = (x + y + z) * R3; // Rotation, not skew + x = r - x; + y = r - y; + z = r - z; + + + int i = (int) Math.round(x); + int j = (int) Math.round(y); + int k = (int) Math.round(z); + double x0 = x - i; + double y0 = y - j; + double z0 = z - k; + + int xNSign = (int) (-1.0 - x0) | 1; + int yNSign = (int) (-1.0 - y0) | 1; + int zNSign = (int) (-1.0 - z0) | 1; + + double ax0 = xNSign * -x0; + double ay0 = yNSign * -y0; + double az0 = zNSign * -z0; + + i *= PRIME_X; + j *= PRIME_Y; + k *= PRIME_Z; + + double[] out = { 0.0f, 0.0f, 0.0f, 0.0f }; + double a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); + + for(int l = 0; ; l++) { + if(a > 0) { + double aa = a * a, aaa = aa * a, aaaa = aa * aa; + int gi = gradCoordIndex(seed, i, j, k); + double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; + double rampValue = gx * x0 + gy * y0 + gz * z0; + out[0] += aaaa * rampValue; + out[1] += gx * aaaa - 8 * rampValue * aaa * x0; + out[1] += gy * aaaa - 8 * rampValue * aaa * y0; + out[2] += gz * aaaa - 8 * rampValue * aaa * z0; + } + + if(ax0 >= ay0 && ax0 >= az0) { + double b = a + ax0 + ax0; + if(b > 1) { + b -= 1; + double bb = b * b, bbb = bb * b, bbbb = bb * bb; + int gi = gradCoordIndex(seed, i - xNSign * PRIME_X, j, k); + double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; + double rampValue = gx * (x0 + xNSign) + gy * y0 + gz * z0; + out[0] += bbbb * rampValue; + out[1] += gx * bbbb - 8 * rampValue * bbb * (x0 + xNSign); + out[1] += gy * bbbb - 8 * rampValue * bbb * y0; + out[2] += gz * bbbb - 8 * rampValue * bbb * z0; + } + } else if(ay0 > ax0 && ay0 >= az0) { + double b = a + ay0 + ay0; + if(b > 1) { + b -= 1; + double bb = b * b, bbb = bb * b, bbbb = bb * bb; + int gi = gradCoordIndex(seed, i, j - yNSign * PRIME_Y, k); + double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; + double rampValue = gx * x0 + gy * (y0 + yNSign) + gz * z0; + out[0] += bbbb * rampValue; + out[1] += gx * bbbb - 8 * rampValue * bbb * x0; + out[1] += gy * bbbb - 8 * rampValue * bbb * (y0 + yNSign); + out[2] += gz * bbbb - 8 * rampValue * bbb * z0; } + } else { + double b = a + az0 + az0; + if(b > 1) { + b -= 1; + double bb = b * b, bbb = bb * b, bbbb = bb * bb; + int gi = gradCoordIndex(seed, i, j, k - zNSign * PRIME_Z); + double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; + double rampValue = gx * x0 + gy * y0 + gz * (z0 + zNSign); + out[0] += bbbb * rampValue; + out[1] += gx * bbbb - 8 * rampValue * bbb * x0; + out[1] += gy * bbbb - 8 * rampValue * bbb * y0; + out[2] += gz * bbbb - 8 * rampValue * bbb * (z0 + zNSign); } + } + + if(l == 1) break; + + ax0 = 0.5 - ax0; + ay0 = 0.5 - ay0; + az0 = 0.5 - az0; + + x0 = xNSign * ax0; + y0 = yNSign * ay0; + z0 = zNSign * az0; + + a += (0.75 - ax0) - (ay0 + az0); + + i += (xNSign >> 1) & PRIME_X; + j += (yNSign >> 1) & PRIME_Y; + k += (zNSign >> 1) & PRIME_Z; + + xNSign = -xNSign; + yNSign = -yNSign; + zNSign = -zNSign; + + seed = ~seed; + } + out[0] *= 32.69428253173828125; + out[1] *= 32.69428253173828125; + out[2] *= 32.69428253173828125; + out[3] *= 32.69428253173828125; + return out; + } } From 1d05f95f746639fdbc4c242d84aa4fcd93d666f4 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 20:38:22 -0600 Subject: [PATCH 105/126] Sin/Cos Opts --- .../com/dfsek/terra/api/util/MathUtil.java | 58 +++++++++++-------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java index e57765f2eb..87ad9159d4 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java @@ -18,41 +18,51 @@ public final class MathUtil { * Epsilon for fuzzy floating point comparisons. */ public static final double EPSILON = 1.0E-5; - private static final int SIN_BITS, SIN_MASK, SIN_COUNT; - private static final double radFull, radToIndex; - private static final double degFull, degToIndex; - private static final double[] sin, cos; - static { - SIN_BITS = 12; - SIN_MASK = ~(-1 << SIN_BITS); - SIN_COUNT = SIN_MASK + 1; + private static final int lookupBits = 14; - radFull = Math.PI * 2.0; - degFull = 360.0; - radToIndex = SIN_COUNT / radFull; - degToIndex = SIN_COUNT / degFull; + static final int lookupTableSize = 1 << lookupBits; - sin = new double[SIN_COUNT]; - cos = new double[SIN_COUNT]; + private static final int lookupTableSizeWithMargin = lookupTableSize + 1; + private static final double tauOverLookupSize = TrigonometryConstants.TAU / lookupTableSize; + static final double radianToIndex = (~(-1 << lookupBits) + 1) / TrigonometryConstants.TAU; + private static final long[] sinTable; - for(int i = 0; i < SIN_COUNT; i++) { - sin[i] = Math.sin((i + 0.5f) / SIN_COUNT * radFull); - cos[i] = Math.cos((i + 0.5f) / SIN_COUNT * radFull); + static { + sinTable = new long[lookupTableSizeWithMargin]; + for (int i = 0; i < lookupTableSizeWithMargin; i++) { + double d = i * tauOverLookupSize; + sinTable[i] = Double.doubleToRawLongBits(StrictMath.sin(d)); } + } - // Four cardinal directions (credits: Nate) - for(int i = 0; i < 360; i += 90) { - sin[(int) (i * degToIndex) & SIN_MASK] = Math.sin(i * Math.PI / 180.0); - cos[(int) (i * degToIndex) & SIN_MASK] = Math.cos(i * Math.PI / 180.0); - } + static double sinLookup(long index) { + // Trigonometric identity: sin(-x) = -sin(x) + // Given a domain of 0 <= x <= 2*pi, just negate the value if x > pi. + // This allows the sin table size to be halved. + long neg = (index & 0x8000000000000000L) << 32; + + // All bits set if (pi/2 <= x), none set otherwise + // Extracts the 31st bit from 'half' + long mask = (index << 33) >> 63; + + // Trigonometric identity: sin(x) = sin(pi/2 - x) + long pos = (0x8000000000000001L & mask) + (index ^ mask); + + // Wrap the position in the table. Moving this down to immediately before the array access + // seems to help the Hotspot compiler optimize the bit math better. + pos &= 0x7fffffffffffffffL; + + // Fetch the corresponding value from the LUT and invert the sign bit as needed + // This directly manipulate the sign bit on the double bits to simplify logic + return Double.longBitsToDouble(sinTable[(int) pos] ^ neg); } public static double sin(double rad) { - return sin[(int) (rad * radToIndex) & SIN_MASK]; + return sinLookup((long) (rad * radianToIndex) & 0xFFFFFFFFL); } public static double cos(double rad) { - return cos[(int) (rad * radToIndex) & SIN_MASK]; + return sinLookup((long) (rad * radianToIndex + lookupTableSize) & 0xFFFFFFFFL); } public static double tan(double rad) { From 10d723372daf14bc551159d050412c71c7f69a76 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 20:45:47 -0600 Subject: [PATCH 106/126] Fix build --- .../api/src/main/java/com/dfsek/terra/api/util/MathUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java index 87ad9159d4..0dbe5bb238 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java @@ -23,8 +23,8 @@ public final class MathUtil { static final int lookupTableSize = 1 << lookupBits; private static final int lookupTableSizeWithMargin = lookupTableSize + 1; - private static final double tauOverLookupSize = TrigonometryConstants.TAU / lookupTableSize; - static final double radianToIndex = (~(-1 << lookupBits) + 1) / TrigonometryConstants.TAU; + private static final double tauOverLookupSize = Math.TAU / lookupTableSize; + static final double radianToIndex = (~(-1 << lookupBits) + 1) / Math.TAU; private static final long[] sinTable; static { From f469193909f4d540e5f0d778359114daf392ac18 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 20:51:00 -0600 Subject: [PATCH 107/126] Make seed affect pseudoerosion hasing --- .../samplers/noise/PseudoErosionSampler.java | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java index 7aeff49ac7..0b96ea517c 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java @@ -47,22 +47,14 @@ public PseudoErosionSampler(int octaves, double gain, double lacunarity, double this.maxCellDistSqRecip = 1 / maxCellDistSq; } - public static float hash(float x, float y) { - float xx = x * HASH_X + HASH_Y; - float yy = y * HASH_Y + HASH_X; - - // Swapped the components here - return 16 * (xx * yy * (xx + yy)); - } - - public static float hashX(float n) { + public static float hashX(float seed, float n) { // Swapped the components here - float nx = HASH_X * n; + float nx = HASH_X * n * seed; return -1.0f + 2.0f * fract(nx); } - public static float hashY(float n) { - float ny = HASH_Y * n; + public static float hashY(float seed, float n) { + float ny = HASH_Y * n * seed; return -1.0f + 2.0f * fract(ny); } @@ -70,7 +62,7 @@ public static float fract(float x) { return (x - (float)Math.floor(x)); } - public float[] erosion(float x, float y, float dirX, float dirY) { + public float[] erosion(int seed, float x, float y, float dirX, float dirY) { int gridX = Math.round(x); int gridY = Math.round(y); float noise = 0.0f; @@ -80,10 +72,9 @@ public float[] erosion(float x, float y, float dirX, float dirY) { for (int cellX = gridX - 1; cellX <= gridX + 1; cellX++) { for (int cellY = gridY - 1; cellY <= gridY + 1; cellY++) { - // TODO - Make seed affect hashing - float cellHash = hash(cellX, cellY); - float cellOffsetX = (float) (hashX(cellHash) * jitter); - float cellOffsetY = (float) (hashY(cellHash) * jitter); + float cellHash = hash(seed, cellX, cellY); + float cellOffsetX = (float) (hashX(seed, cellHash) * jitter); + float cellOffsetY = (float) (hashY(seed, cellHash) * jitter); float cellOriginDeltaX = (x - cellX) + cellOffsetX; float cellOriginDeltaY = (y - cellY) + cellOffsetY; float cellOriginDistSq = cellOriginDeltaX * cellOriginDeltaX + cellOriginDeltaY * cellOriginDeltaY; @@ -135,7 +126,7 @@ public float heightMap(long seed, float x, float y) { // Stack erosion octaves for (int i = 0; i < octaves; i++) { - float[] erosionResult = erosion( + float[] erosionResult = erosion((int) seed, x * freq * (float) erosionFrequency, y * freq * (float) erosionFrequency, baseDirX + dirY * (float) branchStrength, From d6772f51eaa7c5c039accdcc000a7fd0f18706c6 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 20:56:13 -0600 Subject: [PATCH 108/126] Reformat --- .../addons/biome/extrusion/api/Extrusion.java | 4 +- .../pipeline/api/delegate/SelfDelegate.java | 4 +- .../biome/holder/PaletteHolderBuilder.java | 4 +- .../distributors/PointSetDistributor.java | 4 +- .../dfsek/terra/addons/noise/NoiseAddon.java | 43 ++- .../addons/noise/NoiseConfigPackTemplate.java | 6 +- .../DerivativeNoiseSamplerTemplate.java | 3 +- .../templates/ImageSamplerTemplate.java | 9 +- .../noise/PseudoErosionTemplate.java | 19 +- .../noise/DerivativeNoiseFunction.java | 1 + .../samplers/noise/PseudoErosionSampler.java | 55 +-- .../noise/simplex/OpenSimplex2SSampler.java | 334 +++++++++--------- .../noise/simplex/OpenSimplex2Sampler.java | 209 +++++------ .../noise/simplex/SimplexStyleSampler.java | 5 +- .../feature/FeatureGenerationAddon.java | 10 +- .../feature/FeatureGenerationStage.java | 6 +- .../structure/mutator/MutatedStructure.java | 4 +- .../addons/terrascript/parser/ParserUtil.java | 8 +- .../builders/CheckBlockFunctionBuilder.java | 4 +- .../api/noise/DerivativeNoiseSampler.java | 6 +- .../com/dfsek/terra/api/util/MathUtil.java | 2 +- .../world/biome/generation/BiomeProvider.java | 12 +- .../preprocessor/MetaNumberPreprocessor.java | 7 +- .../event/FunctionalEventHandlerImpl.java | 17 +- .../com/dfsek/terra/bukkit/BukkitEntity.java | 6 +- .../bukkit/world/BukkitWorldProperties.java | 4 +- .../terra/lifecycle/LifecycleEntryPoint.java | 6 +- .../mixin/lifecycle/MinecraftServerMixin.java | 1 + .../terra/lifecycle/util/LifecycleUtil.java | 1 + 29 files changed, 411 insertions(+), 383 deletions(-) diff --git a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/api/Extrusion.java b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/api/Extrusion.java index 4c4ca972aa..c1d5f5524d 100644 --- a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/api/Extrusion.java +++ b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/api/Extrusion.java @@ -1,9 +1,9 @@ package com.dfsek.terra.addons.biome.extrusion.api; -import java.util.Collection; - import com.dfsek.terra.api.world.biome.Biome; +import java.util.Collection; + public interface Extrusion { Biome extrude(Biome original, int x, int y, int z, long seed); 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 index c6762334a4..6b62818d23 100644 --- 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 @@ -1,10 +1,10 @@ package com.dfsek.terra.addons.biome.pipeline.api.delegate; -import com.dfsek.terra.api.world.biome.Biome; - 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(); diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderBuilder.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderBuilder.java index e840f98178..a96cbcc484 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderBuilder.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderBuilder.java @@ -7,11 +7,11 @@ package com.dfsek.terra.addons.biome.holder; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + import java.util.Map; import java.util.TreeMap; -import com.dfsek.terra.api.world.chunk.generation.util.Palette; - public class PaletteHolderBuilder { private final TreeMap paletteMap = new TreeMap<>(); diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java index f85d41e5f7..4285af4869 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java @@ -7,11 +7,11 @@ package com.dfsek.terra.addons.feature.distributor.distributors; -import java.util.Set; - import com.dfsek.terra.addons.feature.distributor.util.Point; import com.dfsek.terra.api.structure.feature.Distributor; +import java.util.Set; + public class PointSetDistributor implements Distributor { private final Set points; diff --git a/common/addons/config-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 16e1d80407..3fd52950c0 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 @@ -9,17 +9,46 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.Supplier; + import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.noise.config.CubicSplinePointTemplate; import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; -import com.dfsek.terra.addons.noise.config.templates.*; -import com.dfsek.terra.addons.noise.config.templates.noise.*; +import com.dfsek.terra.addons.noise.config.templates.BinaryArithmeticTemplate; +import com.dfsek.terra.addons.noise.config.templates.DerivativeNoiseSamplerTemplate; +import com.dfsek.terra.addons.noise.config.templates.DomainWarpTemplate; +import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; +import com.dfsek.terra.addons.noise.config.templates.ImageSamplerTemplate; +import com.dfsek.terra.addons.noise.config.templates.KernelTemplate; +import com.dfsek.terra.addons.noise.config.templates.LinearHeightmapSamplerTemplate; +import com.dfsek.terra.addons.noise.config.templates.TranslateSamplerTemplate; +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.PseudoErosionTemplate; +import com.dfsek.terra.addons.noise.config.templates.noise.SimpleNoiseTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.fractal.BrownianMotionTemplate; 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.*; +import com.dfsek.terra.addons.noise.config.templates.normalizer.ClampNormalizerTemplate; +import com.dfsek.terra.addons.noise.config.templates.normalizer.CubicSplineNormalizerTemplate; +import com.dfsek.terra.addons.noise.config.templates.normalizer.ExpressionNormalizerTemplate; +import com.dfsek.terra.addons.noise.config.templates.normalizer.LinearNormalizerTemplate; +import com.dfsek.terra.addons.noise.config.templates.normalizer.NormalNormalizerTemplate; +import com.dfsek.terra.addons.noise.config.templates.normalizer.PosterizationNormalizerTemplate; +import com.dfsek.terra.addons.noise.config.templates.normalizer.ProbabilityNormalizerTemplate; +import com.dfsek.terra.addons.noise.config.templates.normalizer.ScaleNormalizerTemplate; import com.dfsek.terra.addons.noise.math.CubicSpline; -import com.dfsek.terra.addons.noise.samplers.arithmetic.*; +import com.dfsek.terra.addons.noise.samplers.arithmetic.AdditionSampler; +import com.dfsek.terra.addons.noise.samplers.arithmetic.DivisionSampler; +import com.dfsek.terra.addons.noise.samplers.arithmetic.MaxSampler; +import com.dfsek.terra.addons.noise.samplers.arithmetic.MinSampler; +import com.dfsek.terra.addons.noise.samplers.arithmetic.MultiplicationSampler; +import com.dfsek.terra.addons.noise.samplers.arithmetic.SubtractionSampler; import com.dfsek.terra.addons.noise.samplers.noise.CellularSampler; import com.dfsek.terra.addons.noise.samplers.noise.DistanceSampler; import com.dfsek.terra.addons.noise.samplers.noise.random.GaussianNoiseSampler; @@ -41,10 +70,6 @@ import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.function.Supplier; - public class NoiseAddon implements AddonInitializer { public static final TypeKey>> NOISE_SAMPLER_TOKEN = new TypeKey<>() { @@ -97,7 +122,7 @@ public void initialize() { noiseRegistry.register(addon.key("SIMPLEX"), () -> new SimpleNoiseTemplate(SimplexSampler::new)); noiseRegistry.register(addon.key("GABOR"), GaborNoiseTemplate::new); noiseRegistry.register(addon.key("PSEUDOEROSION"), PseudoErosionTemplate::new); - + noiseRegistry.register(addon.key("VALUE"), () -> new SimpleNoiseTemplate(ValueSampler::new)); noiseRegistry.register(addon.key("VALUE_CUBIC"), () -> new SimpleNoiseTemplate(ValueCubicSampler::new)); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseConfigPackTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseConfigPackTemplate.java index c41af17633..d6ac6c00c5 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseConfigPackTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseConfigPackTemplate.java @@ -11,14 +11,14 @@ import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; -import java.util.LinkedHashMap; -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.api.config.meta.Meta; import com.dfsek.terra.api.properties.Properties; +import java.util.LinkedHashMap; +import java.util.Map; + @SuppressWarnings("FieldMayBeFinal") public class NoiseConfigPackTemplate implements ConfigTemplate, Properties { diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java index d93054ac9a..9e66b23ead 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DerivativeNoiseSamplerTemplate.java @@ -14,7 +14,8 @@ public class DerivativeNoiseSamplerTemplate extends SamplerTemplate { diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java index f815cd40c5..03f2252e1b 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java @@ -10,61 +10,48 @@ public class PseudoErosionTemplate extends NoiseTemplate { + @Value("frequency") + @Default + protected @Meta double frequency = 1d; @Value("octaves") @Default private int octaves = 4; - @Value("lacunarity") @Default private double lacunarity = 2.0; - @Value("gain") @Default private double gain = 0.5; - @Value("slope-strength") @Default private double slopeStrength = 1.0; - @Value("branch-strength") @Default private double branchStrength = 1.0; - @Value("strength") @Default private double strength = 0.04; - @Value("erosion-frequency") @Default private double erosionFrequency = 0.02; - @Value("sampler") private DerivativeNoiseSampler heightSampler; - @Value("slope-mask.enable") @Default private boolean slopeMask = true; - @Value("slope-mask.none") @Default private double slopeMaskNone = -0.5; - @Value("slope-mask.full") @Default private double slopeMaskFull = 1; - @Value("jitter") @Default private double jitterModifier = 1; - @Value("average-impulses") @Default private boolean averageErosionImpulses = true; - @Value("frequency") - @Default - protected @Meta double frequency = 1d; - @Override public PseudoErosionSampler get() { PseudoErosionSampler pseudoErosion = new PseudoErosionSampler(octaves, gain, lacunarity, diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DerivativeNoiseFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DerivativeNoiseFunction.java index c5caa0d3a8..0d654eb646 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DerivativeNoiseFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DerivativeNoiseFunction.java @@ -2,6 +2,7 @@ import com.dfsek.terra.api.noise.DerivativeNoiseSampler; + public abstract class DerivativeNoiseFunction extends NoiseFunction implements DerivativeNoiseSampler { @Override public boolean isDifferentiable() { diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java index 0b96ea517c..c761d2e802 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java @@ -9,12 +9,12 @@ public class PseudoErosionSampler extends NoiseFunction { public static final float TAU = (float) (2.0 * Math.PI); private static final float HASH_X = 0.3183099f; private static final float HASH_Y = 0.3678794f; - private final int octaves; public final double gain; public final double lacunarity; public final double slopeStrength; public final double branchStrength; public final double erosionStrength; + private final int octaves; private final double erosionFrequency; private final DerivativeNoiseSampler sampler; private final boolean slopeMask; @@ -25,7 +25,8 @@ public class PseudoErosionSampler extends NoiseFunction { private final double maxCellDistSqRecip; private final boolean averageErosionImpulses; - public PseudoErosionSampler(int octaves, double gain, double lacunarity, double slopeStrength, double branchStrength, double erosionStrength, double erosionFrequency, DerivativeNoiseSampler sampler, + public PseudoErosionSampler(int octaves, double gain, double lacunarity, double slopeStrength, double branchStrength, + double erosionStrength, double erosionFrequency, DerivativeNoiseSampler sampler, boolean slopeMask, double slopeMaskFull, double slopeMaskNone, double jitterModifier, boolean averageErosionImpulses) { this.octaves = octaves; @@ -59,7 +60,22 @@ public static float hashY(float seed, float n) { } public static float fract(float x) { - return (x - (float)Math.floor(x)); + return (x - (float) Math.floor(x)); + } + + public static float smoothstep(float edge0, float edge1, float x) { + // Scale, bias and saturate x to 0..1 range + x = clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f); + // Evaluate polynomial + return x * x * (3 - 2 * x); + } + + public static float clamp(float x, float minVal, float maxVal) { + return Math.max(minVal, Math.min(maxVal, x)); + } + + public static float dot(float x1, float y1, float x2, float y2) { + return x1 * x2 + y1 * y2; } public float[] erosion(int seed, float x, float y, float dirX, float dirY) { @@ -70,16 +86,17 @@ public float[] erosion(int seed, float x, float y, float dirX, float dirY) { float dirOutY = 0.0f; float cumAmp = 0.0f; - for (int cellX = gridX - 1; cellX <= gridX + 1; cellX++) { - for (int cellY = gridY - 1; cellY <= gridY + 1; cellY++) { + for(int cellX = gridX - 1; cellX <= gridX + 1; cellX++) { + for(int cellY = gridY - 1; cellY <= gridY + 1; cellY++) { float cellHash = hash(seed, cellX, cellY); float cellOffsetX = (float) (hashX(seed, cellHash) * jitter); float cellOffsetY = (float) (hashY(seed, cellHash) * jitter); float cellOriginDeltaX = (x - cellX) + cellOffsetX; float cellOriginDeltaY = (y - cellY) + cellOffsetY; float cellOriginDistSq = cellOriginDeltaX * cellOriginDeltaX + cellOriginDeltaY * cellOriginDeltaY; - if (cellOriginDistSq > maxCellDistSq) continue; // Skip calculating cells too far away - float ampTmp = (float) ((cellOriginDistSq * maxCellDistSqRecip) - 1); float amp = ampTmp * ampTmp; // Decrease cell amplitude further away + if(cellOriginDistSq > maxCellDistSq) continue; // Skip calculating cells too far away + float ampTmp = (float) ((cellOriginDistSq * maxCellDistSqRecip) - 1); + float amp = ampTmp * ampTmp; // Decrease cell amplitude further away cumAmp += amp; float directionalStrength = dot(cellOriginDeltaX, cellOriginDeltaY, dirX, dirY) * TAU; noise += (float) (MathUtil.cos(directionalStrength) * amp); @@ -88,23 +105,12 @@ public float[] erosion(int seed, float x, float y, float dirX, float dirY) { dirOutY -= sinAngle * (cellOriginDeltaY + dirY); } } - if (averageErosionImpulses && cumAmp != 0) { + if(averageErosionImpulses && cumAmp != 0) { noise /= cumAmp; dirOutX /= cumAmp; dirOutY /= cumAmp; } - return new float[] {noise, dirOutX, dirOutY}; - } - - public static float smoothstep(float edge0, float edge1, float x) { - // Scale, bias and saturate x to 0..1 range - x = clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f); - // Evaluate polynomial - return x * x * (3 - 2 * x); - } - - public static float clamp(float x, float minVal, float maxVal) { - return Math.max(minVal, Math.min(maxVal, x)); + return new float[]{ noise, dirOutX, dirOutY }; } public float heightMap(long seed, float x, float y) { @@ -125,7 +131,7 @@ public float heightMap(long seed, float x, float y) { float freq = 1.0f; // Stack erosion octaves - for (int i = 0; i < octaves; i++) { + for(int i = 0; i < octaves; i++) { float[] erosionResult = erosion((int) seed, x * freq * (float) erosionFrequency, y * freq * (float) erosionFrequency, @@ -139,7 +145,6 @@ public float heightMap(long seed, float x, float y) { freq *= lacunarity; } - // TODO - Test different output ranges, see how they affect visuals // Normalize erosion noise erosion /= cumAmp; // [-1, 1] -> [0, 1] @@ -147,7 +152,7 @@ public float heightMap(long seed, float x, float y) { // Without masking, erosion noise in areas with small gradients tend to produce mounds, // this reduces erosion amplitude towards smaller gradients to avoid this - if (slopeMask) { + if(slopeMask) { float dirMagSq = dot(baseDirX, baseDirY, baseDirX, baseDirY); float flatness = smoothstep((float) slopeMaskNoneSq, (float) slopeMaskFullSq, dirMagSq); erosion *= flatness; @@ -156,10 +161,6 @@ public float heightMap(long seed, float x, float y) { return (float) (height + erosion * erosionStrength); } - public static float dot(float x1, float y1, float x2, float y2) { - return x1 * x2 + y1 * y2; - } - @Override public double getNoiseRaw(long seed, double x, double y) { return heightMap(seed, (float) x, (float) y); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java index ef81ff1391..86adcee3bb 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java @@ -276,6 +276,7 @@ public double getNoiseRaw(long sl, double x, double y, double z) { return value * 9.046026385208288; } + @Override public boolean isDifferentiable() { return true; @@ -283,173 +284,174 @@ public boolean isDifferentiable() { @Override public double[] getNoiseDerivativeRaw(long sl, double x, double y) { - int seed = (int) sl; - // 2D OpenSimplex2S case is a modified 2D simplex noise. - - final double SQRT3 = 1.7320508075688772935274463415059; - final double G2 = (3 - SQRT3) / 6; - - final double F2 = 0.5f * (SQRT3 - 1); - double s = (x + y) * F2; - x += s; - y += s; - - - int i = (int) Math.floor(x); - int j = (int) Math.floor(y); - double xi = x - i; - double yi = y - j; - - i *= PRIME_X; - j *= PRIME_Y; - int i1 = i + PRIME_X; - int j1 = j + PRIME_Y; - - double t = (xi + yi) * G2; - double x0 = xi - t; - double y0 = yi - t; - - double[] out = { 0.0f, 0.0f, 0.0f }; - - double a0 = (2.0 / 3.0) - x0 * x0 - y0 * y0; - double aa0 = a0 * a0, aaa0 = aa0 * a0, aaaa0 = aa0 * aa0; - int gi0 = gradCoordIndex(seed, i, j); - double gx0 = GRADIENTS_2_D[gi0], gy0 = GRADIENTS_2_D[gi0 | 1]; - double rampValue0 = gx0 * x0 + gy0 * y0; - out[0] = aaaa0 * rampValue0; - out[1] = gx0 * aaaa0 - 8 * rampValue0 * aaa0 * x0; - out[2] = gy0 * aaaa0 - 8 * rampValue0 * aaa0 * y0; - - - - double a1 = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a0); - double x1 = x0 - (1 - 2 * G2); - double y1 = y0 - (1 - 2 * G2); - double aa1 = a1 * a1, aaa1 = aa1 * a1, aaaa1 = aa1 * aa1; - int gi1 = gradCoordIndex(seed, i1, j1); - double gx1 = GRADIENTS_2_D[gi1], gy1 = GRADIENTS_2_D[gi1 | 1]; - double rampValue1 = gx1 * x1 + gy1 * y1; - out[0] += aaaa1 * rampValue1; - out[1] += gx1 * aaaa1 - 8 * rampValue1 * aaa1 * x1; - out[2] += gy1 * aaaa1 - 8 * rampValue1 * aaa1 * y1; - - // Nested conditionals were faster than compact bit logic/arithmetic. - double xmyi = xi - yi; - if(t > G2) { - if(xi + xmyi > 1) { - double x2 = x0 + (3 * G2 - 2); - double y2 = y0 + (3 * G2 - 1); - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; - int gi2 = gradCoordIndex(seed, i + (PRIME_X << 1), j + PRIME_Y); - double gx2 = GRADIENTS_2_D[gi2 | 0], gy2 = GRADIENTS_2_D[gi2 | 1]; - double rampValue2 = gx2 * x2 + gy2 * y2; - out[0] += aaaa2 * rampValue2; - out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; - out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; - } - } else { - double x2 = x0 + G2; - double y2 = y0 + (G2 - 1); - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; - int gi2 = gradCoordIndex(seed, i, j + PRIME_Y); - double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; - double rampValue2 = gx2 * x2 + gy2 * y2; - out[0] += aaaa2 * rampValue2; - out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; - out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; - } - } - - if(yi - xmyi > 1) { - double x3 = x0 + (3 * G2 - 1); - double y3 = y0 + (3 * G2 - 2); - double a3 = (2.0 / 3.0) - x3 * x3 - y3 * y3; - if(a3 > 0) { - double aa3 = a3 * a3, aaa3 = aa3 * a3, aaaa3 = aa3 * aa3; - int gi3 = gradCoordIndex(seed, i + PRIME_X, j + (PRIME_Y << 1)); - double gx3 = GRADIENTS_2_D[gi3], gy3 = GRADIENTS_2_D[gi3 | 1]; - double rampValue3 = gx3 * x3 + gy3 * y3; - out[0] += aaaa3 * rampValue3; - out[1] += gx3 * aaaa3 - 8 * rampValue3 * aaa3 * x3; - out[2] += gy3 * aaaa3 - 8 * rampValue3 * aaa3 * y3; - } - } else { - double x3 = x0 + (G2 - 1); - double y3 = y0 + G2; - double a3 = (2.0 / 3.0) - x3 * x3 - y3 * y3; - if(a3 > 0) { - double aa3 = a3 * a3, aaa3 = aa3 * a3, aaaa3 = aa3 * aa3; - int gi3 = gradCoordIndex(seed, i + PRIME_X, j); - double gx3 = GRADIENTS_2_D[gi3], gy3 = GRADIENTS_2_D[gi3 | 1]; - double rampValue3 = gx3 * x3 + gy3 * y3; - out[0] += aaaa3 * rampValue3; - out[1] += gx3 * aaaa3 - 8 * rampValue3 * aaa3 * x3; - out[2] += gy3 * aaaa3 - 8 * rampValue3 * aaa3 * y3; - } - } - } else { - if(xi + xmyi < 0) { - double x2 = x0 + (1 - G2); - double y2 = y0 - G2; - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; - int gi2 = gradCoordIndex(seed, i - PRIME_X, j); - double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; - double rampValue2 = gx2 * x2 + gy2 * y2; - out[0] += aaaa2 * rampValue2; - out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; - out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; } - } else { - double x2 = x0 + (G2 - 1); - double y2 = y0 + G2; - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; - int gi2 = gradCoordIndex(seed, i + PRIME_X, j); - double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; - double rampValue2 = gx2 * x2 + gy2 * y2; - out[0] += aaaa2 * rampValue2; - out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; - out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; - } - } - - if(yi < xmyi) { - double x2 = x0 - G2; - double y2 = y0 - (G2 - 1); - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; - int gi2 = gradCoordIndex(seed, i, j - PRIME_Y); - double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; - double rampValue2 = gx2 * x2 + gy2 * y2; - out[0] += aaaa2 * rampValue2; - out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; - out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; } - } else { - double x2 = x0 + G2; - double y2 = y0 + (G2 - 1); - double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; - if(a2 > 0) { - double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; - int gi2 = gradCoordIndex(seed, i, j + PRIME_Y); - double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; - double rampValue2 = gx2 * x2 + gy2 * y2; - out[0] += aaaa2 * rampValue2; - out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; - out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; - } - } + int seed = (int) sl; + // 2D OpenSimplex2S case is a modified 2D simplex noise. + + final double SQRT3 = 1.7320508075688772935274463415059; + final double G2 = (3 - SQRT3) / 6; + + final double F2 = 0.5f * (SQRT3 - 1); + double s = (x + y) * F2; + x += s; + y += s; + + + int i = (int) Math.floor(x); + int j = (int) Math.floor(y); + double xi = x - i; + double yi = y - j; + + i *= PRIME_X; + j *= PRIME_Y; + int i1 = i + PRIME_X; + int j1 = j + PRIME_Y; + + double t = (xi + yi) * G2; + double x0 = xi - t; + double y0 = yi - t; + + double[] out = { 0.0f, 0.0f, 0.0f }; + + double a0 = (2.0 / 3.0) - x0 * x0 - y0 * y0; + double aa0 = a0 * a0, aaa0 = aa0 * a0, aaaa0 = aa0 * aa0; + int gi0 = gradCoordIndex(seed, i, j); + double gx0 = GRADIENTS_2_D[gi0], gy0 = GRADIENTS_2_D[gi0 | 1]; + double rampValue0 = gx0 * x0 + gy0 * y0; + out[0] = aaaa0 * rampValue0; + out[1] = gx0 * aaaa0 - 8 * rampValue0 * aaa0 * x0; + out[2] = gy0 * aaaa0 - 8 * rampValue0 * aaa0 * y0; + + + double a1 = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a0); + double x1 = x0 - (1 - 2 * G2); + double y1 = y0 - (1 - 2 * G2); + double aa1 = a1 * a1, aaa1 = aa1 * a1, aaaa1 = aa1 * aa1; + int gi1 = gradCoordIndex(seed, i1, j1); + double gx1 = GRADIENTS_2_D[gi1], gy1 = GRADIENTS_2_D[gi1 | 1]; + double rampValue1 = gx1 * x1 + gy1 * y1; + out[0] += aaaa1 * rampValue1; + out[1] += gx1 * aaaa1 - 8 * rampValue1 * aaa1 * x1; + out[2] += gy1 * aaaa1 - 8 * rampValue1 * aaa1 * y1; + + // Nested conditionals were faster than compact bit logic/arithmetic. + double xmyi = xi - yi; + if(t > G2) { + if(xi + xmyi > 1) { + double x2 = x0 + (3 * G2 - 2); + double y2 = y0 + (3 * G2 - 1); + double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; + if(a2 > 0) { + double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; + int gi2 = gradCoordIndex(seed, i + (PRIME_X << 1), j + PRIME_Y); + double gx2 = GRADIENTS_2_D[gi2 | 0], gy2 = GRADIENTS_2_D[gi2 | 1]; + double rampValue2 = gx2 * x2 + gy2 * y2; + out[0] += aaaa2 * rampValue2; + out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; + out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; } - out[0] *= 18.24196194486065; - out[1] *= 18.24196194486065; - out[2] *= 18.24196194486065; - return out; + } else { + double x2 = x0 + G2; + double y2 = y0 + (G2 - 1); + double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; + if(a2 > 0) { + double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; + int gi2 = gradCoordIndex(seed, i, j + PRIME_Y); + double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; + double rampValue2 = gx2 * x2 + gy2 * y2; + out[0] += aaaa2 * rampValue2; + out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; + out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; + } + } + + if(yi - xmyi > 1) { + double x3 = x0 + (3 * G2 - 1); + double y3 = y0 + (3 * G2 - 2); + double a3 = (2.0 / 3.0) - x3 * x3 - y3 * y3; + if(a3 > 0) { + double aa3 = a3 * a3, aaa3 = aa3 * a3, aaaa3 = aa3 * aa3; + int gi3 = gradCoordIndex(seed, i + PRIME_X, j + (PRIME_Y << 1)); + double gx3 = GRADIENTS_2_D[gi3], gy3 = GRADIENTS_2_D[gi3 | 1]; + double rampValue3 = gx3 * x3 + gy3 * y3; + out[0] += aaaa3 * rampValue3; + out[1] += gx3 * aaaa3 - 8 * rampValue3 * aaa3 * x3; + out[2] += gy3 * aaaa3 - 8 * rampValue3 * aaa3 * y3; + } + } else { + double x3 = x0 + (G2 - 1); + double y3 = y0 + G2; + double a3 = (2.0 / 3.0) - x3 * x3 - y3 * y3; + if(a3 > 0) { + double aa3 = a3 * a3, aaa3 = aa3 * a3, aaaa3 = aa3 * aa3; + int gi3 = gradCoordIndex(seed, i + PRIME_X, j); + double gx3 = GRADIENTS_2_D[gi3], gy3 = GRADIENTS_2_D[gi3 | 1]; + double rampValue3 = gx3 * x3 + gy3 * y3; + out[0] += aaaa3 * rampValue3; + out[1] += gx3 * aaaa3 - 8 * rampValue3 * aaa3 * x3; + out[2] += gy3 * aaaa3 - 8 * rampValue3 * aaa3 * y3; + } + } + } else { + if(xi + xmyi < 0) { + double x2 = x0 + (1 - G2); + double y2 = y0 - G2; + double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; + if(a2 > 0) { + double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; + int gi2 = gradCoordIndex(seed, i - PRIME_X, j); + double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; + double rampValue2 = gx2 * x2 + gy2 * y2; + out[0] += aaaa2 * rampValue2; + out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; + out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; + } + } else { + double x2 = x0 + (G2 - 1); + double y2 = y0 + G2; + double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; + if(a2 > 0) { + double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; + int gi2 = gradCoordIndex(seed, i + PRIME_X, j); + double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; + double rampValue2 = gx2 * x2 + gy2 * y2; + out[0] += aaaa2 * rampValue2; + out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; + out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; + } + } + + if(yi < xmyi) { + double x2 = x0 - G2; + double y2 = y0 - (G2 - 1); + double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; + if(a2 > 0) { + double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; + int gi2 = gradCoordIndex(seed, i, j - PRIME_Y); + double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; + double rampValue2 = gx2 * x2 + gy2 * y2; + out[0] += aaaa2 * rampValue2; + out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; + out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; + } + } else { + double x2 = x0 + G2; + double y2 = y0 + (G2 - 1); + double a2 = (2.0 / 3.0) - x2 * x2 - y2 * y2; + if(a2 > 0) { + double aa2 = a2 * a2, aaa2 = aa2 * a2, aaaa2 = aa2 * aa2; + int gi2 = gradCoordIndex(seed, i, j + PRIME_Y); + double gx2 = GRADIENTS_2_D[gi2], gy2 = GRADIENTS_2_D[gi2 | 1]; + double rampValue2 = gx2 * x2 + gy2 * y2; + out[0] += aaaa2 * rampValue2; + out[1] += gx2 * aaaa2 - 8 * rampValue2 * aaa2 * x2; + out[2] += gy2 * aaaa2 - 8 * rampValue2 * aaa2 * y2; + } + } + } + out[0] *= 18.24196194486065; + out[1] *= 18.24196194486065; + out[2] *= 18.24196194486065; + return out; } @Override diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java index 443146a9b3..862a665c85 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java @@ -206,7 +206,8 @@ public double[] getNoiseDerivativeRaw(long sl, double x, double y) { double rampValue = gx * x2 + gy * y2; out[0] += cccc * rampValue; out[1] += gx * cccc - 8 * rampValue * ccc * x2; - out[2] += gy * cccc - 8 * rampValue * ccc * y2; } + out[2] += gy * cccc - 8 * rampValue * ccc * y2; + } if(y0 > x0) { double x1 = x0 + G2; @@ -219,7 +220,8 @@ public double[] getNoiseDerivativeRaw(long sl, double x, double y) { double rampValue = gx * x1 + gy * y1; out[0] += bbbb * rampValue; out[1] += gx * bbbb - 8 * rampValue * bbb * x1; - out[2] += gy * bbbb - 8 * rampValue * bbb * y1; } + out[2] += gy * bbbb - 8 * rampValue * bbb * y1; + } } else { double x1 = x0 + (G2 - 1); double y1 = y0 + G2; @@ -231,7 +233,8 @@ public double[] getNoiseDerivativeRaw(long sl, double x, double y) { double rampValue = gx * x1 + gy * y1; out[0] += bbbb * rampValue; out[1] += gx * bbbb - 8 * rampValue * bbb * x1; - out[2] += gy * bbbb - 8 * rampValue * bbb * y1; } + out[2] += gy * bbbb - 8 * rampValue * bbb * y1; + } } out[0] *= 99.83685446303647f; @@ -242,114 +245,116 @@ public double[] getNoiseDerivativeRaw(long sl, double x, double y) { @Override public double[] getNoiseDerivativeRaw(long sl, double x, double y, double z) { - int seed = (int) sl; - // 3D OpenSimplex2Sampler case uses two offset rotated cube grids. - final double R3 = (2.0 / 3.0); - double r = (x + y + z) * R3; // Rotation, not skew - x = r - x; - y = r - y; - z = r - z; - - - int i = (int) Math.round(x); - int j = (int) Math.round(y); - int k = (int) Math.round(z); - double x0 = x - i; - double y0 = y - j; - double z0 = z - k; - - int xNSign = (int) (-1.0 - x0) | 1; - int yNSign = (int) (-1.0 - y0) | 1; - int zNSign = (int) (-1.0 - z0) | 1; - - double ax0 = xNSign * -x0; - double ay0 = yNSign * -y0; - double az0 = zNSign * -z0; - - i *= PRIME_X; - j *= PRIME_Y; - k *= PRIME_Z; - - double[] out = { 0.0f, 0.0f, 0.0f, 0.0f }; - double a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); - - for(int l = 0; ; l++) { - if(a > 0) { - double aa = a * a, aaa = aa * a, aaaa = aa * aa; - int gi = gradCoordIndex(seed, i, j, k); + int seed = (int) sl; + // 3D OpenSimplex2Sampler case uses two offset rotated cube grids. + final double R3 = (2.0 / 3.0); + double r = (x + y + z) * R3; // Rotation, not skew + x = r - x; + y = r - y; + z = r - z; + + + int i = (int) Math.round(x); + int j = (int) Math.round(y); + int k = (int) Math.round(z); + double x0 = x - i; + double y0 = y - j; + double z0 = z - k; + + int xNSign = (int) (-1.0 - x0) | 1; + int yNSign = (int) (-1.0 - y0) | 1; + int zNSign = (int) (-1.0 - z0) | 1; + + double ax0 = xNSign * -x0; + double ay0 = yNSign * -y0; + double az0 = zNSign * -z0; + + i *= PRIME_X; + j *= PRIME_Y; + k *= PRIME_Z; + + double[] out = { 0.0f, 0.0f, 0.0f, 0.0f }; + double a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); + + for(int l = 0; ; l++) { + if(a > 0) { + double aa = a * a, aaa = aa * a, aaaa = aa * aa; + int gi = gradCoordIndex(seed, i, j, k); + double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; + double rampValue = gx * x0 + gy * y0 + gz * z0; + out[0] += aaaa * rampValue; + out[1] += gx * aaaa - 8 * rampValue * aaa * x0; + out[1] += gy * aaaa - 8 * rampValue * aaa * y0; + out[2] += gz * aaaa - 8 * rampValue * aaa * z0; + } + + if(ax0 >= ay0 && ax0 >= az0) { + double b = a + ax0 + ax0; + if(b > 1) { + b -= 1; + double bb = b * b, bbb = bb * b, bbbb = bb * bb; + int gi = gradCoordIndex(seed, i - xNSign * PRIME_X, j, k); double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; - double rampValue = gx * x0 + gy * y0 + gz * z0; - out[0] += aaaa * rampValue; - out[1] += gx * aaaa - 8 * rampValue * aaa * x0; - out[1] += gy * aaaa - 8 * rampValue * aaa * y0; - out[2] += gz * aaaa - 8 * rampValue * aaa * z0; + double rampValue = gx * (x0 + xNSign) + gy * y0 + gz * z0; + out[0] += bbbb * rampValue; + out[1] += gx * bbbb - 8 * rampValue * bbb * (x0 + xNSign); + out[1] += gy * bbbb - 8 * rampValue * bbb * y0; + out[2] += gz * bbbb - 8 * rampValue * bbb * z0; } - - if(ax0 >= ay0 && ax0 >= az0) { - double b = a + ax0 + ax0; - if(b > 1) { - b -= 1; - double bb = b * b, bbb = bb * b, bbbb = bb * bb; - int gi = gradCoordIndex(seed, i - xNSign * PRIME_X, j, k); - double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; - double rampValue = gx * (x0 + xNSign) + gy * y0 + gz * z0; - out[0] += bbbb * rampValue; - out[1] += gx * bbbb - 8 * rampValue * bbb * (x0 + xNSign); - out[1] += gy * bbbb - 8 * rampValue * bbb * y0; - out[2] += gz * bbbb - 8 * rampValue * bbb * z0; - } - } else if(ay0 > ax0 && ay0 >= az0) { - double b = a + ay0 + ay0; - if(b > 1) { - b -= 1; - double bb = b * b, bbb = bb * b, bbbb = bb * bb; - int gi = gradCoordIndex(seed, i, j - yNSign * PRIME_Y, k); - double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; - double rampValue = gx * x0 + gy * (y0 + yNSign) + gz * z0; - out[0] += bbbb * rampValue; - out[1] += gx * bbbb - 8 * rampValue * bbb * x0; - out[1] += gy * bbbb - 8 * rampValue * bbb * (y0 + yNSign); - out[2] += gz * bbbb - 8 * rampValue * bbb * z0; } - } else { - double b = a + az0 + az0; - if(b > 1) { - b -= 1; - double bb = b * b, bbb = bb * b, bbbb = bb * bb; - int gi = gradCoordIndex(seed, i, j, k - zNSign * PRIME_Z); - double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; - double rampValue = gx * x0 + gy * y0 + gz * (z0 + zNSign); - out[0] += bbbb * rampValue; - out[1] += gx * bbbb - 8 * rampValue * bbb * x0; - out[1] += gy * bbbb - 8 * rampValue * bbb * y0; - out[2] += gz * bbbb - 8 * rampValue * bbb * (z0 + zNSign); } + } else if(ay0 > ax0 && ay0 >= az0) { + double b = a + ay0 + ay0; + if(b > 1) { + b -= 1; + double bb = b * b, bbb = bb * b, bbbb = bb * bb; + int gi = gradCoordIndex(seed, i, j - yNSign * PRIME_Y, k); + double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; + double rampValue = gx * x0 + gy * (y0 + yNSign) + gz * z0; + out[0] += bbbb * rampValue; + out[1] += gx * bbbb - 8 * rampValue * bbb * x0; + out[1] += gy * bbbb - 8 * rampValue * bbb * (y0 + yNSign); + out[2] += gz * bbbb - 8 * rampValue * bbb * z0; } + } else { + double b = a + az0 + az0; + if(b > 1) { + b -= 1; + double bb = b * b, bbb = bb * b, bbbb = bb * bb; + int gi = gradCoordIndex(seed, i, j, k - zNSign * PRIME_Z); + double gx = GRADIENTS_3D[gi], gy = GRADIENTS_3D[gi | 1], gz = GRADIENTS_3D[gi | 2]; + double rampValue = gx * x0 + gy * y0 + gz * (z0 + zNSign); + out[0] += bbbb * rampValue; + out[1] += gx * bbbb - 8 * rampValue * bbb * x0; + out[1] += gy * bbbb - 8 * rampValue * bbb * y0; + out[2] += gz * bbbb - 8 * rampValue * bbb * (z0 + zNSign); + } + } - if(l == 1) break; + if(l == 1) break; - ax0 = 0.5 - ax0; - ay0 = 0.5 - ay0; - az0 = 0.5 - az0; + ax0 = 0.5 - ax0; + ay0 = 0.5 - ay0; + az0 = 0.5 - az0; - x0 = xNSign * ax0; - y0 = yNSign * ay0; - z0 = zNSign * az0; + x0 = xNSign * ax0; + y0 = yNSign * ay0; + z0 = zNSign * az0; - a += (0.75 - ax0) - (ay0 + az0); + a += (0.75 - ax0) - (ay0 + az0); - i += (xNSign >> 1) & PRIME_X; - j += (yNSign >> 1) & PRIME_Y; - k += (zNSign >> 1) & PRIME_Z; + i += (xNSign >> 1) & PRIME_X; + j += (yNSign >> 1) & PRIME_Y; + k += (zNSign >> 1) & PRIME_Z; - xNSign = -xNSign; - yNSign = -yNSign; - zNSign = -zNSign; + xNSign = -xNSign; + yNSign = -yNSign; + zNSign = -zNSign; - seed = ~seed; - } - out[0] *= 32.69428253173828125; - out[1] *= 32.69428253173828125; - out[2] *= 32.69428253173828125; - out[3] *= 32.69428253173828125; - return out; + seed = ~seed; } + out[0] *= 32.69428253173828125; + out[1] *= 32.69428253173828125; + out[2] *= 32.69428253173828125; + out[3] *= 32.69428253173828125; + return out; + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java index a5fd3f3bf3..f9c3f65a7a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java @@ -8,7 +8,6 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; import com.dfsek.terra.addons.noise.samplers.noise.DerivativeNoiseFunction; -import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; /** @@ -117,12 +116,12 @@ protected static double gradCoord(int seed, int xPrimed, int yPrimed, int zPrime @Override public double[] getNoiseDerivativeRaw(long seed, double x, double y) { - return new double[]{0, 0, 0}; + return new double[]{ 0, 0, 0 }; } @Override public double[] getNoiseDerivativeRaw(long seed, double x, double y, double z) { - return new double[]{0, 0, 0, 0}; + return new double[]{ 0, 0, 0, 0 }; } @Override diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java index 41009ed0b5..f1ca7d9456 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java @@ -11,13 +11,6 @@ import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - import com.dfsek.terra.addons.generation.feature.config.BiomeFeatures; import com.dfsek.terra.addons.generation.feature.config.FeatureStageTemplate; import com.dfsek.terra.addons.manifest.api.AddonInitializer; @@ -35,6 +28,9 @@ import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; +import java.util.*; +import java.util.function.Supplier; + public class FeatureGenerationAddon implements AddonInitializer { public static final TypeKey>> STAGE_TYPE_KEY = new TypeKey<>() { diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java index 11a1e3ca7f..132889d237 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java @@ -7,9 +7,6 @@ package com.dfsek.terra.addons.generation.feature; -import java.util.Collections; -import java.util.Random; - import com.dfsek.terra.addons.generation.feature.config.BiomeFeatures; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.noise.NoiseSampler; @@ -22,6 +19,9 @@ import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; import com.dfsek.terra.api.world.chunk.generation.util.Column; +import java.util.Collections; +import java.util.Random; + public class FeatureGenerationStage implements GenerationStage, StringIdentifiable { private final Platform platform; diff --git a/common/addons/structure-mutator/src/main/java/com/dfsek/terra/addons/structure/mutator/MutatedStructure.java b/common/addons/structure-mutator/src/main/java/com/dfsek/terra/addons/structure/mutator/MutatedStructure.java index 30b2d59844..5b18dd0639 100644 --- a/common/addons/structure-mutator/src/main/java/com/dfsek/terra/addons/structure/mutator/MutatedStructure.java +++ b/common/addons/structure-mutator/src/main/java/com/dfsek/terra/addons/structure/mutator/MutatedStructure.java @@ -1,7 +1,5 @@ package com.dfsek.terra.addons.structure.mutator; -import java.util.Random; - import com.dfsek.terra.api.registry.key.Keyed; import com.dfsek.terra.api.registry.key.RegistryKey; import com.dfsek.terra.api.structure.Structure; @@ -11,6 +9,8 @@ import com.dfsek.terra.api.world.util.ReadInterceptor; import com.dfsek.terra.api.world.util.WriteInterceptor; +import java.util.Random; + public class MutatedStructure implements Structure, Keyed { private final RegistryKey key; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java index b982b09798..4fc805a8f5 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java @@ -7,15 +7,15 @@ package com.dfsek.terra.addons.terrascript.parser; -import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; -import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; -import com.dfsek.terra.addons.terrascript.tokenizer.Token; - import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; +import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; +import com.dfsek.terra.addons.terrascript.tokenizer.Token; + public class ParserUtil { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java index 588b99f53f..cfef3f5728 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java @@ -7,13 +7,13 @@ package com.dfsek.terra.addons.terrascript.script.builders; -import java.util.List; - import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.script.functions.CheckBlockFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; +import java.util.List; + public class CheckBlockFunctionBuilder implements FunctionBuilder { @SuppressWarnings("unchecked") diff --git a/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java b/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java index 0e178130bb..f9e40f0ea5 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java +++ b/common/api/src/main/java/com/dfsek/terra/api/noise/DerivativeNoiseSampler.java @@ -6,7 +6,7 @@ public interface DerivativeNoiseSampler extends NoiseSampler { static boolean isDifferentiable(NoiseSampler sampler) { - if (sampler instanceof DerivativeNoiseSampler dSampler) { + if(sampler instanceof DerivativeNoiseSampler dSampler) { return dSampler.isDifferentiable(); } return false; @@ -22,19 +22,23 @@ static boolean isDifferentiable(NoiseSampler sampler) { /** * Derivative return version of standard 2D noise evaluation + * * @param seed * @param x * @param y + * * @return 3 element array, in index order: noise value, partial x derivative, partial y derivative */ double[] noised(long seed, double x, double y); /** * Derivative return version of standard 3D noise evaluation + * * @param seed * @param x * @param y * @param z + * * @return 4 element array, in index order: noise value, partial x derivative, partial y derivative, partial z derivative */ double[] noised(long seed, double x, double y, double z); diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java index 0dbe5bb238..d12f31c475 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java @@ -29,7 +29,7 @@ public final class MathUtil { static { sinTable = new long[lookupTableSizeWithMargin]; - for (int i = 0; i < lookupTableSizeWithMargin; i++) { + for(int i = 0; i < lookupTableSizeWithMargin; i++) { double d = i * tauOverLookupSize; sinTable[i] = Double.doubleToRawLongBits(StrictMath.sin(d)); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java index d049cd43bf..3aed2b9ac5 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java @@ -7,18 +7,18 @@ package com.dfsek.terra.api.world.biome.generation; -import org.jetbrains.annotations.Contract; - -import java.util.Optional; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - import com.dfsek.terra.api.util.Column; import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.info.WorldProperties; +import org.jetbrains.annotations.Contract; + +import java.util.Optional; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + /** * Provides locations of biomes in a world. diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaNumberPreprocessor.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaNumberPreprocessor.java index 9197adeb1e..c823d7ec44 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaNumberPreprocessor.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaNumberPreprocessor.java @@ -24,14 +24,15 @@ import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.ConfigLoader; import com.dfsek.tectonic.api.preprocessor.Result; + +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.util.reflection.TypeKey; + import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; import java.util.Map; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.reflection.TypeKey; - public class MetaNumberPreprocessor extends MetaPreprocessor { public static final TypeKey META_STRING_KEY = new TypeKey<@Meta String>() { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java index a35bf9366e..67f9846461 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java @@ -17,6 +17,17 @@ package com.dfsek.terra.event; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.Event; import com.dfsek.terra.api.event.events.FailThroughEvent; @@ -25,12 +36,6 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.util.reflection.TypeKey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.lang.reflect.Type; -import java.util.*; - public class FunctionalEventHandlerImpl implements FunctionalEventHandler { private static final Logger logger = LoggerFactory.getLogger(FunctionalEventHandlerImpl.class); diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java index 98f44e2ec4..6df2681803 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java @@ -17,14 +17,14 @@ package com.dfsek.terra.bukkit; +import io.papermc.lib.PaperLib; +import org.bukkit.Location; + import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.bukkit.world.BukkitAdapter; -import io.papermc.lib.PaperLib; -import org.bukkit.Location; - public class BukkitEntity implements Entity { private final org.bukkit.entity.Entity entity; diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorldProperties.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorldProperties.java index f9763df902..7ece9ac7b6 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorldProperties.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorldProperties.java @@ -1,9 +1,9 @@ package com.dfsek.terra.bukkit.world; -import org.bukkit.generator.WorldInfo; - import com.dfsek.terra.api.world.info.WorldProperties; +import org.bukkit.generator.WorldInfo; + public class BukkitWorldProperties implements WorldProperties { private final WorldInfo delegate; diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java index 0cbfa77b41..48dc882498 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecycleEntryPoint.java @@ -1,5 +1,8 @@ package com.dfsek.terra.lifecycle; +import com.dfsek.terra.api.command.CommandSender; +import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; + import net.minecraft.server.command.ServerCommandSource; import org.incendo.cloud.SenderMapper; import org.incendo.cloud.execution.ExecutionCoordinator; @@ -7,9 +10,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dfsek.terra.api.command.CommandSender; -import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; - public final class LifecycleEntryPoint { private static final Logger logger = LoggerFactory.getLogger(LifecycleEntryPoint.class); diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java index 63a8b81706..0f04c0963c 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java @@ -18,6 +18,7 @@ import static com.dfsek.terra.lifecycle.util.LifecycleUtil.initialized; + @Mixin(MinecraftServer.class) public class MinecraftServerMixin { @Inject(method = "(Ljava/lang/Thread;Lnet/minecraft/world/level/storage/LevelStorage$Session;" + 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 28346a6eb4..9ba81f8642 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 @@ -13,6 +13,7 @@ public final class LifecycleUtil { public static boolean initialized = false; + private LifecycleUtil() { } From 42166d5239ad9d6d6fe0906b54bd8837fd333b14 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 20:59:02 -0600 Subject: [PATCH 109/126] bump version number --- 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 af2284b48f..83d927a017 100644 --- a/common/addons/config-noise-function/build.gradle.kts +++ b/common/addons/config-noise-function/build.gradle.kts @@ -1,4 +1,4 @@ -version = version("1.1.0") +version = version("1.2.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) From d69b0dba90000408a1f7d5d548f3bbd5a68dbdf8 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 21:06:07 -0600 Subject: [PATCH 110/126] reformat 2 --- .../noise/PseudoErosionTemplate.java | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java index 03f2252e1b..4e28232712 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java @@ -9,48 +9,61 @@ public class PseudoErosionTemplate extends NoiseTemplate { - @Value("frequency") @Default protected @Meta double frequency = 1d; + @Value("octaves") @Default - private int octaves = 4; + private final int octaves = 4; + @Value("lacunarity") @Default - private double lacunarity = 2.0; + private final double lacunarity = 2.0; + @Value("gain") @Default - private double gain = 0.5; + private final double gain = 0.5; + @Value("slope-strength") @Default - private double slopeStrength = 1.0; + private final double slopeStrength = 1.0; + + @Value("branch-strength") @Default - private double branchStrength = 1.0; + private final double branchStrength = 1.0; + @Value("strength") @Default - private double strength = 0.04; + private final double strength = 0.04; + @Value("erosion-frequency") @Default - private double erosionFrequency = 0.02; + private final double erosionFrequency = 0.02; + @Value("sampler") private DerivativeNoiseSampler heightSampler; + @Value("slope-mask.enable") @Default - private boolean slopeMask = true; + private final boolean slopeMask = true; + @Value("slope-mask.none") @Default - private double slopeMaskNone = -0.5; + private final double slopeMaskNone = -0.5; + @Value("slope-mask.full") @Default - private double slopeMaskFull = 1; + private final double slopeMaskFull = 1; + @Value("jitter") @Default - private double jitterModifier = 1; + private final double jitterModifier = 1; + @Value("average-impulses") @Default - private boolean averageErosionImpulses = true; + private final boolean averageErosionImpulses = true; @Override public PseudoErosionSampler get() { From 9c8298fe530d09b8ad2da12dfbe704804e00edd2 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 21:09:19 -0600 Subject: [PATCH 111/126] convert pseudoerosion to double --- .../samplers/noise/PseudoErosionSampler.java | 104 +++++++++--------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java index c761d2e802..ecb566ca7b 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java @@ -6,9 +6,9 @@ public class PseudoErosionSampler extends NoiseFunction { - public static final float TAU = (float) (2.0 * Math.PI); - private static final float HASH_X = 0.3183099f; - private static final float HASH_Y = 0.3678794f; + public static final double TAU = 2.0 * Math.PI; + private static final double HASH_X = 0.3183099f; + private static final double HASH_Y = 0.3678794f; public final double gain; public final double lacunarity; public final double slopeStrength; @@ -48,59 +48,59 @@ public PseudoErosionSampler(int octaves, double gain, double lacunarity, double this.maxCellDistSqRecip = 1 / maxCellDistSq; } - public static float hashX(float seed, float n) { + public static double hashX(double seed, double n) { // Swapped the components here - float nx = HASH_X * n * seed; + double nx = HASH_X * n * seed; return -1.0f + 2.0f * fract(nx); } - public static float hashY(float seed, float n) { - float ny = HASH_Y * n * seed; + public static double hashY(double seed, double n) { + double ny = HASH_Y * n * seed; return -1.0f + 2.0f * fract(ny); } - public static float fract(float x) { - return (x - (float) Math.floor(x)); + public static double fract(double x) { + return (x - Math.floor(x)); } - public static float smoothstep(float edge0, float edge1, float x) { + public static double smoothstep(double edge0, double edge1, double x) { // Scale, bias and saturate x to 0..1 range x = clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f); // Evaluate polynomial return x * x * (3 - 2 * x); } - public static float clamp(float x, float minVal, float maxVal) { + public static double clamp(double x, double minVal, double maxVal) { return Math.max(minVal, Math.min(maxVal, x)); } - public static float dot(float x1, float y1, float x2, float y2) { + public static double dot(double x1, double y1, double x2, double y2) { return x1 * x2 + y1 * y2; } - public float[] erosion(int seed, float x, float y, float dirX, float dirY) { - int gridX = Math.round(x); - int gridY = Math.round(y); - float noise = 0.0f; - float dirOutX = 0.0f; - float dirOutY = 0.0f; - float cumAmp = 0.0f; + public double[] erosion(int seed, double x, double y, double dirX, double dirY) { + int gridX = (int) Math.round(x); + int gridY = (int) Math.round(y); + double noise = 0.0f; + double dirOutX = 0.0f; + double dirOutY = 0.0f; + double cumAmp = 0.0f; for(int cellX = gridX - 1; cellX <= gridX + 1; cellX++) { for(int cellY = gridY - 1; cellY <= gridY + 1; cellY++) { - float cellHash = hash(seed, cellX, cellY); - float cellOffsetX = (float) (hashX(seed, cellHash) * jitter); - float cellOffsetY = (float) (hashY(seed, cellHash) * jitter); - float cellOriginDeltaX = (x - cellX) + cellOffsetX; - float cellOriginDeltaY = (y - cellY) + cellOffsetY; - float cellOriginDistSq = cellOriginDeltaX * cellOriginDeltaX + cellOriginDeltaY * cellOriginDeltaY; + double cellHash = hash(seed, cellX, cellY); + double cellOffsetX = hashX(seed, cellHash) * jitter; + double cellOffsetY = hashY(seed, cellHash) * jitter; + double cellOriginDeltaX = (x - cellX) + cellOffsetX; + double cellOriginDeltaY = (y - cellY) + cellOffsetY; + double cellOriginDistSq = cellOriginDeltaX * cellOriginDeltaX + cellOriginDeltaY * cellOriginDeltaY; if(cellOriginDistSq > maxCellDistSq) continue; // Skip calculating cells too far away - float ampTmp = (float) ((cellOriginDistSq * maxCellDistSqRecip) - 1); - float amp = ampTmp * ampTmp; // Decrease cell amplitude further away + double ampTmp = (cellOriginDistSq * maxCellDistSqRecip) - 1; + double amp = ampTmp * ampTmp; // Decrease cell amplitude further away cumAmp += amp; - float directionalStrength = dot(cellOriginDeltaX, cellOriginDeltaY, dirX, dirY) * TAU; - noise += (float) (MathUtil.cos(directionalStrength) * amp); - float sinAngle = (float) MathUtil.sin(directionalStrength) * amp; + double directionalStrength = dot(cellOriginDeltaX, cellOriginDeltaY, dirX, dirY) * TAU; + noise += MathUtil.cos(directionalStrength) * amp; + double sinAngle = MathUtil.sin(directionalStrength) * amp; dirOutX -= sinAngle * (cellOriginDeltaX + dirX); dirOutY -= sinAngle * (cellOriginDeltaY + dirY); } @@ -110,33 +110,33 @@ public float[] erosion(int seed, float x, float y, float dirX, float dirY) { dirOutX /= cumAmp; dirOutY /= cumAmp; } - return new float[]{ noise, dirOutX, dirOutY }; + return new double[]{ noise, dirOutX, dirOutY }; } - public float heightMap(long seed, float x, float y) { + public double heightMap(long seed, double x, double y) { double[] sample = sampler.noised(seed, x, y); - float height = (float) sample[0]; - float heightDirX = (float) sample[1]; - float heightDirY = (float) sample[2]; + double height = sample[0]; + double heightDirX = sample[1]; + double heightDirY = sample[2]; // Take the curl of the normal to get the gradient facing down the slope - float baseDirX = heightDirY * (float) slopeStrength; - float baseDirY = -heightDirX * (float) slopeStrength; + double baseDirX = heightDirY * slopeStrength; + double baseDirY = -heightDirX * slopeStrength; - float erosion = 0.0f; - float dirX = 0.0f; - float dirY = 0.0f; - float amp = 1.0f; - float cumAmp = 0.0f; - float freq = 1.0f; + double erosion = 0.0f; + double dirX = 0.0f; + double dirY = 0.0f; + double amp = 1.0f; + double cumAmp = 0.0f; + double freq = 1.0f; // Stack erosion octaves for(int i = 0; i < octaves; i++) { - float[] erosionResult = erosion((int) seed, - x * freq * (float) erosionFrequency, - y * freq * (float) erosionFrequency, - baseDirX + dirY * (float) branchStrength, - baseDirY - dirX * (float) branchStrength); + double[] erosionResult = erosion((int) seed, + x * freq * erosionFrequency, + y * freq * erosionFrequency, + baseDirX + dirY * branchStrength, + baseDirY - dirX * branchStrength); erosion += erosionResult[0] * amp; dirX += erosionResult[1] * amp * freq; dirY += erosionResult[2] * amp * freq; @@ -153,17 +153,17 @@ public float heightMap(long seed, float x, float y) { // Without masking, erosion noise in areas with small gradients tend to produce mounds, // this reduces erosion amplitude towards smaller gradients to avoid this if(slopeMask) { - float dirMagSq = dot(baseDirX, baseDirY, baseDirX, baseDirY); - float flatness = smoothstep((float) slopeMaskNoneSq, (float) slopeMaskFullSq, dirMagSq); + double dirMagSq = dot(baseDirX, baseDirY, baseDirX, baseDirY); + double flatness = smoothstep((double) slopeMaskNoneSq, slopeMaskFullSq, dirMagSq); erosion *= flatness; } - return (float) (height + erosion * erosionStrength); + return height + erosion * erosionStrength; } @Override public double getNoiseRaw(long seed, double x, double y) { - return heightMap(seed, (float) x, (float) y); + return heightMap(seed, x, y); } @Override From f1124aae6bcf1a5079674599cce6b53f9078dbeb Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 21:18:47 -0600 Subject: [PATCH 112/126] Update platform mod file versions and authors --- platforms/bukkit/common/src/main/resources/plugin.yml | 4 ++-- platforms/fabric/src/main/resources/fabric.mod.json | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/platforms/bukkit/common/src/main/resources/plugin.yml b/platforms/bukkit/common/src/main/resources/plugin.yml index e965d7deed..7c0ed151a6 100644 --- a/platforms/bukkit/common/src/main/resources/plugin.yml +++ b/platforms/bukkit/common/src/main/resources/plugin.yml @@ -2,8 +2,8 @@ name: "Terra" main: "com.dfsek.terra.bukkit.TerraBukkitPlugin" version: "@VERSION@" load: "STARTUP" -author: dfsek +authors: ["dfsek", "duplexsystem", "Astrash", "solonovamax", "Sancires", "Aureus", "RogueShade"] website: "@WIKI@" -api-version: "1.20" +api-version: "1.21.1" description: "@DESCRIPTION@" folia-supported: true diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json index bc53194528..592d4021a6 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -5,7 +5,13 @@ "name": "Terra", "description": "@DESCRIPTION@", "authors": [ - "dfsek" + "dfsek", + "duplexsystem", + "Astrash", + "solonovamax", + "Sancires", + "Aureus", + "RogueShade" ], "contact": { "homepage": "@WIKI@", @@ -28,7 +34,7 @@ "depends": { "fabricloader": ">=0.16.5", "java": ">=21", - "minecraft": ">=1.20.6", + "minecraft": ">=1.21.1", "fabric": "*" } } \ No newline at end of file From f87b7c07d99f7ae1468890e36edfd559a1b8c6fb Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 22:27:53 -0600 Subject: [PATCH 113/126] Reformat --- platforms/bukkit/common/src/main/resources/plugin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/bukkit/common/src/main/resources/plugin.yml b/platforms/bukkit/common/src/main/resources/plugin.yml index 7c0ed151a6..782861cfea 100644 --- a/platforms/bukkit/common/src/main/resources/plugin.yml +++ b/platforms/bukkit/common/src/main/resources/plugin.yml @@ -2,7 +2,7 @@ name: "Terra" main: "com.dfsek.terra.bukkit.TerraBukkitPlugin" version: "@VERSION@" load: "STARTUP" -authors: ["dfsek", "duplexsystem", "Astrash", "solonovamax", "Sancires", "Aureus", "RogueShade"] +authors: [ "dfsek", "duplexsystem", "Astrash", "solonovamax", "Sancires", "Aureus", "RogueShade" ] website: "@WIKI@" api-version: "1.21.1" description: "@DESCRIPTION@" From f605ee1937f936617358732815776ad6561ec123 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 22:35:01 -0600 Subject: [PATCH 114/126] Remove Final from psuedoerosion template --- .../noise/PseudoErosionTemplate.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java index 4e28232712..f6d5706d8f 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java @@ -15,55 +15,55 @@ public class PseudoErosionTemplate extends NoiseTemplate { @Value("octaves") @Default - private final int octaves = 4; + private int octaves = 4; @Value("lacunarity") @Default - private final double lacunarity = 2.0; + private double lacunarity = 2.0; @Value("gain") @Default - private final double gain = 0.5; + private double gain = 0.5; @Value("slope-strength") @Default - private final double slopeStrength = 1.0; + private double slopeStrength = 1.0; @Value("branch-strength") @Default - private final double branchStrength = 1.0; + private double branchStrength = 1.0; @Value("strength") @Default - private final double strength = 0.04; + private double strength = 0.04; @Value("erosion-frequency") @Default - private final double erosionFrequency = 0.02; + private double erosionFrequency = 0.02; @Value("sampler") private DerivativeNoiseSampler heightSampler; @Value("slope-mask.enable") @Default - private final boolean slopeMask = true; + private boolean slopeMask = true; @Value("slope-mask.none") @Default - private final double slopeMaskNone = -0.5; + private double slopeMaskNone = -0.5; @Value("slope-mask.full") @Default - private final double slopeMaskFull = 1; + private double slopeMaskFull = 1; @Value("jitter") @Default - private final double jitterModifier = 1; + private double jitterModifier = 1; @Value("average-impulses") @Default - private final boolean averageErosionImpulses = true; + private boolean averageErosionImpulses = true; @Override public PseudoErosionSampler get() { From 59d943b3eaaf95f91e33d3aa39b24bcef49b2ee5 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 22:38:17 -0600 Subject: [PATCH 115/126] Revert "Fix build" This reverts commit 10d723372daf14bc551159d050412c71c7f69a76. --- .../api/src/main/java/com/dfsek/terra/api/util/MathUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java index d12f31c475..6bf9b360d2 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java @@ -23,8 +23,8 @@ public final class MathUtil { static final int lookupTableSize = 1 << lookupBits; private static final int lookupTableSizeWithMargin = lookupTableSize + 1; - private static final double tauOverLookupSize = Math.TAU / lookupTableSize; - static final double radianToIndex = (~(-1 << lookupBits) + 1) / Math.TAU; + private static final double tauOverLookupSize = TrigonometryConstants.TAU / lookupTableSize; + static final double radianToIndex = (~(-1 << lookupBits) + 1) / TrigonometryConstants.TAU; private static final long[] sinTable; static { From 6244ffca6368f94e4d8a73aab87794544edf4fb3 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 22:38:45 -0600 Subject: [PATCH 116/126] Revert "Sin/Cos Opts" This reverts commit 1d05f95f746639fdbc4c242d84aa4fcd93d666f4. --- .../com/dfsek/terra/api/util/MathUtil.java | 50 ++++++++----------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java index 6bf9b360d2..2dd593b216 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java @@ -18,14 +18,22 @@ public final class MathUtil { * Epsilon for fuzzy floating point comparisons. */ public static final double EPSILON = 1.0E-5; - private static final int lookupBits = 14; + private static final int SIN_BITS, SIN_MASK, SIN_COUNT; + private static final double radFull, radToIndex; + private static final double degFull, degToIndex; + private static final double[] sin, cos; + static { + SIN_BITS = 12; + SIN_MASK = ~(-1 << SIN_BITS); + SIN_COUNT = SIN_MASK + 1; - static final int lookupTableSize = 1 << lookupBits; + radFull = Math.PI * 2.0; + degFull = 360.0; + radToIndex = SIN_COUNT / radFull; + degToIndex = SIN_COUNT / degFull; - private static final int lookupTableSizeWithMargin = lookupTableSize + 1; - private static final double tauOverLookupSize = TrigonometryConstants.TAU / lookupTableSize; - static final double radianToIndex = (~(-1 << lookupBits) + 1) / TrigonometryConstants.TAU; - private static final long[] sinTable; + sin = new double[SIN_COUNT]; + cos = new double[SIN_COUNT]; static { sinTable = new long[lookupTableSizeWithMargin]; @@ -33,36 +41,20 @@ public final class MathUtil { double d = i * tauOverLookupSize; sinTable[i] = Double.doubleToRawLongBits(StrictMath.sin(d)); } - } - - static double sinLookup(long index) { - // Trigonometric identity: sin(-x) = -sin(x) - // Given a domain of 0 <= x <= 2*pi, just negate the value if x > pi. - // This allows the sin table size to be halved. - long neg = (index & 0x8000000000000000L) << 32; - - // All bits set if (pi/2 <= x), none set otherwise - // Extracts the 31st bit from 'half' - long mask = (index << 33) >> 63; - // Trigonometric identity: sin(x) = sin(pi/2 - x) - long pos = (0x8000000000000001L & mask) + (index ^ mask); - - // Wrap the position in the table. Moving this down to immediately before the array access - // seems to help the Hotspot compiler optimize the bit math better. - pos &= 0x7fffffffffffffffL; - - // Fetch the corresponding value from the LUT and invert the sign bit as needed - // This directly manipulate the sign bit on the double bits to simplify logic - return Double.longBitsToDouble(sinTable[(int) pos] ^ neg); + // Four cardinal directions (credits: Nate) + for(int i = 0; i < 360; i += 90) { + sin[(int) (i * degToIndex) & SIN_MASK] = Math.sin(i * Math.PI / 180.0); + cos[(int) (i * degToIndex) & SIN_MASK] = Math.cos(i * Math.PI / 180.0); + } } public static double sin(double rad) { - return sinLookup((long) (rad * radianToIndex) & 0xFFFFFFFFL); + return sin[(int) (rad * radToIndex) & SIN_MASK]; } public static double cos(double rad) { - return sinLookup((long) (rad * radianToIndex + lookupTableSize) & 0xFFFFFFFFL); + return cos[(int) (rad * radToIndex) & SIN_MASK]; } public static double tan(double rad) { From 2c45ba91aafe3d453be74b67fd287b78e9a3dda2 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 22:40:37 -0600 Subject: [PATCH 117/126] Fix up commit --- .../src/main/java/com/dfsek/terra/api/util/MathUtil.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java index 2dd593b216..f972e7106d 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java @@ -35,13 +35,6 @@ public final class MathUtil { sin = new double[SIN_COUNT]; cos = new double[SIN_COUNT]; - static { - sinTable = new long[lookupTableSizeWithMargin]; - for(int i = 0; i < lookupTableSizeWithMargin; i++) { - double d = i * tauOverLookupSize; - sinTable[i] = Double.doubleToRawLongBits(StrictMath.sin(d)); - } - // Four cardinal directions (credits: Nate) for(int i = 0; i < 360; i += 90) { sin[(int) (i * degToIndex) & SIN_MASK] = Math.sin(i * Math.PI / 180.0); From 6cc53beecbdd35731b076c18c3a0f4bee4bb0fa8 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Mon, 23 Sep 2024 23:14:35 -0600 Subject: [PATCH 118/126] Fix Sin/Cos --- .../api/src/main/java/com/dfsek/terra/api/util/MathUtil.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java index f972e7106d..e57765f2eb 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java @@ -35,6 +35,11 @@ public final class MathUtil { sin = new double[SIN_COUNT]; cos = new double[SIN_COUNT]; + for(int i = 0; i < SIN_COUNT; i++) { + sin[i] = Math.sin((i + 0.5f) / SIN_COUNT * radFull); + cos[i] = Math.cos((i + 0.5f) / SIN_COUNT * radFull); + } + // Four cardinal directions (credits: Nate) for(int i = 0; i < 360; i += 90) { sin[(int) (i * degToIndex) & SIN_MASK] = Math.sin(i * Math.PI / 180.0); From 1aa3ef813c3497a9999961a8c99172d444f1ea07 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Tue, 24 Sep 2024 09:05:33 -0600 Subject: [PATCH 119/126] add default sampler to pseudoerosion --- .../noise/config/templates/noise/PseudoErosionTemplate.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java index f6d5706d8f..cda91ec326 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/PseudoErosionTemplate.java @@ -4,6 +4,7 @@ import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.terra.addons.noise.samplers.noise.PseudoErosionSampler; +import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.DerivativeNoiseSampler; @@ -43,7 +44,8 @@ public class PseudoErosionTemplate extends NoiseTemplate { private double erosionFrequency = 0.02; @Value("sampler") - private DerivativeNoiseSampler heightSampler; + @Default + private DerivativeNoiseSampler heightSampler = new OpenSimplex2Sampler(); @Value("slope-mask.enable") @Default From 13782bb51e72a15426190526ecb2a2653513e8bc Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Tue, 24 Sep 2024 09:11:43 -0600 Subject: [PATCH 120/126] Remforamt --- .../events/platform/CommandRegistrationEvent.java | 4 ++-- .../api/world/biome/generation/BiomeProvider.java | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java index 80088ff6d0..3ad041c9bd 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java @@ -1,10 +1,10 @@ package com.dfsek.terra.api.event.events.platform; -import org.incendo.cloud.CommandManager; - import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.event.events.Event; +import org.incendo.cloud.CommandManager; + public class CommandRegistrationEvent implements Event { private final CommandManager commandManager; diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java index 3aed2b9ac5..d049cd43bf 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java @@ -7,18 +7,18 @@ package com.dfsek.terra.api.world.biome.generation; -import com.dfsek.terra.api.util.Column; -import com.dfsek.terra.api.util.vector.Vector3; -import com.dfsek.terra.api.util.vector.Vector3Int; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.info.WorldProperties; - import org.jetbrains.annotations.Contract; import java.util.Optional; import java.util.stream.Stream; import java.util.stream.StreamSupport; +import com.dfsek.terra.api.util.Column; +import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.info.WorldProperties; + /** * Provides locations of biomes in a world. From 589cf83c38fbb71209987df9a773ac3878ae7a0a Mon Sep 17 00:00:00 2001 From: astrsh Date: Wed, 25 Sep 2024 14:02:54 +1000 Subject: [PATCH 121/126] Flip comparison As per request from @duplexsystem --- .../noise/samplers/noise/simplex/OpenSimplex2Sampler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java index 862a665c85..e86ec2234a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java @@ -62,7 +62,7 @@ public double getNoiseRaw(long sl, double x, double y) { double x1 = x0 + (G2 - 1); double y1 = y0 + G2; double b = 0.5 - x1 * x1 - y1 * y1; - if(b <= 0) { + if(b > 0) { value += (b * b) * (b * b) * gradCoord(seed, i + PRIME_X, j, x1, y1); } } From f70a83aec3583a2f21b63422f00c05e036958a61 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Tue, 24 Sep 2024 23:26:49 -0600 Subject: [PATCH 122/126] fix spawners on bukkit --- .../bukkit/handles/BukkitWorldHandle.java | 22 ++------------ .../dfsek/terra/bukkit/util/BukkitUtils.java | 29 +++++++++++++++++++ .../terra/bukkit/world/BukkitAdapter.java | 16 ---------- .../world/block/state/BukkitMobSpawner.java | 3 +- 4 files changed, 33 insertions(+), 37 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 97f932c81c..35922cab5c 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 @@ -23,13 +23,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Locale; - import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.entity.EntityType; import com.dfsek.terra.api.handle.WorldHandle; +import com.dfsek.terra.bukkit.util.BukkitUtils; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; -import com.dfsek.terra.bukkit.world.entity.BukkitEntityType; public class BukkitWorldHandle implements WorldHandle { @@ -61,22 +59,6 @@ public BukkitWorldHandle() { @Override public @NotNull EntityType getEntity(@NotNull String id) { - if(!id.contains(":")) { //TODO: remove in 7.0 - String newid = "minecraft:" + id.toLowerCase(); - ; - logger.warn( - "Translating " + id + " to " + newid + ". In 1.20.3 entity parsing was reworked" + - ". You are advised to perform this rename in your config backs as this translation will be removed in the next major " + - "version of Terra."); - } - if(!id.startsWith("minecraft:")) throw new IllegalArgumentException("Invalid entity identifier " + id); - String entityID = id.toUpperCase(Locale.ROOT).substring(10); - - return new BukkitEntityType(switch(entityID) { - case "END_CRYSTAL" -> org.bukkit.entity.EntityType.END_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); - }); + return BukkitUtils.getEntityType(id); } } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/BukkitUtils.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/BukkitUtils.java index cc2fa78ef3..6c0a9c7f4d 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/BukkitUtils.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/BukkitUtils.java @@ -2,11 +2,40 @@ import org.bukkit.Material; import org.bukkit.block.data.BlockData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Locale; + +import com.dfsek.terra.api.entity.EntityType; +import com.dfsek.terra.bukkit.world.entity.BukkitEntityType; public class BukkitUtils { + private static final Logger logger = LoggerFactory.getLogger(BukkitUtils.class); + public static boolean isLiquid(BlockData blockState) { Material material = blockState.getMaterial(); return material == Material.WATER || material == Material.LAVA; } + + public static EntityType getEntityType(String id) { + if(!id.contains(":")) { //TODO: remove in 7.0 + String newid = "minecraft:" + id.toLowerCase(); + ; + logger.warn( + "Translating " + id + " to " + newid + ". In 1.20.3 entity parsing was reworked" + + ". You are advised to perform this rename in your config backs as this translation will be removed in the next major " + + "version of Terra."); + } + if(!id.startsWith("minecraft:")) throw new IllegalArgumentException("Invalid entity identifier " + id); + String entityID = id.toUpperCase(Locale.ROOT).substring(10); + + return new BukkitEntityType(switch(entityID) { + case "END_CRYSTAL" -> org.bukkit.entity.EntityType.END_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); + }); + } } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java index f2d446de7f..4082658211 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java @@ -20,7 +20,6 @@ import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.TreeType; import org.bukkit.entity.Player; import org.bukkit.generator.WorldInfo; import org.bukkit.util.Vector; @@ -46,27 +45,12 @@ import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; import com.dfsek.terra.bukkit.world.inventory.BukkitItemStack; import com.dfsek.terra.bukkit.world.inventory.meta.BukkitEnchantment; -import com.dfsek.terra.transform.MapTransform; -import com.dfsek.terra.transform.TransformerImpl; /** * Utility class to adapt Bukkit enums to Terra enums. */ public final class BukkitAdapter { - public static TransformerImpl TREE_TRANSFORMER = new TransformerImpl.Builder() - .addTransform(new MapTransform() - .add(TreeType.COCOA_TREE, "JUNGLE_COCOA") - .add(TreeType.BIG_TREE, "LARGE_OAK") - .add(TreeType.TALL_REDWOOD, "LARGE_SPRUCE") - .add(TreeType.REDWOOD, "SPRUCE") - .add(TreeType.TREE, "OAK") - .add(TreeType.MEGA_REDWOOD, "MEGA_SPRUCE") - .add(TreeType.SWAMP, "SWAMP_OAK")) - .addTransform(TreeType::toString) - .build(); - - public static BlockState adapt(org.bukkit.block.data.BlockData data) { return BukkitBlockState.newInstance(data); } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java index 7bdc75d967..dc9d1ecb6c 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java @@ -23,6 +23,7 @@ import com.dfsek.terra.api.block.entity.MobSpawner; import com.dfsek.terra.api.block.entity.SerialState; import com.dfsek.terra.api.entity.EntityType; +import com.dfsek.terra.bukkit.util.BukkitUtils; import com.dfsek.terra.bukkit.world.entity.BukkitEntityType; @@ -115,7 +116,7 @@ public void setSpawnRange(int spawnRange) { public void applyState(String state) { SerialState.parse(state).forEach((k, v) -> { switch(k) { - case "type" -> setSpawnedType(new BukkitEntityType(org.bukkit.entity.EntityType.valueOf(v.toUpperCase()))); + case "type" -> setSpawnedType(BukkitUtils.getEntityType(v)); case "delay" -> setDelay(Integer.parseInt(v)); case "min_delay" -> setMinSpawnDelay(Integer.parseInt(v)); case "max_delay" -> setMaxSpawnDelay(Integer.parseInt(v)); From 060cbfd0c439cce2060cb7a7baa9021a0a34c711 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sat, 12 Oct 2024 13:44:02 -0600 Subject: [PATCH 123/126] Update CODEOWNERS --- .github/CODEOWNERS | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 732a59b1d3..7bf7091b63 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,13 +1,13 @@ # Global owners, automatically request review when pull request is submitted -* @dfsek @solonovamax @duplexsystem @Astrashh @justaureus +* @dfsek @solonovamax @duplexsystem @astrsh @justaureus # Platforms /platforms/ @dfsek @solonovamax @duplexsystem @justaureus # Common -/common/ @dfsek @solonovamax @duplexsystem @Astrashh +/common/ @dfsek @solonovamax @duplexsystem @astrsh # Gradle Stuff /buildSrc/ @dfsek @solonovamax @duplexsystem *.gradle.kts @dfsek @solonovamax @duplexsystem -/gradle/ @dfsek @solonovamax @duplexsystem \ No newline at end of file +/gradle/ @dfsek @solonovamax @duplexsystem From 592788450cae723d86918eb90d04eee6c6febc2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sat, 12 Oct 2024 13:45:55 -0600 Subject: [PATCH 124/126] Update CODEOWNERS --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7bf7091b63..f40b5cfd8c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -3,6 +3,7 @@ # Platforms /platforms/ @dfsek @solonovamax @duplexsystem @justaureus +/platforms/bukkit @dfsek @solonovamax @duplexsystem @justaureus @OakLoaf # Common /common/ @dfsek @solonovamax @duplexsystem @astrsh From 12faae8fd52fd27a2991d410e02d22200f93aa68 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Sun, 13 Oct 2024 15:55:29 -0600 Subject: [PATCH 125/126] Use reflection remapper for worldGenContext on bukkit How this even worked before astounds me --- .../bukkit/nms/v1_21/NMSInjectListener.java | 19 +++++++------------ .../terra/bukkit/nms/v1_21/Reflection.java | 11 +++++++++++ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java index 927b019ed5..a25638594e 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java @@ -42,18 +42,13 @@ public void onWorldInit(WorldInitEvent event) { NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed()); ChunkMap chunkMap = serverWorld.getChunkSource().chunkMap; WorldGenContext worldGenContext = chunkMap.worldGenContext; - - try { - ReflectionUtil.setFinalField(chunkMap, "worldGenContext", new WorldGenContext( - worldGenContext.level(), - new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()), - worldGenContext.structureManager(), - worldGenContext.lightEngine(), - worldGenContext.mainThreadMailBox() - )); - } catch(NoSuchFieldException e) { - throw new RuntimeException(e); - } + Reflection.CHUNKMAP.setWorldGenContext(chunkMap, new WorldGenContext( + worldGenContext.level(), + new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()), + worldGenContext.structureManager(), + worldGenContext.lightEngine(), + worldGenContext.mainThreadMailBox() + )); LOGGER.info("Successfully injected into world."); diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java index 57e1b8c9c9..a6f4ea9ba1 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java @@ -3,8 +3,10 @@ import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; import net.minecraft.core.MappedRegistry; +import net.minecraft.server.level.ChunkMap; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.chunk.status.WorldGenContext; import xyz.jpenilla.reflectionremapper.ReflectionRemapper; import xyz.jpenilla.reflectionremapper.proxy.ReflectionProxyFactory; import xyz.jpenilla.reflectionremapper.proxy.annotation.FieldGetter; @@ -19,6 +21,8 @@ public class Reflection { public static final ReferenceProxy REFERENCE; + public static final ChunkMapProxy CHUNKMAP; + static { ReflectionRemapper reflectionRemapper = ReflectionRemapper.forReobfMappingsInPaperJar(); ReflectionProxyFactory reflectionProxyFactory = ReflectionProxyFactory.create(reflectionRemapper, @@ -27,6 +31,7 @@ public class Reflection { MAPPED_REGISTRY = reflectionProxyFactory.reflectionProxy(MappedRegistryProxy.class); STRUCTURE_MANAGER = reflectionProxyFactory.reflectionProxy(StructureManagerProxy.class); REFERENCE = reflectionProxyFactory.reflectionProxy(ReferenceProxy.class); + CHUNKMAP = reflectionProxyFactory.reflectionProxy(ChunkMapProxy.class); } @@ -49,4 +54,10 @@ public interface ReferenceProxy { @MethodName("bindValue") void invokeBindValue(Reference instance, T value); } + + @Proxies(ChunkMap.class) + public interface ChunkMapProxy { + @FieldSetter("worldGenContext") + void setWorldGenContext(ChunkMap instance, WorldGenContext worldGenContext); + } } From 0a952cff4c3eea8bc0a49205643e0c225d12304c Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Sun, 13 Oct 2024 16:06:35 -0600 Subject: [PATCH 126/126] bump build number --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 67b22ccb55..968d1e3b72 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.5.0")) -versionProjects(":common:implementation", version("6.5.0")) -versionProjects(":platforms", version("6.5.0")) +versionProjects(":common:api", version("6.5.1")) +versionProjects(":common:implementation", version("6.5.1")) +versionProjects(":platforms", version("6.5.1")) allprojects {