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

XTransfer

A tool that help you transfer players' data between names or UUIDs.

Загрузки
158
Подписчики
3
Обновлён
13 мая 2026 г.
Лицензия
CC-BY-NC-SA-4.0

Опубликован 25 февраля 2026 г.

XTransfer Logo

0 What the heck is this?

A new plugin designed to transfer players' data between names or UUIDs. I didn't find any other plugin can handle this problem before, so I made my own one and uploaded it to here to help anyone who needs this feature for his/her server.

1 Features

1.1 Smart UUID Detection

Automatically detects UUIDs from:

  • Online players
  • usercache.json (for premium players)
  • Offline-mode UUID generation

1.2 Complete Data Transfer

Transfers all vanilla player data:

  • Player inventory and Ender Chest (playerdata/)
  • Statistics (stats/)
  • Advancements (advancements/) for 1.13+

1.3 Safe & Reliable

  • Creates automatic backups before overwriting
  • Kicks online players to prevent data overwrite (configurable)
  • Asynchronous file operations - no server lag!

2 Commands and Permission Nodes

2.1 Commands

- /xtransfer                          - Show version info
- /xtransfer transfer <old-name> <new-name>  - Transfer by player names
- /xtransfer transferuuid <old-uuid> <new-uuid> - Transfer by UUIDs
- /xtransfer list                      - List all player data files
- /xtransfer list <player>              - Show files for specific player
- /xtransfer reload                     - Reload configuration
- /xtransfer help                       - Show the help message

/xtf = /transfer = /xtransfer

2.2 Permission Nodes

- xtransfer.manage - Allows using all XTransfer commands (default: op)

3 Config

# Show logo when plugin enabled
show_logo: true

# World settings
world:
  # Manual world name (only used if auto-detect is false)
  name: "world"
  # Automatically detect world name from server
  auto-detect: true

# Transfer settings
transfer:
  # Transfer statistics files
  stats: true
  # Transfer advancements files (1.13+)
  advancements: true

  # Backup settings
  backup:
    # Create backup of existing files before overwriting
    create: true
    # Suffix for backup files
    suffix: ".old"

  # Online player handling
  # If true, kick online players before transfer
  # If false, show warning but continue
  kick-online-player: true

# Language settings
language: "en"

# Debug mode (enable only for troubleshooting)
debug: false

# Messages - You can customize all messages here
messages:
  # English messages
  en:
    no-permission: "&cYou don't have permission!"
    usage-header: "&9&lX&f&lTransfer &f&lHelp"
    usage-transfer: "&7/xtransfer transfer &f<old-name> <new-name>"
    usage-transferuuid: "&7/xtransfer transferuuid &f<old-uuid> <new-uuid>"
    usage-list: "&7/xtransfer list &f[player]"
    usage-reload: "&7/xtransfer reload"
    usage-help: "&7/xtransfer help"
    reload-success: "&a✓ Configuration reloaded!"
    transfer-start: "&eStarting async transfer..."

    looking-up: "&eLooking up UUIDs for &f{old} &eand &f{new}&e..."
    uuid-not-found: "&cCould not find UUID for: &f{name}"
    try-uuid: "&7Try using /xtransfer transferuuid with direct UUIDs"
    invalid-uuid: "&cInvalid UUID format! Use: /xtransfer transferuuid <old-uuid> <new-uuid>"
    uuid-example: "&7Example: 12345678-1234-1234-1234-123456789012"

    source-data-missing: "&cSource player {name} ({uuid}) has no data file!"

    transfer-from: "&7From: &f{name} &7({uuid})"
    transfer-to: "&7To: &f{name} &7({uuid})"
    transfer-file: "&7File: &f{file}"
    backup-created: "&7Backed up existing file to: &f{file}"
    transfer-success: "&a✓ Successfully transferred player data!"
    transfer-stats: "&7✓ Transferred stats file"
    transfer-advancements: "&7✓ Transferred advancements file"
    transfer-error: "&cError during transfer: {error}"

    folder-not-found: "&cPlayer data folder not found: {path}"
    source-not-found: "&cSource file not found: {file}"
    source-location: "&7Looked in: {path}"

    player-online-warning: "&e⚠ Warning: Player {player} is online! Data may be overwritten when they log out."
    player-kicked: "&e✓ Player {player} has been kicked for data transfer."
    kick-message: "&cYour data is being transferred. Please rejoin in a few seconds."

    no-files: "&eNo player data files found"
    list-header: "&6=== Player Data Files ({count}) ==="
    list-more: "&7... and {count} more"
    list-entry: "&7{name} &8- {uuid}"
    list-unknown: "&8{uuid} &7(unknown)"

    files-header: "&6=== Files for {player} ==="
    file-playerdata: "&7Player Data: {status}{size}"
    file-stats: "&7Stats: {status}"
    file-advancements: "&7Advancements: {status}"

  # Other language...

Ченджлог

1.3-alphaАльфа26.1, 26.1.1, 26.1.2 · 13 мая 2026 г.

Added

  • Transactional file migration using a temporary staging directory to ensure all-or-nothing data transfer
  • Non-blocking retry mechanism using ScheduledExecutorService with 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
  • FilePair helper class to encapsulate source, temporary destination, final destination, and critical/optional flag for each migrated file

Fixed

  • Thread pool blocking caused by recursive copyWithRetry consuming 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

  • copyWithRetry now uses ScheduledExecutorService for delayed retries instead of recursive calls on the main executor pool
  • copyFile now performs a single copy attempt and returns immediately, with retry logic handled externally
  • transferPlayerData and related methods replaced by transferAllFiles, copyAllToTemp, and moveTempToTarget to support transactional migration
  • Backup creation and optional file transfers (stats, advancements) integrated into the unified transactional pipeline
  • ExecutorService renamed to executor for clarity; new scheduler field added for delayed retry scheduling

Removed

  • Recursive retry logic (copyWithRetry calling itself with thenCompose) that blocked worker threads
  • Separate backupIfNeeded, transferMainData, transferExtraData, and transferFile methods, consolidated into transferAllFiles and supporting methods
  • Direct file overwrite approach that allowed partial transfer states
1.2-rlsРелиз1.21.9, 1.21.10, 1.21.11 · 27 февраля 2026 г.

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() and loadNameToUUIDs() into single loadPlayerData() 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 transfer and transferuuid logic 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 null could 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 async parameter 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
1.2-betaБета1.21.9, 1.21.10, 1.21.11 · 26 февраля 2026 г.

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.

1.2-alphaАльфа1.21.9, 1.21.10, 1.21.11 · 26 февраля 2026 г.

Changed

  • More stable and safe action!
  • The code is shorter than the old one.
  • The plugin runs faster.
1.1-rlsРелиз1.21.9, 1.21.10, 1.21.11 · 25 февраля 2026 г.

Added

  • Folia supported!

Changed

  • Optimized the size of JAR.
1.1-betaБета1.21.9, 1.21.10, 1.21.11 · 25 февраля 2026 г.

Added

  • Supports 1.8.x ~ 1.12.x now!
1.1-alphaАльфа1.21.9, 1.21.10, 1.21.11 · 25 февраля 2026 г.

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)
1.0-rlsРелиз1.21.9, 1.21.10, 1.21.11 · 25 февраля 2026 г.

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.

Комментарии

Загружаем…