# Changed
- Tab list refresh computes **server-wide placeholders** (online count, world counts, TPS, time, …) once per refresh instead of once per line and player, and parses header/footer lines without player-specific placeholders only once. With **100 players** a refresh **dropped from ~110 ms** to **~6 ms** on the main thread.
- List names, nametag team prefixes and header/footer are only sent when they changed. Previously every refresh broadcast ~20,000 packets at 100 players **(~0.7 MB/s)**; now only the header/footer is re-sent.
- Joining no longer refreshes every online player's tab list; others only get an updated header/footer (online count) on the next tick, shared by all joins in that tick. The online count now also updates right after a player quits.
- Chat messages are rendered once instead of once per viewer (ChatRenderer.viewerUnaware), ~100× less work per message at 100 players. This also avoids one main-thread PlaceholderAPI lookup per viewer when the chat format contains PAPI placeholders.
- Parsed status, death count, name/status color and URL hover components are cached instead of re-parsed on every use; config values like tablist.enabled, chat.enabled and the sorting priority are read once per (re)load.
- The tab refresh only re-renders a list name or sort team when the player's status, deaths or country changed (list names using PlaceholderAPI are still re-rendered every time). Names and teams changed by other plugins are still restored on the next refresh.
- Player statuses and status requests are saved in the background (at most every 5 seconds) instead of rewriting the whole file on the main thread for every /status, /status-clear, suggestion, accept/deny and first join with a default status. Data is still saved immediately on reload and shutdown.
- The LibertyBans mute check uses LibertyBans' cache of online players' mutes instead of a database query per chat message. It now also catches IP mutes, the same mutes LibertyBans itself enforces (BETA).
# Fixed
- A chat message or placeholder request during /status-admin reload (or while a status suggestion is accepted) could briefly see no status for a player.
# Added
- benchmark/: test-server benchmark with 100 bots, plus a check that two plugin versions render identical tab lists, nametags and chat (see benchmark/README.md on github). This is more an internal change.
## Notice:
I can't say with 100% certainty exactly how much of a performance improvement this update will bring to your specific server. However, performance should be significantly better than before, especially with more players.
Since I had to make some deep changes to the code for this update, there may be some bugs. All core functions have been thoroughly tested and the plugin has passed all internal tests. Nevertheless, I haven’t had enough time yet to test every function extensively. Even so, this build is labeled as a “Release” rather than a “Beta” because the performance boost benefits everyone.
-> If you had the previous version of the plugin, you just need to replace the JAR file.
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }