Tags
Creators
Details
3.1.2
Compatibility
Changes
Vanish v3.1.2 - Bug Fixes, Performance Boost & bStats
Targeted fixes, a full internal cleanup and technical improvements for a more stable and performant Vanish.
š Bug Fixes
- Fixed: The vanish metadata key is now a single
static finalconstant and vanish checks no longer go through player metadata - reduces garbage collection overhead - Fixed: Fake join/quit messages no longer use the deprecated
Bukkit.broadcastMessage()- they are sent to every player and the console directly, future-proof - Fixed: Inventory close events now skip non-vanished players immediately
- ā” Impact: Reduces unnecessary processing for 100% of non-staff players
- Fixed:
/vanish <player>with an unknown or offline name no longer toggles your own vanish - Fixed: Using a subcommand without permission no longer toggles your own vanish
- Fixed: A player who logged out while vanished is no longer left hidden from others after rejoining visible
- Fixed: Players with
vanish.joinbut withoutvanish.seecan no longer see other vanished players - Fixed: Unvanishing no longer makes players in creative mode or with
/flyfall out of the air - Fixed: Items can no longer be dragged or placed into the Vanish menus
- Fixed: Menus no longer open a new inventory inside the click event, which could cause inventory glitches
- Fixed: Menus use the new accent color right after
/vanish coloror/vanish reload - Fixed: Silent containers no longer open twice (once per hand)
- Fixed: Players in the silent container spectator fallback get their game mode back when they disconnect or the server stops
- Fixed: The pressure plate protection no longer overrides other plugins that cancelled the interaction
- Fixed:
vanish.*now grants every Vanish permission and respects negated child permissions - Fixed: A YAML error in
config.ymlno longer causes the file to be overwritten - Fixed: The Dynmap integration now also works on Spigot (the plugin was looked up with the wrong name)
- Fixed: With ProtocolLib, silent containers no longer show the closing animation or play the closing sound to nearby players when the container was open for more than 2.5 seconds
- Fixed: Silent containers respect chest protection plugins, and sneak-clicking a container with an item in hand uses the item (e.g. places the block) instead of opening the container
- Fixed: A vanished player is no longer left in spectator mode when another plugin prevents a container from opening
- Fixed: Join and quit messages set by other plugins are now also hidden for vanished players
- Fixed: Plugins that handle the quit after Vanish (such as Discord bridges) still see a quitting vanished player as vanished and no longer announce the quit
- Fixed: Changing the plugin color now sends a confirmation, both with
/vanish color <color>and in the color menu - Fixed: Vanished players no longer show up when hovering over the player count in the server list on Paper 1.20.6
- Fixed: Advancements of vanished players are no longer announced on Spigot 1.21.11 and newer without ProtocolLib (the game rule was renamed, which caused an error on every vanish)
- Fixed: No more ProtocolLib errors in the console when vanished players open containers on 1.21.11, and the container sounds are hidden there again
- Fixed: Vanish now disables itself with a clear error message if it cannot start on an incompatible server
š§± Stability & Thread Safety (suggested by pupserjapi7-crypto)
- Dependency handling: ProtocolLib, PlaceholderAPI and Dynmap are soft dependencies that load first when present; a missing or broken integration is logged and skipped instead of breaking Vanish
- No disk I/O on the main thread:
players.ymlis read once at startup and cached in memory - joins and quits never touch the disk - Asynchronous saving: changes to
players.ymlare written on a background thread and flushed when the server stops; an unreadable file is never overwritten - Thread-safe vanish state: vanished players are tracked in a concurrent set with O(1) lookups, safe for packet listeners, PlaceholderAPI and the API
- ā” Impact: No lag spikes on join/quit and no race conditions with async plugins
š§ Technical Improvements
- Config Reload:
/vanish reloadnow refreshes ALL cached values instantly (settings, messages, player data, boss bar and advancement handling)- ā” Impact: No more server restarts needed after config changes - ever
- VanishPlayer Caching: Player objects are now cached and reused
- ā” Performance: Eliminates redundant object creation on high-frequency events
- Gradle Shadow: Dependencies properly relocated - no more conflicts with other plugins
- ā” Impact: Better compatibility with plugin ecosystems
- Clean Codebase: The custom framework was replaced by standard Bukkit structure (one plugin class, plain listeners, a
TabExecutorcommand and typed config access), Lombok was removed and unit tests were added- ā” Impact: Easier to maintain, review and contribute to
- Tested: 66 automated tests on a mock server, plus live tests with bot players on Spigot and Paper from 1.20.1 to 26.2 (26.3: startup and console commands), with and without ProtocolLib, PlaceholderAPI and Dynmap
- ā” Impact: The fixes above were verified on real servers across the supported range
š Security & Dependencies
- Gradle 9.8.1: Fixes three high-severity Gradle security advisories (build tooling only - servers were never affected)
- Verified downloads: The Gradle Wrapper checks the distribution checksum, and third-party repositories may only serve their own artifacts
- Upgraded: Shadow 9.6.1, PlaceholderAPI 2.12.3, JUnit 6.1.3 - removed the unused Gson and Lombok dependencies
- Pinned: Libraries pulled in by the new test suite (commons-lang3, log4j-api, plexus-utils) are forced to patched versions - test only, never shipped with the plugin
- Scanned: All build and test dependencies checked against OSV.dev - 0 known vulnerabilities
š§āš» For Developers
VanishAPIis unchanged;getVanishedPlayers()now returns a snapshot- The main class is now
nl.fronsky.vanish.VanishPlugin(wasMain) - Removed internal helpers:
VanishPlayer.getPlayer(...),VanishPlayer.setState(...)andVisibilityChangeEvent.getData()/getProtocolLib()/isProtocolLibActive()- useVanishAPIinstead - Errors inside API calls are no longer silently swallowed
- Tests run on a mock server with mock players (MockBukkit); Gradle downloads JDK 21 for the tests automatically, while the plugin itself stays on Java 17
ā” Performance Summary
- VanishPlayer caching: fewer object allocations per event
- Config reload: instant refresh, no restart
- Event filtering: non-vanished players skip processing entirely
- Player data: no file I/O on the main thread
- Vanish checks: O(1) and thread-safe
š”ļø bStats Metrics
- Anonymous, opt-out usage statistics
- Opt out for all plugins at once in
plugins/bStats/config.yml - See live data at https://bstats.org/plugin/bukkit/Fronsky Vanish
- ā” Impact: Helps prioritize development based on real usage data
š Config: No config changes required - the new optional message plugin_color_changed in messages.yml falls back to its default
š Compatibility: Spigot/Paper 1.20 - 26.1+ | Java 17
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:e78RxLti:GqsP5L2E"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:e78RxLti:GqsP5L2E"
}

