13 KiB
title, type, weight
| title | type | weight |
|---|---|---|
| World Events | docs | 5 |
Events related to world management, chunks, and environmental changes.
World Lifecycle Events
AddWorldEvent
{{< badge "Cancellable" >}}
Fired when a world is being added to the server.
Package: com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Fields,Methods,Example" >}} {{< tab >}}
| Field | Type | Description |
|---|---|---|
| world | World |
The world being added |
| universe | Universe |
The parent universe |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Returns the worldgetUniverse()- Returns the parent universeisCancelled()- Check if cancelledsetCancelled(boolean)- Cancel world addition {{< /tab >}} {{< tab >}}
getEventRegistry().register(AddWorldEvent.class, event -> {
World world = event.getWorld();
Universe universe = event.getUniverse();
getLogger().at(Level.INFO).log("World added: " + world.getName() + " to " + universe.getName());
// Prevent certain world types from loading
if (world.getName().contains("test") && !isDevMode()) {
event.setCancelled(true);
}
});
{{< /tab >}} {{< /tabs >}}
RemoveWorldEvent
{{< badge "Cancellable" >}}
Fired when a world is being removed from the server.
Package: com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Fields,Methods,Example" >}} {{< tab >}}
| Field | Type | Description |
|---|---|---|
| world | World |
The world being removed |
| reason | RemovalReason |
Why the world is being removed |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Returns the worldgetReason()- Returns removal reasonisCancelled()- Check if cancelledsetCancelled(boolean)- Cancel world removal {{< /tab >}} {{< tab >}}
getEventRegistry().register(RemoveWorldEvent.class, event -> {
World world = event.getWorld();
// Prevent removal of main world
if (world.getName().equals("main")) {
event.setCancelled(true);
getLogger().warning("Cannot remove main world!");
return;
}
// Save data before world is removed
saveWorldData(world);
notifyPlayersInWorld(world, "World is being unloaded!");
});
{{< /tab >}} {{< /tabs >}}
StartWorldEvent
Fired when a world starts (finishes initialization).
Package: com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Fields,Methods,Example" >}} {{< tab >}}
| Field | Type | Description |
|---|---|---|
| world | World |
The world that started |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Returns the world {{< /tab >}} {{< tab >}}
getEventRegistry().register(StartWorldEvent.class, event -> {
World world = event.getWorld();
getLogger().at(Level.INFO).log("World started: " + world.getName());
// Initialize world-specific features
initializeWorldBorders(world);
spawnWorldBoss(world);
startWeatherCycle(world);
});
{{< /tab >}} {{< /tabs >}}
AllWorldsLoadedEvent
Fired when all worlds have finished loading on server startup.
Package: com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Fields,Methods,Example" >}} {{< tab >}}
| Field | Type | Description |
|---|---|---|
| worlds | List<World> |
All loaded worlds |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorlds()- Returns list of all loaded worlds {{< /tab >}} {{< tab >}}
getEventRegistry().register(AllWorldsLoadedEvent.class, event -> {
List<World> worlds = event.getWorlds();
getLogger().at(Level.INFO).log("All " + worlds.size() + " worlds loaded!");
// Initialize cross-world features
initializePortalNetwork(worlds);
syncWorldTimes(worlds);
});
{{< /tab >}} {{< /tabs >}}
Chunk Events
ChunkPreLoadProcessEvent
Fired before a chunk begins loading.
Package: com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Fields,Methods,Example" >}} {{< tab >}}
| Field | Type | Description |
|---|---|---|
| world | World |
The world |
| chunkX | int |
Chunk X coordinate |
| chunkZ | int |
Chunk Z coordinate |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Returns the worldgetChunkX()- Returns chunk X coordinategetChunkZ()- Returns chunk Z coordinate {{< /tab >}} {{< tab >}}
getEventRegistry().register(ChunkPreLoadProcessEvent.class, event -> {
int x = event.getChunkX();
int z = event.getChunkZ();
// Pre-load adjacent chunk data for seamless loading
prepareAdjacentChunkData(event.getWorld(), x, z);
});
{{< /tab >}} {{< /tabs >}}
ChunkLoadEvent
Fired when a chunk finishes loading.
Package: com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Fields,Methods,Example" >}} {{< tab >}}
| Field | Type | Description |
|---|---|---|
| world | World |
The world |
| chunk | Chunk |
The loaded chunk |
| isNewChunk | boolean |
Whether this is a newly generated chunk |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Returns the worldgetChunk()- Returns the chunkisNewChunk()- Returns true if newly generated {{< /tab >}} {{< tab >}}
getEventRegistry().register(ChunkLoadEvent.class, event -> {
Chunk chunk = event.getChunk();
World world = event.getWorld();
if (event.isNewChunk()) {
// Add custom structures to new chunks
generateCustomStructures(chunk);
populateCustomOres(chunk);
}
// Restore entities from storage
loadChunkEntities(world, chunk);
});
{{< /tab >}} {{< /tabs >}}
ChunkUnloadEvent
Fired when a chunk is about to be unloaded.
Package: com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Fields,Methods,Example" >}} {{< tab >}}
| Field | Type | Description |
|---|---|---|
| world | World |
The world |
| chunk | Chunk |
The chunk being unloaded |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Returns the worldgetChunk()- Returns the chunk {{< /tab >}} {{< tab >}}
getEventRegistry().register(ChunkUnloadEvent.class, event -> {
Chunk chunk = event.getChunk();
World world = event.getWorld();
// Save custom chunk data
saveChunkEntities(world, chunk);
saveChunkMetadata(chunk);
// Clean up chunk-specific resources
cleanupChunkParticles(chunk);
});
{{< /tab >}} {{< /tabs >}}
ChunkSaveEvent
Fired when a chunk is being saved.
Package: com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Fields,Methods,Example" >}} {{< tab >}}
| Field | Type | Description |
|---|---|---|
| world | World |
The world |
| chunk | Chunk |
The chunk being saved |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Returns the worldgetChunk()- Returns the chunk {{< /tab >}} {{< tab >}}
getEventRegistry().register(ChunkSaveEvent.class, event -> {
Chunk chunk = event.getChunk();
// Save additional custom data alongside chunk
saveCustomChunkData(chunk);
getLogger().debug("Chunk saved: " + chunk.getX() + ", " + chunk.getZ());
});
{{< /tab >}} {{< /tabs >}}
Environmental Events
MoonPhaseChangeEvent
Fired when the moon phase changes.
Package: com.hypixel.hytale.server.core.event.events.world
{{< tabs items="Fields,Methods,Example" >}} {{< tab >}}
| Field | Type | Description |
|---|---|---|
| world | World |
The world |
| previousPhase | MoonPhase |
Previous moon phase |
| newPhase | MoonPhase |
New moon phase |
| {{< /tab >}} | ||
| {{< tab >}} |
getWorld()- Returns the worldgetPreviousPhase()- Returns previous phasegetNewPhase()- Returns new phase {{< /tab >}} {{< tab >}}
getEventRegistry().register(MoonPhaseChangeEvent.class, event -> {
World world = event.getWorld();
MoonPhase phase = event.getNewPhase();
getLogger().at(Level.INFO).log("Moon phase changed to: " + phase);
// Full moon special events
if (phase == MoonPhase.FULL) {
increaseHostileMobSpawns(world);
enableWerewolfTransformations(world);
}
// New moon darkness events
if (phase == MoonPhase.NEW) {
spawnDarkCreatures(world);
}
});
{{< /tab >}} {{< /tabs >}}
Practical Examples
World Manager Plugin
public class WorldManagerPlugin extends JavaPlugin {
private final Map<String, WorldConfig> worldConfigs = new HashMap<>();
@Override
public void start() {
// Track world additions
getEventRegistry().register(AddWorldEvent.class, event -> {
World world = event.getWorld();
WorldConfig config = loadWorldConfig(world.getName());
worldConfigs.put(world.getName(), config);
// Apply world-specific settings
applyWorldConfig(world, config);
});
// Handle world removal
getEventRegistry().register(RemoveWorldEvent.class, event -> {
World world = event.getWorld();
WorldConfig config = worldConfigs.remove(world.getName());
if (config != null) {
saveWorldConfig(world.getName(), config);
}
});
// Initialize when all worlds ready
getEventRegistry().register(AllWorldsLoadedEvent.class, event -> {
getLogger().at(Level.INFO).log("Initializing world manager with " +
event.getWorlds().size() + " worlds");
initializeCrossWorldFeatures();
});
}
}
Chunk Protection System
public class ChunkProtectionPlugin extends JavaPlugin {
private final Set<ChunkCoord> protectedChunks = new HashSet<>();
@Override
public void start() {
// Load protected chunks when chunk loads
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);
// Apply chunk-level protection
markChunkAsProtected(chunk);
}
});
// Save protection status on unload
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);
}
}
Dynamic World Events
public class DynamicWorldPlugin extends JavaPlugin {
@Override
public void start() {
// Moon phase effects
getEventRegistry().register(MoonPhaseChangeEvent.class, event -> {
World world = event.getWorld();
MoonPhase phase = event.getNewPhase();
switch (phase) {
case FULL:
broadcastToWorld(world, "The full moon rises...");
applyMoonEffect(world, "mob_spawn_increase", 2.0);
break;
case NEW:
broadcastToWorld(world, "Darkness falls...");
applyMoonEffect(world, "visibility_decrease", 0.5);
break;
default:
clearMoonEffects(world);
}
});
// Custom chunk generation
getEventRegistry().register(ChunkLoadEvent.class, event -> {
if (event.isNewChunk()) {
Chunk chunk = event.getChunk();
// Add mystery locations
if (random.nextFloat() < 0.01) { // 1% chance
generateMysteryStructure(chunk);
}
// Add resource nodes
populateResourceNodes(chunk, event.getWorld());
}
});
}
}
Best Practices
{{< callout type="info" >}} World Event Guidelines:
- Use
AllWorldsLoadedEventfor cross-world initialization - Save important data in
ChunkUnloadEventandRemoveWorldEvent - Use
isNewChunk()to avoid regenerating content in existing chunks - Be careful with cancelling
AddWorldEventandRemoveWorldEvent - Consider memory usage when storing per-chunk data {{< /callout >}}
{{< callout type="warning" >}} Performance Note: Chunk events can fire frequently during player movement. Keep handlers lightweight and avoid blocking operations. {{< /callout >}}