mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-17 06:11:24 +00:00
implement API for 3d biomes
This commit is contained in:
+1
-1
@@ -37,7 +37,7 @@ public class ImageBiomeProvider implements BiomeProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Biome getBiome(int x, int z, long seed) {
|
public Biome getBiome(int x, int y, int z, long seed) {
|
||||||
x /= resolution;
|
x /= resolution;
|
||||||
z /= resolution;
|
z /= resolution;
|
||||||
Color color = align.getColor(image, x, z);
|
Color color = align.getColor(image, x, z);
|
||||||
|
|||||||
+1
-1
@@ -81,7 +81,7 @@ public class BiomePipelineProvider implements BiomeProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Biome getBiome(int x, int z, long seed) {
|
public Biome getBiome(int x, int y, int z, long seed) {
|
||||||
x += mutator.noise(seed + 1, x, z) * noiseAmp;
|
x += mutator.noise(seed + 1, x, z) * noiseAmp;
|
||||||
z += mutator.noise(seed + 2, x, z) * noiseAmp;
|
z += mutator.noise(seed + 2, x, z) * noiseAmp;
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@ public class SingleBiomeProvider implements BiomeProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Biome getBiome(int x, int z, long seed) {
|
public Biome getBiome(int x, int y, int z, long seed) {
|
||||||
return biome;
|
return biome;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -73,7 +73,7 @@ public class NoiseChunkGenerator3D implements ChunkGenerator {
|
|||||||
int cx = xOrig + x;
|
int cx = xOrig + x;
|
||||||
int cz = zOrig + z;
|
int cz = zOrig + z;
|
||||||
|
|
||||||
Biome biome = biomeProvider.getBiome(cx, cz, seed);
|
Biome biome = biomeProvider.getBiome(cx, 0, cz, seed);
|
||||||
|
|
||||||
PaletteInfo paletteInfo = biome.getContext().get(PaletteInfo.class);
|
PaletteInfo paletteInfo = biome.getContext().get(PaletteInfo.class);
|
||||||
|
|
||||||
@@ -104,7 +104,7 @@ public class NoiseChunkGenerator3D implements ChunkGenerator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProvider biomeProvider) {
|
public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProvider biomeProvider) {
|
||||||
Biome biome = biomeProvider.getBiome(x, z, world.getSeed());
|
Biome biome = biomeProvider.getBiome(x, y, z, world.getSeed());
|
||||||
Sampler3D sampler = samplerCache.get(x, z, world, biomeProvider);
|
Sampler3D sampler = samplerCache.get(x, z, world, biomeProvider);
|
||||||
|
|
||||||
PaletteInfo paletteInfo = biome.getContext().get(PaletteInfo.class);
|
PaletteInfo paletteInfo = biome.getContext().get(PaletteInfo.class);
|
||||||
@@ -128,7 +128,7 @@ public class NoiseChunkGenerator3D implements ChunkGenerator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Palette getPalette(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
public Palette getPalette(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||||
return biomeProvider.getBiome(x, z, world.getSeed()).getContext().get(PaletteInfo.class).paletteHolder().getPalette(y);
|
return biomeProvider.getBiome(x, y, z, world.getSeed()).getContext().get(PaletteInfo.class).paletteHolder().getPalette(y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SamplerProvider samplerProvider() {
|
public SamplerProvider samplerProvider() {
|
||||||
|
|||||||
+2
-2
@@ -55,7 +55,7 @@ public class ChunkInterpolator {
|
|||||||
|
|
||||||
for(int x = 0; x < 5; x++) {
|
for(int x = 0; x < 5; x++) {
|
||||||
for(int z = 0; z < 5; z++) {
|
for(int z = 0; z < 5; z++) {
|
||||||
BiomeNoiseProperties generationSettings = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed)
|
BiomeNoiseProperties generationSettings = provider.getBiome(xOrigin + (x << 2), 0, zOrigin + (z << 2), seed)
|
||||||
.getContext()
|
.getContext()
|
||||||
.get(BiomeNoiseProperties.class);
|
.get(BiomeNoiseProperties.class);
|
||||||
Map<BiomeNoiseProperties, MutableInteger> genMap = new HashMap<>();
|
Map<BiomeNoiseProperties, MutableInteger> genMap = new HashMap<>();
|
||||||
@@ -66,7 +66,7 @@ public class ChunkInterpolator {
|
|||||||
for(int xi = -blend; xi <= blend; xi++) {
|
for(int xi = -blend; xi <= blend; xi++) {
|
||||||
for(int zi = -blend; zi <= blend; zi++) {
|
for(int zi = -blend; zi <= blend; zi++) {
|
||||||
genMap.computeIfAbsent(
|
genMap.computeIfAbsent(
|
||||||
provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step), seed)
|
provider.getBiome(xOrigin + (x << 2) + (xi * step), 0, zOrigin + (z << 2) + (zi * step), seed)
|
||||||
.getContext()
|
.getContext()
|
||||||
.get(BiomeNoiseProperties.class),
|
.get(BiomeNoiseProperties.class),
|
||||||
g -> new MutableInteger(0)).increment(); // Increment by 1
|
g -> new MutableInteger(0)).increment(); // Increment by 1
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ public class ElevationInterpolator {
|
|||||||
// Precompute generators.
|
// Precompute generators.
|
||||||
for(int x = -1 - smooth; x <= 16 + smooth; x++) {
|
for(int x = -1 - smooth; x <= 16 + smooth; x++) {
|
||||||
for(int z = -1 - smooth; z <= 16 + smooth; z++) {
|
for(int z = -1 - smooth; z <= 16 + smooth; z++) {
|
||||||
gens[x + 1 + smooth][z + 1 + smooth] = provider.getBiome(xOrigin + x, zOrigin + z, seed).getContext().get(
|
gens[x + 1 + smooth][z + 1 + smooth] = provider.getBiome(xOrigin + x, 0, zOrigin + z, seed).getContext().get(
|
||||||
BiomeNoiseProperties.class);
|
BiomeNoiseProperties.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -48,7 +48,7 @@ public class LazilyEvaluatedInterpolator {
|
|||||||
|
|
||||||
NoiseSampler sampler = samplers[x][z];
|
NoiseSampler sampler = samplers[x][z];
|
||||||
if(sampler == null) {
|
if(sampler == null) {
|
||||||
sampler = biomeProvider.getBiome(xi, zi, seed).getContext().get(BiomeNoiseProperties.class).carving();
|
sampler = biomeProvider.getBiome(xi, y, zi, seed).getContext().get(BiomeNoiseProperties.class).carving();
|
||||||
samplers[x][z] = sampler;
|
samplers[x][z] = sampler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -49,7 +49,7 @@ public class FeatureGenerationStage implements GenerationStage, StringIdentifiab
|
|||||||
long coordinateSeed = (seed * 31 + tx) * 31 + tz;
|
long coordinateSeed = (seed * 31 + tx) * 31 + tz;
|
||||||
|
|
||||||
world.getBiomeProvider()
|
world.getBiomeProvider()
|
||||||
.getBiome(tx, tz, seed)
|
.getBiome(tx, 0, tz, seed)
|
||||||
.getContext()
|
.getContext()
|
||||||
.get(BiomeFeatures.class)
|
.get(BiomeFeatures.class)
|
||||||
.getFeatures()
|
.getFeatures()
|
||||||
|
|||||||
+30
-9
@@ -7,10 +7,17 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.api.world.biome.generation;
|
package com.dfsek.terra.api.world.biome.generation;
|
||||||
|
|
||||||
import com.dfsek.terra.api.util.vector.Vector2;
|
|
||||||
import com.dfsek.terra.api.util.vector.Vector3;
|
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.biome.Biome;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Contract;
|
||||||
|
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.StreamSupport;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides locations of biomes in a world.
|
* Provides locations of biomes in a world.
|
||||||
@@ -20,23 +27,26 @@ public interface BiomeProvider {
|
|||||||
* Get the biome at a location.
|
* Get the biome at a location.
|
||||||
*
|
*
|
||||||
* @param x X coordinate
|
* @param x X coordinate
|
||||||
|
* @param y
|
||||||
* @param z Z coordinate
|
* @param z Z coordinate
|
||||||
* @param seed World seed
|
* @param seed World seed
|
||||||
*
|
*
|
||||||
* @return Biome at the location
|
* @return Biome at the location
|
||||||
*/
|
*/
|
||||||
Biome getBiome(int x, int z, long seed);
|
@Contract(pure = true)
|
||||||
|
Biome getBiome(int x, int y, int z, long seed);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the biome at a location.
|
* Get the biome at a location.
|
||||||
*
|
*
|
||||||
* @param vector2 Location
|
* @param vector3 Location
|
||||||
* @param seed World seed
|
* @param seed World seed
|
||||||
*
|
*
|
||||||
* @return Biome at the location
|
* @return Biome at the location
|
||||||
*/
|
*/
|
||||||
default Biome getBiome(Vector2 vector2, long seed) {
|
@Contract(pure = true)
|
||||||
return getBiome(vector2.getBlockX(), vector2.getBlockZ(), seed);
|
default Biome getBiome(Vector3 vector3, long seed) {
|
||||||
|
return getBiome(vector3.getBlockX(), vector3.getBlockY(), vector3.getBlockZ(), seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -47,8 +57,9 @@ public interface BiomeProvider {
|
|||||||
*
|
*
|
||||||
* @return Biome at the location
|
* @return Biome at the location
|
||||||
*/
|
*/
|
||||||
default Biome getBiome(Vector3 vector3, long seed) {
|
@Contract(pure = true)
|
||||||
return getBiome(vector3.getBlockX(), vector3.getBlockZ(), seed);
|
default Biome getBiome(Vector3Int vector3, long seed) {
|
||||||
|
return getBiome(vector3.getX(), vector3.getY(), vector3.getZ(), seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -58,9 +69,19 @@ public interface BiomeProvider {
|
|||||||
*
|
*
|
||||||
* @return {@link Iterable} of all biomes this provider can generate.
|
* @return {@link Iterable} of all biomes this provider can generate.
|
||||||
*/
|
*/
|
||||||
|
@Contract(pure = true)
|
||||||
Iterable<Biome> getBiomes();
|
Iterable<Biome> getBiomes();
|
||||||
|
|
||||||
default BiomeProvider caching() {
|
@Contract(pure = true)
|
||||||
return new CachingBiomeProvider(this);
|
default Stream<Biome> stream() {
|
||||||
|
return StreamSupport.stream(getBiomes().spliterator(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
default BiomeProvider caching(int minY, int maxY) {
|
||||||
|
return new CachingBiomeProvider(this, minY, maxY);
|
||||||
|
}
|
||||||
|
|
||||||
|
default BiomeProvider caching(WorldProperties worldProperties) {
|
||||||
|
return caching(worldProperties.getMinHeight(), worldProperties.getMaxHeight());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-7
@@ -1,12 +1,12 @@
|
|||||||
package com.dfsek.terra.api.world.biome.generation;
|
package com.dfsek.terra.api.world.biome.generation;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.Handle;
|
import com.dfsek.terra.api.Handle;
|
||||||
import com.dfsek.terra.api.util.MathUtil;
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A biome provider implementation that lazily evaluates biomes, and caches them.
|
* A biome provider implementation that lazily evaluates biomes, and caches them.
|
||||||
@@ -15,10 +15,14 @@ import com.dfsek.terra.api.world.biome.Biome;
|
|||||||
*/
|
*/
|
||||||
public class CachingBiomeProvider implements BiomeProvider, Handle {
|
public class CachingBiomeProvider implements BiomeProvider, Handle {
|
||||||
private final BiomeProvider delegate;
|
private final BiomeProvider delegate;
|
||||||
private final Map<Long, Biome> cache = new HashMap<>();
|
private final int minY;
|
||||||
|
private final int maxY;
|
||||||
|
private final Map<Long, Biome[]> cache = new HashMap<>();
|
||||||
|
|
||||||
protected CachingBiomeProvider(BiomeProvider delegate) {
|
protected CachingBiomeProvider(BiomeProvider delegate, int minY, int maxY) {
|
||||||
this.delegate = delegate;
|
this.delegate = delegate;
|
||||||
|
this.minY = minY;
|
||||||
|
this.maxY = maxY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -27,8 +31,14 @@ public class CachingBiomeProvider implements BiomeProvider, Handle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Biome getBiome(int x, int z, long seed) {
|
public Biome getBiome(int x, int y, int z, long seed) {
|
||||||
return cache.computeIfAbsent(MathUtil.squash(x, z), key -> delegate.getBiome(x, z, seed));
|
if(y >= maxY || y < minY) throw new IllegalArgumentException("Y out of range: " + y + " (min: " + minY + ", max: " + maxY + ")");
|
||||||
|
Biome[] biomes = cache.computeIfAbsent(MathUtil.squash(x, z), key -> new Biome[maxY - minY]);
|
||||||
|
int yi = y - minY;
|
||||||
|
if(biomes[yi] == null) {
|
||||||
|
biomes[yi] = delegate.getBiome(x, y, z, seed);
|
||||||
|
}
|
||||||
|
return biomes[yi];
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+1
-1
@@ -19,7 +19,7 @@ public class BukkitBiomeProvider extends BiomeProvider implements Handle {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull org.bukkit.block.Biome getBiome(@NotNull WorldInfo worldInfo, int x, int y, int z) {
|
public @NotNull org.bukkit.block.Biome getBiome(@NotNull WorldInfo worldInfo, int x, int y, int z) {
|
||||||
Biome biome = delegate.getBiome(x, z, worldInfo.getSeed());
|
Biome biome = delegate.getBiome(x, y, z, worldInfo.getSeed());
|
||||||
return (org.bukkit.block.Biome) biome.getPlatformBiome().getHandle();
|
return (org.bukkit.block.Biome) biome.getPlatformBiome().getHandle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -59,8 +59,8 @@ public class BukkitChunkGeneratorWrapper extends org.bukkit.generator.ChunkGener
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void generateNoise(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z, @NotNull ChunkData chunkData) {
|
public void generateNoise(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z, @NotNull ChunkData chunkData) {
|
||||||
delegate.generateChunkData(new BukkitProtoChunk(chunkData), new BukkitWorldProperties(worldInfo), pack.getBiomeProvider().caching(),
|
BukkitWorldProperties properties = new BukkitWorldProperties(worldInfo);
|
||||||
x, z);
|
delegate.generateChunkData(new BukkitProtoChunk(chunkData), properties, pack.getBiomeProvider().caching(properties), x, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ public class CLIWorld implements ServerWorld, NBTSerializable<Stream<Pair<Vector
|
|||||||
try {
|
try {
|
||||||
int num = amount.getAndIncrement();
|
int num = amount.getAndIncrement();
|
||||||
CLIChunk chunk = getChunkAt(finalX, finalZ);
|
CLIChunk chunk = getChunkAt(finalX, finalZ);
|
||||||
chunkGenerator.generateChunkData(chunk, this, pack.getBiomeProvider().caching(), finalX, finalZ);
|
chunkGenerator.generateChunkData(chunk, this, pack.getBiomeProvider().caching(this), finalX, finalZ);
|
||||||
CLIProtoWorld protoWorld = new CLIProtoWorld(this, finalX, finalZ);
|
CLIProtoWorld protoWorld = new CLIProtoWorld(this, finalX, finalZ);
|
||||||
pack.getStages().forEach(stage -> stage.populate(protoWorld));
|
pack.getStages().forEach(stage -> stage.populate(protoWorld));
|
||||||
if(num % 240 == 239) {
|
if(num % 240 == 239) {
|
||||||
|
|||||||
+9
-5
@@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.fabric.generation;
|
package com.dfsek.terra.fabric.generation;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||||
|
|
||||||
import com.mojang.serialization.Codec;
|
import com.mojang.serialization.Codec;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.structure.StructureSet;
|
import net.minecraft.structure.StructureSet;
|
||||||
@@ -128,7 +130,7 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C
|
|||||||
public CompletableFuture<Chunk> populateNoise(Executor executor, Blender arg, StructureAccessor structureAccessor, Chunk chunk) {
|
public CompletableFuture<Chunk> populateNoise(Executor executor, Blender arg, StructureAccessor structureAccessor, Chunk chunk) {
|
||||||
return CompletableFuture.supplyAsync(() -> {
|
return CompletableFuture.supplyAsync(() -> {
|
||||||
ProtoWorld world = (ProtoWorld) ((StructureAccessorAccessor) structureAccessor).getWorld();
|
ProtoWorld world = (ProtoWorld) ((StructureAccessorAccessor) structureAccessor).getWorld();
|
||||||
BiomeProvider biomeProvider = pack.getBiomeProvider().caching();
|
BiomeProvider biomeProvider = pack.getBiomeProvider().caching(world);
|
||||||
delegate.generateChunkData((ProtoChunk) chunk, world, biomeProvider, chunk.getPos().x, chunk.getPos().z);
|
delegate.generateChunkData((ProtoChunk) chunk, world, biomeProvider, chunk.getPos().x, chunk.getPos().z);
|
||||||
|
|
||||||
PreLoadCompatibilityOptions compatibilityOptions = pack.getContext().get(PreLoadCompatibilityOptions.class);
|
PreLoadCompatibilityOptions compatibilityOptions = pack.getContext().get(PreLoadCompatibilityOptions.class);
|
||||||
@@ -163,9 +165,10 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C
|
|||||||
@Override
|
@Override
|
||||||
public int getHeight(int x, int z, Heightmap.Type heightmap, HeightLimitView height) {
|
public int getHeight(int x, int z, Heightmap.Type heightmap, HeightLimitView height) {
|
||||||
int y = height.getTopY();
|
int y = height.getTopY();
|
||||||
BiomeProvider biomeProvider = pack.getBiomeProvider().caching();
|
WorldProperties properties = FabricAdapter.adapt(height, seed);
|
||||||
|
BiomeProvider biomeProvider = pack.getBiomeProvider().caching(properties);
|
||||||
while(y >= getMinimumY() && !heightmap.getBlockPredicate().test(
|
while(y >= getMinimumY() && !heightmap.getBlockPredicate().test(
|
||||||
(BlockState) delegate.getBlock(FabricAdapter.adapt(height, seed), x, y - 1, z, biomeProvider))) {
|
(BlockState) delegate.getBlock(properties, x, y - 1, z, biomeProvider))) {
|
||||||
y--;
|
y--;
|
||||||
}
|
}
|
||||||
return y;
|
return y;
|
||||||
@@ -174,9 +177,10 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C
|
|||||||
@Override
|
@Override
|
||||||
public VerticalBlockSample getColumnSample(int x, int z, HeightLimitView height) {
|
public VerticalBlockSample getColumnSample(int x, int z, HeightLimitView height) {
|
||||||
BlockState[] array = new BlockState[height.getHeight()];
|
BlockState[] array = new BlockState[height.getHeight()];
|
||||||
BiomeProvider biomeProvider = pack.getBiomeProvider().caching();
|
WorldProperties properties = FabricAdapter.adapt(height, seed);
|
||||||
|
BiomeProvider biomeProvider = pack.getBiomeProvider().caching(properties);
|
||||||
for(int y = height.getTopY() - 1; y >= height.getBottomY(); y--) {
|
for(int y = height.getTopY() - 1; y >= height.getBottomY(); y--) {
|
||||||
array[y - height.getBottomY()] = (BlockState) delegate.getBlock(FabricAdapter.adapt(height, seed), x, y, z, biomeProvider);
|
array[y - height.getBottomY()] = (BlockState) delegate.getBlock(properties, x, y, z, biomeProvider);
|
||||||
}
|
}
|
||||||
return new VerticalBlockSample(height.getBottomY(), array);
|
return new VerticalBlockSample(height.getBottomY(), array);
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -67,7 +67,7 @@ public class TerraBiomeSource extends BiomeSource {
|
|||||||
public RegistryEntry<net.minecraft.world.biome.Biome> getBiome(int biomeX, int biomeY, int biomeZ, MultiNoiseSampler noiseSampler) {
|
public RegistryEntry<net.minecraft.world.biome.Biome> getBiome(int biomeX, int biomeY, int biomeZ, MultiNoiseSampler noiseSampler) {
|
||||||
return biomeRegistry.getOrCreateEntry(((ProtoPlatformBiome) pack
|
return biomeRegistry.getOrCreateEntry(((ProtoPlatformBiome) pack
|
||||||
.getBiomeProvider()
|
.getBiomeProvider()
|
||||||
.getBiome(biomeX << 2, biomeZ << 2, seed)
|
.getBiome(biomeX << 2, biomeY << 2, biomeZ << 2, seed)
|
||||||
.getPlatformBiome())
|
.getPlatformBiome())
|
||||||
.getDelegate());
|
.getDelegate());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user