
ControlBans
Feature compact punishment system. free and open sourced.
Оцените первым
684
8
Список изменений
🔴 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.
Файлы
ControlBans-5.3.jar(30.38 MiB)
ОсновнойМетаданные
Канал релиза
Release
Номер версии
5.3
Загрузчики
BukkitBungeeCordFoliaPaperPurpurSpigotVelocity
Версии игры
1.16–26.1.2
Загрузок
64
Дата публикации
19.05.2026
