
709
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.
Метаданные
Канал релиза
Release
Номер версии
5.3
Загрузчики
BukkitBungeeCordFoliaPaperPurpurSpigotVelocity
Версии игры
1.16–26.1.2
Загрузок
65
Дата публикации
1 мес. назад
