14 KiB
title, type, weight
| title | type | weight |
|---|---|---|
| Événements Monde | docs | 5 |
Événements liés à la gestion des mondes, chunks et changements environnementaux.
Événements du Cycle de Vie des Mondes
AddWorldEvent
{{< badge "Annulable" >}}
Déclenché quand un monde est en train d'être ajouté au serveur.
Package : com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Champs,Méthodes,Exemple" >}} {{< tab >}}
| Champ | Type | Description |
|---|---|---|
| world | World |
Le monde ajouté |
| universe | Universe |
L'univers parent |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Retourne le mondegetUniverse()- Retourne l'univers parentisCancelled()- Vérifie si annulésetCancelled(boolean)- Annule l'ajout du monde {{< /tab >}} {{< tab >}}
getEventRegistry().register(AddWorldEvent.class, event -> {
World world = event.getWorld();
Universe universe = event.getUniverse();
getLogger().at(Level.INFO).log("Monde ajouté : " + world.getName() + " à " + universe.getName());
// Empêcher certains types de mondes de se charger
if (world.getName().contains("test") && !isDevMode()) {
event.setCancelled(true);
}
});
{{< /tab >}} {{< /tabs >}}
RemoveWorldEvent
{{< badge "Annulable" >}}
Déclenché quand un monde est en train d'être retiré du serveur.
Package : com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Champs,Méthodes,Exemple" >}} {{< tab >}}
| Champ | Type | Description |
|---|---|---|
| world | World |
Le monde retiré |
| reason | RemovalReason |
Raison du retrait |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Retourne le mondegetReason()- Retourne la raison du retraitisCancelled()- Vérifie si annulésetCancelled(boolean)- Annule le retrait du monde {{< /tab >}} {{< tab >}}
getEventRegistry().register(RemoveWorldEvent.class, event -> {
World world = event.getWorld();
// Empêcher le retrait du monde principal
if (world.getName().equals("main")) {
event.setCancelled(true);
getLogger().warning("Impossible de retirer le monde principal !");
return;
}
// Sauvegarder les données avant que le monde soit retiré
saveWorldData(world);
notifyPlayersInWorld(world, "Le monde est en cours de déchargement !");
});
{{< /tab >}} {{< /tabs >}}
StartWorldEvent
Déclenché quand un monde démarre (termine son initialisation).
Package : com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Champs,Méthodes,Exemple" >}} {{< tab >}}
| Champ | Type | Description |
|---|---|---|
| world | World |
Le monde qui a démarré |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Retourne le monde {{< /tab >}} {{< tab >}}
getEventRegistry().register(StartWorldEvent.class, event -> {
World world = event.getWorld();
getLogger().at(Level.INFO).log("Monde démarré : " + world.getName());
// Initialiser les fonctionnalités spécifiques au monde
initializeWorldBorders(world);
spawnWorldBoss(world);
startWeatherCycle(world);
});
{{< /tab >}} {{< /tabs >}}
AllWorldsLoadedEvent
Déclenché quand tous les mondes ont fini de charger au démarrage du serveur.
Package : com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Champs,Méthodes,Exemple" >}} {{< tab >}}
| Champ | Type | Description |
|---|---|---|
| worlds | List<World> |
Tous les mondes chargés |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorlds()- Retourne la liste de tous les mondes chargés {{< /tab >}} {{< tab >}}
getEventRegistry().register(AllWorldsLoadedEvent.class, event -> {
List<World> worlds = event.getWorlds();
getLogger().at(Level.INFO).log("Tous les " + worlds.size() + " mondes chargés !");
// Initialiser les fonctionnalités inter-mondes
initializePortalNetwork(worlds);
syncWorldTimes(worlds);
});
{{< /tab >}} {{< /tabs >}}
Événements de Chunk
ChunkPreLoadProcessEvent
Déclenché avant qu'un chunk commence à charger.
Package : com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Champs,Méthodes,Exemple" >}} {{< tab >}}
| Champ | Type | Description |
|---|---|---|
| world | World |
Le monde |
| chunkX | int |
Coordonnée X du chunk |
| chunkZ | int |
Coordonnée Z du chunk |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Retourne le mondegetChunkX()- Retourne la coordonnée X du chunkgetChunkZ()- Retourne la coordonnée Z du chunk {{< /tab >}} {{< tab >}}
getEventRegistry().register(ChunkPreLoadProcessEvent.class, event -> {
int x = event.getChunkX();
int z = event.getChunkZ();
// Pré-charger les données des chunks adjacents pour un chargement fluide
prepareAdjacentChunkData(event.getWorld(), x, z);
});
{{< /tab >}} {{< /tabs >}}
ChunkLoadEvent
Déclenché quand un chunk finit de charger.
Package : com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Champs,Méthodes,Exemple" >}} {{< tab >}}
| Champ | Type | Description |
|---|---|---|
| world | World |
Le monde |
| chunk | Chunk |
Le chunk chargé |
| isNewChunk | boolean |
Si c'est un chunk nouvellement généré |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Retourne le mondegetChunk()- Retourne le chunkisNewChunk()- Retourne vrai si nouvellement généré {{< /tab >}} {{< tab >}}
getEventRegistry().register(ChunkLoadEvent.class, event -> {
Chunk chunk = event.getChunk();
World world = event.getWorld();
if (event.isNewChunk()) {
// Ajouter des structures personnalisées aux nouveaux chunks
generateCustomStructures(chunk);
populateCustomOres(chunk);
}
// Restaurer les entités depuis le stockage
loadChunkEntities(world, chunk);
});
{{< /tab >}} {{< /tabs >}}
ChunkUnloadEvent
Déclenché quand un chunk est sur le point d'être déchargé.
Package : com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Champs,Méthodes,Exemple" >}} {{< tab >}}
| Champ | Type | Description |
|---|---|---|
| world | World |
Le monde |
| chunk | Chunk |
Le chunk déchargé |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Retourne le mondegetChunk()- Retourne le chunk {{< /tab >}} {{< tab >}}
getEventRegistry().register(ChunkUnloadEvent.class, event -> {
Chunk chunk = event.getChunk();
World world = event.getWorld();
// Sauvegarder les données personnalisées du chunk
saveChunkEntities(world, chunk);
saveChunkMetadata(chunk);
// Nettoyer les ressources spécifiques au chunk
cleanupChunkParticles(chunk);
});
{{< /tab >}} {{< /tabs >}}
ChunkSaveEvent
Déclenché quand un chunk est en cours de sauvegarde.
Package : com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Champs,Méthodes,Exemple" >}} {{< tab >}}
| Champ | Type | Description |
|---|---|---|
| world | World |
Le monde |
| chunk | Chunk |
Le chunk sauvegardé |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Retourne le mondegetChunk()- Retourne le chunk {{< /tab >}} {{< tab >}}
getEventRegistry().register(ChunkSaveEvent.class, event -> {
Chunk chunk = event.getChunk();
// Sauvegarder des données personnalisées supplémentaires avec le chunk
saveCustomChunkData(chunk);
getLogger().debug("Chunk sauvegardé : " + chunk.getX() + ", " + chunk.getZ());
});
{{< /tab >}} {{< /tabs >}}
Événements Environnementaux
MoonPhaseChangeEvent
Déclenché quand la phase lunaire change.
Package : com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Champs,Méthodes,Exemple" >}} {{< tab >}}
| Champ | Type | Description |
|---|---|---|
| world | World |
Le monde |
| previousPhase | MoonPhase |
Phase lunaire précédente |
| newPhase | MoonPhase |
Nouvelle phase lunaire |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Retourne le mondegetPreviousPhase()- Retourne la phase précédentegetNewPhase()- Retourne la nouvelle phase {{< /tab >}} {{< tab >}}
getEventRegistry().register(MoonPhaseChangeEvent.class, event -> {
World world = event.getWorld();
MoonPhase phase = event.getNewPhase();
getLogger().at(Level.INFO).log("Phase lunaire changée en : " + phase);
// Événements spéciaux pleine lune
if (phase == MoonPhase.FULL) {
increaseHostileMobSpawns(world);
enableWerewolfTransformations(world);
}
// Événements de ténèbres nouvelle lune
if (phase == MoonPhase.NEW) {
spawnDarkCreatures(world);
}
});
{{< /tab >}} {{< /tabs >}}
Exemples Pratiques
Plugin Gestionnaire de Mondes
public class WorldManagerPlugin extends JavaPlugin {
private final Map<String, WorldConfig> worldConfigs = new HashMap<>();
@Override
public void start() {
// Suivre les ajouts de mondes
getEventRegistry().register(AddWorldEvent.class, event -> {
World world = event.getWorld();
WorldConfig config = loadWorldConfig(world.getName());
worldConfigs.put(world.getName(), config);
// Appliquer les paramètres spécifiques au monde
applyWorldConfig(world, config);
});
// Gérer le retrait de monde
getEventRegistry().register(RemoveWorldEvent.class, event -> {
World world = event.getWorld();
WorldConfig config = worldConfigs.remove(world.getName());
if (config != null) {
saveWorldConfig(world.getName(), config);
}
});
// Initialiser quand tous les mondes sont prêts
getEventRegistry().register(AllWorldsLoadedEvent.class, event -> {
getLogger().at(Level.INFO).log("Initialisation du gestionnaire de mondes avec " +
event.getWorlds().size() + " mondes");
initializeCrossWorldFeatures();
});
}
}
Système de Protection de Chunks
public class ChunkProtectionPlugin extends JavaPlugin {
private final Set<ChunkCoord> protectedChunks = new HashSet<>();
@Override
public void start() {
// Charger les chunks protégés quand le chunk charge
getEventRegistry().register(ChunkLoadEvent.class, event -> {
Chunk chunk = event.getChunk();
ChunkCoord coord = new ChunkCoord(
event.getWorld().getName(),
chunk.getX(),
chunk.getZ()
);
if (isChunkProtected(coord)) {
protectedChunks.add(coord);
// Appliquer la protection au niveau du chunk
markChunkAsProtected(chunk);
}
});
// Sauvegarder le statut de protection au déchargement
getEventRegistry().register(ChunkUnloadEvent.class, event -> {
Chunk chunk = event.getChunk();
ChunkCoord coord = new ChunkCoord(
event.getWorld().getName(),
chunk.getX(),
chunk.getZ()
);
if (protectedChunks.contains(coord)) {
saveProtectionStatus(coord);
}
});
}
public void protectChunk(World world, int chunkX, int chunkZ) {
ChunkCoord coord = new ChunkCoord(world.getName(), chunkX, chunkZ);
protectedChunks.add(coord);
saveProtectionStatus(coord);
}
}
Événements de Monde Dynamiques
public class DynamicWorldPlugin extends JavaPlugin {
@Override
public void start() {
// Effets de phase lunaire
getEventRegistry().register(MoonPhaseChangeEvent.class, event -> {
World world = event.getWorld();
MoonPhase phase = event.getNewPhase();
switch (phase) {
case FULL:
broadcastToWorld(world, "La pleine lune se lève...");
applyMoonEffect(world, "mob_spawn_increase", 2.0);
break;
case NEW:
broadcastToWorld(world, "Les ténèbres tombent...");
applyMoonEffect(world, "visibility_decrease", 0.5);
break;
default:
clearMoonEffects(world);
}
});
// Génération de chunk personnalisée
getEventRegistry().register(ChunkLoadEvent.class, event -> {
if (event.isNewChunk()) {
Chunk chunk = event.getChunk();
// Ajouter des emplacements mystères
if (random.nextFloat() < 0.01) { // 1% de chance
generateMysteryStructure(chunk);
}
// Ajouter des nœuds de ressources
populateResourceNodes(chunk, event.getWorld());
}
});
}
}
Bonnes Pratiques
{{< callout type="info" >}} Directives pour les Événements de Monde :
- Utiliser
AllWorldsLoadedEventpour l'initialisation inter-mondes - Sauvegarder les données importantes dans
ChunkUnloadEventetRemoveWorldEvent - Utiliser
isNewChunk()pour éviter de régénérer du contenu dans les chunks existants - Être prudent en annulant
AddWorldEventetRemoveWorldEvent - Considérer l'utilisation mémoire lors du stockage de données par chunk {{< /callout >}}
{{< callout type="warning" >}} Note de Performance : Les événements de chunk peuvent se déclencher fréquemment pendant le mouvement des joueurs. Gardez les handlers légers et évitez les opérations bloquantes. {{< /callout >}}