Перейти к содержимому
Mineforgian

Zenith-Mod

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

Загрузки
518
Подписчики
2
Обновлён
15 марта 2026 г.
Лицензия
Apache-2.0

Опубликован 18 октября 2025 г.

Zenith-Mod - Professional Moderation Plugin

Missing something?

Do you miss something in this Plugin? Open a Ticket in our Discord and we'll implement it very asap!

A comprehensive moderation plugin built for modern Paper servers. Zenith-Mod gives you everything you need to manage your community effectively, with a focus on performance and reliability.

Core Features

Complete Moderation Suite

Ban System - Full ban management with IP bans, temporary and permanent bans, automatic escalation, and template support. Ban players whether they're online or offline.

Mute System - Chat muting with command blocking support. Works for offline players too, so you can mute someone before they even join. Includes IP-based muting and automatic escalation.

Warning System - Track warnings with escalation levels and customizable thresholds. See a player's warning history at a glance.

Freeze System - Freeze players in place with movement restrictions. Perfect for investigations or preventing griefers from escaping.

Kick System - Enhanced kick functionality with custom reasons and staff notifications.

AutoMod - The AutoMod system automatically monitors chat and removes messages that violate your server rules — no manual intervention needed. Word Filter automatically detects and removes messages containing blacklisted words. Thanks to built-in Leetspeak normalization, bypass attempts like 1d10t, i.d.i.o.t or @ssh0le are caught automatically — you only need to add the base word to the list. AntiSpam detects two types of spam: players sending the same message repeatedly (duplicate detection) and players flooding the chat with too many messages in a short time (flood detection). Both thresholds are fully configurable. When a message is blocked, the player receives a notification and staff members with the alert permission are instantly notified in-game. Alerts are also sent to a configurable Discord channel as an embed. Staff can toggle their own alerts on/off with /automod alerts.

Banlist GUI - The Banlist GUI gives your staff a clean overview of all bans on your server — both active and inactive — directly in-game via /banlist. Active bans are displayed in red, expired or already unbanned players in green, making it easy to see the current status at a glance. Each entry shows the player head, ban reason, type (Ban or IP-Ban), remaining duration, the staff member who issued the ban, and the Case ID. Staff can filter the list to show all bans, active bans only, or inactive bans only. A built-in Case ID search lets you find a specific case instantly by typing the ID in chat. Clicking on an active ban entry unbans the player directly from the GUI.

Advanced Management Tools

Vanish System - Complete invisibility with tab list hiding, god mode, and permission-based visibility. Staff can stay hidden while monitoring the server.

Alt Detection & Limiting - Automatically detect alt accounts and limit how many accounts can connect from the same IP address (configurable up to 5 accounts per IP).

Client Detection - Detect what client players are using and take action based on that information.

Chat Freeze - Temporarily freeze all chat for announcements or emergencies. Useful for server-wide announcements.

Notes System - Staff-only notes for players with full history tracking. Keep internal notes that players can't see.

History System - Complete audit trail with case IDs for all moderation actions. Every action is logged and searchable.

Template & Escalation System

Pre-configured Templates - Ready-to-use punishment templates that automatically escalate based on repeat offenses. Set up once and let the system handle repeat offenders.

Multi-level Escalation - Automatic duration increases based on how many times a player has been punished. First offense gets a warning, second gets a short ban, third gets longer, and so on.

IP/UUID Tracking - Choose whether to track by IP address or UUID per template. Some offenses might need IP tracking, others don't.

Custom Reason Suffixes - Automatically add offense level information to ban reasons. Makes it clear why someone got a longer ban.

Template Permissions - Granular permission system so junior staff can only use certain templates.

Offline Player Support

One of Zenith-Mod's key features is that you can moderate players even when they're not currently online. This means you can ban, mute, warn, freeze, or add notes to players who are offline - the action will take effect as soon as they try to join. This is especially useful for handling reports or taking action on players who logged off before you could deal with them.

Note: This refers to players who are currently offline, not offline-mode (cracked) Minecraft servers. The plugin works with standard online-mode authentication.

API & Integrations

Java API System (Beta)

Zenith-Mod includes a comprehensive Java API for developers who want to integrate moderation features into their own plugins.

Available APIs:

  • FreezeAPI - Programmatically freeze and unfreeze players with history tracking
  • ChatFreezeAPI - Control server chat programmatically
  • EssentialsAPI - God mode, fly mode, heal, feed, clear inventory, teleport
  • VanishAPI - Vanish and unvanish players programmatically
  • Event System - Listen to moderation actions with custom events (Ban, Mute, Warn, Kick events)

All API methods use CompletableFuture for non-blocking operations, so they won't slow down your server. Staff notifications and history logging happen automatically for all API actions.

API Documentation: http://javadocs.zenith-studios.org/

API Beta Notice

The Java API is currently in Beta. While core plugin functionality is stable, API features may undergo changes in future versions. Use at your own risk.

Other Integrations

Web-API (Premium) - RESTful API for external integrations and web panels. Token-based authentication with real-time server statistics and license validation for premium features.

Discord Integration (Beta) - Use slash commands in Discord to perform moderation actions. Great for remote moderation or integrating with Discord bots.

Performance Optimized

Everything in Zenith-Mod is built with performance in mind. All operations are fully asynchronous, so nothing blocks the main server thread. We use HikariCP for database connection pooling, which means fast and efficient database operations. Configuration changes can be reloaded without restarting the server, and all database queries are non-blocking.

Modern Architecture

Multi-Database Support - Works with H2 (default), SQLite, MySQL, or MariaDB. Use H2 for single servers, MySQL/MariaDB for multi-server setups.

Proxy Support - Full support for Velocity and BungeeCord IP forwarding.

Modular Configuration - Each module has its own config file, making it easy to customize what you need.

Permission-Based - Comprehensive permission system so you can control who can do what.

Error Handling - Robust error handling means the plugin won't crash your server if something goes wrong.

Modules

Module Description
Ban Complete ban management with IP bans and escalation
Mute Chat muting with command blocking and escalation
Warn Warning system with customizable thresholds
Freeze Player freezing with restrictions
Kick Enhanced kick system
Vanish Complete invisibility system
Limiter Alt detection and IP limiting
History Complete moderation history tracking
Notes Staff notes system
Check Player information and status checks
Client Detector Client type detection
Chat Freeze Temporary chat freezing
Essentials God mode, fly mode, heal, feed, clear, teleport
Web-API (Premium) RESTful API integration
Discord (Beta) Discord bot integration

What we're planning:

  • Punish Command - Take moderation actions through a GUI
  • VoiceChat Muting - Mute people in voice chat using Simple Voice Chat

Technical Specifications

Compatibility

  • Paper 1.21.4+ - Fully tested and supported
  • Paper 1.21.x - Very likely compatible
  • Paper 1.20.x - Very likely compatible
  • Paper 1.19.4 - Probably compatible
  • Paper 1.19.x - May work with minor issues
  • Paper 1.18.x and older - Not supported
  • Spigot - Partially supported (some features may not work)

Requirements

  • Java: 17 or higher
  • Server: Paper 1.19.4+ recommended
  • Database: H2 (default), SQLite, MySQL, or MariaDB
  • Permissions: LuckPerms or similar (recommended)

Configuration

  • Hot-Reload: Use /zenith reload to reload all configs without restarting
  • Modular Config: Each module has its own YAML file in the modules/ directory
  • Color Support: Full hex color support and Minecraft color codes
  • Placeholders: Dynamic placeholders in all messages

Key Commands

  • /ban <player> <template> - Ban a player using a template
  • /mute <player> <template> - Mute a player using a template
  • /warn <player> <template> - Warn a player using a template
  • /freeze <player> - Freeze a player in place
  • /vanish - Toggle vanish mode
  • /history <player> - View a player's moderation history
  • /notes <player> - Manage staff notes for a player
  • /check <player> - Check a player's current status
  • /zenith reload - Reload all configuration files
  • /zenith help - Show all available commands

Staff Features

  • Real-time notifications for all moderation events
  • Auto-escalation based on repeat offenses
  • IP-based tracking to prevent alt account abuse
  • Complete audit trail with searchable case IDs
  • Offline player moderation support
  • Template-only mode for junior staff members

Performance Highlights

  • Async Operations: Nothing blocks the server thread
  • Connection Pooling: HikariCP for optimal database performance
  • Smart Caching: Frequently accessed data is cached
  • File Rotation: Automatic log file rotation by date
  • Error Recovery: Automatic retry for database operations

Statistics & Tracking

  • Player join and leave tracking
  • Moderation action counts
  • Active ban and mute tracking
  • Offense count per template
  • Alt account detection
  • IP address tracking (with proxy support)

Customization

  • Messages: Fully customizable in messages.yml
  • Colors: Hex color support throughout
  • Placeholders: Dynamic content in all messages
  • Prefix: Configurable prefix for all messages
  • Duration Format: Customizable duration display

Getting Started

  1. Download the plugin and place it in your plugins/ folder
  2. Restart your server
  3. Configure your database settings in config.yml
  4. Customize messages in messages.yml if needed
  5. Configure modules in the modules/ directory
  6. Use /zenith reload to apply any configuration changes

For Plugin Developers

Zenith-Mod provides a comprehensive Java API for plugin integration:

ZenithAPI api = ZenithAPI.getInstance();
if (api != null && api.isAvailable()) {
    // Use FreezeAPI, ChatFreezeAPI, EssentialsAPI, VanishAPI
    // Subscribe to events with ZenithEventBus
}

Full API Documentation: http://javadocs.zenith-studios.org/

API Usage Example
// Subscribe to ban events
ZenithEventBus bus = ZenithEventBus.getInstance();
bus.subscribe(PlayerBanEvent.class, event -> {
    getLogger().info(event.getPlayerName() + " was banned: " + event.getReason());
});

// Freeze a player via API
FreezeAPI freezeAPI = api.getFreezeAPI();
freezeAPI.freeze(playerUuid, staffUuid, "Investigation").thenAccept(success -> {
    if (success) {
        getLogger().info("Player frozen successfully");
    }
});

Important Notes

  • Java API: Currently in BETA - API structure may change in future versions
  • Discord Integration: Currently in BETA - use with caution
  • Premium Features: Some features require a license
  • Database: H2 is recommended for single-server setups
  • MySQL/MariaDB: Recommended for multi-server setups

Support & Resources

Why Zenith-Mod?

Performance First - Zero thread blocking, fully async operations
Modern Design - Built for Paper 1.21.4+ with latest APIs
Complete Solution - Everything you need in one plugin
Developer Friendly - Comprehensive Java API for integrations
Scalable - Works great for small and large servers
Professional - Enterprise-grade reliability
Configurable - Highly customizable to fit your needs
Well Documented - Comprehensive documentation and support


Made with ❤️ by Zenith Studios

Bstats

Ченджлог

1.2.7Релиз26.1, 26.1.1, 26.1.2 · 15 марта 2026 г.

Changelog

Ban GUI

  • Completely remade the Ban GUI, fixing several bugs from the previous version
  • Added a Case-ID search feature — simply click the magnifying glass and type the ID in chat
  • Active bans now show in red, expired/unbanned players in green
  • Added a filter button to toggle between all bans, active only, or inactive only

AutoMod

  • Added an AutoMod system that automatically detects and removes messages containing blacklisted words
  • Leetspeak detection included — things like 1d10t or i.d.i.o.t are caught automatically, you only need to add the base word to the list
  • Added an AntiSpam system that detects duplicate messages and message flooding
  • Staff alerts are sent in-game and to Discord when a message is blocked
  • Staff can toggle their own alerts with /automod alerts
1.2.6Релиз1.21.9, 1.21.10, 1.21.11 · 30 января 2026 г.

Zenith-Mod v1.2.6 Update

🐛 Bug Fixes

BanList GUI Critical Fixes

This update fixes several critical issues in the BanList GUI module that could cause server crashes.

Fixed Issues

  • Fixed: Critical crash when opening Ban Details GUI caused by invalid material name (HOURGLASS)

    • The material HOURGLASS does not exist in Minecraft/Bukkit API
    • Changed to CLOCK (the correct material name)
    • Added fallback handling for invalid material names throughout the module
  • Fixed: Material validation errors

    • All Material.valueOf() calls now include proper try-catch error handling
    • Invalid material names from configuration now fallback to safe defaults (PAPER, RED_CONCRETE)
    • Prevents IllegalArgumentException crashes when configuration contains invalid materials
  • Fixed: Pagination bounds checking

    • Improved index validation when clicking on ban items
    • Prevents IndexOutOfBoundsException when navigating between pages
    • Better handling of edge cases in pagination logic

Technical Improvements

  • Added: Safe material name validation with fallback handling for all GUI items

    • Filter buttons, navigation buttons, action buttons, and info items all have fallback materials
    • Configuration errors no longer cause server crashes
    • Server continues to function even with invalid material names in config
  • Added: Enhanced slot bounds checking throughout the BanList module

    • All slot assignments now validate bounds before setting items
    • Prevents ArrayIndexOutOfBoundsException errors
    • Better error logging for configuration issues
  • Improved: Better error handling for invalid configuration values

    • Invalid slot numbers are safely ignored
    • Invalid material names use fallback materials
    • Configuration errors are logged but don't crash the server

🚀 Velocity Plugin Available

Zenith-Mod Velocity v1.2.5 is now also available! The Velocity version includes all the same features and bug fixes as the Bukkit version.

📋 Compatibility

  • Fully backward compatible - No breaking changes
  • No configuration changes needed - Existing configs work as-is
  • No database migrations needed - Automatic database handling
  • Works with all database types - H2, SQLite, MySQL, MariaDB

🔧 Technical Details

Material Name Validation

All GUI item creation now includes safe material validation:

Material material;
try {
    material = Material.valueOf(materialName);
} catch (IllegalArgumentException e) {
    // Fallback to safe default
    material = Material.PAPER; // or appropriate fallback
}

This ensures that even if the configuration contains invalid material names (like HOURGLASS), the server will not crash and will use a safe fallback material instead.

Slot Bounds Checking

All slot assignments now validate bounds:

if (slot >= 0 && slot < gui.getSize()) {
    gui.setItem(slot, item);
}

This prevents ArrayIndexOutOfBoundsException errors when configuration contains invalid slot numbers.

📝 Configuration Notes

If you're using custom material names in modules/banlist.yml, please ensure they are valid Minecraft material names. Common mistakes:

  • HOURGLASS → ✅ CLOCK
  • WOOL → ✅ WHITE_WOOL (or specific color)
  • STAINED_GLASS → ✅ WHITE_STAINED_GLASS (or specific color)

For a complete list of valid material names, refer to the Bukkit Material API documentation.

⚠️ Important Notes

  • This update is highly recommended - Fixes critical crashes in the BanList GUI
  • No data loss - All existing bans and history entries remain intact
  • Automatic fallback - Invalid configurations are automatically handled with safe defaults
  • Error logging - Configuration errors are logged to help identify issues

🔗 Links


⚠️ Recommendation: If you're using the BanList GUI feature, we strongly recommend updating to this version to prevent potential server crashes.

Developed by Zenith-Studios

1.2.5Релиз1.21.9, 1.21.10, 1.21.11 · 24 января 2026 г.

Zenith-Mod v1.2.5 Update

🎨 New: Ban List GUI (/banlist)

  • GUI-based ban overview with player heads
  • Click a ban to open a detail view
  • Unban directly from the GUI (permission-based)
  • Pagination + filters (Active/Expired, Player/IP, All)

🛠️ Fixed

  • Fixed: A crash (ArrayIndexOutOfBoundsException) when opening the Ban Details GUI caused by invalid slot handling / config path mismatch.

🌐 Velocity Plugin Available

  • The Zenith-Mod Velocity plugin is now available for proxy/network setups. Download on our Discord

🔐 Permissions

  • zenith.banlist — Access /banlist
  • zenith.banlist.unban — Unban from the GUI

Developed by Zenith-Studios

1.2.4Релиз1.21.9, 1.21.10, 1.21.11 · 22 января 2026 г.

Zenith-Mod v1.2.4 Update

🎨 New Feature: Ban List GUI

A powerful, interactive GUI system for managing bans!

Zenith-Mod now includes a comprehensive ban list interface that makes it easier than ever to view, filter, and manage player bans directly from an in-game GUI.

✨ Key Features

Interactive Ban List GUI

  • Visual Ban Overview: Browse all bans in a beautiful, organized GUI
  • Player Heads: See player avatars for each banned player
  • Detailed Information: View ban reason, staff member, case ID, date, duration, and status at a glance
  • Click to View Details: Click on any ban to see full information

Advanced Filtering System

  • Active Bans: Filter to show only currently active bans
  • Expired Bans: View bans that have expired or been lifted
  • Player Bans: Filter to show only player-specific bans
  • IP Bans: Filter to show only IP-based bans
  • All Bans: View complete ban history

Pagination Support

  • Navigate through large ban lists with ease
  • Page indicators show your current position
  • Smooth navigation between pages

Quick Actions

  • Unban Directly from GUI: Unban players with a single click (requires permission)
  • Detailed View: Click any ban to see complete information including:
    • Player UUID and IP address
    • Full ban reason
    • Staff member details
    • Case ID
    • Ban date and duration
    • Current status (Active/Expired/Unbanned)

🎯 Configuration

The ban list GUI is fully configurable via modules/banlist.yml:

  • Customizable GUI Titles: Use hex colors and small caps formatting
  • Configurable Item Lore: Customize what information is displayed
  • Filter Button Positions: Arrange filter buttons as you prefer
  • Material Customization: Choose different materials for active/expired/IP bans
  • Variable Support: Use placeholders like {player_name}, {reason}, {case_id}, etc.
  • Color Utils Support: Full support for %smcaps% and hex colors (&#RRGGBB)

🔐 Permissions

  • zenith.banlist - Access to /banlist command
  • zenith.banlist.unban - Unban players from the GUI

📋 Usage

Simply use the /banlist command to open the ban list GUI. From there, you can:

  1. Browse all bans with pagination
  2. Apply filters to narrow down results
  3. Click on any ban to view detailed information
  4. Unban players directly from the detail view (if you have permission)

🎨 Customization Examples

The ban list GUI supports extensive customization through the configuration file:

gui:
  title: '&#00FFAA%smcaps%BAN LIST%smreset%'
  ban_item:
    name: '&#FF5555{player_name}'
    lore:
      - '&#AAAAAAReason: &#FFFFFF{reason}'
      - '&#AAAAAAStaff: &#FFFFFF{staff_name}'
      - '&#AAAAAACase ID: &#FFFFFF{case_id}'

All text supports:

  • Hex colors (&#RRGGBB)
  • Small caps formatting (%smcaps%...%smreset%)
  • Variable placeholders ({player_name}, {reason}, etc.)
  • Standard Minecraft color codes

🔧 Technical Details

  • Asynchronous Loading: Ban data is loaded asynchronously to prevent server lag
  • Session Management: Player sessions track current filter and page state
  • Efficient Filtering: Smart filtering system handles large ban lists efficiently
  • Thread-Safe: All GUI operations are properly synchronized

📊 Integration

The ban list GUI integrates seamlessly with:

  • Existing ban system
  • History tracking
  • Case ID system
  • Unban functionality
  • Staff notification system

⚠️ Breaking Changes

None - This update is fully backward compatible. All existing commands and functionality work exactly as before.

🔄 Migration Notes

  • No configuration changes required
  • The ban list module is enabled by default
  • New configuration file modules/banlist.yml will be created automatically
  • All existing bans are immediately visible in the GUI

📝 Files Changed

New Classes

  • me.kzlyth.modules.banlist.BanListModule
  • me.kzlyth.modules.banlist.BanListConfig
  • me.kzlyth.modules.banlist.gui.BanListGUI
  • me.kzlyth.modules.banlist.gui.BanDetailGUI
  • me.kzlyth.modules.banlist.gui.BanListGUIHandler
  • me.kzlyth.commands.admin.BanListCommand

New Configuration

  • modules/banlist.yml - Complete GUI configuration

Enhanced

  • ZenithMod - Added ban list module initialization
  • plugin.yml - Added /banlist command and permissions

🎉 Enjoy the new ban list GUI! This feature makes ban management more intuitive and efficient than ever before.

📢 Note: The ban list GUI requires players to have the zenith.banlist permission. Make sure to grant this permission to your staff members.

1.2.3Релиз1.21.8, 1.21.9, 1.21.10 · 31 октября 2025 г.

Zenith-Mod v1.2.3 Update

⚠️ Beta Notice

This update includes significant API additions that are currently in Beta. While we've thoroughly tested all features, please be aware that:

  • In very rare cases, API methods may behave unexpectedly
  • In very rare cases, events may not fire or fire incorrectly
  • API structure may undergo changes in future versions
  • We do not provide any warranty or guarantee regarding the API's functionality

Use of the new API features is at your own risk. However, all core plugin functionality (commands, moderation, etc.) remains stable and fully supported.

🚨 CRITICAL: Database Fix

⚠️ THIS UPDATE IS HIGHLY RECOMMENDED - CRITICAL DATABASE ISSUE FIXED

This version fixes a critical database problem that could cause data inconsistency issues. We strongly recommend updating immediately, especially if you're using MySQL or MariaDB databases.

What Was Fixed?

  • Fixed: Critical database transaction issue that could cause history entries to be incomplete
  • Fixed: Potential race condition in database operations that could lead to missing case IDs
  • Improved: Database connection handling and error recovery
  • Result: More reliable database operations and complete history tracking

Note: If you experience any issues after updating, please check your database logs and ensure all migrations completed successfully.

🎯 New API System (Beta)

Zenith-Mod now includes a comprehensive Java API for developers to integrate with other plugins and extend functionality!

📦 New API Modules

FreezeAPI (me.kzlyth.api.freeze)

  • freeze(UUID, UUID, String) - Freeze a player with reason
  • unfreeze(UUID, UUID, String) - Unfreeze a player
  • isFrozen(UUID) - Check if player is frozen
  • getFrozenPlayers() - Get list of all frozen players
  • Automatic history logging with case IDs
  • Staff notifications for all freeze actions

ChatFreezeAPI (me.kzlyth.api.chatfreeze)

  • freezeChat(UUID, String) - Freeze the server chat
  • unfreezeChat(UUID, String) - Unfreeze the server chat
  • isChatFrozen() - Check if chat is currently frozen
  • Server-wide chat control with history tracking
  • Automatic staff notifications

EssentialsAPI (me.kzlyth.api.essentials)

  • God Mode: setGodMode(UUID, UUID, boolean), isGodMode(UUID)
  • Fly Mode: setFlyMode(UUID, UUID, boolean), isFlying(UUID)
  • Heal: heal(UUID, UUID) - Restore player health
  • Feed: feed(UUID, UUID) - Restore player hunger
  • Clear Inventory: clearInventory(UUID, UUID) - Clear player inventory
  • Teleport: teleport(UUID, UUID), teleportHere(UUID, UUID) - Teleport players
  • All methods include staff notifications

VanishAPI (me.kzlyth.api.vanish)

  • vanish(UUID) - Make player invisible
  • unvanish(UUID) - Make player visible
  • toggleVanish(UUID) - Toggle vanish status
  • isVanished(UUID) - Check if player is vanished
  • getVanishedPlayers() - Get list of all vanished players
  • Automatic staff notifications

🎪 Event System (Beta)

A powerful event bus system for listening to moderation actions in real-time!

Available Events

  • Ban Events: PlayerBanEvent, PlayerUnbanEvent
  • Mute Events: PlayerMuteEvent, PlayerUnmuteEvent
  • Warn Events: PlayerWarnEvent
  • Kick Events: PlayerKickEvent

Event Packages

  • me.kzlyth.api.events.ban.* - Ban and unban events
  • me.kzlyth.api.events.mute.* - Mute and unmute events
  • me.kzlyth.api.events.warn.* - Warn events
  • me.kzlyth.api.events.kick.* - Kick events

Features

  • Events fired after actions complete (for integrations and logging)
  • Complete event data (player info, staff info, reason, case ID, duration, etc.)
  • Automatic main-thread handling for safe Bukkit API access
  • Simple subscription/unsubscription system
  • Perfect for Discord webhooks, external databases, analytics, and plugin integrations

📚 API Integration

All new APIs are accessible through the main ZenithAPI class:

ZenithAPI api = ZenithAPI.getInstance();
if (api != null && api.isAvailable()) {
    FreezeAPI freezeAPI = api.getFreezeAPI();
    ChatFreezeAPI chatFreezeAPI = api.getChatFreezeAPI();
    EssentialsAPI essentialsAPI = api.getEssentialsAPI();
    VanishAPI vanishAPI = api.getVanishAPI();
    
    ZenithEventBus eventBus = ZenithEventBus.getInstance();
    eventBus.subscribe(PlayerBanEvent.class, event -> {
        // Handle ban event
    });
}

📖 Complete API Documentation

For detailed API documentation, method signatures, parameters, and usage examples, visit:

http://javadocs.zenith-studios.org/

The Javadoc includes:

  • Complete class and method documentation
  • Parameter descriptions and return types
  • Usage examples and best practices
  • Exception handling guides
  • Event system documentation

✅ Enhanced Existing APIs

BanAPI Improvements

  • Fixed: Players are now automatically kicked when banned via API
  • Added: Staff notifications for all ban API calls
  • Improved: Better error handling and validation

MuteAPI Improvements

  • Added: Staff notifications for all mute API calls
  • Improved: Better offline player handling

WarnAPI Improvements

  • Added: Staff notifications for all warn API calls
  • Fixed: Auto-escalation now works correctly with API calls

KickAPI Improvements

  • Added: Staff notifications for all kick API calls
  • Improved: Better integration with history system

📊 Analytics Integration

bStats Integration

  • Added: Integrated bStats metrics system for plugin analytics
  • Anonymous usage statistics to help us improve the plugin
  • Respects server privacy settings
  • Can be disabled via bStats configuration

🔧 Technical Details

API Architecture

  • Asynchronous Operations: All API methods use CompletableFuture for non-blocking operations
  • Thread Safety: Event bus automatically handles thread synchronization
  • Error Handling: Comprehensive exception handling with APIUnavailableException
  • History Integration: All API actions automatically create history entries with case IDs
  • Notification System: Automatic staff notifications for all moderation actions

Database Improvements

  • Fixed critical transaction issues
  • Improved connection handling
  • Better error recovery mechanisms
  • Enhanced history entry consistency

Performance

  • Asynchronous API calls prevent server lag
  • Event system optimized for high-throughput scenarios
  • Efficient database operations

📋 Setup Instructions

For Plugin Developers

  1. Add Zenith-Mod as a dependency in your plugin.yml:
depend: [Zenith-Mod]
  1. Get the API instance:
ZenithAPI api = ZenithAPI.getInstance();
if (api != null && api.isAvailable()) {
    // Use API...
}
  1. Subscribe to events:
ZenithEventBus bus = ZenithEventBus.getInstance();
bus.subscribe(PlayerBanEvent.class, event -> {
    // Handle event...
});

For complete setup instructions and examples, see the API Documentation.

⚠️ Breaking Changes

None - This update is fully backward compatible. All existing commands and functionality work exactly as before.

🔄 Migration Notes

  • No configuration changes required
  • No database migrations needed (automatic)
  • All existing bans, mutes, warns, and history entries remain intact
  • API is opt-in - existing plugins continue to work without changes

📝 Files Changed

New API Classes

  • me.kzlyth.api.freeze.FreezeAPI
  • me.kzlyth.api.chatfreeze.ChatFreezeAPI
  • me.kzlyth.api.essentials.EssentialsAPI
  • me.kzlyth.api.vanish.VanishAPI
  • me.kzlyth.api.events.ZenithEvent
  • me.kzlyth.api.events.ZenithEventBus
  • Event classes in me.kzlyth.api.events.* packages

Enhanced Existing Classes

  • ZenithAPI - Added getters for new APIs
  • BanAPI - Added notifications and auto-kick
  • MuteAPI - Added notifications
  • WarnAPI - Added notifications
  • KickAPI - Added notifications

Database Fixes

  • Enhanced transaction handling in all repository classes
  • Improved connection pool management
  • Better error recovery mechanisms

🔗 Full API Documentation: http://javadocs.zenith-studios.org/

⚠️ Remember: The API system is in Beta. While core plugin functionality is stable, please test API integrations thoroughly in a development environment before using in production.

📢 Important: This update fixes a critical database issue. We highly recommend updating as soon as possible.


Developed by Zenith-Studios

1.2.2Релиз1.21.8, 1.21.9, 1.21.10 · 28 октября 2025 г.

Zenith-Mod v1.2.2 Release Notes

Update Notification System & Critical Bug Fixes

🔔 Update Notification System

  • Added: Automatic update checking for new plugin versions
  • Added: Players with zenith.update.notify permission get notified when a new version is available
  • Added: Clickable green "Modrinth" link that opens the download page
  • Features:
    • Async version checking via Modrinth API
    • Non-blocking update checks
    • Clean notification message with clickable link
    • Permission-based notification system (default: OP only)
  • Result: Staff members are automatically notified of new versions when joining the server

🔓 Unmute System Fix

  • Fixed: active_case now correctly set to null after unmute (instead of unmute case ID)
  • Fixed: ip_muted status now properly cleared when unmuting IP-muted players
  • Fixed: IPMUTE recognition (without underscore) in unmute operations
  • Added: Support for both IP_MUTE and IPMUTE punishment types in unmute logic
  • Changed: updatePlayerMuteStatus now sets active_case to null instead of unmute case ID
  • Result: Unmuted players have correct status flags, allowing them to be muted again if needed

⏱️ IP-Mute Duration Display Fix

  • Fixed: "Unknown" or "Permanent" duration display for IP-muted players
  • Fixed: Correct remaining duration calculation for IP_MUTE and IPMUTE types
  • Changed: JSON parsing now supports both "expiry_time" and "expiryTime" formats
  • Changed: Staff notifications now show accurate remaining mute time for IP-muted players
  • Result: Staff see correct remaining time (e.g., "45 minutes") instead of "Unknown" or "Permanent"

🎯 Offense Counter Fix

  • Fixed: Offense counting now works per template/reason instead of globally
  • Fixed: Different templates (e.g., "Doxx Threats", "Cheating") are counted separately
  • Changed: SQL query now filters by reason base (e.g., "Doxx Threats%") instead of all offenses
  • Changed: Template-based offense tracking prevents cross-template contamination
  • Result: Correct escalation levels per template (1st/2nd/3rd offense per specific reason)

🚀 Player Join Optimization & Mute Command Fix

  • Fixed: "Player not found in database" error when muting freshly joined players
  • Fixed: Race condition between player join and mute commands
  • Changed: Intelligent player database handling on join (existing vs new players)
  • Changed: Synchronous database creation for new players to prevent race conditions
  • Changed: Asynchronous updates for existing players (last_seen, IP) for performance
  • Added: Fallback mechanism for database errors during player join
  • Result: Mute commands work immediately after player join, no more "not found" errors

What Changed?

Before:

  • ❌ No automatic update notifications for staff
  • ❌ Players had to manually check for new versions
  • active_case set to unmute case ID prevented re-muting players
  • ip_muted status not cleared after unmuting IP-muted players
  • ❌ Staff notifications showed "Unknown" or "Permanent" for IP-muted players
  • ❌ Duration calculation failed for IP_MUTE and IPMUTE types
  • ❌ JSON parsing only checked for "expiryTime" format
  • ❌ Offense counting was global across all templates
  • ❌ Different templates contaminated each other's offense counts
  • ❌ Players got wrong escalation levels (e.g., "2nd Offense" when it was their first)
  • ❌ "Player not found in database" error when muting freshly joined players
  • ❌ Race condition between player join and mute commands
  • ❌ All player joins used asynchronous database operations

After:

  • ✅ Automatic update notifications when joining server
  • ✅ Clickable Modrinth link for easy download access
  • ✅ Permission-based notification system
  • active_case correctly set to null after unmute
  • ip_muted status properly cleared after unmuting IP-muted players
  • ✅ Both IP_MUTE and IPMUTE supported in unmute operations (I dont even know why I did IP_MUTE and IPMUTE in the first place 😭)
  • ✅ Accurate remaining duration shown in staff notifications
  • ✅ Supports both "expiry_time" and "expiryTime" JSON formats
  • ✅ Correct duration calculation for all mute types
  • ✅ Offense counting works per template/reason
  • ✅ Each template tracks offenses independently
  • ✅ Correct escalation levels per specific reason
  • ✅ Mute commands work immediately after player join
  • ✅ No more "Player not found in database" errors
  • ✅ Intelligent player database handling (existing vs new players)
  • ✅ Synchronous database creation for new players prevents race conditions

Technical Details

Update Notification System

  • UpdateChecker.java: New utility class for checking Modrinth API for updates
  • UpdateCheckListener.java: Event listener that checks for updates on player join
  • API Integration: Fetches version list from https://api.modrinth.com/v2/project/z-mod/version
  • Version Comparison: Semantic versioning comparison (MAJOR.MINOR.PATCH)
  • Notification: Adventure API message with clickable link using ClickEvent.OPEN_URL
  • Permission: zenith.update.notify (default: OP only)
  • Thread Safety: Async operations prevent blocking server thread

Unmute System Fix

  • MuteManager.unmutePlayerWithCaseId(): Now checks for MUTE, IP_MUTE, and IPMUTE types
  • MuteManager.unmuteOfflinePlayerWithCaseId(): Same fixes for offline unmute operations
  • PlayerRepository.updatePlayerMuteStatus(): Sets active_case to null instead of unmute case ID
  • PlayerRepository.setIpMuted(): Clears ip_muted status when unmuting IP-muted players
  • Case ID Tracking: Original mute case ID stored in additional_data for audit trail
  • Discord Logging: Original case ID displayed in unmute embeds

IP-Mute Duration Display Fix

  • MuteHandler.sendStaffNotificationForIpMutedChat(): Fixed JSON parsing for expiry time
  • JSON Parsing: Supports both "expiry_time" (underscore) and "expiryTime" (no underscore)
  • String Parsing: Proper extraction of expiry_time value from JSON strings
  • Duration Calculation: remainingSeconds = (expiryTime - currentTime) / 1000
  • Format Display: Uses DurationParser.formatDuration() for readable time display
  • Punishment Type Support: Recognizes both IP_MUTE and IPMUTE types

Offense Counter Fix

  • HistoryRepository.getOffenseCountByType(): Now filters by reason base instead of all offenses
  • Template Integration: Loads BanTemplate to get correct default reason for filtering
  • SQL Query: reason LIKE baseReason + "%" instead of reason LIKE "%(%"
  • Cross-Template Prevention: Different templates (e.g., "Doxx Threats", "Cheating") counted separately
  • Escalation Accuracy: Each template maintains independent offense counts
  • Backward Compatibility: Existing history entries remain unchanged

Player Join Optimization & Mute Command Fix

  • PlayerJoinHandler.continueNormalJoinProcess(): Intelligent player database handling
  • PlayerRepository.updatePlayerLastSeenAndIp(): New method for updating existing players
  • Synchronous Database Creation: New players created synchronously to prevent race conditions
  • Asynchronous Updates: Existing players updated asynchronously for performance
  • MuteCommand.handleOfflineManualMute(): Online player detection prevents database lookup errors
  • Race Condition Prevention: Eliminates timing issues between join and mute commands
  • Fallback Mechanism: Graceful error handling with async fallback

Compatibility

Update Notification System

  • ✅ Fully backward compatible
  • ✅ No configuration required
  • ✅ Permission-based access control
  • ✅ Works with all server types (Paper/Purpur)
  • ✅ Graceful handling of API failures

Unmute System

  • ✅ Fully backward compatible with existing unmutes
  • ✅ No database migration required
  • ✅ Works with all mute types (MUTE, IP_MUTE, IPMUTE)
  • ✅ Complete audit trail maintained
  • ✅ Discord logging shows original case ID

IP-Mute Duration Display

  • ✅ Fully backward compatible
  • ✅ Supports both JSON formats for expiry time
  • ✅ Handles missing or malformed JSON gracefully
  • ✅ Accurate duration calculation for all mute scenarios
  • ✅ Staff notifications work for all mute types

Offense Counter Fix

  • ✅ Fully backward compatible with existing history entries
  • ✅ No database migration required
  • ✅ Works with all ban/mute templates
  • ✅ Template-based offense tracking
  • ✅ Correct escalation levels per reason

Player Join Optimization & Mute Command Fix

  • ✅ Fully backward compatible with existing player data
  • ✅ No database migration required
  • ✅ Works with all server types (Paper/Purpur)
  • ✅ Minimal performance impact (only new players affected)
  • ✅ Graceful fallback for database errors

Changelog Summary

Added

  • 🔔 Update notification system for staff members
  • 🔔 Permission zenith.update.notify for update notifications
  • 🔗 Clickable Modrinth download link in notifications
  • 🔗 Async version checking via Modrinth API

Fixed

  • 🔓 active_case now correctly set to null after unmute
  • 🔓 ip_muted status now properly cleared after unmuting IP-muted players
  • 🔓 Both IP_MUTE and IPMUTE supported in unmute operations
  • ⏱️ Accurate duration display for IP-muted players in staff notifications
  • ⏱️ JSON parsing for "expiry_time" format (with underscore)
  • ⏱️ Duration calculation for all IP-mute types
  • 🎯 Offense counting now works per template instead of globally
  • 🎯 Different templates tracked independently (no cross-contamination)
  • 🎯 Correct escalation levels per specific reason
  • 🚀 "Player not found in database" error when muting freshly joined players
  • 🚀 Race condition between player join and mute commands

Changed

  • 🔔 Update checks are async and non-blocking
  • 🔓 Unmute operations now clear all mute flags correctly
  • ⏱️ Duration display uses proper JSON parsing for all formats
  • 🎯 SQL queries now filter by reason base instead of all offenses
  • 🎯 Template-based offense tracking prevents cross-contamination
  • 🚀 Player join handling now uses intelligent database operations
  • 🚀 New players created synchronously, existing players updated asynchronously
  • 🚀 Mute command detects online players to prevent database lookup errors

Version: 1.2.2
Released: January 17, 2025
Platform: Paper 1.21.4+

1.2.1Релиз1.21.8, 1.21.9, 1.21.10 · 27 октября 2025 г.

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
1.2.0Релиз1.21.8, 1.21.9, 1.21.10 · 27 октября 2025 г.

Zenith-Mod v1.2.0 Release Notes

Performance & UX Improvements

⚡ Instant Ban Disconnect

  • Fixed: Players are now instantly kicked during login without waiting for database queries
  • Improved: Disconnect screen shows immediately for banned players
  • Changes: Ban checks now happen in AsyncPlayerPreLoginEvent with instant kick, while history details load asynchronously in background
  • Result: No more delays when banned players try to join - connection is rejected immediately

⚡ Instant Kick Command

  • Fixed: /kick command now executes immediately without any delay
  • Removed: 20-tick (1 second) delay that was previously added
  • Improved: Kick disconnect screen appears instantly for kicked players
  • Changes: History entry is now created asynchronously after the kick, not blocking the kick execution
  • Result: Staff can instantly kick players without waiting for database operations

🗄️ Full Database Compatibility

  • Fixed: SQLite syntax errors in all repository files
  • Added: Proper SQL syntax for all database types (SQLite, MySQL, MariaDB, H2)
  • Changed: All repository files now use database-specific AUTO_INCREMENT syntax
  • Changed: UPSERT operations now use database-specific syntax (ON DUPLICATE KEY UPDATE for MySQL/MariaDB, INSERT OR REPLACE for SQLite/H2)
  • Result: Plugin now works seamlessly with SQLite, MySQL, MariaDB, and H2 databases

⚙️ Configuration Improvements

  • Fixed: config.yml is now truly read-only and never overwritten by the system
  • Changed: Plugin now stops immediately if database connection fails (no automatic fallback)
  • Result: User database settings are preserved exactly as configured

What Changed?

Before:

  • ❌ Banned players could briefly connect before being kicked
  • ❌ Kick command had a 1-second delay
  • ❌ Server had to wait for database queries before kicking
  • ❌ SQLite databases caused syntax errors
  • config.yml was sometimes overwritten by the system
  • ❌ Plugin tried to fallback to different databases when connection failed

After:

  • ✅ Banned players are rejected immediately at login
  • ✅ Kick command executes instantly
  • ✅ Database operations happen in background without affecting user experience
  • ✅ SQLite works perfectly with proper syntax
  • config.yml is truly read-only
  • ✅ Plugin stops gracefully on database connection failure (respects user configuration)

Technical Details

  • Ban Handler: Optimized AsyncPlayerPreLoginHandler to kick players instantly with default message, then load actual ban details asynchronously
  • Kick Manager: Removed blocking .join() calls and runTaskLater delay, now kicks immediately
  • Database Operations: All history entries and Discord logs now happen asynchronously without blocking user operations
  • SQLite Support: Fixed AUTO_INCREMENT syntax in all 6 repository files (History, Player, AltLimit, Notes, Warn, RequestLog)
  • UPSERT Operations: Database-specific syntax for insert-or-update operations
  • Config Protection: config.yml is now read-only at save time to prevent system overwrites
  • Database Failures: Plugin stops gracefully when connection fails instead of automatic fallback

Compatibility

  • ✅ Fully backward compatible
  • ✅ No configuration changes required
  • ✅ All existing bans/kicks continue to work normally
  • ✅ Works with all database types (H2, SQLite, MySQL, MariaDB)

Note: This version focuses on performance and user experience improvements, ensuring instant feedback for moderation actions.

Комментарии

Загружаем…