Files
Documentation/content/world/worldgen/zones.fr.md
2026-01-20 20:33:59 +01:00

4.8 KiB

title, type, weight
title type weight
Zones docs 6

Les zones définissent des régions distinctes du monde avec des règles de génération, des biomes et des caractéristiques spécifiques.

Package: com.hypixel.hytale.server.worldgen.zone

Système de Zones

Les zones partitionnent le monde en zones distinctes :

public class ZoneManager {
    // Obtenir la zone à une position
    public Zone getZone(int x, int z);

    // Enregistrer une zone
    public void registerZone(Zone zone);

    // Obtenir toutes les zones
    public List<Zone> getZones();
}

Définition de Zone

# zones/emerald_grove.yaml
Type: Zone
Id: emerald_grove
DisplayName: "Bosquet d'Émeraude"
Shape: Circle
Center: [0, 0]
Radius: 1000
Biomes:
  - forest
  - dense_forest
Climate:
  TemperatureOffset: 0.1
  HumidityOffset: 0.2
Features:
  - giant_trees
  - fairy_circles
Prefabs:
  - elf_village
  - forest_shrine
MobSpawns:
  - Type: deer
    Weight: 20
  - Type: forest_spirit
    Weight: 5

Classe Zone

public class Zone {
    private String id;
    private String displayName;
    private ZoneShape shape;
    private List<String> biomes;
    private ClimateModifier climate;
    private List<String> features;
    private List<String> prefabs;
    private List<MobSpawn> mobSpawns;

    // Vérifier si une position est dans la zone
    public boolean contains(int x, int z);

    // Obtenir le biome spécifique à la zone
    public Biome getBiome(int x, int z);

    // Modifier la génération
    public void modifyGeneration(GenerationContainer container);
}

Formes de Zones

public interface ZoneShape {
    boolean contains(int x, int z);
    float getDistanceToEdge(int x, int z);
}

public class CircleZone implements ZoneShape {
    private int centerX, centerZ;
    private int radius;

    public boolean contains(int x, int z) {
        int dx = x - centerX;
        int dz = z - centerZ;
        return dx * dx + dz * dz <= radius * radius;
    }
}

public class RectangleZone implements ZoneShape {
    private int minX, minZ, maxX, maxZ;

    public boolean contains(int x, int z) {
        return x >= minX && x <= maxX && z >= minZ && z <= maxZ;
    }
}

public class PolygonZone implements ZoneShape {
    private List<Vector2i> vertices;

    public boolean contains(int x, int z) {
        // Algorithme point-dans-polygone
        return isPointInPolygon(x, z, vertices);
    }
}

Transitions de Zones

Transitions douces entre zones :

public class ZoneTransition {
    private int transitionWidth;

    public float getBlendFactor(Zone from, Zone to, int x, int z) {
        float distFrom = from.getShape().getDistanceToEdge(x, z);
        float distTo = to.getShape().getDistanceToEdge(x, z);

        if (distFrom > transitionWidth) {
            return 0.0f;  // Complètement dans la zone 'from'
        }
        if (distTo > transitionWidth) {
            return 1.0f;  // Complètement dans la zone 'to'
        }

        return distFrom / (distFrom + distTo);
    }
}

Couches de Zones

Les zones peuvent avoir des couches verticales :

# zones/underground_kingdom.yaml
Type: Zone
Id: underground_kingdom
Shape: Circle
Center: [5000, 5000]
Radius: 500
VerticalRange:
  MinY: 0
  MaxY: 40
Biomes:
  - crystal_cave
  - mushroom_forest
Features:
  - glowing_crystals
  - underground_lake

Priorité des Zones

Quand les zones se chevauchent, la priorité détermine laquelle s'applique :

public class ZonePriority {
    public Zone getActiveZone(int x, int y, int z) {
        List<Zone> containing = zones.stream()
            .filter(z -> z.contains(x, z) && z.containsY(y))
            .sorted(Comparator.comparing(Zone::getPriority).reversed())
            .toList();

        return containing.isEmpty() ? defaultZone : containing.get(0);
    }
}

Zones Dynamiques

Zones qui peuvent changer à l'exécution :

public class DynamicZone extends Zone {
    public void expand(int amount) {
        if (shape instanceof CircleZone circle) {
            circle.setRadius(circle.getRadius() + amount);
        }
    }

    public void move(int dx, int dz) {
        shape.translate(dx, dz);
    }
}

Configuration

# worldgen/zone_config.yaml
Zones:
  Default: wilderness
  TransitionWidth: 32
  List:
    - Id: spawn_area
      Priority: 100
      Shape: Circle
      Center: [0, 0]
      Radius: 200
    - Id: wilderness
      Priority: 0
      Shape: Infinite

Bonnes Pratiques

{{< callout type="info" >}} Directives des Zones :

  • Utilisez les zones pour des régions distinctes du monde
  • Définissez des transitions douces entre zones
  • Considérez la priorité des zones pour les chevauchements
  • Utilisez des formes appropriées pour les limites de zones
  • Testez minutieusement la génération des zones {{< /callout >}}