Sueta

XGamemode

4.6-rls

You're not switching modes, you're switching dimensions.

·Plugin
  1. 4.6-rlslatestCompletingAug 24, 2026
    Added
    - Editable gamemode names - now there are keys like survival in the config and you can edit the name of the gamemodes. - Ignore default gamemode node - if a player has it, the default gamemode won't apply on this player. Thanks to the feedback from @不是阿风喵!
    Changed
    - (nothing)
    Fixed
    - (nothing)
    Removed
    - (nothing)
    94 downloads
  2. 4.6-betaAPI SecurityApr 29, 2026

    Added

    - API security control: allow_to_use_api config option (default: true) to prevent other plugins from accessing the API when set to false - IllegalStateException with clear message when API access is disabled

    Fixed

    - None

    Changed

    - None

    Removed

    - None
    147 downloads
  3. 4.6-alphaMore StableApr 24, 2026

    Added

    - Storage type change detection on reload - warns admin to restart server instead of loading mismatched data

    Fixed

    - MAX_MAPPINGS limit now trims oldest entries instead of only warning - YAML name fallback uses full UUID string instead of substring(0, 8) to prevent potential boundary issues

    Changed

    - lastStorageType field tracks storage type across reloads for change detection
    28 downloads
  4. 4.5-rlsFinal fixesApr 23, 2026

    Added

    - Folia scheduler support with automatic fallback to Bukkit scheduler - SQLite ON CONFLICT detection for better UPSERT performance - UUID-based write locks for thread-safe player data operations - Player save queue (pendingSaves) to serialize async database writes per UUID - Offline player name caching to reduce I/O operations during batch processing - YAML save debouncing with resettable timer (scheduleYamlSave) - Atomic reference for nameToUUIDs and uuidToName maps for safe reload - Legacy YAML format detection and migration support (uuid: GAMEMODE) - Support for setting gamemode for players who have never joined the server - GamemodeChangeEvent custom event for API integration - -all, -online, -offline batch operation flags - Database transaction support for batch offline player updates - Automatic config.yml key merging with missing defaults preservation - Connection retry mechanism with configurable attempts and delay - Debug logging controlled by config option

    Fixed

    - NPE in onDisable() when storageType is not "yaml" and yamlCache is null - Race condition in onPlayerJoin where async save could overwrite recently set gamemode - SQL operation silent failure - now logs error after max retry attempts - Write lock timeout now logs debug message instead of failing silently - Skipped offline players during batch operations now logged with warning count - Config merge now properly adds missing keys without overwriting existing values - Migration now handles both legacy (flat) and modern (nested) YAML formats

    Changed

    - Replaced pendingSaves Set<String> with Map<UUID, CompletableFuture<Void>> for per-UUID queuing - Refactored tryWriteLock pattern into withWriteLock helper method - Optimized processOfflinePlayersData with name cache and early empty check - Cached UPSERT SQL generation to avoid repeated ON CONFLICT detection - Message placeholder replacement now uses Matcher.quoteReplacement() to escape $ and \ - Folia reflection now uses Consumer.class with proper generic erasure handling - savePlayerModeDirect now updates memory cache immediately before async DB write - Batch migration now uses incremental executeBatch() to avoid memory issues

    Removed

    - Legacy yamlCache.set(uuid.toString(), mode.name()) flat format write - Redundant saveYamlCache() call when using database storage - Unused SAVE_DELAY field from earlier versions
    166 downloads
  5. 4.5-betaOptimizations lolApr 20, 2026

    Added

    - Added database connection retry mechanism with MAX_RETRY_ATTEMPTS (3) and RETRY_DELAY_MS (1000ms) for MySQL/SQLite. - Added ensureConnection() and reconnect() methods for automatic database connection recovery. - Added executeWithRetry(), executeUuidQueryWithRetry(), and executeVoidWithRetry() helper methods to wrap SQL operations with retry logic. - Added cross-server compatibility for offline player targeting: When a player name is not found in the local memory cache (nameToUUIDs), the plugin now queries the database directly via queryUuidByName(). - Added -offline, -online, and -all flags to batch target processing. - Added PlayerQuitEvent handler to clean up playerLocks when a player disconnects, preventing potential memory leaks. - Added proper index creation handling (createIndexSafe) with fallback checks for MySQL vs SQLite metadata differences. - Added GamemodeChangeEvent custom event that is called when a player's gamemode is changed by the plugin.

    Fixed

    - Fixed database index creation to check for existing indexes before attempting CREATE INDEX to prevent SQL errors on MySQL. - Fixed onPlayerJoin event to use Optional for loadPlayerMode and properly handle null stored gamemodes without triggering unnecessary errors. - Fixed savePlayerMode to ensure player name is correctly updated in the database when saving gamemode. - Fixed setPlayerMode API method to handle exceptions and return false on failure rather than always returning true. - Fixed YAML caching to properly wrap saves in synchronized blocks to prevent concurrent modification issues. - Fixed loadData to properly populate nameToUUIDs and uuidToName mappings from both YAML and SQL storage. - Fixed handleSinglePlayer to check for player name in database when local cache misses, improving cross-server or bungeecord network support. - Fixed processOfflinePlayersData to use database batch operations for SQL storage instead of locking each player individually, greatly improving performance.

    Changed

    - Refactored database initialization to use a dedicated dbUrl, dbUser, and dbPass fields instead of constructing the connection string inline. - Updated loadPlayerMode to use executeWithRetry for robust SQL error handling and Optional<GameMode> return type. - Improved setPlayerGamemodeLocked logic to check player.isOnline() before scheduling tasks. - Enhanced handleGamemodeTarget to use async() for both batch and single player operations to avoid blocking the main thread. - Replaced explicit try-catch blocks with executeWithRetry wrappers in database operations for cleaner code. - Changed handleBatchPlayers and handleSinglePlayer to use sync() for sending messages to ensure thread safety. - Improved migrateFromYamlIfNeeded to handle ON DUPLICATE KEY UPDATE properly on MySQL. - Optimized processOfflinePlayersData to use batch SQL execution (executeBatch()) with BATCH_SIZE instead of individual updates.

    Removed

    - Removed tryReadLock(), unlockRead(), and withReadLock() methods as they were unused in the new version. - Removed saveAllSync() method as it was unused. - Removed direct Statement usage in initDatabase() in favor of try-with-resources and prepared statements. - Removed redundant player mode saving in onPlayerJoin (no longer forces save if gamemode didn't change). - Removed manual thread sleeping in processOfflinePlayersData for SQL storage, as batch processing handles this efficiently.
    19 downloads
  6. 4.5-alphaMajor Change...Apr 18, 2026

    Added

    - Multi-storage support with automatic migration (YAML, SQLite, MySQL) - Database connection pooling preparation structure - Automatic YAML to database migration on first load - Fallback mechanism to YAML when database connection fails - ReadWriteLock implementation for finer-grained concurrency control - Separate read/write lock methods (tryReadLock, tryWriteLock, unlockRead, unlockWrite) - withReadLock and withWriteLock helper methods for cleaner lock management - Comprehensive API methods with CompletableFuture return types (getPlayerMode, setPlayerMode) - Custom GamemodeChangeEvent for third-party plugin integration - Static Main.getInstance() API accessor - Dedicated savePlayerMode and loadPlayerMode methods with storage abstraction - saveAllSync method for batch YAML persistence - closeStorage method for proper database connection cleanup - Storage type logging on startup when debug mode is enabled - Player lock map initialization with ReentrantReadWriteLock - Database index creation for player name lookups with fallback for SQLite compatibility

    Fixed

    - Lock ownership checking before unlocking to prevent IllegalMonitorStateException - Thread interruption handling in lock timeout scenarios with proper flag restoration - Concurrent modification safety in batch player processing - Data consistency between online player state and persistent storage - Proper thread interruption propagation during executor shutdown - Offline player name resolution fallback chain - UUID validation with proper exception handling for malformed entries - Batch processing now includes invalid entry removal and reporting - YAML cache synchronization issues with synchronized blocks - Pending save deduplication using ConcurrentHashMap.newKeySet()

    Changed

    - Storage backend from single YAML file to pluggable architecture (YAML/SQLite/MySQL) - Lock mechanism from ReentrantLock to ReentrantReadWriteLock for improved read concurrency - Database operations execute asynchronously with prepared statements - Player mode saving now includes timestamp field for future audit capabilities - Data file renamed from data.yml to structured format with separate name and gamemode fields - Configuration now supports storage section with type, MySQL credentials, and connection parameters - Migration process creates .bak backup of original YAML file - handleGamemodeTarget split into handleBatchPlayers and handleSinglePlayer for clarity - processOfflinePlayersData now returns PlayerDataResult with changed and removed counts - Lock acquisition timeout reduced from lock-per-operation to centralized timeout constant - saveDataAsync and saveDataSync replaced with storage-aware savePlayerMode and savePlayerModeLocked - Executor service now uses fixed thread pool of 4 instead of cached pool - detectServerVersion method removed as no longer needed for SPECTATOR detection - Database connection uses MySQL connection parameters (useSSL=false, serverTimezone=UTC, autoReconnect=true) - YAML cache field renamed from dataConfig to yamlCache for clarity

    Removed

    - PlayerDataResult inner class (functionality merged into improved batch processing) - serverMinorVersion field and version-specific SPECTATOR availability checking - saveDataSync direct public method (replaced by saveYamlCache) - updateMapping standalone method (merged into player join event handling) - processPlayerSet helper method (consolidated into main processing flow) - Direct dataConfig field exposure (now accessed through synchronized yamlCache) - Inline database connection string building (moved to dedicated initDatabase method) - Redundant gamemode name storage in YAML root level (now only stored in structured format)
    19 downloads
  7. 4.4-rlsOptimizationsMar 22, 2026

    Added

    - Batch processing for offline player data with configurable BATCH_SIZE (default: 100) to prevent memory overflow when handling large datasets - Centralized constant declarations (SAVE_DELAY, MAX_MAPPINGS, BATCH_SIZE, LOCK_TIMEOUT, SHUTDOWN_TIMEOUT) for better maintainability

    Fixed

    - Potential performance issue where offline player data was processed without pagination, causing high memory usage - Redundant BatchResult inner class replaced with local variables for cleaner code structure

    Changed

    - Optimized processOfflinePlayersData method to process keys in batches instead of all at once - Simplified handleBatchPlayers method by removing unnecessary BatchResult wrapper class - Streamlined code formatting: compressed multi-line conditionals into single lines where appropriate - Improved code readability with consistent constant usage across all methods

    Removed

    - Redundant BatchResult inner class (functionality replaced with local variables) - Hardcoded thread pool size value (now using THREAD_POOL_SIZE constant)
    61 downloads
  8. 4.4-betaFixes...Feb 27, 2026
    Added
    - Added debug logging for lock timeouts and interruptions - Added pendingSaves set to prevent multiple concurrent save operations
    Changed
    - Improved Folia scheduler fallback logic: sync tasks now use Bukkit scheduler instead of direct run() to prevent main thread blocking - Enhanced version detection to properly handle 1.8.8 format
    Fixed
    - Fixed potential main thread blocking when Folia scheduling fails - Fixed lock timeout handling with proper debug logging for easier troubleshooting - Fixed duplicate data saving by implementing pending saves tracking with ConcurrentHashMap.newKeySet() - Fixed version parsing for formats like 1.8.8
    38 downloads
  9. 4.4-alphaCompletly Optimized!Feb 26, 2026
    Added
    - Added comprehensive thread-safe locking mechanism using ReentrantLock for player data - Added support for Folia server software with unified scheduling API - Added debug mode with detailed logging for troubleshooting - Added maximum mappings limit (10,000) to prevent memory leaks - Added delayed save system (20 ticks) to batch disk writes - Added batch processing commands: /gamemode -all, -online, -offline - Added server version detection for spectator mode compatibility - Added configuration auto-merge to keep config.yml up-to-date - Added proper error handling with stack traces in debug mode - Added player quit event handling to clean up locks
    Changed
    - Complete architecture rewrite with modular design - Migrated from coarse synchronized blocks to fine-grained ReentrantLock - Improved thread management: replaced scattered async calls with centralized 4-thread pool - Enhanced name-to-UUID mapping with bidirectional cache (uuidToName + nameToUUIDs) - Optimized data saving: from immediate writes to delayed batch saving - Unified task scheduling for Bukkit and Folia platforms - Improved command tab completion with offline player suggestions - Refactored permission system with granular control (xgamemode.admin, xgamemode.others.*) - Enhanced logging with color-coded console messages - Restructured message system with better fallback support
    Fixed
    - Fixed thread safety issues in name-to-UUID mappings - Fixed memory leak where player data never got cleaned up - Fixed data loss risk from frequent uncoordinated saves - Fixed incorrect console sender usage in logo display - Fixed spectator mode detection on older server versions - Fixed race conditions in player join event handling - Fixed improper synchronization in data file access - Fixed tab completion showing duplicate entries - Fixed permission checks for offline player modifications
    Removed
    - Removed excessive synchronized blocks causing performance bottlenecks - Removed redundant saveData() calls after every player join - Removed unsafe HashSet usage in concurrent mappings - Removed mixed tab/space indentation (now using consistent spaces) - Removed deprecated scheduler implementations I won't be sad when the final JAR file is big anymore! Stable > Everything! Screw you, JAR size!
    15 downloads
  10. 4.3-rlsFeb 2, 2026
    - Optimized the plugin.
    115 downloads
  11. 4.3-betaJul 4, 2025
    [x] Fixed the bug that cause error when closing the server.
    257 downloads
  12. 4.3-alphaMay 25, 2025
    [+] Added 1.8.X mode [x] Optimized Tab Completer
    69 downloads
  13. 4.2-ReleaseMay 5, 2025
    [+] Added Supports to 1.9.X ~ 1.10.X. [x] Optimized Optimized Performance.
    206 downloads
  14. 4.1-ReleaseMay 1, 2025
    [+] Added
    show_logo: true/false
    Show logo or not when plugin enabled. --- [x] Optimized Optimized Performance.
    58 downloads
  15. 4.0-ReleaseNew Generations : 4.0-ReleaseApr 6, 2025
    Fixed the issue where lang settings could not be changed _I uploaded the Release version without checking the plugin functionality, which was my negligence. I hereby apologize to all users affected by the above issues._ SORRY ABOUT THAT! Optimized performance Readded Invalid Playername Check Supported 1.11+ _~~Removed oii-aio~~_
    89 downloads
  16. 3.9-ReleaseApr 4, 2025
    A huge of performance improve JAR size improve Bug fixes
    48 downloads
  17. 3.8-ReleaseMar 29, 2025
    Fixed bug where XGamemode not working on Folia Added Check Legal Player Name Improved performance a lot! _Hope you enjoy it!_
    55 downloads
  18. 3.8-beta-fixMar 19, 2025
    Fixed bug about Auto-Fix config
    49 downloads
  19. 3.8-betaMar 19, 2025
    Optimized size and performance and data secure
    61 downloads
  20. 3.8-alphaMar 18, 2025
    Performance optimize and a HUGE size optimize (I didn't use ProGuard this time!)
    43 downloads
  21. 3.7-ReleaseMar 2, 2025
    Optimized size and fixed bugs
    75 downloads
  22. 3.7-betaMar 1, 2025
    Added log
    60 downloads
  23. 3.7-alphaFeb 28, 2025
    Used Java 8 not Java 17 Optimized size
    44 downloads
  24. 3.6-ReleaseFeb 28, 2025
    Fixed the bug where the _console cannot change the offline player gamemode_ Optimized size to almost less then 10KB
    74 downloads
  25. 3.6-betaFeb 28, 2025
    Fixed _~~many bugs~~_ about Auto-Fix Optimized size and performance
    75 downloads
  26. 3.63.6-alphaFeb 21, 2025
    _~~Fixed many bugs~~_ Optimized size and performance
    62 downloads
  27. 3.53.5-ReleaseFeb 17, 2025
    Optimized Size & Performance! _~~Fixed many bugs~~_
    57 downloads
  28. 3.4Feb 14, 2025
    _~~Fixed All Bugs I Found...again~~_ _( · v . )_ Added oii-aio Language
    23 downloads
  29. 3.3Feb 12, 2025
    _~~Fixed All Bugs I Found! qwq~~_ Optimized Performance and JAR Size to 10.1 KB.
    22 downloads
  30. 3.2Feb 10, 2025
    Fixed Many Bugs on Spigot Not Optimized yet _(I mean size not performance)_ So the JAR is huge (12KB) Uh, I'll optimize it in V3.3.
    26 downloads
  31. 3.1Feb 7, 2025
    Improved Performance Improved Auto-Fix
    33 downloads
  32. 3.0Feb 6, 2025
    Added Auto-Fix for config.yml! Added Multi-Language Supports!
    24 downloads
  33. 2.9Feb 5, 2025
    _Better_ Performance!
    24 downloads
  34. 2.8Feb 3, 2025
    _~~Fixed All Known Bugs!~~_
    30 downloads
  35. 2.7Feb 2, 2025
    **_Fixed many bugs_**
    33 downloads
  36. 2.6Feb 2, 2025
    _Fixed many bugs_
    31 downloads
  37. 2.5Feb 1, 2025
    Fixed many bugs. _(SORRY ABOUT THAT)_ Added Default Gamemode in config.yml
    21 downloads
  38. 2.4Feb 1, 2025
    Supports Folia Now! Added /gm <mode> -all/-online/-offline Added data.yml so you can edit the gamemode for offline player. Improved Performance.
    21 downloads
  39. 2.3Jan 30, 2025
    Supports 1.13 & 1.13+ now! Added /xgm about
    21 downloads
  40. 2.2Jan 24, 2025
    Added /xgamemode Added Auto-Complete
    22 downloads
  41. 2.1Jan 24, 2025
    Added /xgamemode reload Added /gamemode <mode> [player] Added /gm
    26 downloads
  42. 1.0Jan 23, 2025
    Plugin is done!
    32 downloads

Similar projects

Plugin →