
Your player logs out at coordinates X=150, Y=80, Z=-200 in the End dimension. They close the game, go to sleep, and log back in the next day. Instead of spawning in the End where they left off, they spawn at X=150, Y=80, Z=-200 in the Overworld. If those coordinates are underground, they suffocate inside solid blocks and die immediately.
Their End items are gone. Their location data got corrupted. This makes no sense because the game is supposed to save the dimension alongside the coordinates in the player's data file.
This bug specifically affects Paper 1.21.x servers running Geyser (for Bedrock crossplay) alongside ViaVersion. It does not happen on vanilla servers. It does not happen without Geyser. The combination of these plugins creates a dimension-tracking conflict during the player save process.
What Causes This
When a player disconnects, Paper saves their position data to a file inside the world/playerdata/ folder. This file stores XYZ coordinates, the dimension identifier (overworld, the_nether, or the_end), health, inventory, and other state.
Geyser handles Bedrock players by translating between Bedrock and Java protocols in real time. During the disconnect sequence, Geyser processes the player removal slightly differently than a standard Java client disconnect. On Paper 1.21.x, this creates a race condition: Paper saves the player's coordinate values before Geyser finishes signaling which dimension the player was in.
The result is that the coordinates get saved correctly but the dimension field defaults to "overworld" instead of "the_end". On next login, the server reads the file, sees Overworld, and places the player at the correct XYZ values but in the wrong world.
ViaVersion adds to the problem because it introduces an additional protocol translation layer. The disconnect packet routing goes: Player > ViaVersion > Geyser > Paper. Each layer processes the disconnect event in sequence, and the timing gap between Geyser's cleanup and Paper's save operation is where the data corruption happens.
How to Fix It
Fix 1: Update to Latest Builds
This bug was partially addressed in newer Paper and Geyser builds. Make sure you are running:
- Paper: latest build for your Minecraft version (check papermc.io/downloads)
- Geyser: latest build from geysermc.org
- ViaVersion: latest release from the ViaVersion GitHub
After updating, restart the server completely. Do not use /reload.
Fix 2: Use the Floodgate Dimension Workaround
Add the Floodgate plugin alongside Geyser (if you do not already have it). Floodgate handles Bedrock player authentication and improves the disconnect sequence timing.
Download Floodgate from: geysermc.org/download
Place it in your plugins folder and restart.
Fix 3: Force Dimension Save on Disconnect
If the bug persists after updating, you can use a small plugin or script that forces a dimension-aware save before the player fully disconnects.
Several community plugins provide this. Search for "PlayerQuitLocation" or "SafeLogout" on SpigotMC/Modrinth. These plugins intercept the PlayerQuitEvent and explicitly write the correct dimension to the player data file before Paper's default save runs.
Fix 4: Manual Player Data Repair
If a player already lost their items from suffocating in the wrong dimension, you can manually fix their data:
- Stop the server
- Navigate to
world/playerdata/ - Find the player's UUID file (it will be a
.datfile named with their UUID) - Use an NBT editor like NBTExplorer to open the file
- Find the
Dimensiontag and change it fromminecraft:overworldtominecraft:the_end - Adjust the
Poscoordinates if needed - Save the file and restart the server
Prevention
Until a permanent upstream fix lands in Paper or Geyser, the safest approach for crossplay servers is:
- Tell players to return to the Overworld before logging off. This avoids the dimension save bug entirely
- Keep regular backups of the
world/playerdata/folder. If someone's data gets corrupted, you can restore a recent copy - Run the latest builds of every plugin in the chain. The developers are actively aware of this interaction and push fixes regularly
Does This Affect All Players?
No. This bug primarily affects Java players on servers running Geyser. Bedrock players connecting through Geyser have a different disconnect flow and are less likely to trigger the race condition. However, it has been reported on both sides in some configurations.
If you run a Java-only server without Geyser, you will not experience this. The bug is specifically caused by the multi-layer protocol translation pipeline that Geyser and ViaVersion introduce.
On Space-Node servers, the support team will help you update all plugins to compatible versions and configure the save behavior correctly. Get started here.
