Biome height support

This commit is contained in:
paulevsGitch 2021-03-29 08:49:40 +03:00
parent 21358808e4
commit cee5c914f9
36 changed files with 212 additions and 41 deletions

View file

@ -10,8 +10,8 @@ import net.minecraft.world.biome.SpawnSettings.SpawnEntry;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.integration.Integrations; import ru.betterend.integration.Integrations;
import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.integration.byg.features.BYGFeatures;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
import ru.betterend.world.biome.land.BiomeDefinition;
public class EterialGrove extends EndBiome { public class EterialGrove extends EndBiome {
public EterialGrove() { public EterialGrove() {

View file

@ -13,8 +13,8 @@ import ru.betterend.BetterEnd;
import ru.betterend.integration.Integrations; import ru.betterend.integration.Integrations;
import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.integration.byg.features.BYGFeatures;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
import ru.betterend.world.biome.land.BiomeDefinition;
public class NightshadeRedwoods extends EndBiome { public class NightshadeRedwoods extends EndBiome {
public NightshadeRedwoods() { public NightshadeRedwoods() {

View file

@ -20,8 +20,8 @@ import ru.betterend.BetterEnd;
import ru.betterend.integration.Integrations; import ru.betterend.integration.Integrations;
import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.integration.byg.features.BYGFeatures;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
import ru.betterend.world.biome.land.BiomeDefinition;
public class OldBulbisGardens extends EndBiome { public class OldBulbisGardens extends EndBiome {
public OldBulbisGardens() { public OldBulbisGardens() {

View file

@ -10,17 +10,23 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.biome.source.BiomeSource;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
import net.minecraft.world.gen.chunk.NoiseChunkGenerator; import net.minecraft.world.gen.chunk.NoiseChunkGenerator;
import net.minecraft.world.gen.chunk.StructuresConfig;
import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.generator.GeneratorOptions;
import ru.betterend.world.generator.TerrainGenerator; import ru.betterend.world.generator.TerrainGenerator;
@Mixin(NoiseChunkGenerator.class) @Mixin(NoiseChunkGenerator.class)
public abstract class NoiseChunkGeneratorMixin { public abstract class NoiseChunkGeneratorMixin extends ChunkGenerator {
@Final @Final
@Shadow @Shadow
protected Supplier<ChunkGeneratorSettings> settings; protected Supplier<ChunkGeneratorSettings> settings;
public NoiseChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, StructuresConfig structuresConfig, long worldSeed) {
super(populationSource, biomeSource, structuresConfig, worldSeed);
}
@Inject(method = "<init>(Lnet/minecraft/world/biome/source/BiomeSource;Lnet/minecraft/world/biome/source/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL")) @Inject(method = "<init>(Lnet/minecraft/world/biome/source/BiomeSource;Lnet/minecraft/world/biome/source/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL"))
private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, Supplier<ChunkGeneratorSettings> settings, CallbackInfo info) { private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, Supplier<ChunkGeneratorSettings> settings, CallbackInfo info) {
TerrainGenerator.initNoise(seed); TerrainGenerator.initNoise(seed);
@ -30,7 +36,7 @@ public abstract class NoiseChunkGeneratorMixin {
private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) {
if (GeneratorOptions.useNewGenerator() && settings.get().equals(ChunkGeneratorSettings.END)) { if (GeneratorOptions.useNewGenerator() && settings.get().equals(ChunkGeneratorSettings.END)) {
if (TerrainGenerator.canGenerate(x, z)) { if (TerrainGenerator.canGenerate(x, z)) {
TerrainGenerator.fillTerrainDensity(buffer, x, z); TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource());
info.cancel(); info.cancel();
} }
} }

View file

@ -287,8 +287,8 @@ public class EndBiomes {
* @return registered {@link EndBiome} * @return registered {@link EndBiome}
*/ */
public static EndBiome registerSubBiome(EndBiome biome, EndBiome parent) { public static EndBiome registerSubBiome(EndBiome biome, EndBiome parent) {
registerBiomeDirectly(biome);
if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) {
registerBiomeDirectly(biome);
parent.addSubBiome(biome); parent.addSubBiome(biome);
SUBBIOMES.add(biome); SUBBIOMES.add(biome);
SUBBIOMES_UNMUTABLES.add(biome.getID()); SUBBIOMES_UNMUTABLES.add(biome.getID());
@ -305,8 +305,8 @@ public class EndBiomes {
* @return registered {@link EndBiome} * @return registered {@link EndBiome}
*/ */
public static EndBiome registerBiome(EndBiome biome, BiomeType type) { public static EndBiome registerBiome(EndBiome biome, BiomeType type) {
registerBiomeDirectly(biome);
if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) {
registerBiomeDirectly(biome);
addToPicker(biome, type); addToPicker(biome, type);
ID_MAP.put(biome.getID(), biome); ID_MAP.put(biome.getID(), biome);
if (type == BiomeType.LAND) { if (type == BiomeType.LAND) {
@ -325,8 +325,8 @@ public class EndBiomes {
* @return registered {@link EndBiome} * @return registered {@link EndBiome}
*/ */
public static EndBiome registerSubBiomeIntegration(EndBiome biome) { public static EndBiome registerSubBiomeIntegration(EndBiome biome) {
registerBiomeDirectly(biome);
if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) {
registerBiomeDirectly(biome);
SUBBIOMES.add(biome); SUBBIOMES.add(biome);
SUBBIOMES_UNMUTABLES.add(biome.getID()); SUBBIOMES_UNMUTABLES.add(biome.getID());
ID_MAP.put(biome.getID(), biome); ID_MAP.put(biome.getID(), biome);
@ -367,9 +367,7 @@ public class EndBiomes {
} }
private static void registerBiomeDirectly(EndBiome biome) { private static void registerBiomeDirectly(EndBiome biome) {
if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { Registry.register(BuiltinRegistries.BIOME, biome.getID(), biome.getBiome());
Registry.register(BuiltinRegistries.BIOME, biome.getID(), biome.getBiome());
}
} }
private static void addLandBiomeToFabricApi(EndBiome biome) { private static void addLandBiomeToFabricApi(EndBiome biome) {
@ -420,8 +418,8 @@ public class EndBiomes {
} }
public static EndCaveBiome registerCaveBiome(EndCaveBiome biome) { public static EndCaveBiome registerCaveBiome(EndCaveBiome biome) {
registerBiomeDirectly(biome);
if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) {
registerBiomeDirectly(biome);
CAVE_BIOMES.addBiome(biome); CAVE_BIOMES.addBiome(biome);
ID_MAP.put(biome.getID(), biome); ID_MAP.put(biome.getID(), biome);
} }

View file

@ -11,8 +11,8 @@ import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.GenerationStep;
import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.ConfiguredFeature;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
import ru.betterend.world.biome.land.BiomeDefinition;
import ru.betterend.world.features.BlueVineFeature; import ru.betterend.world.features.BlueVineFeature;
import ru.betterend.world.features.CavePumpkinFeature; import ru.betterend.world.features.CavePumpkinFeature;
import ru.betterend.world.features.CharniaFeature; import ru.betterend.world.features.CharniaFeature;

View file

@ -0,0 +1,60 @@
package ru.betterend.util.sdf.operator;
import net.minecraft.util.math.MathHelper;
import ru.betterend.noise.OpenSimplexNoise;
import ru.betterend.util.MHelper;
public class SDFRadialNoiseMap extends SDFDisplacement {
private static final float SIN = MathHelper.sin(0.5F);
private static final float COS = MathHelper.cos(0.5F);
private OpenSimplexNoise noise;
private float intensity = 1F;
private float radius = 1F;
private short offsetX;
private short offsetZ;
public SDFRadialNoiseMap() {
setFunction((pos) -> {
if (intensity == 0) {
return 0F;
}
float px = pos.getX() / radius;
float pz = pos.getZ() / radius;
float distance = MHelper.lengthSqr(px, pz);
if (distance > 1) {
return 0F;
}
distance = 1 - MathHelper.sqrt(distance);
float nx = px * COS - pz * SIN;
float nz = pz * COS + px * SIN;
distance *= getNoise(nx * 0.75 + offsetX, nz * 0.75 + offsetZ);
return distance * intensity;
});
}
private float getNoise(double x, double z) {
return (float) noise.eval(x, z) + (float) noise.eval(x * 3 + 1000, z * 3) * 0.5F + (float) noise.eval(x * 9 + 1000, z * 9) * 0.2F;
}
public SDFRadialNoiseMap setSeed(long seed) {
noise = new OpenSimplexNoise(seed);
return this;
}
public SDFRadialNoiseMap setIntensity(float intensity) {
this.intensity = intensity;
return this;
}
public SDFRadialNoiseMap setRadius(float radius) {
this.radius = radius;
return this;
}
public SDFRadialNoiseMap setOffset(int x, int z) {
offsetX = (short) (x & 32767);
offsetZ = (short) (z & 32767);
return this;
}
}

View file

@ -1,4 +1,4 @@
package ru.betterend.world.biome.land; package ru.betterend.world.biome;
import java.util.List; import java.util.List;
@ -63,6 +63,7 @@ public class BiomeDefinition {
private int foliageColor = DEF_FOLIAGE; private int foliageColor = DEF_FOLIAGE;
private int grassColor = DEF_FOLIAGE; private int grassColor = DEF_FOLIAGE;
private float fogDensity = 1F; private float fogDensity = 1F;
private float depth = 0.1F;
private final Identifier id; private final Identifier id;
private float genChance = 1F; private float genChance = 1F;
@ -112,6 +113,11 @@ public class BiomeDefinition {
this.genChance = genChance; this.genChance = genChance;
return this; return this;
} }
public BiomeDefinition setDepth(float depth) {
this.depth = depth;
return this;
}
public BiomeDefinition addMobSpawn(EntityType<?> type, int weight, int minGroupSize, int maxGroupSize) { public BiomeDefinition addMobSpawn(EntityType<?> type, int weight, int minGroupSize, int maxGroupSize) {
Identifier eID = Registry.ENTITY_TYPE.getId(type); Identifier eID = Registry.ENTITY_TYPE.getId(type);
@ -256,7 +262,7 @@ public class BiomeDefinition {
return new Biome.Builder() return new Biome.Builder()
.precipitation(Precipitation.NONE) .precipitation(Precipitation.NONE)
.category(isCaveBiome ? Category.NONE : Category.THEEND) .category(isCaveBiome ? Category.NONE : Category.THEEND)
.depth(0.1F) .depth(depth)
.scale(0.2F) .scale(0.2F)
.temperature(2.0F) .temperature(2.0F)
.downfall(0.0F) .downfall(0.0F)

View file

@ -14,7 +14,6 @@ import net.minecraft.world.biome.Biome;
import ru.betterend.config.Configs; import ru.betterend.config.Configs;
import ru.betterend.util.JsonFactory; import ru.betterend.util.JsonFactory;
import ru.betterend.util.StructureHelper; import ru.betterend.util.StructureHelper;
import ru.betterend.world.biome.land.BiomeDefinition;
import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.EndFeature;
import ru.betterend.world.features.ListFeature; import ru.betterend.world.features.ListFeature;
import ru.betterend.world.features.ListFeature.StructureInfo; import ru.betterend.world.features.ListFeature.StructureInfo;

View file

@ -4,8 +4,8 @@ import net.minecraft.entity.EntityType;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndParticles;
import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndStructures;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
import ru.betterend.world.biome.land.BiomeDefinition;
public class BiomeIceStarfield extends EndBiome { public class BiomeIceStarfield extends EndBiome {
public BiomeIceStarfield() { public BiomeIceStarfield() {

View file

@ -3,7 +3,7 @@ package ru.betterend.world.biome.cave;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndParticles;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.biome.BiomeDefinition;
public class EmptyAuroraCaveBiome extends EndCaveBiome { public class EmptyAuroraCaveBiome extends EndCaveBiome {
public EmptyAuroraCaveBiome() { public EmptyAuroraCaveBiome() {

View file

@ -2,7 +2,7 @@ package ru.betterend.world.biome.cave;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.biome.BiomeDefinition;
public class EmptyEndCaveBiome extends EndCaveBiome { public class EmptyEndCaveBiome extends EndCaveBiome {
public EmptyEndCaveBiome() { public EmptyEndCaveBiome() {

View file

@ -3,7 +3,7 @@ package ru.betterend.world.biome.cave;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndParticles;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.biome.BiomeDefinition;
public class EmptySmaragdantCaveBiome extends EndCaveBiome { public class EmptySmaragdantCaveBiome extends EndCaveBiome {
public EmptySmaragdantCaveBiome() { public EmptySmaragdantCaveBiome() {

View file

@ -7,8 +7,8 @@ import net.minecraft.util.collection.WeightedList;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.gen.feature.Feature; import net.minecraft.world.gen.feature.Feature;
import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBiomes;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
import ru.betterend.world.biome.land.BiomeDefinition;
import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.EndFeature;
import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature; import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature;

View file

@ -8,7 +8,7 @@ import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndParticles;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.biome.BiomeDefinition;
public class LushAuroraCaveBiome extends EndCaveBiome { public class LushAuroraCaveBiome extends EndCaveBiome {
public LushAuroraCaveBiome() { public LushAuroraCaveBiome() {

View file

@ -4,7 +4,7 @@ import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndParticles;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.biome.BiomeDefinition;
public class LushSmaragdantCaveBiome extends EndCaveBiome { public class LushSmaragdantCaveBiome extends EndCaveBiome {
public LushSmaragdantCaveBiome() { public LushSmaragdantCaveBiome() {

View file

@ -7,6 +7,7 @@ import ru.betterend.registry.EndEntities;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndParticles;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class AmberLandBiome extends EndBiome { public class AmberLandBiome extends EndBiome {

View file

@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndEntities;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class BlossomingSpiresBiome extends EndBiome { public class BlossomingSpiresBiome extends EndBiome {

View file

@ -9,6 +9,7 @@ import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndEntities;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class ChorusForestBiome extends EndBiome { public class ChorusForestBiome extends EndBiome {

View file

@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndStructures;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class CrystalMountainsBiome extends EndBiome { public class CrystalMountainsBiome extends EndBiome {

View file

@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndParticles;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class DragonGraveyardsBiome extends EndBiome { public class DragonGraveyardsBiome extends EndBiome {

View file

@ -5,6 +5,7 @@ import net.minecraft.world.gen.feature.ConfiguredStructureFeatures;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class DryShrublandBiome extends EndBiome { public class DryShrublandBiome extends EndBiome {

View file

@ -5,6 +5,7 @@ import net.minecraft.particle.ParticleTypes;
import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class DustWastelandsBiome extends EndBiome { public class DustWastelandsBiome extends EndBiome {

View file

@ -8,6 +8,7 @@ import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndParticles;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndStructures;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class FoggyMushroomlandBiome extends EndBiome { public class FoggyMushroomlandBiome extends EndBiome {

View file

@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndParticles;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class GlowingGrasslandsBiome extends EndBiome { public class GlowingGrasslandsBiome extends EndBiome {

View file

@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndParticles;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class LanternWoodsBiome extends EndBiome { public class LanternWoodsBiome extends EndBiome {

View file

@ -6,6 +6,7 @@ import ru.betterend.registry.EndEntities;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndStructures;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class MegalakeBiome extends EndBiome { public class MegalakeBiome extends EndBiome {
@ -18,6 +19,7 @@ public class MegalakeBiome extends EndBiome {
.setMusic(EndSounds.MUSIC_WATER) .setMusic(EndSounds.MUSIC_WATER)
.setLoop(EndSounds.AMBIENT_MEGALAKE) .setLoop(EndSounds.AMBIENT_MEGALAKE)
.setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST) .setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST)
.setDepth(0F)
.addStructureFeature(EndStructures.MEGALAKE) .addStructureFeature(EndStructures.MEGALAKE)
.addFeature(EndFeatures.END_LOTUS) .addFeature(EndFeatures.END_LOTUS)
.addFeature(EndFeatures.END_LOTUS_LEAF) .addFeature(EndFeatures.END_LOTUS_LEAF)

View file

@ -7,6 +7,7 @@ import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndParticles;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndStructures;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class MegalakeGroveBiome extends EndBiome { public class MegalakeGroveBiome extends EndBiome {
@ -20,6 +21,7 @@ public class MegalakeGroveBiome extends EndBiome {
.setMusic(EndSounds.MUSIC_WATER) .setMusic(EndSounds.MUSIC_WATER)
.setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE) .setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE)
.setSurface(EndBlocks.END_MOSS) .setSurface(EndBlocks.END_MOSS)
.setDepth(0F)
.addStructureFeature(EndStructures.MEGALAKE_SMALL) .addStructureFeature(EndStructures.MEGALAKE_SMALL)
.addFeature(EndFeatures.LACUGROVE) .addFeature(EndFeatures.LACUGROVE)
.addFeature(EndFeatures.END_LOTUS) .addFeature(EndFeatures.END_LOTUS)

View file

@ -6,6 +6,7 @@ import net.minecraft.world.gen.feature.ConfiguredStructureFeatures;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class NeonOasisBiome extends EndBiome { public class NeonOasisBiome extends EndBiome {

View file

@ -5,6 +5,7 @@ import net.minecraft.particle.ParticleTypes;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndStructures;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class PaintedMountainsBiome extends EndBiome { public class PaintedMountainsBiome extends EndBiome {

View file

@ -7,6 +7,7 @@ import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndEntities;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class ShadowForestBiome extends EndBiome { public class ShadowForestBiome extends EndBiome {

View file

@ -5,6 +5,7 @@ import ru.betterend.registry.EndEntities;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndParticles;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
import ru.betterend.world.surface.SurfaceBuilders; import ru.betterend.world.surface.SurfaceBuilders;
@ -19,6 +20,7 @@ public class SulphurSpringsBiome extends EndBiome {
.setFogColor(207, 194, 62) .setFogColor(207, 194, 62)
.setFogDensity(1.5F) .setFogDensity(1.5F)
.setCaves(false) .setCaves(false)
.setDepth(0F)
.setParticles(EndParticles.SULPHUR_PARTICLE, 0.001F) .setParticles(EndParticles.SULPHUR_PARTICLE, 0.001F)
.addFeature(EndFeatures.GEYSER) .addFeature(EndFeatures.GEYSER)
.addFeature(EndFeatures.SURFACE_VENT) .addFeature(EndFeatures.SURFACE_VENT)

View file

@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndParticles;
import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndSounds;
import ru.betterend.world.biome.BiomeDefinition;
import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.EndBiome;
public class UmbrellaJungleBiome extends EndBiome { public class UmbrellaJungleBiome extends EndBiome {

View file

@ -108,6 +108,24 @@ public class BetterEndBiomeSource extends BiomeSource {
return endBiome.getActualBiome(); return endBiome.getActualBiome();
} }
} }
public Biome getLandBiome(int biomeX, int biomeY, int biomeZ) {
boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid();
long i = (long) biomeX * (long) biomeX;
long j = (long) biomeZ * (long) biomeZ;
long dist = i + j;
if (hasVoid) {
if (dist <= 65536L) return this.centerBiome;
}
else if (dist <= 625L) {
dist += noise.sample(i * 0.2, j * 0.2) * 10;
if (dist <= 625L) {
return this.centerBiome;
}
}
return mapLand.getBiome(biomeX << 2, biomeZ << 2).getActualBiome();
}
@Override @Override
public BiomeSource withSeed(long seed) { public BiomeSource withSeed(long seed) {

View file

@ -1,7 +1,5 @@
package ru.betterend.world.generator; package ru.betterend.world.generator;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -10,13 +8,11 @@ import java.util.Random;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import net.minecraft.client.texture.NativeImage;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import ru.betterend.BetterEnd;
import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.noise.OpenSimplexNoise;
import ru.betterend.util.MHelper; import ru.betterend.util.MHelper;
import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.SDF;
import ru.betterend.util.sdf.operator.SDFHeightmap; import ru.betterend.util.sdf.operator.SDFRadialNoiseMap;
import ru.betterend.util.sdf.operator.SDFScale; import ru.betterend.util.sdf.operator.SDFScale;
import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFSmoothUnion;
import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFTranslate;
@ -24,7 +20,8 @@ import ru.betterend.util.sdf.primitive.SDFCappedCone;
public class IslandLayer { public class IslandLayer {
private static final Random RANDOM = new Random(); private static final Random RANDOM = new Random();
private static final SDF[] ISLAND; private final SDFRadialNoiseMap noise;
private final SDF island;
private final List<BlockPos> positions = new ArrayList<BlockPos>(9); private final List<BlockPos> positions = new ArrayList<BlockPos>(9);
private final Map<BlockPos, SDF> islands = Maps.newHashMap(); private final Map<BlockPos, SDF> islands = Maps.newHashMap();
@ -38,6 +35,16 @@ public class IslandLayer {
this.density = new OpenSimplexNoise(seed); this.density = new OpenSimplexNoise(seed);
this.options = options; this.options = options;
this.seed = seed; this.seed = seed;
SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F);
SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F);
SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F);
SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F);
SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2);
SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4);
noise = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSeed(seed).setRadius(0.5F).setIntensity(0.2F).setSource(coneTop);
island = new SDFSmoothUnion().setRadius(0.01F).setSourceA(noise).setSourceB(coneBottom);
} }
private int getSeed(int x, int z) { private int getSeed(int x, int z) {
@ -47,7 +54,6 @@ public class IslandLayer {
} }
public void updatePositions(double x, double z) { public void updatePositions(double x, double z) {
int ix = MHelper.floor(x / options.distance); int ix = MHelper.floor(x / options.distance);
int iz = MHelper.floor(z / options.distance); int iz = MHelper.floor(z / options.distance);
@ -91,14 +97,15 @@ public class IslandLayer {
SDF island = islands.get(pos); SDF island = islands.get(pos);
if (island == null) { if (island == null) {
if (pos.getX() == 0 && pos.getZ() == 0) { if (pos.getX() == 0 && pos.getZ() == 0) {
island = new SDFScale().setScale(1.3F).setSource(ISLAND[0]); island = new SDFScale().setScale(1.3F).setSource(this.island);
} }
else { else {
RANDOM.setSeed(getSeed(pos.getX(), pos.getZ())); RANDOM.setSeed(getSeed(pos.getX(), pos.getZ()));
island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(ISLAND[0]); island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(this.island);
} }
islands.put(pos, island); islands.put(pos, island);
} }
noise.setOffset(pos.getX(), pos.getZ());
return island; return island;
} }
@ -123,6 +130,12 @@ public class IslandLayer {
return -calculateSDF(x, y, z); return -calculateSDF(x, y, z);
} }
public float getDensity(double x, double y, double z, float height) {
noise.setIntensity(height);
noise.setRadius(0.5F / (1 + height));
return -calculateSDF(x, y, z);
}
public void clearCache() { public void clearCache() {
if (islands.size() > 128) { if (islands.size() > 128) {
islands.clear(); islands.clear();
@ -135,7 +148,7 @@ public class IslandLayer {
return new SDFTranslate().setTranslate(0, minY + hh, 0).setSource(sdf); return new SDFTranslate().setTranslate(0, minY + hh, 0).setSource(sdf);
} }
private static NativeImage loadMap(String path) { /*private static NativeImage loadMap(String path) {
InputStream stream = IslandLayer.class.getResourceAsStream(path); InputStream stream = IslandLayer.class.getResourceAsStream(path);
if (stream != null) { if (stream != null) {
try { try {
@ -148,9 +161,9 @@ public class IslandLayer {
} }
} }
return null; return null;
} }*/
static { /*static {
NativeImage map = loadMap("/assets/" + BetterEnd.MOD_ID + "/textures/heightmaps/mountain_1.png"); NativeImage map = loadMap("/assets/" + BetterEnd.MOD_ID + "/textures/heightmaps/mountain_1.png");
SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F);
@ -162,10 +175,11 @@ public class IslandLayer {
SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4);
SDF map1 = new SDFHeightmap().setMap(map).setIntensity(0.3F).setSource(coneTop); SDF map1 = new SDFHeightmap().setMap(map).setIntensity(0.3F).setSource(coneTop);
NOISE = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSource(coneTop);
ISLAND = new SDF[] { ISLAND = new SDF[] {
new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom), new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom),
new SDFSmoothUnion().setRadius(0.01F).setSourceA(map1).setSourceB(coneBottom) new SDFSmoothUnion().setRadius(0.01F).setSourceA(map1).setSourceB(coneBottom)
}; };
} }*/
} }

View file

@ -1,9 +1,15 @@
package ru.betterend.world.generator; package ru.betterend.world.generator;
import java.awt.Point;
import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import com.google.common.collect.Lists;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.source.BiomeSource;
import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.noise.OpenSimplexNoise;
import ru.betterend.util.MHelper; import ru.betterend.util.MHelper;
@ -11,7 +17,8 @@ public class TerrainGenerator {
private static final ReentrantLock LOCKER = new ReentrantLock(); private static final ReentrantLock LOCKER = new ReentrantLock();
private static final double SCALE_XZ = 8.0; private static final double SCALE_XZ = 8.0;
private static final double SCALE_Y = 4.0; private static final double SCALE_Y = 4.0;
//private static final int CENTER = MHelper.floor(500 / SCALE_XZ); private static final float[] COEF;
private static final Point[] OFFS;
private static IslandLayer largeIslands; private static IslandLayer largeIslands;
private static IslandLayer mediumIslands; private static IslandLayer mediumIslands;
@ -32,7 +39,7 @@ public class TerrainGenerator {
noise2 = new OpenSimplexNoise(random.nextInt()); noise2 = new OpenSimplexNoise(random.nextInt());
} }
public static void fillTerrainDensity(double[] buffer, int x, int z) { public static void fillTerrainDensity(double[] buffer, int x, int z, BiomeSource biomeSource) {
LOCKER.lock(); LOCKER.lock();
largeIslands.clearCache(); largeIslands.clearCache();
@ -48,11 +55,13 @@ public class TerrainGenerator {
mediumIslands.updatePositions(px, pz); mediumIslands.updatePositions(px, pz);
smallIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz);
float height = getAverageDepth(biomeSource, x << 1, z << 1) * 0.5F;
for (int y = 0; y < buffer.length; y++) { for (int y = 0; y < buffer.length; y++) {
double py = (double) y * SCALE_Y; double py = (double) y * SCALE_Y;
float dist = largeIslands.getDensity(px, py, pz); float dist = largeIslands.getDensity(px, py, pz, height);
dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz, height));
dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz, height));
if (dist > -0.5F) { if (dist > -0.5F) {
dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02; dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02;
dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01;
@ -64,6 +73,26 @@ public class TerrainGenerator {
LOCKER.unlock(); LOCKER.unlock();
} }
private static float getAverageDepth(BiomeSource biomeSource, int x, int z) {
if (getBiome(biomeSource, x, z).getDepth() < 0.1F) {
return 0F;
}
float depth = 0F;
for (int i = 0; i < OFFS.length; i++) {
int px = x + OFFS[i].x;
int pz = z + OFFS[i].y;
depth += getBiome(biomeSource, px, pz).getDepth() * COEF[i];
}
return depth;
}
private static Biome getBiome(BiomeSource biomeSource, int x, int z) {
if (biomeSource instanceof BetterEndBiomeSource) {
return ((BetterEndBiomeSource) biomeSource).getLandBiome(x, 0, z);
}
return biomeSource.getBiomeForNoiseGen(x, 0, z);
}
/** /**
* Check if this is land * Check if this is land
* @param x - biome pos x * @param x - biome pos x
@ -143,4 +172,25 @@ public class TerrainGenerator {
LOCKER.unlock(); LOCKER.unlock();
return 0; return 0;
} }
static {
float sum = 0;
List<Float> coef = Lists.newArrayList();
List<Point> pos = Lists.newArrayList();
for (int x = -3; x <= 3; x++) {
for (int z = -3; z <= 3; z++) {
float dist = MHelper.length(x, z) / 3F;
if (dist <= 1) {
sum += dist;
coef.add(dist);
pos.add(new Point(x, z));
}
}
}
OFFS = pos.toArray(new Point[] {});
COEF = new float[coef.size()];
for (int i = 0; i < COEF.length; i++) {
COEF[i] = coef.get(i) / sum;
}
}
} }