EmptyNet

EmptyNet

A self-standing plugin that transfers players between servers via commands. Also includes a simple login system

30 downloads

EmptyNet

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 - /server lists all available servers
  • Server back - /serverback returns 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 /server command

Requirements

  • Paper 1.21.1 or higher
  • Java 21 or higher

Installation

  1. Download the EmptyNet-1.2.0.jar from the releases page
  2. Place the jar file in your server's plugins/ folder
  3. Restart your server
  4. Edit the plugins/EmptyNet/config.yml to configure your servers
  5. Restart your server or use /reload to 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:

  1. Looks up the server configuration
  2. Stores the target server as the "last server" for /serverback
  3. Starts a transfer timeout monitor (configurable, default 120 seconds)
  4. Sends the configured message to the player
  5. 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:

  1. New players use /register <password> <confirm-password> to create an account
  2. Returning players use /login <password> to authenticate
  3. If the player has 2FA enabled, they must then enter /2fa <code>
  4. 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.

No gallery available for this project.