Multi-arena & isolation

How LavaRises keeps every arena in its own world and its own chat, notification and visibility room.

Servers that run several minigames at once have one recurring problem: messages leak. A title meant for arena A flashes on arena B’s screen, and global chat turns into three games shouting over each other.

LavaRises solves this by treating each arena world like a separate server.

What is scoped to the arena

ChannelScope
ChatOnly players in the same arena world (config: world-isolation.chat)
Broadcast messagesParticipants + spectators + everyone in that instance world
Titles & subtitlesSame
Action barSame
Boss barSame
ScoreboardSame
SoundsSame
Tab list & visibilityArena players and outsiders are hidden from each other (world-isolation.hide-non-arena-players)

The plugin never calls Bukkit.broadcast. Every message goes to an explicitly built audience.

world-isolation:
  chat: true
  hide-non-arena-players: true

One world per match

Every match gets its own world, named lavarises_<arena>_<n>:

  1. Create — on the global tick thread, from the arena’s seed and generator.
  2. Play — game rules are forced for the match: no fire tick, no daylight cycle, no weather, no mob spawning, no mob griefing, immediate respawn, auto-save off.
  3. Unload — through the Canvas asynchronous unload API.
  4. Delete — only after the unload reports success, and only on an async thread.

A folder is deleted only if it is inside the server’s world container and its name starts with lavarises_. Anything else is refused and logged.

Why the lava engine is split per region

On a regionised server (Folia / Canvas) a single 192×192 lava layer is 36,864 cells spread over many independent region threads. Filling it from one queue would be wrong — and slow.

Instead, each layer is cut into chunk slices, and every slice is submitted to the region scheduler for its own chunk. The performance.blocks-per-tick budget is divided between the active slices, so the work lands on the thread that already owns each chunk and no thread is asked to carry the whole layer.

Next: Commands & permissions.