Unofficial site, not affiliated with modrinth.com.What is this?
Плагины/Zenith-Mod
Zenith-Mod

Zenith-Mod

Advanced moderation plugin with ban/mute systems, escalation templates, offline support, and Web-API integration for professional server management.

354
2
Все версииZenith-Mod 1.2.1

Zenith-Mod 1.2.1

Release6 мес. назад

Список изменений

Zenith-Mod v1.2.1 Release Notes

CRITICAL Bug Fixes

🎭 Vanish Module - Fly State Preservation

  • Fixed: Fly mode is now properly restored when exiting vanish
  • Changed: Previous fly state (from EssentialsX /fly or Creative gamemode) is now saved and restored automatically
  • Result: Players can now fly again after exiting vanish if they had fly enabled before entering vanish
  • Technical: Added previousAllowFlight and previousFlying Maps to store and restore player fly states

🔨 Ban/Mute Duration Fixes

  • Fixed: Permanent ban/mute now uses 0 duration instead of -1 for consistency
  • Fixed: Commands /ban player perm reason and /ban player 0 reason now correctly create permanent bans
  • Fixed: Player is no longer instantly unbanned when using duration "0"
  • Changed: Internal logic now treats 0 as permanent ban/mute across all systems
  • Result: Permanent bans now work correctly without instant unbans

🔇 Mute Already Muted Player Error

  • Fixed: Better error messages when trying to mute already muted players
  • Changed: Now shows "Player is already muted!" instead of "Failed to mute offline player"
  • Result: Staff members get clear feedback when attempting to mute already muted players

🔓 Unban Discord Logging & Case ID Display

  • Fixed: Unban actions now properly log to Discord channel when executed ingame
  • Fixed: Original case ID from ban is now displayed in Discord embed for unbans
  • Changed: Discord embed now shows the original ban case ID in "Original Case" field
  • Result: Staff can now track which ban was undone by each unban action

🔓 Unmute Discord Logging & Case ID Display

  • Fixed: Unmute actions now properly log to Discord channel for both online and offline players
  • Fixed: Original case ID from mute is now displayed in Discord embed for unmutes
  • Changed: UnmuteCommand now properly waits for Discord logging to complete before showing success message
  • Result: Staff can now track which mute was undone by each unmute action, complete audit trail for mute/unmute workflow

🚫 Ban Check Race Condition Fix

  • Fixed: Banned players can no longer join server during async ban check
  • Changed: Ban checking is now synchronous in AsyncPlayerPreLoginHandler to prevent race conditions
  • Result: Banned players are instantly blocked before they can join, no matter how fast they connect

🔌 Discord Plugin Reload Fix

  • Fixed: "zip file closed" errors during plugin reloads no longer spam console
  • Changed: Added global exception handler in DiscordBot to catch and ignore expected "zip file closed" errors
  • Result: Clean console during Discord interactions after plugin updates, no error spam

⏰ Auto-Unban Expired Bans Fix

  • Fixed: Players with expired bans can now connect, ban status is automatically updated
  • Changed: Added automatic expiry check in AsyncPlayerPreLoginHandler for both regular and IP bans
  • Result: Expired bans are automatically deactivated when players try to join, no manual unban required

📊 JSON Parsing Fix for Expired Bans

  • Fixed: Better JSON parsing for expiry_time in additional_data to correctly extract expiry timestamps
  • Changed: Now properly finds the end of the number value (either comma or closing brace) in JSON strings
  • Result: Expired bans are now correctly detected and auto-unbanned, no more parsing errors

🖥️ Disconnect Screen - Real Ban Data Display

  • Fixed: Disconnect screen now shows real ban data instead of placeholders
  • Changed: Added handleIpBanWithData() and handlePlayerBanWithData() methods that load real ban information before disconnecting
  • Result: Players now see correct staff name, reason, remaining time, and case ID on disconnect screen

⏱️ Remaining Ban Time Calculation

  • Fixed: Disconnect screen now shows remaining ban time instead of original duration
  • Changed: Calculates remaining time from expiry_time in additional_data for both IP bans and regular bans
  • Result: Players see "2h 30m" instead of original "6h" ban duration on disconnect screen

🔍 Orphaned IP Ban Fix

  • Fixed: Players with ip_banned=true but no active history entry are now allowed to connect
  • Changed: Added check for caseId <= 0 to detect orphaned ban status in players table
  • Result: Removes incorrect ip_banned flag when no active history entry exists, prevents false positives

What Changed?

Before:

  • ❌ Players lost ability to fly after exiting vanish
  • ❌ Creative mode flight disappeared after vanish
  • EssentialsX /fly no longer worked after vanish
  • ❌ Permanent bans using "perm" or "0" didn't work correctly
  • ❌ Player was instantly unbanned when using duration "0"
  • ❌ Unclear error messages when trying to mute already muted players
  • ❌ Unban actions didn't log to Discord when executed ingame
  • ❌ Discord embeds didn't show which ban was undone
  • ❌ No way to track which case was reversed by an unban
  • ❌ Unmute actions didn't log to Discord for offline players
  • ❌ Original case ID not displayed in unmute embeds
  • ❌ Banned players could join server during async ban check (race condition)
  • ❌ "zip file closed" errors flooded console after plugin updates
  • ❌ Expired bans kept players blocked, required manual unban
  • ip_banned flag stayed true even after ban expiration
  • ❌ JSON parsing errors when checking expired ban expiry times
  • ❌ Disconnect screen showed "Admin", "N/A", "No expiration" instead of real ban data
  • ❌ Disconnect screen showed original ban duration instead of remaining time
  • ❌ Players with orphaned ip_banned=true flag couldn't connect

After:

  • ✅ Players keep their original fly state after exiting vanish
  • ✅ Creative mode flight is preserved
  • EssentialsX /fly continues working after vanish
  • ✅ Fly speed returns to normal (0.1f)
  • ✅ Permanent bans work correctly with both "perm" and "0" durations
  • ✅ Players stay banned when using permanent ban durations
  • ✅ Clear error messages when attempting to mute already muted players
  • ✅ All unban actions log to Discord (both ingame and Discord bot)
  • ✅ Discord embed shows original ban case ID
  • ✅ Complete audit trail for ban/unban workflow
  • ✅ Staff can see which specific ban was reversed
  • ✅ All unmute actions log to Discord (both online and offline players)
  • ✅ Discord embed shows original mute case ID for unmutes
  • ✅ Complete audit trail for mute/unmute workflow
  • ✅ Banned players are instantly blocked, no race condition possible
  • ✅ Clean console during plugin reloads, no "zip file closed" spam
  • ✅ Expired bans are automatically removed, players can reconnect
  • ✅ Ban status flags are updated when bans expire
  • ✅ JSON expiry time parsing works correctly, no more parsing errors
  • ✅ Disconnect screen shows real staff name, reason, remaining time, and case ID
  • ✅ Disconnect screen shows remaining ban time instead of original duration
  • ✅ Orphaned ban statuses are automatically cleaned up

Technical Details

Vanish Module

  • Vanish Entry: System now stores current allowFlight and isFlying state before enabling vanish flying
  • Vanish Exit: System restores the exact previous fly state (including EssentialsX /fly or Creative mode)
  • Storage: Uses HashMap<UUID, Boolean> to track previous fly states per player

Duration System

  • DurationParser: Changed permanent ban/mute from -1 to 0 for consistency
  • BanManager/MuteManager: Updated all -1 checks to use 0 for permanent bans
  • Validation: Both "perm" and "0" are now treated as permanent ban/mute durations
  • Expiry Time: Changed from expiryTime = -1 to expiryTime = 0 for permanent punishments

Error Handling

  • MuteCommand: Added check for caseId == -1 to detect already muted players
  • Error Messages: Improved messaging to distinguish between "already muted" and "player not found" errors

Discord Logging

  • UnbanCommand: Added Discord logging after successful unban history creation
  • UnmuteCommand: Fixed to properly wait for async unmute operations and Discord logging
  • MuteManager: Added Discord logging for offline unmute operations
  • Embed Display: Added regex parsing to extract original_case_id from additional_data
  • Field Display: Shows "Original Case: #123" in Discord embed for unbans and unmutes
  • Case ID Tracking: additional_data JSON now includes original_case_id field for complete audit trail

Ban Check Race Condition

  • AsyncPlayerPreLoginHandler: Changed from async .thenAccept() to synchronous .get() calls
  • IP Ban Check: Now uses playerRepository.isIpBanned(playerIp).get() for synchronous check
  • Player Ban Check: Now uses playerRepository.getPlayerByUuid(uuid).get() for synchronous check
  • Result: Banned players are blocked immediately, preventing them from joining during database query

Discord Plugin Reload Handler

  • DiscordBot.onException(): Added global exception handler to catch IllegalStateException with "zip file closed" message
  • Error Filtering: Only ignores expected "zip file closed" errors during plugin reloads, logs other exceptions normally
  • Result: Clean console output during Discord interactions after plugin updates

Auto-Unban Expired Bans

  • AsyncPlayerPreLoginHandler: Added expiry check for both regular bans and IP bans before blocking connection
  • Expiry Detection: Parses expiry_time from additional_data to determine if ban has expired
  • Active Status Check: First checks if history entry exists and is active = true in history table
  • Automatic Cleanup: Updates banned/ip_banned flags to false and deactivates history entry when ban expires or is not active
  • deactivateCase(): New method in HistoryRepository to deactivate history entries by case ID
  • Result: Expired bans are automatically removed when players try to join, eliminating need for manual unban

JSON Parsing for Expiry Time

  • AsyncPlayerPreLoginHandler: Improved JSON parsing logic to correctly extract expiry_time from additional_data
  • Parsing Logic: Now finds the end of the number value by looking for comma , or closing brace }
  • String Extraction: Properly extracts just the timestamp number without extra JSON content
  • Error Handling: Catches parsing errors and logs them without blocking ban checks
  • Result: Expired bans are now correctly detected and auto-unbanned without parsing errors

Disconnect Screen Improvements

  • handleIpBanWithData(): New method that loads real IP ban data synchronously before disconnecting
  • handlePlayerBanWithData(): New method that loads real player ban data synchronously before disconnecting
  • Real Data Display: Shows actual staff name, reason, and case ID from history entry instead of placeholders
  • Remaining Time: Calculates remaining ban time from expiry_time in additional_data for accurate duration display
  • Data Sources: Uses historyEntry.getStaffName(), historyEntry.getReason(), and formatted remaining seconds
  • Result: Players see accurate ban information on disconnect screen, not "Admin" or "N/A"

Orphaned Ban Cleanup

  • AsyncPlayerPreLoginHandler: Added check for caseId <= 0 to detect orphaned ban status
  • Detection: When ip_banned=true in players table but no active history entry exists
  • Automatic Removal: Sets ip_banned to false and allows connection if no case found
  • Prevention: Prevents false positives from database inconsistencies
  • Result: Players with orphaned ban status can now connect, system auto-cleans inconsistent data

Compatibility

Vanish Module

  • ✅ Fully backward compatible
  • ✅ Works with EssentialsX /fly command
  • ✅ Works with Creative mode flying
  • ✅ Works with any other plugin that modifies allowFlight/flying
  • ✅ No configuration changes required

Ban/Mute System

  • ✅ Fully backward compatible with existing permanent bans (converts -1 to 0 internally)
  • ✅ Supports both "perm" and "0" as permanent ban/mute durations
  • ✅ Clear error messages for staff when attempting to mute already muted players
  • ✅ No database migration required

Unban/Unmute System

  • ✅ Fully backward compatible with existing unbans and unmutes
  • ✅ Works with both regular bans and IP bans
  • ✅ Works with both regular mutes and IP mutes
  • ✅ Complete audit trail for ban/unban and mute/unmute workflows
  • ✅ Discord embeds show historical case IDs for both unbans and unmutes

Discord Reload Handling

  • ✅ Gracefully handles plugin reloads without error spam
  • ✅ Old Discord interactions silently fail during reload
  • ✅ No console spam from expected "zip file closed" errors
  • ✅ New plugin instances work seamlessly after reload

Expired Ban Handling

  • ✅ Expired regular bans are automatically removed on connection attempt
  • ✅ Expired IP bans are automatically removed on connection attempt
  • ✅ Ban status flags (banned, ip_banned) are updated when bans expire
  • ✅ History entries are properly deactivated when bans expire
  • ✅ No manual intervention required for expired bans
  • ✅ JSON parsing for expiry times works correctly for all ban types

Disconnect Screen Display

  • ✅ Real staff names displayed instead of "Admin"
  • ✅ Actual ban reasons displayed instead of "IP Banned"
  • ✅ Remaining ban time calculated and displayed correctly
  • ✅ Real case IDs displayed instead of "N/A"
  • ✅ Both IP bans and regular bans show accurate information

Database Consistency

  • ✅ Orphaned ban statuses automatically detected and cleaned
  • ✅ Players with ip_banned=true but no history entry can connect
  • ✅ System prevents false positives from database inconsistencies

Файлы

Zenith-Mod-1.2.1.jar(660.54 KiB)
Основной
Скачать

Метаданные

Канал релиза

Release

Номер версии

1.2.1

Загрузчики

Paper
Purpur

Версии игры

1.19.4–1.21.10

Загрузок

16

Дата публикации

6 мес. назад

Загрузил

ID версии

Главная