5.8 KiB
5.8 KiB
title, type, weight
| title | type | weight |
|---|---|---|
| Climat & Biomes | docs | 3 |
Le système de climat et de biomes détermine la distribution des biomes à travers le monde basée sur la température, l'humidité et d'autres facteurs.
Package: com.hypixel.hytale.server.worldgen.climate
Système de Climat
Le ClimateGenerator crée des cartes de climat :
public class ClimateGenerator {
// Obtenir la température à une position
public float getTemperature(int x, int z);
// Obtenir l'humidité à une position
public float getHumidity(int x, int z);
// Obtenir le facteur d'altitude
public float getAltitude(int x, int y, int z);
// Obtenir les données climatiques
public ClimateData getClimate(int x, int z);
}
ClimateData
public class ClimateData {
private float temperature; // -1.0 (froid) à 1.0 (chaud)
private float humidity; // 0.0 (sec) à 1.0 (humide)
private float altitude; // Hauteur normalisée
private float continentality; // Distance de l'océan
public Biome getBiome();
}
Sélection de Biome
Les biomes sont sélectionnés selon les paramètres climatiques :
public class BiomeSelector {
private Map<BiomeCondition, Biome> biomeMap;
public Biome selectBiome(ClimateData climate) {
for (Map.Entry<BiomeCondition, Biome> entry : biomeMap.entrySet()) {
if (entry.getKey().matches(climate)) {
return entry.getValue();
}
}
return defaultBiome;
}
}
public class BiomeCondition {
private Range temperatureRange;
private Range humidityRange;
private Range altitudeRange;
public boolean matches(ClimateData climate) {
return temperatureRange.contains(climate.temperature)
&& humidityRange.contains(climate.humidity)
&& altitudeRange.contains(climate.altitude);
}
}
Définition de Biome
# biomes/forest.yaml
Type: Biome
Id: forest
DisplayName: "Forêt"
Climate:
Temperature: [0.3, 0.7]
Humidity: [0.4, 0.8]
Terrain:
SurfaceBlock: grass
SubsurfaceBlock: dirt
StoneBlock: stone
Features:
- Type: Tree
Density: 0.3
Variants: [oak, birch]
- Type: Grass
Density: 0.8
- Type: Flower
Density: 0.1
Mobs:
- Type: deer
SpawnWeight: 10
- Type: rabbit
SpawnWeight: 20
AmbientSounds:
- birds
- wind_leaves
Zones de Température
public enum TemperatureZone {
FROZEN(-1.0f, -0.5f), // Glace, neige
COLD(-0.5f, 0.0f), // Taïga, toundra
TEMPERATE(0.0f, 0.5f), // Forêt, plaines
WARM(0.5f, 0.8f), // Savane, jungle
HOT(0.8f, 1.0f); // Désert, volcanique
private float min;
private float max;
}
Zones d'Humidité
public enum HumidityZone {
ARID(0.0f, 0.2f), // Désert
DRY(0.2f, 0.4f), // Savane, steppe
MODERATE(0.4f, 0.6f), // Plaines, forêt
HUMID(0.6f, 0.8f), // Jungle, marais
WET(0.8f, 1.0f); // Forêt tropicale, marécage
}
Mélange de Biomes
Transitions douces entre biomes :
public class BiomeBlender {
private int blendRadius;
public BiomeBlendData blend(int x, int z) {
Map<Biome, Float> weights = new HashMap<>();
// Échantillonner les biomes environnants
for (int dx = -blendRadius; dx <= blendRadius; dx++) {
for (int dz = -blendRadius; dz <= blendRadius; dz++) {
Biome biome = getBiome(x + dx, z + dz);
float distance = (float) Math.sqrt(dx * dx + dz * dz);
float weight = 1.0f / (1.0f + distance);
weights.merge(biome, weight, Float::sum);
}
}
return new BiomeBlendData(weights);
}
}
Bruit Climatique
public class ClimateNoiseGenerator {
private SimplexNoise temperatureNoise;
private SimplexNoise humidityNoise;
public ClimateNoiseGenerator(long seed) {
temperatureNoise = new SimplexNoise(seed);
humidityNoise = new SimplexNoise(seed + 1);
}
public float getTemperature(int x, int z) {
// Variation de température à grande échelle
float base = temperatureNoise.noise2D(x * 0.001f, z * 0.001f);
// Variation à petite échelle
float detail = temperatureNoise.noise2D(x * 0.01f, z * 0.01f) * 0.2f;
return base + detail;
}
public float getHumidity(int x, int z) {
return humidityNoise.noise2D(x * 0.002f, z * 0.002f);
}
}
Effets d'Altitude
public class AltitudeClimateModifier {
// La température diminue avec l'altitude
public float modifyTemperature(float baseTemp, int altitude) {
float altitudeFactor = altitude / 256.0f;
return baseTemp - (altitudeFactor * 0.5f);
}
// L'humidité varie avec l'altitude
public float modifyHumidity(float baseHumidity, int altitude) {
if (altitude < 64) {
return baseHumidity * 1.2f; // Plus humide en basse altitude
} else if (altitude > 128) {
return baseHumidity * 0.6f; // Plus sec en haute altitude
}
return baseHumidity;
}
}
Configuration
# worldgen/climate_config.yaml
Climate:
NoiseScale: 0.001
TemperatureRange: [-1.0, 1.0]
HumidityRange: [0.0, 1.0]
BlendRadius: 8
AltitudeEffect: true
Biomes:
- Id: forest
Temperature: [0.3, 0.7]
Humidity: [0.4, 0.8]
- Id: desert
Temperature: [0.7, 1.0]
Humidity: [0.0, 0.3]
- Id: tundra
Temperature: [-1.0, -0.3]
Humidity: [0.2, 0.6]
Bonnes Pratiques
{{< callout type="info" >}} Directives Climatiques :
- Utilisez un bruit lisse pour des transitions climatiques naturelles
- Considérez l'altitude lors de la détermination des biomes
- Mélangez les biomes pour des transitions fluides
- Testez la distribution des biomes sur de grandes zones {{< /callout >}}