All Mods Resource Packs Data Packs Shaders Modpacks Plugins
PlayerDataSync

PlayerDataSync

by FrediFret • Downloads: 0 • Followers: 0
Description
Gallery
Changelog
Versions

🧩 PlayerDataSync

One player profile for your whole network. Inventories, Ender Chests, XP, health, effects, attributes and economy follow your players to every server — automatically, safely, in the right order.

Servers & Players


🚀 Overview

Players on a network expect one thing: what they had on Survival is still there on SkyBlock, and what they earned on SkyBlock is waiting for them back on Survival.

PlayerDataSync makes that happen. Every server writes to one shared database, every server reads from it on join, and Redis tells the others the moment something changed. Your network behaves like a single world.

No manual file transfers. No duplicated inventories. No lost progress. No "my boots are gone".


✨ What Gets Synchronized

Every entry is an individual toggle in the config, so you decide exactly what travels with your players.

Category Included
Items Inventory (incl. armor and off-hand), Ender Chest, selected hotbar slot
Progression Experience, levels, advancements, statistics
Vitals Health, absorption, hunger, saturation, exhaustion, air, fire ticks, freeze ticks, arrows in body
Effects & state Potion effects, game mode, flight, walk & fly speed, fall distance, player time, player weather
Advanced Attributes, Persistent Data Container, Vault economy balance
Optional Location (disabled by default — see below)

📍 About location sync

Location sync teleports players to their stored position on join. It ships disabled (sync.location: false) because it only makes sense when the destination server has a world of the same name. If that world is missing, the restore is skipped with a log warning instead of dropping the player somewhere wrong.


🛡️ Built to Never Roll Back

Most sync plugins work fine until two things happen at once. PlayerDataSync is designed around exactly those moments:

  • Proxy handshake. With the Velocity bridge, a server switch waits until the old server confirms its save. The new server never reads the database before the write has landed.
  • Ordered loads. Join event, proxy notification and Redis notification all trigger loads — they are queued per player, so the newest record is always the one applied last.
  • No premature saves. Autosave, quit and proxy saves are refused until the stored profile has been applied. The stale local player file can never overwrite the database.
  • No redundant re-applies. A late notification for a record the player already has is ignored. Gear equipped in the meantime stays equipped.
  • Save on shutdown. /stop and /pds reload save every online player and wait for the writes. Paper kicks players after disabling plugins — we save before that happens.
  • Honest failures. A failed database write is counted, logged and retried on the next save instead of being silently marked as "unchanged".
  • Encrypted means encrypted. If encryption is enabled and fails, the save fails. Plaintext never reaches the database by accident.

🧰 More Than Just Sync

  • 🔴 Redis live sync — other servers reload a profile the moment it was saved; the subscriber reconnects automatically if Redis drops
  • 🔐 AES encryption — encrypt stored profiles with your own key
  • 💾 Backups — export the whole database to a compressed snapshot, import it back with one command
  • 🔁 Storage migration — move between MySQL, MariaDB, PostgreSQL and MongoDB in place
  • ⬆️ Legacy import — profiles from the original PlayerDataSync are read automatically
  • 💬 Discord webhooks — notifications for sync successes and failures
  • ⏱️ Autosave — periodic saves as a crash safeguard, with an optional minimum interval
  • 🚫 Exclusions — skip specific worlds or specific item types
  • 🔍 Diagnostics — /pds status for counters and the last error, /pds info <player> for one player's exact sync state
  • 📊 bStats & FastStats metrics
  • 🧩 Developer API — force-save, force-reload and direct access to stored profiles from your own plugins

🌟 Why PlayerDataSync?

Running a network without proper synchronization leads to lost inventories, duplicated items, missing experience and players who stop trusting your server.

PlayerDataSync removes those failure modes — including the rare ones that only show up under load.

  • ✅ One shared player profile across your whole network
  • ✅ Instant propagation with Redis
  • ✅ Four database backends to choose from
  • ✅ Asynchronous — the main thread stays free
  • ✅ Skips saves when nothing changed
  • ✅ Race conditions covered by unit tests, not by hope
  • ✅ Open source (MIT) and actively maintained

🧱 Supported Platforms

Component Supported
Minecraft 1.20 – 26.2
Server software Paper, Spigot, Purpur, Folia, Fabric, Velocity (proxy bridge)
Java 21+ — Minecraft 26.x servers require Java 25
Database MySQL, MariaDB, PostgreSQL, MongoDB

Every platform is a separate download:

File Goes to
PlayerDataSyncReloaded-<version>.jar Paper / Spigot plugins/
PlayerDataSyncReloaded-Velocity-<version>.jar Velocity plugins/
PlayerDataSyncReloaded-Fabric-<mc>-<version>.jar Fabric mods/ — pick the jar for your Minecraft line (1.20, 1.21, 26.1, 26.2)

Please note:

  • Fabric is not yet at feature parity. Advancements and statistics are not synchronized on Fabric. The 1.20 and 1.21 Fabric builds additionally lack Ender Chest, potion effects and attributes; the 26.x builds have those. Fabric does not answer the proxy save handshake yet.
  • Forge is currently unavailable while its build tooling catches up with the Minecraft 26.x toolchain.
  • On Fabric, use MariaDB, PostgreSQL or MongoDB. The MySQL driver is not bundled and mod loaders do not supply one. The MariaDB driver connects to MySQL servers just fine. Paper and Spigot are unaffected.
  • SQLite is not supported for networks — data must live in a database every server can reach.

⚙️ Configuration

Full documentation: 👉 https://pds.devvoxel.de/config

  • Paper / Spigot: plugins/PlayerDataSyncReloaded/config.yml
  • Fabric: config/playerdatasync.properties, created on first start
  • Velocity: plugins/playerdatasync/playerdatasync.properties, created on first start
storage:
  type: "mariadb"   # mysql, mariadb, postgres, mongodb
  host: "localhost"
  port: 3306
  database: "minecraft"
  username: "root"
  password: ""

redis:
  enabled: true     # strongly recommended for multi-server setups
  host: "localhost"
  port: 6379

autosave:
  enabled: true
  interval: 300     # seconds

sync:
  inventory: true
  ender_chest: true
  economy: true     # requires Vault + an economy plugin
  location: false   # teleports players on join

Velocity bridge (playerdatasync.properties):

# How long a server switch waits for the old server to confirm its save. 0 = don't wait.
save_ack_timeout_ms=2000

💬 Commands & Permissions

Everyday operation is fully automatic — players never touch a command. For administrators, everything lives under /playerdatasync (aliases /pds, /pdasync) behind the playerdatasync.admin permission.

Command Description
/pds status Load/save counters, skips, last durations, last error, excluded worlds
/pds info <player> One player's sync state: data applied, load in flight, applied record and last save timestamps
/pds save <player> Force-save a player
/pds saveall Force-save everyone online
/pds load <player> Reload a player from storage (overrides what they have now)
/pds backup list List available backups
/pds backup export <name> Export the whole database to a backup
/pds backup import <name> Restore a backup into the database
/pds migrate Migrate to the storage backend configured under migration
/pds debug on\|off\|toggle Toggle verbose logging at runtime
/pds reload Reload configuration and reconnect storage, Redis and Discord

📈 Performance

  • ⚡ Asynchronous database operations on a dedicated pool — the main thread is never blocked
  • 🔄 Saves are skipped when the inventory has not changed since the last write
  • ⏳ Configurable minimum interval between saves
  • 💾 Compressed, Base64-encoded item data; compressed backups
  • 📉 Low CPU and memory footprint

Suitable for small communities and large networks alike.


📋 Requirements

  • ☕ Java 21+ (Java 25 for Minecraft 26.x servers)
  • 🗄️ MySQL, MariaDB, PostgreSQL or MongoDB
  • 🧱 Paper, Spigot or Fabric server
  • 🌐 Multiple servers pointed at the same database
  • 🔴 Redis (optional, recommended) — instant cross-server propagation
  • 🌉 Velocity bridge (optional, recommended) — save handshake on server switches
  • 💰 Vault + an economy plugin (optional) — required for economy sync

🛠️ Support

  • 💬 Join our Discord server
  • 🐛 Report bugs on GitHub — /pds info <player> output and the server log make reports actionable
  • 📚 Read the documentation
  • 💡 Share feature requests and suggestions

❤️ Credits

Developed with ❤️ by DerGamer09

All Versions

+ Add Version
Name Game version Platforms Published Downloads Actions
26.2 26.1.x 1.21.x +1
Fabric
14h ago 1
26.2 26.1.x 1.21.x +1
Velocity
14h ago 1
26.2 26.1.x 1.21.x +1
Bukkit Folia Paper Purpur Spigot
14h ago 1
26.2 26.1.x 1.21.x +1
Bukkit Fabric Folia Forge Paper Purpur Spigot Velocity
14h ago 1
26.2 26.1.x 1.21.x +1
Bukkit Fabric Folia Forge Paper Purpur Spigot Velocity
14h ago 1
26.2 26.1.x 1.21.x +1
Bukkit Fabric Folia Forge Paper Purpur Spigot Velocity
14h ago 1
26.2 26.1.x 1.21.x +1
Bukkit Fabric Folia Forge Paper Purpur Spigot Velocity
14h ago 1
26.2 26.1.x 1.21.x +1
Bukkit Folia Paper Purpur Spigot
14h ago 1
26.1.x 1.21.x 1.20.x
Bukkit Folia Paper Purpur Spigot
14h ago 1
26.1.x 1.21.x 1.20.x
Bukkit Folia Paper Purpur Spigot
14h ago 1
26.1.x 1.21.x 1.20.x
Bukkit Folia Paper Purpur Spigot
14h ago 1
26.1.x 1.21.x 1.20.x
Bukkit Folia Paper Purpur Spigot
14h ago 1
26.1.x 1.21.x 1.20.x
Bukkit Folia Paper Purpur Spigot
14h ago 1
26.1.x 1.21.x 1.20.x
Bukkit Folia Paper Purpur Spigot
14h ago 1
26.1.x 1.21.x 1.20.x +12
Bukkit Folia Paper Purpur Spigot
14h ago 1
26.1 1.21.x 1.20.x +12
Bukkit Folia Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x 1.19.x +11
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
1.21.x 1.20.x
Bukkit Paper Purpur Spigot
14h ago 1
# PlayerDataSyncReloaded 26.10-ALPHA.001 — Fabric 1.20.1 – 26.2

> **Alpha build.** Compiles and passes the unit tests; not yet exercised on a live network. Test on a staging server first.

### File

  • PlayerDataSyncReloaded-Fabric-26.10-ALPHA.001.jar** — one jar for every supported line. On start the mod reads the Minecraft version from Fabric Loader and activates the matching adapter:

| Minecraft | Fabric Loader | Fabric API | Java |
|-----------|---------------|------------|------|
| 1.20.1 | 0.15.11+ | 0.92.2+1.20.1 | 17+ |
| 1.21.4 | 0.16.14+ | 0.119.2+1.21.4 | 21+ |
| 26.1 | 0.19.3+ | 0.153.0+26.1.2 | 25+ |
| 26.2 | 0.19.3+ | 0.153.0+26.2 | 25+ |

Config: config/playerdatasync.properties, created on first start. Use MariaDB, PostgreSQL or MongoDB — the MySQL driver is not bundled; the MariaDB driver connects to MySQL servers.

### Distribution
  • Now a separate download covering all Minecraft lines. Previously a single-line Fabric jar shipped inside the Paper jar as bundled/playerdatasync-fabric.jar.

### Fixed (all lines)
  • Mod jar was not standalone**: it contained only the adapter classes and failed on load with NoClassDefFoundError. :api, :common and the runtime libraries (HikariCP, MariaDB/PostgreSQL drivers, Mongo driver, Jedis) are now shaded in. Gson and SLF4J are left out because Minecraft ships them.
  • Health 0 killed the player on the next server**: quitting on the death screen saved health = 0, which was applied on join. Health is only applied when it is above 0.

### Added (all lines)
  • Save on shutdown**: SERVER_STOPPING saves every online player; SERVER_STOPPED closes storage after the writes have finished. Storage was never closed before.
  • Disconnect now clears the player's per-session sync state, like the other platforms.

### Sync core (shared by all platforms)
  • Redis auto-reconnect**: the subscriber ran on a common-pool thread and died silently when the connection dropped, so other servers stopped receiving reload notifications. It now runs on its own thread and reconnects every 5 s.
  • Encryption failure no longer writes plaintext**: if CryptoUtil.encrypt throws, the save fails instead of storing unencrypted JSON (SQL and Mongo).
  • Exact unchanged-check**: skipping a save because "nothing changed" now compares the full serialized inventory instead of String#hashCode, so a hash collision can no longer drop a changed inventory.
  • SyncManager#handleQuit returns a CompletableFuture that completes when the write is done; new saveAll and markLoaded for shutdown/reload handling.
  • Includes the 26.9 ordering fixes: loads are serialized per player, saves are refused until the stored profile has been applied, a record that is already applied is not re-applied, and failed SQL writes are counted and retried instead of being cached as "unchanged".

### Known issues
  • Feature parity per line**
  • 1.20.1 and 1.21.4: no Ender Chest, potion effects, attributes, advancements, statistics.
  • 26.1 and 26.2: no advancements, statistics.
  • Fabric does not answer the Velocity save handshake yet. The proxy waits the full timeout once per Fabric server and then stops waiting on it.

# PlayerDataSyncReloaded 26.10-ALPHA.001 — Velocity

> **Alpha build.** Compiles and passes the unit tests; not yet exercised on a live network. Test on a staging server first.

### Distribution
  • Now a separate download. Previously shipped inside the Paper jar as bundled/playerdatasync-velocity.jar.

### Added
  • Save handshake**: ServerPreConnectEvent sends save: to the current server and holds the switch until it answers saved:<uuid>. The destination server can no longer read storage before the previous server's save committed — the cause of "old armor came back" after a switch.
  • Config file** plugins/playerdatasync/playerdatasync.properties, created on first start:
  • save_ack_timeout_ms (default 2000): how long to wait for the confirmation; 0 = never wait.
  • A backend that never answers (older plugin, Fabric, Forge) is only waited on once; afterwards switches from it proceed immediately until it answers again.
  • Control messages from backends on pds:sync are consumed by the proxy and no longer forwarded to the client.

### Requirements
  • Velocity 3.x
  • Backends running PlayerDataSyncReloaded 26.10-ALPHA.001 (Paper) for the handshake; older backends still work, just without the wait.

# PlayerDataSyncReloaded 26.10-ALPHA.001 — Paper / Spigot

> **Alpha build.** Compiles and passes the unit tests; not yet exercised on a live network. Test on a staging server first.

### Distribution
  • The Paper jar no longer embeds bundled/*.jar. Velocity and Fabric are separate downloads (PlayerDataSyncReloaded-Velocity-26.10-ALPHA.001.jar, PlayerDataSyncReloaded-Fabric-<mc>-26.10-ALPHA.001.jar).

### Added
  • Save on shutdown and reload**: Paper disables plugins *before* it kicks players, so PlayerQuitEvent never reached the plugin on /stop and everything since the last autosave was lost. onDisable and /pds reload now save every online player and wait for the writes.
  • Proxy save acknowledgement**: when the Velocity bridge sends save:, the plugin answers saved:<uuid> on pds:sync once the write has landed. The proxy holds the server switch until then, so the destination server never reads a stale profile.
  • /pds info <player>**: shows whether the stored data has been applied, whether a load is in flight or queued, and the timestamps of the applied record and the last save.

### Fixed
  • /pds reload refused all saves**: the reload created a fresh sync manager that did not know online players already had their data applied.
  • Health 0 killed the player on the next server**: quitting on the death screen saved health = 0, which was applied on join. Health is only applied when it is above 0.
  • The "Syncing your data..." message is no longer sent again on proxy/Redis reloads of an already-synced player.

### Sync core (shared by all platforms)
  • Redis auto-reconnect**: the subscriber ran on a common-pool thread and died silently when the connection dropped, so other servers stopped receiving reload notifications. It now runs on its own thread and reconnects every 5 s.
  • Encryption failure no longer writes plaintext**: if CryptoUtil.encrypt throws, the save fails instead of storing unencrypted JSON (SQL and Mongo).
  • Exact unchanged-check**: skipping a save because "nothing changed" now compares the full serialized inventory instead of String#hashCode, so a hash collision can no longer drop a changed inventory.
  • SyncManager#handleQuit returns a CompletableFuture that completes when the write is done; new saveAll and markLoaded for shutdown/reload handling.
  • Includes the 26.9 ordering fixes: loads are serialized per player, saves are refused until the stored profile has been applied, a record that is already applied is not re-applied, and failed SQL writes are counted and retried instead of being cached as "unchanged".

### Requirements
  • Paper, Spigot, Purpur or Folia — Minecraft 1.20 to 26.2 (Java 21+, Java 25 for 26.x)
  • MySQL, MariaDB, PostgreSQL or MongoDB
  • Optional: Redis, Velocity bridge 26.10-ALPHA.001, Vault + economy plugin
## [26.9-Release] - 2026-09-10
### Fixed
  • Old armor / inventory coming back after a server switch**: Three ordering races in SyncManager could apply a stale record over the player's real state. (1) The join event, the Velocity load: message and the Redis notify each started their own DB load; two loads ran concurrently and whichever finished last won, even if it had read the record from *before* the previous server's save landed. Loads are now serialized per player: a load requested while one is in flight is queued and runs afterwards, so the newest record is always the one applied last. (2) Autosave, the proxy save: message and quit could all save while the join load was still pending, writing the server's local playerdata (the player's state from their *last* visit) over the record the previous server had just written. Saves are now refused until the stored record has been applied. (3) A late Redis reload re-applied a record the player already had, rolling back anything done since (e.g. newly equipped boots). Records now carry savedAt; re-applying the same record within a session is skipped unless forced via /pds load or PlayerDataSyncAPI#forceReload.
  • Failed SQL saves were reported as successful**: SqlStorage#save swallowed SQLException, so SyncManager cached the inventory hash (skipping the next save as "unchanged") and told other servers to reload. The future now fails, the error is counted, and the next save retries.

### Added
  • Unit tests for the SyncManager join/quit ordering (common/src/test), run via gradlew :common:test.
> ⚠️ **Alpha.** Everything below compiles and is code-reviewed, but the economy fix, the new location teleport and the Redis live sync have not been exercised against a running server with Vault, Redis or a real multi-server setup. Test on staging before production.

### Fixed
  • Dead config toggles**: sync.attributes, sync.pdc and sync.flight were declared in config.yml but never evaluated — switching them off did nothing. Same bug class as the economy fix in 26.7.
  • Item exclusions on Fabric**: exclusions.items was stored and never read, so excluded items synced anyway. Both minecraft:diamond and the Bukkit-style DIAMOND spelling are accepted.

### Added
  • Location sync now actually works.** The position was previously captured and written to storage but never restored — no teleport existed anywhere in the plugin. Joining players are now teleported to their stored position.
  • Guarded by sync.location, which **defaults to false**. It only works when the destination server has a world of the same name, and turning it on by default would have started teleporting players on upgrade.
  • If the world is missing, the restore is skipped with a warning instead of dropping the player somewhere wrong.
  • Redis live sync completed.** The subscribe handler parsed the incoming UUID and then did nothing — publishing worked, but no server ever acted on it. Receiving servers now reload that player if they are online locally. Messages carry a per-server node ID so a server ignores its own publishes rather than reloading over the save it just made.
  • Config support for Fabric.** Fabric previously returned hardcoded defaults for every config lookup, so no sync.* toggle worked at all. A playerdatasync.properties file is now generated in the Fabric config directory, using the same keys as the Bukkit config. Storage settings are read from it too, instead of the previously hardcoded (and non-functional) SQLite database.
  • More data synced on Fabric (MC 26.x)**: Ender Chest, potion effects and attributes.

### Known issues
  • Fabric is not at parity with Paper.** Advancements and statistics are not synced on any Fabric version. The 1.20 and 1.21 modules also still lack Ender Chest, potion effects and attributes — only 26.x gained those. Planned for 26.8-BETA.
  • On Fabric, use MariaDB, PostgreSQL or MongoDB.** The MySQL driver is not bundled and mod loaders do not provide one. SQLite is not supported on any platform.
  • Forge is not built** — ForgeGradle does not support Gradle 9, which the MC 26.x toolchain requires.
### Fixed
  • Economy sync (Vault)**: Balances were never actually synchronized. SyncManager#setEconomy discarded the Vault provider, and PlayerData.balance was neither read on quit nor applied on join — the sync.economy config toggle had no effect. Balances now transfer across servers, and sync.economy: false genuinely disables it.

### Added
  • Paper 26.2 support**: New v26_2_R1 version handler built against paper-api 26.2; server version detection recognizes 26.2 automatically.
  • Fabric 26.1 / 26.2 modules**: New adapter modules targeting Minecraft 26.1 and 26.2.

### Changed
  • Paper 26.1.2**: Updated to the latest stable build (26.1.2.build.72-stable).
  • Build toolchain**: Gradle 9.6.0; Fabric Loom 1.15.5 (1.20/1.21 lines) and 1.17.12 (26.x lines).
  • Fabric mappings**: MC 26.x builds use Yarn 1.21.11+build.6, since Mojang no longer publishes official mappings for 26.x. Fabric has aligned these names with Mojang's, so 26.x adapter code uses ServerPlayer, CompoundTag, StreamCodec, and net.minecraft.resources.Identifier.

### Known issues
  • Forge is not built in this release.** ForgeGradle 6.0.x refuses to run on Gradle 9+, and no compatible release exists yet. The Forge modules remain in the repository and can be re-enabled with -Ppds.enableForge=true once ForgeGradle supports Gradle 9.
## [26.5.5.1-ALPHA] - 2026-05-20
### Added
  • Fabric**: fabric-api (0.92.2+1.20.1) so lifecycle and server-play networking APIs resolve at compile time; fabric.mod.json declares a fabric-api dependency.
  • Velocity**: Gradle task generatePluginBuildInfo emits PluginBuildInfo.VERSION so the @Plugin version always matches the Gradle project version.
  • Modrinth / Fabric**: Guide [pds-docs/modrinth-upload.md](pds-docs/modrinth-upload.md) (Paper vs Fabric JAR); Gradle task **checkFabricModMetadata** asserts fabric.mod.json exists in the remapped Fabric JAR; Fabric archive base name **playerdatasync-fabric** so it is not confused with the Paper plugin artifact.
  • Unified distribution JAR**: The Paper **PlayerDataSyncReloaded-*.jar** (also copied to **build/libs/**) embeds **bundled/playerdatasync-velocity.jar**, **bundled/playerdatasync-fabric.jar**, and **bundled/playerdatasync-forge.jar** plus **bundled/README.txt** — one download; extract sibling JARs for Velocity/Fabric/Forge (classes are not merged to avoid mapping clashes).

### Changed
  • Gradle / bytecode targets**: api and common use **Java 17** (Fabric/Forge); **plugin** and **Velocity** use **Java 21** so **Paper 1.21.x** can remap the shaded plugin (ASM does not accept class file **69**). Nested **:versions:*** modules are set to **21** in **versions/build.gradle.kts** (they are not root subprojects, so they previously picked up the toolchain default and emitted **69**).
  • Velocity**: velocity-api updated to **3.5.0-SNAPSHOT**; Velocity→backend plugin messages use **UTF-8** (StandardCharsets.UTF_8); ServerConnectedEvent log line uses **event.getServer().getServerInfo()** (Velocity 3 API).
  • Shadow plugin**: Replaced com.github.johnrengelman.shadow **8.1.1** with **com.gradleup.shadow 8.3.10** so shadowJar can process modern class files when relocating (e.g. bundled jars).
  • Forge**: META-INF/mods.toml version is expanded from Gradle (mod_version); Forge build.gradle.kts no longer overrides root version / group.
  • Fabric**: build.gradle.kts no longer overrides root version / group (single version from gradle.properties).
  • Gradle runtime**: **Configuration cache disabled** in gradle.properties (ForgeGradle, Fabric Loom, and Shadow-related flows are not reliable with CC enabled); parallel and build caching remain enabled.
  • CI**: Workflow runs **./gradlew :plugin:build** and uploads the unified **build/libs/PlayerDataSyncReloaded-*.jar** (includes **bundled/** platform JARs).

### Fixed
  • Bukkit version handlers**: v1_20_R1 and v26_1_R1 VersionHandlerImpl now extend **BukkitBaseVersionHandler** and implement **capture / apply with PDSPlayer** (restores compatibility after removal of BaseVersionHandler).
  • Fabric** PlayerDataSyncFabric: ServerPlayNetworking global receiver is registered in **SERVER_STARTING** after storage/SyncManager setup; SLF4J error logging for storage init; guards when syncManager is not ready yet.
  • Forge** PlayerDataSyncForge: storage init failures use **Log4j** instead of printStackTrace; packet and login handlers guard **syncManager == null**.
  • Multi-platform build**: Resolved Gradle dependency variant mismatches (Fabric vs api/common JVM level). **v26_1_R1**: compileClasspath requests JVM **25** so Paper 26 paper-api resolves while sources still compile with **--release 21**.

### Notes
  • One JAR download**: build/libs/PlayerDataSyncReloaded-*.jar contains Paper + **bundled/** Velocity/Fabric/Forge JARs; Modrinth still needs the **extracted** platform files per loader (see pds-docs/modrinth-upload.md).
  • Modrinth**: Use **bundled/playerdatasync-fabric.jar** (extracted from the distribution JAR) for the Fabric loader file — not the outer archive root (that is the Paper plugin with **plugin.yml** only).
  • Paper 1.21.x**: The main plugin classes are built as **Java 21 bytecode** so the server’s **PluginRemapper** can read them. Run the server on **Java 21+** as required by Paper 1.21. **Deploy the JAR whose name matches gradle.properties version** (e.g. **PlayerDataSyncReloaded-26.5.5.1-ALPHA.jar**); delete any older file such as **PlayerDataSyncReloaded-26.5.5-SNAPSHOT.jar** from plugins/ so Paper does not remap a stale build. The shaded jar **excludes META-INF/versions/**** so multi-release dependency layers (class file 69) are not shipped to the remapper.
## [26.5.4-Release] - 2026-05-05
### Fixed
  • Build Process**: Redirected final shaded JAR output to the root build directory for easier access.
  • Database Migration**: Added automatic schema migration for SQL storage to fix "Unknown column" errors when upgrading from older versions.
  • Legacy Fallback**: Implemented automatic fallback to the legacy data format if the new JSON format is missing in SQL storage.

## [26.5.3-Release] - 2026-05-05
### Added
  • Database Migration**: Added automatic schema migration for SQL storage to fix "Unknown column" errors when upgrading from older versions.
  • Legacy Fallback**: Implemented automatic fallback to the legacy data format if the new JSON format is missing in SQL storage.

### Changed
  • Paper Compatibility**: Updated NMS support for the stable Paper 26.1.2 release.
  • Dependency Management**: Updated internal version modules to target the latest stable API builds.
## [26.5.2-Release] - 2026-05-03
### Changed
  • Paper Compatibility**: Updated NMS support for the stable Paper 26.1.2 release.
  • Dependency Management**: Updated internal version modules to target the latest stable API builds.
## [26.5.1-Release] - 2026-05-01
### Fixed
  • Thread Safety**: Resolved IllegalStateException on Paper/Purpur servers where PlayerDataSaveEvent was incorrectly triggered on the main thread while marked as an asynchronous event. Both Save and Load events are now synchronous to ensure full compatibility with the Bukkit threading model.
## [26.5-Release] - 2026-04-27
### Added
  • API Extensibility**: Added extraData map to PlayerData for third-party plugin data synchronization.
  • Save Cancellation**: PlayerDataSaveEvent now implements Cancellable, allowing plugins to prevent data from being saved under specific conditions.
  • Granular Sync Controls**: Added new configuration options to disable syncing for Potion Effects, Food, GameMode, Advancements, and Statistics.
  • Improved Version Detection**: Better handling for Minecraft 1.21.1 and future sub-versions.

### Changed
  • Banner Update**: Refreshed the startup banner with new colors and "Expansion Update" subtitle.
  • Performance**: Minor internal optimizations for event handling.

### Fixed
  • Potential edge case where data might save during an invalid state.
## [26.4-Release] - 2026-04-18
### Added
  • Storage Migrator**: Full release of the migration tool for seamless transitions between SQL and NoSQL.
  • Zipped Backup System**: Reliable export/import system for disaster recovery.
  • Legacy Migration Support**: Bridge for users coming from the original PlayerDataSync version.
  • Vault Economy Sync**: Stable cross-network balance synchronization.
  • Advanced Sync Features**: Full support for PDC, Attributes, Statistics, and Advancements.
  • Auto-Save System**: Background saving task to prevent data loss.
  • Exclusion System**: World and item blacklists for granular control.

### Changed
  • Modernized Version Support**: Dropped legacy support. Now exclusively supporting **1.20, 1.21, and 26.1+**.
  • Performance Optimizations**: GZIP compression and dedicated thread pools are now enabled by default.
  • Inventory Hashing**: Intelligent skip mechanics for unchanged data.

### Fixed
  • All issues discovered during the Beta phase, including NMS fallback and thread safety.

## [26.4-BETA] - 2026-04-12
### Added
  • Storage Migrator**: Added a powerful tool to move data between any supported database backend (MySQL, MariaDB, PostgreSQL, MongoDB).
  • Zipped Backup System**: Added /pds backup export/import for portable data management and safety.
  • Legacy Migration Support**: Added specialized support to migrate data from the old PlayerDataSync version to the new Reloaded format.
  • Vault Economy Sync**: Full synchronization for player balances across the network.
  • Advanced Sync Features**: Added support for Persistent Data Containers (PDC), modern Attributes, Statistics, and Advancements.
  • Auto-Save System**: Automated background saving of all online players to prevent data loss on server crashes.
  • Exclusion System**: Added blacklists for specific worlds and items (by material) to prevent them from being synchronized.
  • Management Commands**: Added /pds reload for hot-reloading connections and /pds migrate for data transfers.
  • Real-time Feedback**: Configurable chat messages for players during synchronization events.
  • Debug Mode**: Detailed logging for easier troubleshooting in complex environments.

### Changed
  • Modernized Version Support**: Dropped legacy support for Minecraft 1.8 through 1.19. Now exclusively supporting **1.20, 1.21, and 26.1+**.
  • Massive Performance Boost**:
  • Integrated **GZIP Compression** for serialized data, reducing storage size and network load by up to 90%.
  • Introduced **Dedicated Thread Pools** for all database I/O to ensure the main server thread is NEVER blocked.
  • Added **Inventory Hashing** to skip redundant database writes if data hasn't changed.
  • Simplified Architecture**: Refactored the core logic into a cleaner multi-module system.
  • Banner**: Updated the startup console banner for a premium look.

### Fixed
  • Fixed internal Attribute constant name changes between 1.20 and 1.21.
  • Fixed NoClassDefFoundError occurring when specific version modules were missing.
  • Fixed thread safety issues in MongoDB and SQL storage handlers.
  • Fixed reflection issues for PersistentDataContainer compatibility across 1.20/1.21.
## [26.4.1-SNAPSHOT] - 2026-04-11

### Added
  • Initial Reload Release**: Complete rewrite and modernization of the sync engine.
  • Java 25 Support**: Leveraged the latest Java features for performance.
  • Multi-Database Support**: Added drivers for MySQL, MariaDB, PostgreSQL, and MongoDB.
  • Redis Pub/Sub Sync**: Implemented ultra-fast synchronization for high-traffic networks.
  • Folia Compatibility**: Support for region-based multithreading.
  • AES Encryption**: Secure player data storage and transmission.
  • Expanded Sync Options**:
  • Inventory and Ender Chest.
  • Health, Food, and Experience.
  • Potion Effects.
  • Advancements and Statistics.
  • Game Mode and Flight status.
  • Location tracking across instances.
  • Attributes and Persistent Data Container (PDC) data.
  • New Command System**: Improved /playerdatasync (aliases: /pds, /pdasync).
  • Improved Config**: New structured config.yml with clear documentation for all settings.
## 🚀 [Reloaded v26.4-SNAPSHOT] - 2026-03-28

The "Reloaded" version is a complete rewrite of the original PlayerDataSync plugin, designed for better performance, modern server support, and extensibility.


## ✨ Added

### 🧠 Core Engine Rewrite
  • Completely new architecture for better stability and lower performance impact.

### 💾 Improved Database Handling
  • Integrated **HikariCP** for high-performance connection pooling.
  • MySQL/MariaDB** support for cross-server synchronization.

### 🔄 Comprehensive Data Synchronization
  • Inventories, Armor, and Ender Chests (Base64 serialized)
  • Health (including Max Health and Scale)
  • Food Level, Saturation, and Exhaustion
  • Experience (Level, Progress, Total Exp) and Score
  • GameMode, Flight status, and Location
  • New:** Potion Effects, Statistics, and Persistent Data Container (PDC)

### 🧩 Modern Server Support
  • Native **Folia** support with regionalized scheduling
  • Compatible with **Paper, Spigot, and Bukkit (1.8 - 1.21+)**

### 🌍 Internationalization (i18n)
  • Multi-language support with dedicated translation files
  • Included languages:
  • German
  • English
  • Chinese (TW)
  • Dutch
  • Korean
  • Malay
  • and more

### 🛠️ Enhanced Utilities
  • ColorUtils:** Support for modern HEX colors and legacy formatting
  • Reflection API:** Cross-version compatibility handling

### 📊 Metrics
  • Integrated **bStats** to track plugin usage and statistics


## 🔄 Changed

  • Migrated storage format to **JSON** for better extensibility
  • Optimized save tasks with configurable intervals (auto-save-ticks)
  • Improved join/quit logic to prevent data loss or race conditions


## 🐛 Fixed

  • Resolved many legacy bugs associated with NBT serialization
  • Fixed async database operations to prevent main-thread lag


## ❤️ Powered by CraftingStudioPro
## [PlayerDataSync-26.3.4-SNAPSHOT] - 2026-03-11

### 🔧 Fixed & Improved
  • Legacy Minecraft Support (1.8-1.16)**: Resolved multiple critical issues for older server versions.
  • Java 8 Compatibility**: Fixed NoSuchMethodError: String.isBlank() by replacing it with Java 8 compatible alternatives in MessageManager.
  • FastStats Isolation**: Isolated Java 17-dependent metrics library to prevent UnsupportedClassVersionError on Java 8 environments.
  • JDBC Driver Fixes**:
  • Implemented explicit driver registration to solve "No suitable driver found" errors in shaded environments (PaperSpigot 1.8.8).
  • Fixed AbstractMethodError: Connection.isValid() by adding safety wrappers for legacy JDBC drivers (SQLite).
  • Configuration Robustness**:
  • Fixed an issue where config.yml was being stripped of content and comments on older Bukkit versions by reducing unnecessary saves.
  • Implemented explicit UTF-8 loading for configuration files to prevent character encoding issues on Windows servers.
  • Enhanced configuration migration and initialization to correctly merge defaults without overwriting existing user settings.
  • Stability and Performance**:
  • Fixed a race condition where default configurations were not being saved to disk before being reloaded during the first startup.
  • Consolidated maintenance mode and version checking logs for better readability.
## [PlayerDataSync-26.3.3-SNAPSHOT] - 2026-03-10

### 🚀 New Features
  • Maintenance Mode**: Pause all data syncing with /sync maintenance <on|off>. Useful for database migrations or emergency fixes.
  • Management GUI**: Use /sync menu for a visual way to toggle sync options and manage the plugin.
  • Performance Profiler**: Use /sync profile to track average and maximum save/load times for better performance monitoring.

### 🔧 Fixed
  • Java Compatibility**: Downgraded default Java target to Java 8 to ensure full compatibility with Minecraft 1.8.8 through 1.16.5 (Purpur) and resolved "Unsupported class file major version 65" errors.
  • Build Configuration**: Removed conflicting activeByDefault profile to prevent accidental Java 21 builds.

### 🔄 Update Checker
  • Hardcoded API Key**: Added a hardcoded API key (CSP-PDS-...) for streamlined server-to-API authentication.
  • Improved Caching**: Implemented a 1-hour cache for update metadata to reduce unnecessary API requests.
  • Manual Check Command**: Added /sync checkupdate command to manually trigger an update check (bypasses cache).
  • Silent Reloading**: Added simplified version check handling that can be called asynchronously without blocking the main thread.

## [PlayerDataSync-26.3.2-SNAPSHOT] - 2026-03-07

### 🔄 Update Checker
  • API Migration**: Fully migrated to CraftingStudio Pro API v1 using modern HttpClient.
  • API Key Support**: Added hardcoded API key support directly in UpdateChecker.java for streamlined authentication.
  • Improved Reliability**: Replaced legacy HttpURLConnection with asynchronous requests and better error handling.
  • Enhanced URLs**: Updated download and plugin info links to the new category-based structure.
## Update – PlayerDataSync 26.3.1-SNAPSHOT

A small update has been released for **PlayerDataSync**.

### Changes
  • Fixed an issue with the version display
  • Corrected the plugin version number

Some users were seeing the incorrect version number **2025.03**.
This version number was **not correct**.

With this update, the version has been corrected to **26.3.1-SNAPSHOT**.

Please make sure to update to the latest version to avoid confusion with incorrect version information.
[26.3] PlayerDataSync v26.3 by FrediFret on Oct 15, 2026
Download
## [PlayerDataSync-26.3-RELEASE] - 2026-03-04

### 🔧 Fixed
  • MongoDB**: Fixed MongoDB errors / MongoDB-Fehler behoben.
## [PlayerDataSync-26.2-RELEASE] - 2026-02-20

### 🛠 XP Sync Fixes
  • Fixed an edge-case where spent XP (for example after enchanting) could be restored on relog due to stale total XP capture.
  • Added immediate autosave hooks for XP/level changes and enchanting to persist XP updates right away.
  • Added new config toggle autosave.on_xp_change (default: true) for instant XP persistence.

### 🗃 Database & Compatibility
  • Kept automatic schema update behavior on startup and runtime upgrade attempts for safe database migrations.
  • Prepared compatibility messaging/docs for upcoming 26.1/26.2 cycle.
## [1.3.0-RELEASE] - 2026-02-13

### 🔄 Reworked Update Checker
  • Complete rewrite of version check flow with robust semantic comparison for tags like -RELEASE/-BETA
  • Uses configurable request timeout (update_checker.timeout) for reliable network behavior
  • Smarter latest-version detection avoids false positive update notifications

### ⚡ XP Synchronization Improvements
  • Optimized XP apply flow with bounded correction attempts for more stable cross-version results
  • Improved mismatch handling to prevent repeated over/under-correction on join/load
  • More precise debug and warning logs for diagnosing XP sync edge-cases

### 💰 Economy Sync Optimization
  • Optimized balance transfer with normalized precision for smooth and reliable Vault synchronization
  • Added post-transfer verification and auto re-adjustment attempts to reduce desyncs
  • Improved fallback logic when provider-specific setBalance implementations are inconsistent
## [1.2.9-RELEASE] - 2026-01-25

### 🎯 Custom-Enchantment-Support & Database Upgrade / Custom-Enchantment-Support & Datenbank-Upgrade

### 🔧 Fixed

  • Database Truncation Error (Critical Fix) / Datenbank-Truncation-Fehler (Critical Fix)**:
  • EN:** Fixes "Data too long for column" errors with large inventories
  • DE:** Behebt "Data too long for column" Fehler bei großen Inventaren
  • ✅ **EN:** Automatic upgrade from TEXT to LONGTEXT for inventory, enderchest, armor, and offhand columns
  • ✅ **DE:** Automatisches Upgrade von TEXT zu LONGTEXT für inventory, enderchest, armor und offhand Spalten
  • ✅ **EN:** Now supports inventories with many custom enchantments (e.g., ExcellentEnchants)
  • ✅ **DE:** Unterstützt jetzt Inventare mit vielen Custom-Enchantments (z.B. ExcellentEnchants)
  • ✅ **EN:** Upgrade is performed automatically on server start
  • ✅ **DE:** Upgrade wird automatisch beim Server-Start durchgeführt
  • ✅ **EN:** Runtime upgrade attempt on truncation errors
  • ✅ **DE:** Runtime-Upgrade-Versuch bei Truncation-Fehlern
  • ✅ **EN:** Improved error messages with solution suggestions
  • ✅ **DE:** Verbesserte Fehlermeldungen mit Lösungsvorschlägen
  • 🔧 **EN:** Fixes issues with large inventories and custom enchantments
  • 🔧 **DE:** Behebt Probleme mit großen Inventaren und Custom-Enchantments

  • Custom-Enchantment Deserialization / Custom-Enchantment-Deserialisierung**:
  • EN:** Robust error handling for custom enchantments
  • DE:** Robuste Fehlerbehandlung für Custom-Enchantments
  • ✅ **EN:** Improved detection of custom enchantment errors (e.g., minecraft:venom)
  • ✅ **DE:** Verbesserte Erkennung von Custom-Enchantment-Fehlern (z.B. minecraft:venom)
  • ✅ **EN:** Items are skipped instead of causing plugin crashes
  • ✅ **DE:** Items werden übersprungen statt Plugin-Absturz zu verursachen
  • ✅ **EN:** Data remains preserved in the database
  • ✅ **DE:** Daten bleiben in der Datenbank erhalten
  • ✅ **EN:** Detailed logging with enchantment names
  • ✅ **DE:** Detailliertes Logging mit Enchantment-Namen
  • ✅ **EN:** Support for ExcellentEnchants and similar plugins
  • ✅ **DE:** Unterstützung für ExcellentEnchants und ähnliche Plugins
  • 🔧 **EN:** Prevents crashes with unrecognized custom enchantments
  • 🔧 **DE:** Verhindert Abstürze bei nicht erkannten Custom-Enchantments

  • Stale Player Data / Veraltete Spielerdaten**:
  • EN:** Fixes issue with outdated player data
  • DE:** Behebt Problem mit nicht aktualisierten Spielerdaten
  • ✅ **EN:** Database upgrade enables successful saves
  • ✅ **DE:** Datenbank-Upgrade ermöglicht erfolgreiche Speicherungen
  • ✅ **EN:** Improved error handling prevents data loss
  • ✅ **DE:** Verbesserte Fehlerbehandlung verhindert Datenverlust
  • ✅ **EN:** Automatic recovery after database upgrade
  • ✅ **DE:** Automatische Wiederherstellung nach Datenbank-Upgrade

### ✨ Added

  • Custom-Enchantment Synchronization / Custom-Enchantment-Synchronisation**:
  • EN:** Full support for custom enchantments
  • DE:** Vollständige Unterstützung für Custom-Enchantments
  • ✅ **EN:** Preservation of all NBT data including custom enchantments during serialization
  • ✅ **DE:** Erhaltung aller NBT-Daten inklusive Custom-Enchantments beim Serialisieren
  • ✅ **EN:** Refresh mechanism after loading inventories (2-tick delay)
  • ✅ **DE:** Refresh-Mechanismus nach dem Laden von Inventaren (2-Tick-Delay)
  • ✅ **EN:** Explicit re-setting of items so plugins can process enchantments
  • ✅ **DE:** Explizites Neusetzen von Items, damit Plugins Enchantments verarbeiten können
  • ✅ **EN:** Works for main inventory, armor, offhand, and enderchest
  • ✅ **DE:** Funktioniert für Hauptinventar, Rüstung, Offhand und Enderchest
  • 📝 **EN:** Supports plugins like ExcellentEnchants that use custom enchantments
  • 📝 **DE:** Unterstützt Plugins wie ExcellentEnchants, die Custom-Enchantments verwenden

  • Deserialization Statistics & Monitoring / Deserialisierungs-Statistiken & Monitoring**:
  • EN:** Comprehensive monitoring system
  • DE:** Umfassendes Monitoring-System
  • ✅ **EN:** Counters for custom enchantment errors, version compatibility errors, and other errors
  • ✅ **DE:** Zähler für Custom-Enchantment-Fehler, Versionskompatibilitäts-Fehler und andere Fehler
  • ✅ **EN:** getDeserializationStats() method for statistics
  • ✅ **DE:** getDeserializationStats() Methode für Statistiken
  • ✅ **EN:** resetDeserializationStats() method to reset statistics
  • ✅ **DE:** resetDeserializationStats() Methode zum Zurücksetzen
  • ✅ **EN:** Integration into /sync cache command
  • ✅ **DE:** Integration in /sync cache Befehl
  • ✅ **EN:** Detailed error logging with enchantment names
  • ✅ **DE:** Detaillierte Fehlerprotokollierung mit Enchantment-Namen
  • 📝 **EN:** Admins can now easily monitor custom enchantment issues
  • 📝 **DE:** Admins können jetzt Probleme mit Custom-Enchantments einfach überwachen

  • Improved Error Handling / Verbesserte Fehlerbehandlung**:
  • EN:** Extended error detection and handling
  • DE:** Erweiterte Fehlererkennung und -behandlung
  • ✅ **EN:** Automatic extraction of enchantment names from error messages
  • ✅ **DE:** Automatische Extraktion von Enchantment-Namen aus Fehlermeldungen
  • ✅ **EN:** Detailed error chain analysis (up to 3 levels)
  • ✅ **DE:** Detaillierte Fehlerketten-Analyse (bis zu 3 Ebenen)
  • ✅ **EN:** Contextual error messages with solution suggestions
  • ✅ **DE:** Kontextuelle Fehlermeldungen mit Lösungsvorschlägen
  • ✅ **EN:** Better detection of various error types (IllegalStateException, NullPointerException, etc.)
  • ✅ **DE:** Bessere Erkennung verschiedener Fehlertypen (IllegalStateException, NullPointerException, etc.)
  • ✅ **EN:** Pattern-based detection of custom enchantment errors
  • ✅ **DE:** Pattern-basierte Erkennung von Custom-Enchantment-Fehlern

### 🔄 Changed

  • Database Schema / Datenbank-Schema**:
  • EN:** Automatic upgrade for existing installations
  • DE:** Automatisches Upgrade für bestehende Installationen
  • ✅ **EN:** inventory: TEXT → LONGTEXT (max. ~4GB instead of ~65KB)
  • ✅ **DE:** inventory: TEXT → LONGTEXT (max. ~4GB statt ~65KB)
  • ✅ **EN:** enderchest: TEXT → LONGTEXT
  • ✅ **DE:** enderchest: TEXT → LONGTEXT
  • ✅ **EN:** armor: TEXT → LONGTEXT
  • ✅ **DE:** armor: TEXT → LONGTEXT
  • ✅ **EN:** offhand: TEXT → LONGTEXT
  • ✅ **DE:** offhand: TEXT → LONGTEXT
  • ✅ **EN:** Upgrade is performed automatically on server start
  • ✅ **DE:** Upgrade wird beim Server-Start automatisch durchgeführt
  • 📝 **EN:** Existing data is preserved, no data migration needed
  • 📝 **DE:** Bestehende Daten bleiben erhalten, keine Datenmigration nötig

  • EditorIntegration Removed / EditorIntegration entfernt**:
  • EN:** Preparation for website update
  • DE:** Vorbereitung für Website-Update
  • ✅ **EN:** EditorIntegrationManager completely removed
  • ✅ **DE:** EditorIntegrationManager komplett entfernt
  • ✅ **EN:** All editor-related commands removed
  • ✅ **DE:** Alle Editor-bezogenen Befehle entfernt
  • ✅ **EN:** Code cleanup for future editor integration
  • ✅ **DE:** Code-Bereinigung für zukünftige Editor-Integration
  • 📝 **EN:** New editor integration will be added in a future version
  • 📝 **DE:** Neue Editor-Integration wird in zukünftiger Version hinzugefügt

### 📊 Technical Details

#### Database Upgrade Process / Datenbank-Upgrade-Prozess

  • EN:** The plugin automatically performs an upgrade of database columns on startup:

  • DE:** Das Plugin führt beim Start automatisch ein Upgrade der Datenbank-Spalten durch:

1. **EN:** **Check**: Verifies the current data type of each column
  • DE:** **Prüfung**: Überprüft den aktuellen Datentyp jeder Spalte
2. **EN:** **Upgrade**: Converts TEXT to LONGTEXT if necessary
  • DE:** **Upgrade**: Konvertiert TEXT zu LONGTEXT wenn nötig
3. **EN:** **Logging**: Logs all upgrades for transparency
  • DE:** **Logging**: Protokolliert alle Upgrades für Transparenz
4. **EN:** **Runtime Upgrade**: Also attempts to upgrade during runtime if an error occurs
  • DE:** **Runtime-Upgrade**: Versucht auch während des Betriebs zu upgraden, wenn ein Fehler auftritt

  • EN:** **Why LONGTEXT?**
  • DE:** **Warum LONGTEXT?**
  • TEXT: Max. ~65KB (65,535 bytes)
  • LONGTEXT: Max. ~4GB (4,294,967,295 bytes)
  • EN:** Custom enchantments with extensive NBT data can become very large
  • DE:** Custom-Enchantments mit vielen NBT-Daten können sehr groß werden
  • EN:** Large inventories with many items and enchantments require more space
  • DE:** Große Inventare mit vielen Items und Enchantments benötigen mehr Platz

#### Custom-Enchantment Error Handling / Custom-Enchantment-Fehlerbehandlung

  • EN:** The improved error handling recognizes various error types:

  • DE:** Die verbesserte Fehlerbehandlung erkennt verschiedene Fehlertypen:

  • IllegalStateException** with DataResult/Codec/Decoder
  • NullPointerException** in enchantment-related classes
  • EN:** Error messages with "enchantment not found/unknown/invalid"
  • DE:** Fehlermeldungen mit "enchantment not found/unknown/invalid"
  • EN:** Pattern-based detection of custom enchantment names
  • DE:** Pattern-basierte Erkennung von Custom-Enchantment-Namen

  • EN:** **Error Handling Flow:**
  • DE:** **Fehlerbehandlung-Flow:**
1. **EN:** Attempt normal deserialization
  • DE:** Versuch der normalen Deserialisierung
2. **EN:** On error: Check if it's a custom enchantment problem
  • DE:** Bei Fehler: Prüfung ob es ein Custom-Enchantment-Problem ist
3. **EN:** Extract enchantment name from error message
  • DE:** Extraktion des Enchantment-Namens aus der Fehlermeldung
4. **EN:** Detailed logging with context
  • DE:** Detailliertes Logging mit Kontext
5. **EN:** Item is skipped (null), but data remains in database
  • DE:** Item wird übersprungen (null), aber Daten bleiben in DB
6. **EN:** Statistics are updated
  • DE:** Statistiken werden aktualisiert

#### Refresh Mechanism / Refresh-Mechanismus

  • EN:** After loading inventories, a refresh mechanism is executed:

  • DE:** Nach dem Laden von Inventaren wird ein Refresh-Mechanismus ausgeführt:

1. **EN:** **Initial Load**: ItemStacks are loaded from database
  • DE:** **Initiales Laden**: ItemStacks werden aus der Datenbank geladen
2. **EN:** **2-Tick Delay**: Waits 2 ticks to give plugins time to initialize
  • DE:** **2-Tick-Delay**: Wartet 2 Ticks, damit Plugins Zeit haben zu initialisieren
3. **EN:** **Refresh**: Explicitly re-sets items to trigger plugin processing
  • DE:** **Refresh**: Setzt Items explizit neu, um Plugin-Verarbeitung zu triggern
4. **EN:** **Update**: Calls updateInventory() for client synchronization
  • DE:** **Update**: Ruft updateInventory() auf für Client-Synchronisation

  • EN:** **Why 2 Ticks?**
  • DE:** **Warum 2 Ticks?**
  • EN:** Gives custom enchantment plugins time to register their enchantments
  • DE:** Gibt Custom-Enchantment-Plugins Zeit, ihre Enchantments zu registrieren
  • EN:** Enables plugin event handlers to react to item changes
  • DE:** Ermöglicht Plugin-Event-Handler, auf Item-Änderungen zu reagieren
  • EN:** Prevents race conditions between plugin loading and item loading
  • DE:** Verhindert Race-Conditions zwischen Plugin-Loading und Item-Loading

#### Statistics System / Statistiken-System

  • EN:** The new statistics system collects information about deserialization errors:

  • DE:** Das neue Statistiken-System sammelt Informationen über Deserialisierungs-Fehler:

  • EN:** **Custom Enchantment Errors**: Counts items skipped due to unrecognized custom enchantments
  • DE:** **Custom-Enchantment-Fehler**: Zählt Items, die wegen nicht erkannter Custom-Enchantments übersprungen wurden
  • EN:** **Version Compatibility Errors**: Counts items with version compatibility issues
  • DE:** **Versionskompatibilitäts-Fehler**: Zählt Items mit Versionskompatibilitätsproblemen
  • EN:** **Other Errors**: Counts all other deserialization errors
  • DE:** **Andere Fehler**: Zählt alle anderen Deserialisierungs-Fehler

  • EN:** **Usage:**
  • DE:** **Verwendung:**
``bash
/sync cache # EN: Shows all statistics / DE: Zeigt alle Statistiken
/sync cache clear # EN: Resets statistics / DE: Setzt Statistiken zurück
`

### 🔍 Monitoring & Debugging

  • EN:** Admins can now easily monitor custom enchantment issues:

  • DE:** Admins können jetzt einfach Probleme mit Custom-Enchantments überwachen:

1. **EN:** **View Statistics**:
/sync cache shows deserialization statistics
  • DE:** **Statistiken anzeigen**: /sync cache zeigt Deserialisierungs-Statistiken
2. **EN:** **Analyze Errors**: Detailed logs show exactly which enchantments cause problems
  • DE:** **Fehler analysieren**: Detaillierte Logs zeigen genau, welche Enchantments Probleme verursachen
3. **EN:** **Fix Issues**: Clear error messages with solution suggestions
  • DE:** **Probleme beheben**: Klare Fehlermeldungen mit Lösungsvorschlägen

  • EN:** **Example Output:**
  • DE:** **Beispiel-Output:**
`
Deserialization Stats: Deserialization failures: 5 total
(Custom Enchantments: 3, Version Issues: 1, Other: 1)
⚠ If you see custom enchantment failures, ensure enchantment plugins
(e.g., ExcellentEnchants) are loaded and all enchantments are registered.
`

### ⚠️ Important Notes / Wichtige Hinweise

  • EN:** **Database Upgrade**: On first start after update, columns are automatically upgraded
  • DE:** **Datenbank-Upgrade**: Beim ersten Start nach dem Update werden die Spalten automatisch geupgradet
  • EN:** **Custom Enchantments**: Ensure enchantment plugins (e.g., ExcellentEnchants) are installed and active on both servers
  • DE:** **Custom-Enchantments**: Stellen Sie sicher, dass Enchantment-Plugins (z.B. ExcellentEnchants) auf beiden Servern installiert und aktiv sind
  • EN:** **Plugin Load Order**: Enchantment plugins should load before PlayerDataSync (check plugin.yml)
  • DE:** **Plugin-Load-Reihenfolge**: Enchantment-Plugins sollten vor PlayerDataSync geladen werden (in plugin.yml prüfen)
  • EN:** **EditorIntegration**: EditorIntegration has been removed and will be re-implemented in a future version
  • DE:** **EditorIntegration**: Die EditorIntegration wurde entfernt und wird in einer zukünftigen Version neu implementiert

### 📝 Migration Guide

  • EN:** **For Existing Installations:**

  • DE:** **Für bestehende Installationen:**

1. **EN:** **Automatic Upgrade**: No manual action needed - plugin performs upgrade automatically
  • DE:** **Automatisches Upgrade**: Keine manuelle Aktion nötig - das Plugin führt das Upgrade automatisch durch
2. **EN:** **Restart Server**: Restart server after update to perform database upgrade
  • DE:** **Server neu starten**: Nach dem Update den Server neu starten, damit das Datenbank-Upgrade durchgeführt wird
3. **EN:** **Check Logs**: Verify logs for upgrade messages:
  • DE:** **Logs prüfen**: Überprüfen Sie die Logs auf Upgrade-Meldungen:
`
[INFO] Upgraded inventory column from TEXT to LONGTEXT to support large inventories
[INFO] Upgraded enderchest column from TEXT to LONGTEXT to support large inventories
[INFO] Upgraded armor column from TEXT to LONGTEXT to support large inventories
[INFO] Upgraded offhand column from TEXT to LONGTEXT to support large inventories
`
4. **EN:** **Check Custom Enchantments**: Ensure all enchantment plugins are loaded correctly
  • DE:** **Custom-Enchantments prüfen**: Stellen Sie sicher, dass alle Enchantment-Plugins korrekt geladen sind

  • EN:** **Troubleshooting:**

  • DE:** **Bei Problemen:**

  • EN:** Check /sync cache for deserialization statistics
  • DE:** Prüfen Sie /sync cache für Deserialisierungs-Statistiken
  • EN:** Review logs for custom enchantment errors
  • DE:** Überprüfen Sie die Logs auf Custom-Enchantment-Fehler
  • EN:** Ensure enchantment plugins are installed on both servers
  • DE:** Stellen Sie sicher, dass Enchantment-Plugins auf beiden Servern installiert sind
  • EN:** Check plugin load order in plugin.yml
  • DE:** Prüfen Sie die Plugin-Load-Reihenfolge in plugin.yml`


## [1.2.7-RELEASE] - 2026-01-03

### 🔧 Critical Fixes & New Features

This release includes critical bug fixes for XP synchronization and Vault economy, plus a new Respawn to Lobby feature.

### Fixed
  • Issue #45 - XP & Level Synchronization (Critical Fix)**: Complete rewrite of experience synchronization
  • ✅ Replaced unreliable setTotalExperience() with giveExp() as primary method
  • ✅ giveExp() is more reliable across all Minecraft versions (1.8-1.21.11)
  • ✅ Better error handling and verification with detailed logging
  • ✅ Automatic correction if experience doesn't match expected value
  • ✅ Prevents XP sync failures on all supported versions
  • ✅ Improved level calculation and synchronization
  • 🔧 Fixes Issue #43, #45 and XP sync problems across version range
  • 📝 Detailed logging for debugging XP sync issues
  • Issue #46 - Vault Balance de-sync on server shutdown**: Fixed economy balance not being saved during shutdown
  • ✅ Enhanced shutdown save process to ensure Vault economy is available
  • ✅ Reconfigure economy integration before shutdown save
  • ✅ Added delay to ensure Vault is fully initialized before saving
  • ✅ Force balance refresh before save to get latest balance
  • ✅ Better error handling and logging during shutdown
  • ✅ Prevents economy balance loss on server restart
  • 🔧 Fixes Issue #46: Vault Balance de-sync on server shutdown
## [1.2.8-BETA] - 2025-12-29

### 🎉 Big Update - Major Improvements & API Migration

This release includes significant improvements, API migrations, and enhanced compatibility features.

### Changed
  • Update Checker**: Complete migration to CraftingStudio Pro API
  • ✅ Migrated from SpigotMC Legacy API to CraftingStudio Pro API
  • ✅ New API endpoint: https://craftingstudiopro.de/api/plugins/playerdatasync/latest
  • ✅ Uses plugin slug (playerdatasync) instead of resource ID
  • ✅ Improved JSON response parsing using Gson library
  • ✅ Better error handling for HTTP status codes (429 Rate Limit, etc.)
  • ✅ Enhanced update information with download URLs from API response
  • 📖 API Documentation: https://www.craftingstudiopro.de/docs/api
  • Plugin API Version**: Updated to 1.13 for better modern API support
  • Minimum required Minecraft version: 1.13
  • Still supports versions 1.8-1.21.11 with automatic compatibility handling
  • Improved NamespacedKey support and modern Material API usage

### Fixed
  • Version Compatibility**: Fixed critical GRAY_STAINED_GLASS_PANE compatibility issue
  • ✅ Prevents fatal error on Minecraft 1.8-1.12 servers
  • ✅ Automatic version detection and Material selection
  • ✅ Uses STAINED_GLASS_PANE with durability value 7 for older versions (1.8-1.12)
  • ✅ Uses GRAY_STAINED_GLASS_PANE for modern versions (1.13+)
  • ✅ Filler item in inventory viewer now works correctly across all supported versions
  • Inventory Synchronization**: Enhanced inventory sync reliability
  • ✅ Added updateInventory() calls after loading inventory, armor, and offhand
  • ✅ Improved client synchronization for all inventory types
  • ✅ Better inventory size validation (normalized to 36 slots for main inventory)
  • ✅ Improved enderchest size validation (normalized to 27 slots)
  • ✅ Better armor array normalization (ensures exactly 4 slots)
  • ItemStack Validation**: Enhanced ItemStack sanitization and validation
  • ✅ Improved validation of item amounts (checks against max stack size)
  • ✅ Better handling of invalid stack sizes (clamps to max instead of removing)
  • ✅ Improved AIR item filtering
  • ✅ More robust error handling for corrupted items
  • Logging System**: Complete logging overhaul
  • ✅ Replaced all System.err.println() calls with proper Bukkit logger
  • ✅ Replaced all printStackTrace() calls with proper logger.log() calls
  • ✅ Better log levels (WARNING/SEVERE instead of stderr for compatibility issues)
  • ✅ More consistent error messages across the codebase
  • ✅ Stack traces now properly logged through plugin logger
  • ✅ Improved logging for version compatibility issues

### Improved
  • Code Quality**: Significant improvements to error handling and resource management
  • ✅ Comprehensive exception handling with proper stack trace logging
  • ✅ Better debug logging throughout inventory operations
  • ✅ Improved client synchronization after inventory changes
  • ✅ Better resource management and cleanup
  • ✅ Enhanced error diagnostics throughout the codebase
  • Performance**: Optimizations for inventory operations
  • ✅ Better item validation prevents unnecessary operations
  • ✅ Improved error recovery mechanisms
  • ✅ Enhanced memory management

### Technical Details
  • API Migration**: Complete rewrite of UpdateChecker class
  • Old: SpigotMC Legacy API (plain text response)
  • New: CraftingStudio Pro API (JSON response with Gson parsing)
  • Improved error handling for network issues and rate limits
  • Compatibility**: Maintained support for Minecraft 1.8-1.21.11
  • Version-based feature detection and automatic disabling
  • Graceful degradation for unsupported features on older versions
  • Comprehensive version compatibility checking at startup

### Breaking Changes
⚠️ **Plugin API Version**: Changed from 1.8 to 1.13
  • Plugins compiled with this version require at least Minecraft 1.13
  • Server administrators using 1.8-1.12 should continue using previous versions
  • Automatic legacy conversion may still work, but not guaranteed

### Migration Guide
If upgrading from 1.2.6-RELEASE or earlier:
1. No configuration changes required
2. Update checker will now use CraftingStudio Pro API
3. All existing data is compatible
4. Recommended to test on a staging server first
## [1.2.6-RELEASE] - 2025-12-29

### Changed
  • Update Checker**: Migrated to CraftingStudio Pro API
  • Updated from SpigotMC API to CraftingStudio Pro API (https://craftingstudiopro.de/api)
  • Now uses plugin slug instead of resource ID
  • Improved JSON response parsing for better update information
  • Better error handling for rate limits (429 responses)
  • API endpoint: /api/plugins/playerdatasync/latest

### Fixed
  • Version Compatibility**: Fixed GRAY_STAINED_GLASS_PANE compatibility issue for Minecraft 1.8-1.12
  • Added version check to use STAINED_GLASS_PANE with durability value 7 for older versions
  • Prevents fatal error when loading plugin on 1.8-1.12 servers
  • Filler item in inventory viewer now works correctly across all supported versions
## [1.2.7-ALPHA] - 2025-12-29

### Fixed
  • Version Compatibility**: Fixed GRAY_STAINED_GLASS_PANE compatibility issue for Minecraft 1.8-1.12
  • Added version check to use STAINED_GLASS_PANE with durability value 7 for older versions
  • Prevents fatal error when loading plugin on 1.8-1.12 servers
  • Filler item in inventory viewer now works correctly across all supported versions
## [1.2.6-ALPHA] - 2025-12-29

### Improved
  • Inventory Synchronization**: Significantly improved inventory sync reliability
  • Added updateInventory() call after loading inventory, armor, and offhand to ensure client synchronization
  • Improved inventory size validation (normalized to 36 slots for main inventory)
  • Improved enderchest size validation (normalized to 27 slots)
  • Better armor array normalization (ensures exactly 4 slots)
  • Enhanced error handling with detailed logging and stack traces
  • Added debug logging for successful inventory loads
  • ItemStack Validation**: Enhanced ItemStack sanitization
  • Improved validation of item amounts (checks against max stack size)
  • Better handling of invalid stack sizes (clamps to max stack size instead of removing)
  • Improved AIR item filtering
  • More robust error handling for corrupted items
  • Logging System**: Improved logging consistency
  • Replaced all System.err.println() calls with proper Bukkit logger
  • Replaced all printStackTrace() calls with proper logger.log() calls
  • Better log levels (WARNING instead of stderr for compatibility issues)
  • More consistent error messages across the codebase
  • Improved logging for version compatibility issues
  • Stack traces now properly logged through plugin logger instead of printStackTrace()
  • Code Quality**: Further improvements to error handling
  • Added comprehensive exception handling with stack traces
  • Better debug logging throughout inventory operations
  • Improved client synchronization after inventory changes
  • Better resource management and cleanup
## [1.2.5-SNAPSHOT] - 2025-12-29

### Fixed
  • Issue #45 - XP Sync Not Working**: Fixed experience synchronization not working
  • Improved applyExperience() method with proper reset before setting experience
  • Added verification to ensure experience is set correctly
  • Added fallback mechanism using giveExp() if setTotalExperience() doesn't work
  • Better error handling with detailed logging and stack traces
  • Now works reliably across all Minecraft versions (1.8-1.21.11)

### Improved
  • Code Quality**: Fixed deprecated method usage and improved compatibility
  • Replaced deprecated URL(String) constructor with URI.toURL() for better Java 20+ compatibility
  • Replaced deprecated PotionEffectType.getName() with getKey().getKey() for better compatibility
  • Improved PotionEffectType.getByName() usage with NamespacedKey fallback
  • Replaced deprecated getMaxHealth() with Attribute system where available
  • Improved getOfflinePlayer(String) usage with better error handling
  • Added @SuppressWarnings annotations for necessary deprecated method usage
  • Cleaned up unused imports and improved code organization
PlayerDataSync Icon
Download PlayerDataSync
Select game version
Select platform