Tags
Creators
Details
All versions
5.3
Release
Final polishing5 months ago 83
Compatibility
Minecraft: Java Edition
26.1.x
1.21.x
1.20.x
1.19.x
1.18.x
1.17.x
1.16.x
Platforms
Bukkit
BungeeCord
Folia
Paper
Purpur
Spigot
Velocity
Changes
๐ด Critical Fixes
- Fixed main thread blocking from
.join()calls in ReportsCommand, NoteCommand, and MyReportsGuiManager. All database operations now use async callbacks with scheduler dispatch. - Fixed synchronous Mojang API lookups in AltsCommand, HistoryCommand, ReportCommand, PunishCommand, and UnvoidJailCommand. Replaced deprecated
Bukkit.getOfflinePlayer(String)with async UUID resolution using database cache and UuidUtil fallback. - Fixed ConcurrentModificationException in AltService. Changed
HashSet<UUID>toConcurrentHashMap.newKeySet()for thread-safe alt collection across async database futures. - Fixed offline player unjail trap. Players unjailed while offline are now flagged with
pending_unjailin void-jail.yml and automatically teleported to their return location on next login.
๐ High Priority Fixes
- Fixed async Bukkit API call in PunishmentService. Moved
Bukkit.getOfflinePlayer()fromCompletableFuture.supplyAsync()toscheduler.callSync()to comply with Paper/Folia thread safety rules. - Fixed database thread pool overflow risk. Replaced
CallerRunsPolicywith a custom rejection handler that logs a warning and discards tasks instead of executing them on the caller thread (which could be the main server thread). - Fixed fail-open mute bypass in PlayerChatListener. On cache miss, chat messages are now cancelled while the async mute lookup completes. Messages are re-sent only if the player is confirmed unmuted.
๐ก Medium Priority Fixes
- Fixed memory leaks in ChatManager and ReportService. Added PlayerQuitEvent listeners to remove disconnected players from
lastMessageTimeandlastReportTimemaps. - Fixed settings GUI triggering full plugin reloads on the main thread. Config save and
plugin.reload()now run asynchronously, with GUI reopen dispatched back to the main thread. - Fixed inefficient N+1 subqueries in PunishmentDao. Replaced correlated subqueries
(SELECT name FROM controlbans_history WHERE uuid = t.uuid ...)withLEFT JOIN controlbans_historyacross getRecentPunishments, getPunishmentHistory, getPunishmentById, and getAllPunishments.
๐ข Low Priority Fixes
- Fixed void jail command whitelist edge case. Added length check before
event.getMessage().substring(1)to prevent issues when a player types only/. - Fixed GUI cooldown feedback ignored in GuiListener. The report GUI now checks the
submitReport()return value and displays a cooldown message if the report fails. - Fixed brittle YAML string parsing in ConfigUpdater. Replaced primitive
.replace("\"", "\\\"")with proper YAML escaping that handles special characters, multiline strings, booleans, numbers, and lists. - Fixed zero-size pagination inconsistency in HistoryGuiManager. Changed
Math.ceil(...)with manualif (maxPage == 0) maxPage = 1toMath.max(1, (int) Math.ceil(...))for consistency with AltsGuiManager. - Fixed missing return statement in PlayerJoinListener blacklist check. Added explicit
returnafterevent.disallow()to prevent execution continuation and potential future bugs.
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:2V1taxea:swV6AQYR"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:2V1taxea:swV6AQYR"
}

