/
/fly or Creative gamemode) is now saved and restored automaticallypreviousAllowFlight and previousFlying Maps to store and restore player fly states0 duration instead of -1 for consistency/ban player perm reason and /ban player 0 reason now correctly create permanent bans0 as permanent ban/mute across all systemsAsyncPlayerPreLoginHandler to prevent race conditionsDiscordBot to catch and ignore expected "zip file closed" errorsAsyncPlayerPreLoginHandler for both regular and IP bansexpiry_time in additional_data to correctly extract expiry timestampshandleIpBanWithData() and handlePlayerBanWithData() methods that load real ban information before disconnectingexpiry_time in additional_data for both IP bans and regular bansip_banned=true but no active history entry are now allowed to connectcaseId <= 0 to detect orphaned ban status in players tableip_banned flag when no active history entry exists, prevents false positives/fly no longer worked after vaniship_banned flag stayed true even after ban expirationip_banned=true flag couldn't connect/fly continues working after vanishallowFlight and isFlying state before enabling vanish flying/fly or Creative mode)HashMap<UUID, Boolean> to track previous fly states per player-1 to 0 for consistency-1 checks to use 0 for permanent bansexpiryTime = -1 to expiryTime = 0 for permanent punishmentscaseId == -1 to detect already muted playersoriginal_case_id from additional_dataadditional_data JSON now includes original_case_id field for complete audit trail.thenAccept() to synchronous .get() callsplayerRepository.isIpBanned(playerIp).get() for synchronous checkplayerRepository.getPlayerByUuid(uuid).get() for synchronous checkIllegalStateException with "zip file closed" messageexpiry_time from additional_data to determine if ban has expiredactive = true in history tablebanned/ip_banned flags to false and deactivates history entry when ban expires or is not activeHistoryRepository to deactivate history entries by case IDexpiry_time from additional_data, or closing brace }expiry_time in additional_data for accurate duration displayhistoryEntry.getStaffName(), historyEntry.getReason(), and formatted remaining secondscaseId <= 0 to detect orphaned ban statusip_banned=true in players table but no active history entry existsip_banned to false and allows connection if no case found/fly command-1 to 0 internally)banned, ip_banned) are updated when bans expireip_banned=true but no history entry can connect
Advanced moderation plugin with ban/mute systems, escalation templates, offline support, and Web-API integration for professional server management.