🧩 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.
🚀 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.
/stopand/pds reloadsave 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 statusfor 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 |
|---|---|---|---|---|---|
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 | ||||
| 17h ago | 1 |
> **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,:commonand 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_STOPPINGsaves every online player;SERVER_STOPPEDcloses 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.encryptthrows, 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#handleQuitreturns aCompletableFuturethat completes when the write is done; newsaveAllandmarkLoadedfor 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.
> **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**:
ServerPreConnectEventsendssave:to the current server and holds the switch until it answerssaved:<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(default2000): 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:syncare 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.
> **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
PlayerQuitEventnever reached the plugin on/stopand everything since the last autosave was lost.onDisableand/pds reloadnow save every online player and wait for the writes. - Proxy save acknowledgement**: when the Velocity bridge sends
save:, the plugin answerssaved:<uuid>onpds:synconce 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 reloadrefused 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.encryptthrows, 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#handleQuitreturns aCompletableFuturethat completes when the write is done; newsaveAllandmarkLoadedfor 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
### Fixed
- Old armor / inventory coming back after a server switch**: Three ordering races in
SyncManagercould apply a stale record over the player's real state. (1) The join event, the Velocityload: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 proxysave: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 carrysavedAt; re-applying the same record within a session is skipped unless forced via/pds loadorPlayerDataSyncAPI#forceReload. - Failed SQL saves were reported as successful**:
SqlStorage#saveswallowedSQLException, soSyncManagercached 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
SyncManagerjoin/quit ordering (common/src/test), run viagradlew :common:test.
### Fixed
- Dead config toggles**:
sync.attributes,sync.pdcandsync.flightwere declared inconfig.ymlbut never evaluated — switching them off did nothing. Same bug class as the economy fix in 26.7. - Item exclusions on Fabric**:
exclusions.itemswas stored and never read, so excluded items synced anyway. Bothminecraft:diamondand the Bukkit-styleDIAMONDspelling 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 tofalse**. 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. Aplayerdatasync.propertiesfile 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.
- Economy sync (Vault)**: Balances were never actually synchronized.
SyncManager#setEconomydiscarded the Vault provider, andPlayerData.balancewas neither read on quit nor applied on join — thesync.economyconfig toggle had no effect. Balances now transfer across servers, andsync.economy: falsegenuinely disables it.
### Added
- Paper 26.2 support**: New
v26_2_R1version handler built againstpaper-api 26.2; server version detection recognizes26.2automatically. - 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 usesServerPlayer,CompoundTag,StreamCodec, andnet.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=trueonce ForgeGradle supports Gradle 9.
### Added
- Fabric**:
fabric-api(0.92.2+1.20.1) so lifecycle and server-play networking APIs resolve at compile time;fabric.mod.jsondeclares afabric-apidependency. - Velocity**: Gradle task
generatePluginBuildInfoemitsPluginBuildInfo.VERSIONso the@Pluginversion 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** assertsfabric.mod.jsonexists 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**:
apiandcommonuse **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 rootsubprojects, so they previously picked up the toolchain default and emitted **69**). - Velocity**:
velocity-apiupdated to **3.5.0-SNAPSHOT**; Velocity→backend plugin messages use **UTF-8** (StandardCharsets.UTF_8);ServerConnectedEventlog line uses **event.getServer().getServerInfo()** (Velocity 3 API). - Shadow plugin**: Replaced
com.github.johnrengelman.shadow**8.1.1** with **com.gradleup.shadow8.3.10** soshadowJarcan process modern class files when relocating (e.g. bundled jars). - Forge**:
META-INF/mods.tomlversion is expanded from Gradle (mod_version); Forgebuild.gradle.ktsno longer overrides rootversion/group. - Fabric**:
build.gradle.ktsno longer overrides rootversion/group(single version fromgradle.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_R1andv26_1_R1VersionHandlerImplnow extend **BukkitBaseVersionHandler** and implement **capture/applywithPDSPlayer** (restores compatibility after removal ofBaseVersionHandler). - Fabric**
PlayerDataSyncFabric:ServerPlayNetworkingglobal receiver is registered in **SERVER_STARTING** after storage/SyncManagersetup; SLF4J error logging for storage init; guards whensyncManageris not ready yet. - Forge**
PlayerDataSyncForge: storage init failures use **Log4j** instead ofprintStackTrace; packet and login handlers guard **syncManager == null**. - Multi-platform build**: Resolved Gradle dependency variant mismatches (Fabric vs
api/commonJVM level). **v26_1_R1**:compileClasspathrequests JVM **25** so Paper 26paper-apiresolves while sources still compile with **--release 21**.
### Notes
- One JAR download**:
build/libs/PlayerDataSyncReloaded-*.jarcontains Paper + **bundled/** Velocity/Fabric/Forge JARs; Modrinth still needs the **extracted** platform files per loader (seepds-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.propertiesversion** (e.g. **PlayerDataSyncReloaded-26.5.5.1-ALPHA.jar**); delete any older file such as **PlayerDataSyncReloaded-26.5.5-SNAPSHOT.jar** fromplugins/so Paper does not remap a stale build. The shaded jar **excludesMETA-INF/versions/**** so multi-release dependency layers (class file 69) are not shipped to the remapper.
### 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.
### 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.
### 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.
### Fixed
- Thread Safety**: Resolved
IllegalStateExceptionon Paper/Purpur servers wherePlayerDataSaveEventwas 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.
### Added
- API Extensibility**: Added
extraDatamap toPlayerDatafor third-party plugin data synchronization. - Save Cancellation**:
PlayerDataSaveEventnow implementsCancellable, 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.
### 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.
### 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/importfor 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 reloadfor hot-reloading connections and/pds migratefor 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
Attributeconstant name changes between 1.20 and 1.21. - Fixed
NoClassDefFoundErroroccurring when specific version modules were missing. - Fixed thread safety issues in MongoDB and SQL storage handlers.
- Fixed reflection issues for
PersistentDataContainercompatibility across 1.20/1.21.
### 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.ymlwith clear documentation for all settings.
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
### 🔧 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 inMessageManager. - FastStats Isolation**: Isolated Java 17-dependent metrics library to prevent
UnsupportedClassVersionErroron 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.ymlwas 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.
### 🚀 New Features
- Maintenance Mode**: Pause all data syncing with
/sync maintenance <on|off>. Useful for database migrations or emergency fixes. - Management GUI**: Use
/sync menufor a visual way to toggle sync options and manage the plugin. - Performance Profiler**: Use
/sync profileto 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
activeByDefaultprofile 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 checkupdatecommand 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.
### 🔄 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.javafor streamlined authentication. - Improved Reliability**: Replaced legacy
HttpURLConnectionwith asynchronous requests and better error handling. - Enhanced URLs**: Updated download and plugin info links to the new category-based structure.
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.
### 🔧 Fixed
- MongoDB**: Fixed MongoDB errors / MongoDB-Fehler behoben.
### 🛠 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.
### 🔄 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
setBalanceimplementations are inconsistent
### 🎯 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
TEXTtoLONGTEXTforinventory,enderchest,armor, andoffhandcolumns - ✅ **DE:** Automatisches Upgrade von
TEXTzuLONGTEXTfürinventory,enderchest,armorundoffhandSpalten - ✅ **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 cachecommand - ✅ **DE:** Integration in
/sync cacheBefehl - ✅ **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
TEXT to LONGTEXT if necessary- DE:** **Upgrade**: Konvertiert
TEXTzuLONGTEXTwenn nötig
- DE:** **Logging**: Protokolliert alle Upgrades für Transparenz
- 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:**
- DE:** Versuch der normalen Deserialisierung
- DE:** Bei Fehler: Prüfung ob es ein Custom-Enchantment-Problem ist
- DE:** Extraktion des Enchantment-Namens aus der Fehlermeldung
- DE:** Detailliertes Logging mit Kontext
- DE:** Item wird übersprungen (null), aber Daten bleiben in DB
- 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
- DE:** **2-Tick-Delay**: Wartet 2 Ticks, damit Plugins Zeit haben zu initialisieren
- DE:** **Refresh**: Setzt Items explizit neu, um Plugin-Verarbeitung zu triggern
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-Statistiken2. **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 statisticsDE:** Prüfen Sie /sync cache für Deserialisierungs-StatistikenEN:** 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.ymlDE:** Prüfen Sie die Plugin-Load-Reihenfolge in plugin.yml`### 🔧 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()withgiveExp()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
### 🎉 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_PANEwith durability value 7 for older versions (1.8-1.12) - ✅ Uses
GRAY_STAINED_GLASS_PANEfor 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 properlogger.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
### 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
### 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
### 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
### 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()ifsetTotalExperience()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 withURI.toURL()for better Java 20+ compatibility - Replaced deprecated
PotionEffectType.getName()withgetKey().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
@SuppressWarningsannotations for necessary deprecated method usage - Cleaned up unused imports and improved code organization