For over a decade, the Minecraft community was divided. On one side stood the Java Edition veterans, enjoying the flexibility of mods, complex redstone, and custom plugins. On the other stood the Bedrock Edition army, playing on consoles, phones, and tablets with cross-platform ease. Today, we tear down that wall.
Running a server that allows both Java and Bedrock players to connect simultaneously—often called a "Crossplay Server"—is the holy grail of community building. By unifying these player bases, you instantly expand your potential audience by millions. The technology powering this bridge is known as GeyserMC, typically paired with an authentication handler called Floodgate.
In this comprehensive guide, we won't just tell you which files to drag and drop; we will explain the underlying network protocols, why packet translation is computationally expensive, and how to configure your King's Domain server for a seamless, lag-free cross-play experience.
The Technical Challenge: Why Are They Incompatible?
To understand the solution, you must first respect the complexity of the problem. Minecraft Java Edition and Minecraft Bedrock Edition are, effectively, two completely different video games that just happen to share the same visual assets and gameplay mechanics.
1. Language and Architecture
Java Edition is written in Java (utilizing the LWJGL library) and relies heavily on the Java Virtual Machine (JVM). Bedrock Edition is written in C++, optimized for the diverse hardware constraints of mobile devices and consoles.
2. Network Protocols (TCP vs. UDP)
This is the biggest hurdle. Java Edition communicates using TCP (Transmission Control Protocol). TCP is reliable; it ensures every packet of data sent is received in order. If a packet is lost, the server asks for it again. This is great for stability but can cause "rubber-banding" if the connection is poor.
Bedrock Edition utilizes UDP (User Datagram Protocol) via a custom library called RakNet. UDP is a "fire and forget" protocol. It prioritizes speed over reliability. If a packet is lost, the game moves on. This is essential for mobile networks where latency fluctuates wildy.
3. Block States and Entity Data
The internal ID numbers for blocks and items differ between the versions. A "Stone Sword" in Java might be ID 272, but it could be a completely different ID in Bedrock. Furthermore, the way Bedrock calculates redstone ticks and entity hitboxes is fundamentally different from Java.
Enter GeyserMC: The Middleware Translator
GeyserMC acts as a "Man-in-the-Middle" packet translator. It sits on your server (or proxy) and listens for Bedrock connections. When a Bedrock player connects via UDP, Geyser intercepts those RakNet packets, translates them into Java TCP packets, and forwards them to the server software.
To the Minecraft server, the Bedrock player looks like a Java player. To the Bedrock player, the Java server looks like a Bedrock server.
Performance Warning: This translation happens in milliseconds, but it requires significant CPU resources. Every movement, block break, and chat message must be translated in real-time. This is why hosting on a Raspberry Pi or a budget host often results in input lag. King's Domain servers utilize high-clock-speed Ryzen processors specifically chosen to handle this single-thread intensity without sweating.
Prerequisites
Before we begin, ensure your server environment is ready:
- A Java Server Backend: You need a server running Spigot, Paper, Purpur, or a proxy like Velocity or BungeeCord. You cannot install Geyser on a vanilla Mojang `server.jar` because it lacks the plugin API. We highly recommend Paper or Purpur for their asynchronous chunk loading capabilities.
- UDP Port Availability: Bedrock players usually connect via port
19132(UDP). If you are on a shared host, you cannot simply "decide" to use this port; it must be assigned to you. - Java 21 (or newer): Modern Minecraft versions require modern Java runtimes.
Step 1: Installing GeyserMC
Geyser can be installed as a plugin on your backend server (Spigot/Paper) or on your proxy (Velocity/Waterfall). Installing it on the proxy is generally superior for performance, as it offloads the translation work from the main game loop. However, for this guide, we will cover the standard single-server installation on Paper/Spigot, as it is the most common setup for new admins.
Installation Process
- Stop your server completely using the `stop` command. Never install plugins while the server is running.
- Navigate to the GeyserMC download page.
- Download the
Geyser-Spigot.jarfile. - Upload this file to your server's
/plugins/directory using SFTP or the King's Domain File Manager. - Start your server to generate the configuration files, then stop the server again immediately.
Step 2: Configuring Geyser (The Critical Part)
Navigate to /plugins/Geyser-Spigot/config.yml. This is where most server owners make mistakes. You need to understand the distinction between the Bedrock configuration and the Remote configuration.
The Bedrock Section
This section controls how Geyser listens for incoming connections from Bedrock clients (phones, consoles).
bedrock:
# The IP address Geyser will listen on.
# Leave as 0.0.0.0 to listen on all interfaces.
address: 0.0.0.0
# The port Bedrock players will use to join.
# Default is 19132.
# CRITICAL: If you are on shared hosting, you must change this
# to the additional port assigned to you by your host.
port: 19132
# This is the MOTD shown to Bedrock players.
motd1: "Welcome to King's Domain"
motd2: "Crossplay Enabled!"
King's Domain Client Tip: Go to the Network tab in your console. Create an additional allocation. If your main server is on port 25565, and you are assigned port 8004 as an extra, you MUST set port: 8004 in the config above. Bedrock players will then join using your-ip:8004.
The Remote Section
This section tells Geyser where to forward the translated data. Since Geyser is running on the same server as the game, you are forwarding traffic to "localhost".
remote:
# The IP of the Java server.
# Since it's local, 127.0.0.1 or localhost is correct.
address: 127.0.0.1
# The port your JAVA server runs on.
# Usually 25565 (or whatever your main server port is).
port: 25565
# Authentication type. 'online' requires a licensed Java account.
# We will change this to 'floodgate' in the next step.
auth-type: online
Step 3: Implementing Floodgate (Handling Authentication)
By default, if you just use Geyser, Bedrock players will be prompted to log in with a Java Edition account when they join. This defeats the purpose for many players who only own the mobile or console version. To fix this, we use Floodgate.
Floodgate is a hybrid mode authentication plugin. It creates a "dummy" Java profile for Bedrock users so the server accepts them without a Java license check, while still maintaining security for your actual Java players.
Installing Floodgate
- Download
Floodgate-Spigot.jarfrom the GeyserMC download page. - Place it in your
/plugins/folder. - Crucial: Go back to your
Geyser-Spigot/config.ymland changeauth-type: onlinetoauth-type: floodgate. - Start your server.
Upon startup, Geyser will detect Floodgate. Floodgate will generate a key.pem file in the Geyser folder and the Floodgate folder. This key is used to encrypt data between Geyser and the server, ensuring that nobody can spoof a Bedrock login to hack your admin account.
Understanding UUIDs and Prefixing
Java players and Bedrock players might share the same username. For example, there might be a "Steve" on PC and a "Steve" on Xbox. To prevent database conflicts, Floodgate adds a prefix to Bedrock players (default is .) and generates a unique UUID format for them.
- Java User: Steve (Standard UUID)
- Bedrock User: .Steve (Floodgate UUID)
If you are using permission plugins like LuckPerms, you must remember this prefix. To give a Bedrock player admin rights, you would type: /lp user .Steve parent set admin.
Note: You can change this prefix in the Floodgate config.yml, but we recommend keeping it to avoid confusion.
Connecting from Consoles (Xbox, Switch, PS4/5)
PC and Mobile Bedrock players can easily add external servers via the "Servers" tab. Console players, however, are restricted by the platform holders (Microsoft/Sony/Nintendo) to only join the "Featured Servers."
To bypass this, your console players need to use a DNS redirect trick or a third-party app like "BedrockTogether" (on mobile) which broadcasts your server as a LAN game to their console.
- BedrockTogether Method: Run the app on a phone on the same WiFi as the console. Enter your King's Domain IP and Port. The server will appear under "LAN Games" on the console.
- DNS Method: Change the console's DNS settings to
104.238.130.180. This redirects one of the featured servers to a server list menu where they can type in your IP.
Advanced Optimization for Crossplay
Bedrock clients handle chunk loading differently than Java clients. To prevent "void holes" or lag for Bedrock users, we recommend tweaking your settings.
View Distance & Simulation Distance
Bedrock clients often request chunks that the server hasn't loaded yet. While high-performance servers from King's Domain can handle high view distances, setting your view-distance to 10 and simulation-distance to 6-8 in `server.properties` offers the best stability for packet translation.
Common Troubleshooting
"Unable to Connect to World"
This generic error is the bane of Bedrock players. It almost always means the UDP port is blocked or incorrect.
- Check your
Geyser-Spigot/config.yml. Does thebedrock: portmatch the extra port allocated in your King's Domain panel? - Did you restart the server after changing the config?
- Are you trying to join using the Java port (e.g., 25565)? Bedrock players MUST use the Geyser port (e.g., 19132 or your custom allocation).
"Outdated Geyser Proxy"
Minecraft Bedrock updates frequently, and app stores often force these updates on players. If Bedrock updates to 1.21.0 today, but your Geyser plugin was downloaded last week for 1.20.80, players cannot join.
Solution: You must update `Geyser-Spigot.jar` almost immediately after a major Bedrock update. We recommend installing a plugin like GeyserUpdater to handle this automatically on server restarts.
Skins Not Showing
Sometimes Bedrock skins don't load for Java players. This is often due to the trusted skin servers. In the Geyser config, ensure allow-third-party-capes and allow-third-party-skins are set to true. For complex skin restoration, you may need the SkinsRestorer plugin alongside Geyser.
Conclusion
Bridging the gap between Java and Bedrock is one of the most effective ways to grow a Minecraft server. While the setup involves careful configuration of ports and authentication methods, the result—a unified community playing together regardless of device—is worth the effort.
Verify your ports, keep your Geyser jar updated, and ensure your hardware is up to the task. If you encounter packet loss or translation lag, consider upgrading to a King's Domain Premium Plan, where the raw power of our CPUs ensures Geyser never skips a beat.