
XTransfer
A tool that help you transfer players' data between names or UUIDs.
130
3
Added
- Transactional file migration using a temporary staging directory to ensure all-or-nothing data transfer
- Non-blocking retry mechanism using
ScheduledExecutorServicewith configurable delay between attempts - Automatic rollback of backup files when the final atomic move operation fails
- Staging directory cleanup on transfer failure to prevent leftover temporary files
FilePairhelper class to encapsulate source, temporary destination, final destination, and critical/optional flag for each migrated file
Fixed
- Thread pool blocking caused by recursive
copyWithRetryconsuming worker threads during retry waits - Data inconsistency when some files succeed and others fail during a single transfer operation (partial transfer no longer possible)
- Backup file not being created before the main data copy, risking loss of the target player's original data
Changed
copyWithRetrynow usesScheduledExecutorServicefor delayed retries instead of recursive calls on the main executor poolcopyFilenow performs a single copy attempt and returns immediately, with retry logic handled externallytransferPlayerDataand related methods replaced bytransferAllFiles,copyAllToTemp, andmoveTempToTargetto support transactional migration- Backup creation and optional file transfers (stats, advancements) integrated into the unified transactional pipeline
ExecutorServicerenamed toexecutorfor clarity; newschedulerfield added for delayed retry scheduling
Removed
- Recursive retry logic (
copyWithRetrycalling itself withthenCompose) that blocked worker threads - Separate
backupIfNeeded,transferMainData,transferExtraData, andtransferFilemethods, consolidated intotransferAllFilesand supporting methods - Direct file overwrite approach that allowed partial transfer states
Added
- Added
MAX_CACHE_SIZE(1000) limit to prevent memory overflow when loading usercache.json - Added automatic cleanup task to remove stale player locks and access records every hour
- Added performance monitoring with loading time statistics in debug logs
- Added detailed debug logging for file operations, lock acquisition, and error conditions
- Added disk space check before backup operations
Changed
- Refactored data loading: Merged
loadUserCache()andloadNameToUUIDs()into singleloadPlayerData()method for better performance - Improved lock management: Locks now track last access time and are automatically cleaned up
- Enhanced error handling: All exceptions now include detailed debug messages instead of being ignored
- Optimized file copying: Implemented atomic temp file operations with proper cleanup
- Restructured command handling: Unified
transferandtransferuuidlogic into single method - Improved backup system: Added proper file existence checks and atomic operations
- Enhanced tab completion: Added offline player name suggestions with limits
- Better executor shutdown: Added timeout handling and forced termination if needed
Fixed
- Critical: Fixed recursive scheduling in
startCleanupTask()that could cause stack overflow - Critical: Removed dangerous offline UUID fallback that could match wrong players (
UUID.nameUUIDFromBytes) - Fixed scheduler parameter bug where
nullcould be passed instead of plugin instance - Fixed potential memory leak by properly removing locks on player quit
- Fixed file copy failure when parent directories don't exist
- Fixed race condition in task tracking set during concurrent operations
- Fixed incorrect stats file extension for older server versions (<1.13)
- Fixed potential deadlock by implementing consistent lock ordering
- Fixed missing message placeholders in several command responses
Removed
- Removed dangerous offline UUID generation (
UUID.nameUUIDFromBytes) - Removed redundant
asyncparameter from Bukkit scheduler calls - Removed duplicate data loading methods in favor of unified approach
- Removed empty catch blocks that silently ignored exceptions
- Removed unnecessary thread pool for simple operations
- Added
Added
- Folia server support with global region scheduler
- Async file copy operations with buffered streams
- User cache loading from usercache.json
- Name-to-UUID mapping system for offline player lookup
- Backup file creation with configurable suffix
- Disk space checking before file operations (50MB reserve)
- File copy retry mechanism (3 retries with 1 second delay)
- Atomic file operations using temporary files
- Memory leak prevention with automatic lock cleanup system
- Periodic cache cleanup task (runs every hour)
- Player quit event listener to remove unused locks
- Last access time tracking for lock management
- Version detection fallback for unknown server versions
- Multi-language support with message placeholders
- Stats and advancements transfer with version detection
- List command for player data with pagination
- Tab completion with online and offline player support
- Player kick option for online target players
Changed
- Migrated to CompletableFuture for reliable async operations
- Optimized concurrent map operations with atomic replacements
- Improved UUID parsing with better error handling and formatting
- Enhanced scheduler with automatic Folia/Bukkit detection
- Simplified logging system while keeping debug functionality
- Better resource cleanup in onDisable() with timeout handling
- Streamlined configuration loading with auto-fix
- More efficient name-to-UUID mapping updates
- Optimized file copy with proper buffer sizing (8KB)
- Improved lock acquisition with timeout and deadlock prevention
Fixed
- Potential memory leak from unclosed player locks
- Thread safety issues in cache loading (added synchronization)
- Disk space exhaustion crashes during file transfer
- Server version detection crashes with unusual formats
- Concurrent modification issues in map operations
- File copy failures due to cross-filesystem moves
- Backup file corruption from incomplete writes
- Tab completion NPE with null permissions
- UUID format inconsistencies in user input
- Player kick timing issues with async operations
- Configuration loading errors with missing keys
- Resource leaks in file streams (try-with-resources)
- Shutdown hangs from unfinished tasks
Removed
- Redundant constant classes (merged into simple constants)
- Excessive logging methods (consolidated into core ones)
- Overly detailed debug outputs (kept essential only)
- Unnecessary map clearing operations
- Duplicate code blocks in transfer handling
- Deprecated Bukkit API usages
- Legacy version color formatting (simplified version display)
- Redundant permission checks in tab completion
Nah, this is a big work, honestly. Not gonna give up of it.
Changed
- More stable and safe action!
- The code is shorter than the old one.
- The plugin runs faster.
Added
- Folia supported!
Changed
- Optimized the size of JAR.
Added
- Supports 1.8.x ~ 1.12.x now!
Added
- Full configuration system - Now with proper config.yml support
- Auto-config fixing - Missing config entries are automatically restored
- Beautiful console logo - ASCII art on startup (can be disabled in config)
- Colored version display - Alpha (red), Beta (gold), Release (green)
- Multi-language support - Messages fully customizable in config
- Player name tab completion - Tab completes online players and players with data files
- Kick online players option - Prevents data overwrite (configurable)
- Asynchronous file operations - No more server lag during transfers
- Backup system - Automatically creates .old files before overwriting
- /xtransfer reload command - Reload configuration without restart
Changed
- Version display format - Now matches XGamemode style (XTransfer V1.1-alpha)
- Command output - All messages now from config file
- UUID detection - Better handling of premium/offline players
- File copying - Using NIO for better performance
Fixed
- NullPointerException in loadMessages() - Messages map now properly initialized
- Null version in onDisable() - Added DISPLAY_VERSION for reliable shutdown
- Config corruption - Auto-fixes missing config values
- Online player data overwrite - Kicks player before transfer (optional)
Plugin done!
This is just a demo so it doesn't have multi language, config file and other extra features yet.
I will do it when I'm free and I want to code.
Совместимость
Ссылки
Сведения
Лицензия:
Опубликован:3 месяца назад
Обновлён:1 месяц назад
ID проекта:
