Repository navigation
NeoTab 1.3.2
NeoTab 1.3.2
1.3.2 is a stability, interoperability, and performance patch for the 1.3.x feature line.
Lifecycle and correctness
- Prevents delayed join work from recreating region or scoreboard state after a player has disconnected.
- Restores tablist state only while NeoTab still owns it and yields when another plugin takes control.
- Avoids replacing scoreboards that already contain objectives or teams and yields ownership when another plugin assigns a board later.
- Clears stale update-check results after failures and respects the global ActionBar switch in timer and stopwatch services.
- Preserves legacy ActionBar Timer configuration paths when editing timer text.
- Keeps Region Profile boundary endpoints stable while Pos1 and Pos2 are edited in either order.
Permissions and Paper APIs
- Rechecks granular permissions for GUI clicks and delayed chat callbacks.
- Adds functional permission inheritance for scoreboard and ActionBar Extras parent nodes.
- Uses Paper's Adventure-based
AsyncChatEvent, inventory titles, and scoreboard components. - Removes deprecated scoreboard and Gradle resource-processing APIs.
Performance
- Adds chunk-based Region Profile lookup with a safe fallback for extremely large regions.
- Replaces the nearest-player all-pairs scan with a spatial grid.
- Caches the visible advancement registry and per-player completion counts.
- Shares player-independent footer components and skips unchanged tablist packets.
- Coalesces YAML snapshots and performs atomic disk writes on a dedicated writer thread.
Tests and validation
- Adds JUnit 5 regression coverage for YAML persistence, version ordering, timer parsing, and canonical region bounds.
- Clean Gradle build and all regression tests pass without deprecation warnings.
- Runtime smoke-tested on Paper
1.20.6,1.21.11, and26.1.2with NeoTab enable, reload, command, RCON, and clean shutdown checks.
Compatibility
- Paper
1.20.6+ - Java 21 bytecode
- LuckPerms, PlaceholderAPI, WorldEdit, and FastAsyncWorldEdit remain optional.