You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Performance monitor: samples TPS, MSPT (mean/p95/max), CPU, GC, memory, entities and chunks in the background with a rolling history, and prints debounced console warnings when the server lags. /ssmp perf [check|history [minutes]|report [minutes]|record|auto|spark] (ssmp.perf) shows it live, saves text reports to perf-reports/ (also exported automatically on a warning) and can start a Spark profile. Fully configurable and live-editable in Settings > Performance (performance.*)
/ssmp perf record [start [minutes]|stop|status]: a timed benchmark of the whole plugin. A background sampler watches every thread and reports how much main-thread time (and estimated ms per tick) the plugin uses, broken down per module, hottest classes and methods, async/Netty threads and other plugins' code, next to TPS/MSPT/CPU/GC/memory over the run. Saved to perf-reports/benchmark-*.txt; length, sample interval and report size are configurable in Settings > Performance
Automatic benchmarking (performance.auto.*, /ssmp perf auto [status|on|off|now|log [lines]]): benchmarks now run on their own - as soon as a lag warning fires and on a routine schedule (default every 6 h) - with a cooldown, and optionally only with players online and never during a recording. Each report starts with an automatic "Findings" verdict (plugin ms per tick, heaviest module, server lag, heap, build protection failures, busy background threads) and online admins with ssmp.perf are told when a run starts and what it found. Everything the benchmark system does is logged - triggers, runs skipped and why, starts, results, errors - to the console and to perf-reports/benchmark.log (rotated), viewable in game with /ssmp perf auto log [lines]; each part (performance.auto.log.console/file/verbose) is toggleable. Every switch and number is live-editable in Settings > Performance
Changed
Performance: the team glow packet listener no longer does work for every entity-metadata packet - it first checks (cheaply) whether the packet even sets the glow flag, and its settings are cached for a second instead of being read from the config on every packet; scoreboard team colours resolve their reflection once instead of on every call; the freeze visual task skips its per-player checks when nobody is frozen
Benchmark reports no longer count bundled libraries (SQLite etc.) as plugin code (which had wrongly blamed another plugin's database thread on this one), and label the shared listeners package correctly instead of as "death-list"
Recording restrictions: the Damage lock now also makes locked players untargetable (mobs ignore them and drop existing aggro), non-collidable (no pushing), and projectiles and attack knockback pass over them
Fixed
Build protection: chunks are now actually rewritten, so the world shows as stone from the moment it loads instead of only turning to stone when a block is touched. Fixed on both 1.21.x and 26.1:
the chunk rewriter assumed the 26.1 section layout (an extra fluid-count short) and failed with "block state bits 85" on 1.21.11; the layout is now chosen by server version
chunk and block-change packets are copied and edited directly instead of through ProtocolLib's clone and chunk-data wrappers, which fail on 1.21.11 with ProtocolLib 5.4.0 ("Cannot create instance of class ClientboundLevelChunkWithLightPacket")
multi-block-change packets are rewritten too, fixing the MULTI_BLOCK_CHANGE warning
failure warnings are shown once per packet kind and include the full cause; /ssmp buildprotect status now also shows "chunks seen"
Recording restrictions: placing a block while build is locked is now refused up front instead of the block vanishing after being placed, and the item is no longer lost
Recording restrictions: the items lock no longer blocks placing blocks or buckets - build and items now work independently
Nicknames: fixed a NullPointerException when rewriting PLAYER_INFO packets that contain empty entries