
EmptyNet
A self-standing plugin that transfers players between servers via commands. Also includes a simple login system
⬇ Download on ModrinthEmptyNet
A self-standing Paper 1.21.1+ plugin that provides server transfers, a built-in login/register system with 2FA
Features
- Self-standing - No BungeeCord, Velocity, or any other proxy required
- Unlimited servers - Add as many server entries as you want in the config
- Custom commands - Each server gets its own command (e.g.,
/lobby,/survival) - Server listing -
/serverlists all available servers - Server back -
/serverbackreturns to the last server you connected to - Transfer timeout - Configurable timeout that notifies players if a transfer fails to connect
- Login/Register system - Players must register and login before playing
- 2FA support - Optional 6-digit 2FA code for extra security
- H2 database - All passwords stored as BCrypt hashes in an embedded H2 database
- Config toggles - Enable/disable the transfer system and login system independently
- Custom messages - Configure the message shown when connecting to each server
- Tab completion - Auto-completes server names in
/servercommand
Requirements
- Paper 1.21.1 or higher
- Java 21 or higher
Installation
- Download the
EmptyNet-1.2.0.jarfrom the releases page - Place the jar file in your server's
plugins/folder - Restart your server
- Edit the
plugins/EmptyNet/config.ymlto configure your servers - Restart your server or use
/reloadto apply changes
Configuration
Edit plugins/EmptyNet/config.yml:
# EmptyNet Configuration
# Add as many servers as you want by copying and pasting the section below.
# =====================================================
# Transfer Settings
# =====================================================
# Master switch for the server transfer system. Set to false to disable all transfer commands.
transfer-enabled: true
# Time in seconds to wait for a player to successfully connect to the target server.
# If the player does not connect within this time, they will be notified that the
# connection failed and can try again. Set to 0 to disable.
timeout: 120
# =====================================================
# Login System
# =====================================================
# Master switch for the login/register system. Set to false to disable.
login-enabled: true
# Give players the blindness effect while they are not logged in.
login-blindness: true
# Kick players who do not login/register within the timeout. Set to false to disable.
login-kick-enabled: true
# Time in seconds a player has to login/register before being kicked.
login-kick-timeout: 30
servers:
example:
# The display name shown to players
name: "Example Server"
# The command name (e.g., /example)
command: "example"
# The server IP and port to connect to
ip: "127.0.0.1:25566"
# The message shown to the player when connecting
message: "&aConnecting to Example Server..."
Adding More Servers
Simply copy and paste the server entry block and change the values:
servers:
lobby:
name: "Lobby"
command: "lobby"
ip: "192.168.1.10:25565"
message: "&aSending you to the Lobby..."
survival:
name: "Survival Server"
command: "survival"
ip: "192.168.1.10:25566"
message: "&aConnecting to Survival..."
creative:
name: "Creative Server"
command: "creative"
ip: "192.168.1.10:25567"
message: "&aTeleporting to Creative..."
Config Fields
| Field | Description | Example |
|---|---|---|
transfer-enabled |
Master switch for the transfer system | true |
timeout |
Seconds to wait before considering a transfer failed (0 = disabled) | 120 |
login-enabled |
Master switch for the login/register system | true |
login-blindness |
Give blindness to unauthenticated players | true |
login-kick-enabled |
Kick players who don't login in time | true |
login-kick-timeout |
Seconds before unauthenticated players are kicked | 30 |
name |
Display name shown in /server list | "Survival Server" |
command |
The command players use (e.g., /survival) | "survival" |
ip |
Server IP address and port | "192.168.1.10:25566" |
message |
Message shown when connecting (use & for color codes) | "&aConnecting..." |
Commands
| Command | Description | Permission |
|---|---|---|
/server |
Lists all available servers | emptynet.use |
/server <name> |
Connect to a specific server | emptynet.use |
/serverback |
Return to your last server | emptynet.use |
/<command> |
Direct command for each configured server | emptynet.use |
/register <password> <confirm> |
Register an account | true |
/login <password> |
Login to your account | true |
/2fa <code> |
Enter your 2FA code after login | true |
/2fa set <code> |
Set a 6-digit 2FA code (while logged in) | true |
/2fa remove |
Remove your 2FA code (while logged in) | true |
Examples
/server- Shows a list of all configured servers/server lobby- Connects to the "lobby" server/lobby- Same as above (if configured with command: "lobby")/serverback- Returns to the server you were on before/register mypass mypass- Registers a new account/login mypass- Logs in with your password/2fa 123456- Enters your 2FA code after login/2fa set 654321- Sets a 2FA code (while logged in)/2fa remove- Removes your 2FA code (while logged in)
Permissions
| Permission | Description | Default |
|---|---|---|
emptynet.use |
Allows using /server and /serverback commands | true (all players) |
emptynet.admin |
Reserved for future admin commands | op |
How It Works
Server Transfers
This plugin uses Paper's built-in Player#transfer(String host, int port) API to transfer players directly to another server. No proxy or external dependencies are needed - the plugin handles everything internally.
When a player uses /server <name> or a direct command like /lobby, the plugin:
- Looks up the server configuration
- Stores the target server as the "last server" for
/serverback - Starts a transfer timeout monitor (configurable, default 120 seconds)
- Sends the configured message to the player
- Transfers the player to the target IP:port
If the player is still on this server after the timeout expires, they are notified that the connection failed and can try again.
Login System
When a player joins, they are prompted to either register or login:
- New players use
/register <password> <confirm-password>to create an account - Returning players use
/login <password>to authenticate - If the player has 2FA enabled, they must then enter
/2fa <code> - Once authenticated, the player can play normally
While unauthenticated, players cannot:
- Move
- Break or place blocks
- Interact with the world
- Drop items
- Open inventories
- Take damage
- Chat
- Use any commands except
/login,/register, and/2fa
Additionally, unauthenticated players receive the blindness effect (configurable with login-blindness). If login-kick-enabled is true, players who don't login/register within login-kick-timeout seconds are kicked from the server.
2FA
Players can enable 2FA after logging in with /2fa set <6-digit-code>. Once enabled, they must enter this code after their password on every login. Use /2fa remove to disable it.
H2 Database
All user accounts are stored in an embedded H2 database at plugins/EmptyNet/emptynet.mv.db. Passwords are stored as BCrypt hashes (never plaintext). The database is automatically created on first run.
- Ships as EmptyNet-1.2.0.jar — drop this file into the mods folder
- Download size: 2.6 MB
- Download link checked 10 Aug 2026 — working
These come from our own check of the pack file, not from the source page.