Player Lifecycle
Use this pattern to avoid leaked tasks/viewers.
On Join
kotlin
manager.assign(player, lobbySidebar, buildReplacers(player))java
manager.assign(player, lobbySidebar, buildReplacers(player));On Data Change
kotlin
manager.addReplacers(player, mapOf("{online}" to onlinePlayerCount().toString()))java
manager.addReplacers(player, Map.of("{online}", Integer.toString(onlinePlayerCount())));On Quit
kotlin
manager.remove(player)java
manager.remove(player);remove(player) detaches the sidebar and stops active animation tasks.