From a058f1c58bd79ee566e6f516eeb4704fa90738f7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 13 Dec 2020 15:21:55 -0700 Subject: [PATCH] BiomeGrid no longer needs World object. --- .../main/java/com/dfsek/terra/TerraWorld.java | 10 ++--- .../dfsek/terra/api/gaea/biome/BiomeGrid.java | 13 ++---- .../java/com/dfsek/terra/biome/BiomeZone.java | 5 +-- .../terra/biome/grid/SingleBiomeGrid.java | 5 +-- .../terra/biome/grid/UserDefinedGrid.java | 5 +-- .../biome/grid/master/TerraBiomeGrid.java | 5 +-- .../grid/master/TerraRadialBiomeGrid.java | 9 ++-- .../grid/master/TerraStandardBiomeGrid.java | 9 ++-- .../builder/biomegrid/BiomeGridBuilder.java | 3 +- .../builder/biomegrid/SingleGridBuilder.java | 5 +-- .../biomegrid/UserDefinedGridBuilder.java | 5 +-- .../dfsek/terra/fabric/TerraFabricPlugin.java | 5 ++- .../terra/fabric/codec/ConfigPackCodec.java | 19 ++++++++ .../fabric/world/FabricBiomeRegistry.java | 7 +++ .../terra/fabric/world/TerraBiomeSource.java | 45 +++++++++++++++++++ 15 files changed, 103 insertions(+), 47 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/codec/ConfigPackCodec.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeRegistry.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java diff --git a/common/src/main/java/com/dfsek/terra/TerraWorld.java b/common/src/main/java/com/dfsek/terra/TerraWorld.java index 8129e6e81..d25793411 100644 --- a/common/src/main/java/com/dfsek/terra/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/TerraWorld.java @@ -35,7 +35,7 @@ public class TerraWorld { String partName = template.getGrids().get(i); try { BiomeGridBuilder g = config.getBiomeGrid(partName); - BiomeGrid b = g.build(w, c); + BiomeGrid b = g.build(w.getSeed(), c); definedGrids[i] = b; } catch(NullPointerException e) { safe = false; @@ -46,12 +46,12 @@ public class TerraWorld { main.getLogger().severe("Terrain will NOT generate properly at this point. Correct your config before using your server!"); } } - zone = new BiomeZone(w, c, definedGrids); + zone = new BiomeZone(w.getSeed(), c, definedGrids); if(template.getGridType().equals(TerraBiomeGrid.Type.RADIAL)) { - BiomeGrid internal = config.getBiomeGrid(template.getRadialInternalGrid()).build(w, c); - grid = new TerraRadialBiomeGrid(w, template.getGridFreqX(), template.getGridFreqZ(), zone, config, template.getRadialGridRadius(), internal); - } else grid = new TerraStandardBiomeGrid(w, template.getGridFreqX(), template.getGridFreqZ(), zone, config); + BiomeGrid internal = config.getBiomeGrid(template.getRadialInternalGrid()).build(w.getSeed(), c); + grid = new TerraRadialBiomeGrid(w.getSeed(), template.getGridFreqX(), template.getGridFreqZ(), zone, config, template.getRadialGridRadius(), internal); + } else grid = new TerraStandardBiomeGrid(w.getSeed(), template.getGridFreqX(), template.getGridFreqZ(), zone, config); } public static boolean isTerraWorld(World w) { diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java b/common/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java index ef106fde0..9c2bfc51d 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java @@ -2,24 +2,21 @@ package com.dfsek.terra.api.gaea.biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Location; public abstract class BiomeGrid { private final FastNoiseLite noiseX; private final FastNoiseLite noiseZ; - private final World world; private final int sizeX; private final int sizeZ; private Biome[][] grid; - public BiomeGrid(World w, double freq1, double freq2, int sizeX, int sizeZ) { + public BiomeGrid(long seed, double freq1, double freq2, int sizeX, int sizeZ) { this.sizeX = sizeX; this.sizeZ = sizeZ; - this.world = w; - this.noiseX = new FastNoiseLite((int) w.getSeed()); - this.noiseZ = new FastNoiseLite((int) w.getSeed() + 1); + this.noiseX = new FastNoiseLite((int) seed); + this.noiseZ = new FastNoiseLite((int) seed + 1); this.noiseX.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); this.noiseX.setFractalType(FastNoiseLite.FractalType.FBm); this.noiseX.setFractalOctaves(4); @@ -96,10 +93,6 @@ public abstract class BiomeGrid { return grid[normalize(biomeNoise, sizeX)][normalize(climateNoise, sizeZ)]; } - public World getWorld() { - return world; - } - public int getSizeX() { return sizeX; } diff --git a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java index e93d28b37..d9535363b 100644 --- a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java +++ b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java @@ -3,7 +3,6 @@ package com.dfsek.terra.biome; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.biome.NormalizationUtil; import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.image.ImageLoader; @@ -22,8 +21,8 @@ public class BiomeZone { private final boolean useImage; private final ImageLoader.Channel channel; - public BiomeZone(World w, ConfigPack wc, BiomeGrid[] grids) { - this.noise = new FastNoiseLite((int) w.getSeed() + 2); + public BiomeZone(long seed, ConfigPack wc, BiomeGrid[] grids) { + this.noise = new FastNoiseLite((int) seed + 2); this.noise.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); this.noise.setFractalType(FastNoiseLite.FractalType.FBm); this.noise.setFractalOctaves(4); diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java index c4412cd53..ef203f355 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java @@ -3,7 +3,6 @@ package com.dfsek.terra.biome.grid; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Location; /** @@ -12,8 +11,8 @@ import com.dfsek.terra.api.generic.world.vector.Location; public class SingleBiomeGrid extends BiomeGrid { private final Biome biome; - public SingleBiomeGrid(World w, Biome biome) { - super(w, 0, 0, 1, 1); + public SingleBiomeGrid(long seed, Biome biome) { + super(seed, 0, 0, 1, 1); this.biome = biome; } diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java index 61cbd749d..b86a55611 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java @@ -4,7 +4,6 @@ import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.biome.NormalizationUtil; import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; @@ -16,8 +15,8 @@ public class UserDefinedGrid extends BiomeGrid { private final ImageLoader.Channel channelX; private final ImageLoader.Channel channelZ; - public UserDefinedGrid(World w, double freq1, double freq2, Biome[][] b, ConfigPack c) { - super(w, freq1, freq2, b.length, b[0].length); + public UserDefinedGrid(long seed, double freq1, double freq2, Biome[][] b, ConfigPack c) { + super(seed, freq1, freq2, b.length, b[0].length); super.setGrid(b); ConfigPackTemplate t = c.getTemplate(); imageLoader = t.getImageLoader(); diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java index 6968a13e9..43a81a2e9 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java @@ -1,12 +1,11 @@ package com.dfsek.terra.biome.grid.master; import com.dfsek.terra.api.gaea.biome.BiomeGrid; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.grid.UserDefinedGrid; public abstract class TerraBiomeGrid extends BiomeGrid { - public TerraBiomeGrid(World w, double freq1, double freq2, int sizeX, int sizeZ) { - super(w, freq1, freq2, sizeX, sizeZ); + public TerraBiomeGrid(long seed, double freq1, double freq2, int sizeX, int sizeZ) { + super(seed, freq1, freq2, sizeX, sizeZ); } public abstract UserDefinedGrid getGrid(int x, int z); diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java index a55953071..6381c85f8 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java @@ -3,7 +3,6 @@ package com.dfsek.terra.biome.grid.master; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.BiomeZone; @@ -23,15 +22,15 @@ public class TerraRadialBiomeGrid extends TerraBiomeGrid { private CoordinatePerturb perturb; private ErosionNoise erode; - public TerraRadialBiomeGrid(World w, double freq1, double freq2, BiomeZone zone, ConfigPack c, double radius, BiomeGrid internal) { - super(w, freq1, freq2, 0, 0); + public TerraRadialBiomeGrid(long seed, double freq1, double freq2, BiomeZone zone, ConfigPack c, double radius, BiomeGrid internal) { + super(seed, freq1, freq2, 0, 0); ConfigPackTemplate t = c.getTemplate(); if(c.getTemplate().isBlend()) { - perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), w.getSeed()); + perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), seed); } this.zone = zone; if(c.getTemplate().isErode()) { - erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), w.getSeed()); + erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), seed); } this.radiusSq = FastMath.pow2(radius); this.internal = internal; diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java index e23838eba..d1f33df60 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java @@ -2,7 +2,6 @@ package com.dfsek.terra.biome.grid.master; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.BiomeZone; @@ -19,15 +18,15 @@ public class TerraStandardBiomeGrid extends TerraBiomeGrid { private CoordinatePerturb perturb; private ErosionNoise erode; - public TerraStandardBiomeGrid(World w, double freq1, double freq2, BiomeZone zone, ConfigPack c) { - super(w, freq1, freq2, 0, 0); + public TerraStandardBiomeGrid(long seed, double freq1, double freq2, BiomeZone zone, ConfigPack c) { + super(seed, freq1, freq2, 0, 0); ConfigPackTemplate t = c.getTemplate(); if(c.getTemplate().isBlend()) { - perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), w.getSeed()); + perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), seed); } this.zone = zone; if(c.getTemplate().isErode()) { - erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), w.getSeed()); + erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), seed); } } diff --git a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java index 6960a605e..e0c402088 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java @@ -1,9 +1,8 @@ package com.dfsek.terra.config.builder.biomegrid; import com.dfsek.terra.api.gaea.biome.BiomeGrid; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.config.base.ConfigPack; public interface BiomeGridBuilder { - BiomeGrid build(World world, ConfigPack config); + BiomeGrid build(long seed, ConfigPack config); } diff --git a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java index 121e7c8dc..8e03874a1 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java @@ -1,7 +1,6 @@ package com.dfsek.terra.config.builder.biomegrid; import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.grid.SingleBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; @@ -13,7 +12,7 @@ public class SingleGridBuilder implements BiomeGridBuilder { } @Override - public SingleBiomeGrid build(World world, ConfigPack config) { - return new SingleBiomeGrid(world, biome); + public SingleBiomeGrid build(long seed, ConfigPack config) { + return new SingleBiomeGrid(seed, biome); } } diff --git a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java index fcbef2910..0dbda3288 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java @@ -1,7 +1,6 @@ package com.dfsek.terra.config.builder.biomegrid; import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.grid.UserDefinedGrid; import com.dfsek.terra.config.base.ConfigPack; @@ -12,8 +11,8 @@ public class UserDefinedGridBuilder implements BiomeGridBuilder { private Biome[][] biomes; @Override - public UserDefinedGrid build(World world, ConfigPack config) { - return new UserDefinedGrid(world, 1D / xFreq, 1D / zFreq, biomes, config); + public UserDefinedGrid build(long seed, ConfigPack config) { + return new UserDefinedGrid(seed, 1D / xFreq, 1D / zFreq, biomes, config); } public double getXFreq() { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 2ea905a41..898ba09c2 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -16,6 +16,7 @@ import com.dfsek.terra.fabric.inventory.FabricItemHandle; import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; import com.dfsek.terra.fabric.world.FabricBiome; import com.dfsek.terra.fabric.world.FabricWorldHandle; +import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.world.generator.TerraChunkGeneratorCodec; import com.dfsek.terra.registry.ConfigRegistry; @@ -24,7 +25,6 @@ import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.world.GeneratorType; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.source.VanillaLayeredBiomeSource; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig; @@ -45,7 +45,8 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { new StructuresConfig(Optional.empty(), Collections.emptyMap()), biomeRegistry); config.updateLayerBlocks(); - return new FabricChunkGeneratorWrapper(new VanillaLayeredBiomeSource(seed, false, false, biomeRegistry), seed); + + return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed), seed); } }; private final TerraChunkGeneratorCodec chunkGeneratorCodec = new TerraChunkGeneratorCodec(this); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/codec/ConfigPackCodec.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/codec/ConfigPackCodec.java new file mode 100644 index 000000000..f2b0eae2b --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/codec/ConfigPackCodec.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.fabric.codec; + +import com.dfsek.terra.config.base.ConfigPack; +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.DynamicOps; + +public class ConfigPackCodec implements Codec { + @Override + public DataResult> decode(DynamicOps ops, T input) { + return null; + } + + @Override + public DataResult encode(ConfigPack input, DynamicOps ops, T prefix) { + return null; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeRegistry.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeRegistry.java new file mode 100644 index 000000000..007a2767d --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeRegistry.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.registry.TerraRegistry; +import net.minecraft.world.biome.Biome; + +public class FabricBiomeRegistry extends TerraRegistry { +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java new file mode 100644 index 000000000..0d09d9fdf --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java @@ -0,0 +1,45 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.RegistryLookupCodec; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.BiomeSource; + +import java.util.stream.Collectors; + +public class TerraBiomeSource extends BiomeSource { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + RegistryLookupCodec.of(Registry.BIOME_KEY).forGetter(source -> source.biomeRegistry), + Codec.LONG.fieldOf("seed").stable().forGetter(source -> source.seed)) + .apply(instance, instance.stable(TerraBiomeSource::new))); + + private final Registry biomeRegistry; + private final long seed; + private final TerraPlugin main; + + public TerraBiomeSource(Registry biomes, long seed) { + super(biomes.stream().collect(Collectors.toList())); + this.biomeRegistry = biomes; + this.seed = seed; + this.main = TerraFabricPlugin.getInstance(); + } + + @Override + protected Codec getCodec() { + return CODEC; + } + + @Override + public BiomeSource withSeed(long seed) { + return new TerraBiomeSource(this.biomeRegistry, seed); + } + + @Override + public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) { + return null; + } +}