Run Several Game Modes as One Network

Lobby, Skyblock, OneBlock and Chunklock behind one address, step by step: planning, Velocity and modern forwarding, Paper back-ends, a lobby with NPCs and menus, shared LuckPerms, backups, restarts and troubleshooting

Minecraft Game Modes

28 min readAdvancedLast updated Oct 31, 2026

A network puts several Minecraft servers behind one address. Players connect, land in a lobby, pick Skyblock, OneBlock or Chunklock from an NPC or a compass menu, and move between them without disconnecting. Each game mode runs on its own server with its own memory, CPU, world, plugins and backups, so a lag spike or crash in one never touches the others.

                                   ┌──► Lobby       (Paper)
Players ──► Velocity (public) ─────┼──► Skyblock    (Paper + BentoBox/BSkyBlock)
                                   ├──► OneBlock    (Paper + BentoBox/AOneBlock)
                                   └──► Chunklock   (Paper + Chunklock)
                 shared: one MySQL database for LuckPerms ranks

This guide builds exactly that network from nothing, and then covers running it: permissions, chat and tab list, economy, backups, restarts, updates and fixing problems. The same steps work for any mix of game modes; swap in your own.

Time needed: an evening for Velocity, the lobby and the connections (steps 1–7), then however long each game mode's own guide takes. Difficulty: advanced, but every step says what to click and how to check it worked.

Before you start you need:

  • One server per game mode, plus a Velocity server and a lobby server, on your account. You can't create servers yourself in the panel: ask us or order them (step 2).
  • One MySQL database for LuckPerms (your plan's Databases count must be at least 1).
  • Basic panel skills: editing files in Files, using Console, installing from Minecraft Plugins. If those are new, read Install plugins and Files and SFTP first.
  • This guide uses the general Velocity steps from Velocity networks and adds everything specific to a multi-game-mode network.
1

Plan the network

Fill in this plan before you ask for servers. It decides how much to order and saves rework.

Server Name in Velocity Server type Memory to start Plugins (core) Guide
Proxy (none) Velocity 1 GB LuckPerms, TAB, ViaVersion this guide
Lobby lobby Paper 1.5–2 GB LuckPerms, FancyNpcs, DeluxeMenus, PlaceholderAPI, WorldGuard this guide, step 7
Skyblock skyblock Paper 4–6 GB BentoBox + BSkyBlock, LuckPerms, CoreProtect Skyblock
OneBlock oneblock Paper 3–5 GB BentoBox + AOneBlock, LuckPerms, CoreProtect OneBlock
Chunklock chunklock Paper 3–5 GB Chunklock, LuckPerms, CoreProtect, Chunky Chunklock

Rules for the plan:

  • Names are lowercase, no spaces: lobby, skyblock, oneblock, chunklock. You'll type them in velocity.toml, in NPC actions, in menus and in LuckPerms contexts, and they must match exactly everywhere.
  • One game mode per server. Don't put Skyblock and OneBlock on the same server to save money: they'd share one main thread and lag together, which is the problem a network solves.
  • Pick each server's Minecraft version as the newest version all that server's plugins support. They can differ (for example, if the Chunklock plugin lags a release behind). Velocity itself supports all current versions, and ViaVersion on Velocity lets newer clients join older back-ends (step 12). Matching versions everywhere is simplest when you can.
  • Velocity is light. Its own guidance is roughly 512 MB of heap per 500 players; 1 GB is plenty for small and medium networks. Spend memory on the game servers.
2

Get the servers on your account

  1. Contact us (or order through your account) for the servers in your plan: Velocity, lobby, and one Paper server per mode, with the memory from the table. Mention it's a network so we can keep the back-end ports private.
  2. When they appear in your server list, open each one and go to Settings. Rename them so you can tell them apart, e.g. Network - Velocity, Network - Lobby, Network - Skyblock.
  3. On each Paper server, open Startup and set Minecraft Version to the exact version you chose for that server (not latest). Change version
  4. On the Velocity server, open Startup and check the Velocity version is current. Keep it up to date: newer Velocity builds are what let newer Minecraft clients connect.
  5. Start each Paper server once, accept the EULA in the console when asked, then Stop it. First start

Check it worked: every server in your list has a clear name, and each Paper server has generated server.properties, config/paper-global.yml and spigot.yml in Files.

3

Write down each server's address

Velocity needs the address and port of every back-end.

  1. Open each Paper server's Network page.
  2. Note the primary allocation: an IP address and port, e.g. 10.11.30.202:40003. Use the address shown there, not your public connect address.
  3. Fill in a table like this (yours will have different numbers):
Name Address from Network
lobby 10.11.30.202:40005
skyblock 10.11.30.202:40003
oneblock 10.11.30.202:40007
chunklock 10.11.30.202:40002

The Velocity server's own allocation is the only address players use. Give players that address (or point your domain's SRV record at it). Connect

4

Set up Velocity

4.1 Generate the files

  1. Open the Velocity server and Start it. Wait until the console shows it's listening, then Stop it.
  2. In Files you now have velocity.toml, forwarding.secret and a plugins folder.

4.2 Edit velocity.toml

Open velocity.toml in Files. Don't replace the whole file: change the lines below and leave everything else (including config-version) as it is.

# --- top of the file ---
motd = "<aqua>CrashCrafts Network</aqua> <gray>- Skyblock, OneBlock, Chunklock"
show-max-players = 200
online-mode = true
force-key-authentication = true
player-info-forwarding-mode = "modern"
forwarding-secret-file = "forwarding.secret"
announce-forge = false
kick-existing-players = false
ping-passthrough = "DISABLED"

[servers]
lobby     = "10.11.30.202:40005"
skyblock  = "10.11.30.202:40003"
oneblock  = "10.11.30.202:40007"
chunklock = "10.11.30.202:40002"

# Where players go when they join, and where they fall back to if a server goes down
try = ["lobby"]

[forced-hosts]
# Delete the example.com lines that come in the default file.
# Optional: send a subdomain straight to one mode.
# "skyblock.yourdomain.com" = ["skyblock"]

[advanced]
compression-threshold = 256
bungee-plugin-message-channel = true
failover-on-unexpected-server-disconnect = true

What each setting does:

Setting Value Why
bind leave as the panel set it Velocity listens on your allocation. Changing it breaks the connection.
motd your text The server-list message. Uses MiniMessage tags (<aqua>, <gray>, <bold>), not & codes. Back-end MOTDs are never shown.
show-max-players e.g. 200 The "max players" number in the server list. Back-end max-players still caps each server.
online-mode true Velocity checks every player with Mojang. Never turn this off.
player-info-forwarding-mode "modern" Securely passes each player's real UUID, skin and IP to back-ends, signed with the secret.
forwarding-secret-file "forwarding.secret" The file holding the shared secret.
[servers] name = address Every back-end, using the addresses from step 3.
try ["lobby"] New players land in the lobby, and players kicked from a restarting server are moved there.
[forced-hosts] your domains, or empty The default file contains lobby.example.com and similar entries pointing at servers you don't have. Delete or edit them, or Velocity complains about unknown servers at start-up.
bungee-plugin-message-channel true Required for lobby NPCs and menus to move players (FancyNpcs' send_to_server, DeluxeMenus' [connect]).
failover-on-unexpected-server-disconnect true If a back-end crashes, players go to the lobby instead of being disconnected.
compression-threshold 256 Velocity compresses traffic to players. Back-ends turn compression off (step 5).

4.3 Copy the forwarding secret

  1. Open forwarding.secret in Files. It contains one long random line.
  2. Copy it somewhere safe (a password manager). You'll paste it into every back-end.

4.4 Install Velocity plugins

Velocity has its own plugins (Paper plugins don't work on it). Install them into the Velocity server's plugins folder: from Minecraft Plugins if it lists a Velocity version, or download the Velocity jar from the plugin's Modrinth/Hangar page and use Files → plugins → Upload.

Plugin Needed? Why
LuckPerms (Velocity version) Yes Ranks and proxy permissions (step 9).
ViaVersion (+ ViaBackwards) Recommended Lets players on newer (and older) clients join.
TAB Optional One tab list showing the whole network (step 10).
ajQueue Optional Queues for full servers (free; ajQueuePlus is paid).
A punishment plugin Recommended Network-wide bans (step 10).
Geyser + Floodgate Only for Bedrock Bedrock players. Geyser goes on Velocity only. Bedrock

Start Velocity. Check it worked: the console shows no errors, and velocity plugins in the Velocity console lists the plugins you installed.

5

Set up each Paper back-end

Repeat this for every Paper server: lobby, Skyblock, OneBlock and Chunklock.

5.1 server.properties

Stop the server, open server.properties and set:

Setting Value Why
online-mode false Velocity has already checked the player. The back-end trusts Velocity's signed forwarding instead. Only safe with step 5.2 done.
network-compression-threshold -1 Only Velocity compresses; double compression wastes CPU.
enable-status true Velocity, queue plugins and player-count placeholders ping back-ends.
prevent-proxy-connections false Leave off; Velocity is the proxy.
white-list false Use the whitelist on the lobby only, if at all, or players get kicked mid-network.
server-port leave as set The panel sets it to the allocation.

5.2 config/paper-global.yml

Find the proxies: section and set the velocity part:

proxies:
  bungee-cord:
    online-mode: true
  proxy-protocol: false
  velocity:
    enabled: true
    online-mode: true
    secret: 'paste-the-forwarding-secret-here'
  • velocity.enabled: true turns on modern forwarding.
  • velocity.online-mode must match online-mode in velocity.toml (true).
  • secret is the exact text from forwarding.secret, in single quotes.

5.3 spigot.yml

Make sure settings.bungeecord is false. That setting is for BungeeCord's old, insecure forwarding and conflicts with Velocity's.

5.4 Start and check

Start the server. The start-up log should show no forwarding errors. Repeat 5.1–5.4 on every Paper back-end.

6

Test the connections

Do these tests before building anything else. Fixing forwarding later, after players have joined, is much harder.

  1. Join the Velocity address from your Minecraft client. You should land in the lobby (still an empty world for now).
  2. Type /server skyblock. You should move to the Skyblock server with the same skin. Repeat for oneblock and chunklock, then /server lobby.
  3. Try connecting directly to a back-end's address (for testing only). It must refuse you with a message like "This server requires you to connect with Velocity." If it lets you in, that server's forwarding isn't set up, and anyone could join it as anyone. Fix it before going further.
  4. In the Velocity console, run glist all. It lists every server and who's on it.
7

Build the lobby

The lobby is the first thing every player sees. Keep it small, fast and focused on getting players into a game.

7.1 The lobby world

Choose one:

  • A downloaded or commissioned lobby map. Stop the lobby server, delete the world folder (and world_nether, world_the_end) in Files, upload the map's folder and rename it to world (or set level-name to its name). Large maps upload more easily over SFTP. Upload a world
  • Build your own. Start with a flat or void world and build a small spawn: a central hub with one area or NPC per game mode.

Then set, in the lobby's server.properties:

Setting Value Why
view-distance 6 The lobby is small; fewer chunks to send.
simulation-distance 4 Nothing needs to grow or move far away.
max-players your network size Every player passes through the lobby.
spawn-protection 0 WorldGuard handles protection.
allow-nether false No Nether in a lobby.
gamemode / force-gamemode adventure / true Players can't break or place blocks, and always arrive in adventure mode.

7.2 Protect it with WorldGuard

Install WorldEdit and WorldGuard on the lobby (Minecraft Plugins), restart, then run these in game as an op (or in the console, adding -w world):

/rg flag __global__ pvp deny
/rg flag __global__ mob-spawning deny
/rg flag __global__ fall-damage deny
/rg flag __global__ item-drop deny
/rg flag __global__ block-break deny
/rg flag __global__ block-place deny
/rg flag __global__ time-lock 6000
/rg flag __global__ weather-lock clear

__global__ is WorldGuard's region for the whole world. Ops and staff with worldguard.region.bypass.world can still build. Check it worked: from a non-op account, try to break a block, hit another player and drop an item: all three should fail.

Falling into the void: put a floor of barrier blocks a few blocks below your build, or make sure players can't reach the edge. A player who dies in the void respawns at world spawn, so set it with /setworldspawn standing on your spawn point.

7.3 NPCs that send players to each server

We use FancyNpcs (free, maintained, packet-based so the NPCs cost almost nothing). Install it on the lobby, restart, then stand where the Skyblock NPC should be and run:

/npc create skyblock
/npc skin skyblock Notch
/npc displayname skyblock <gold><bold>SKYBLOCK</bold></gold>
/npc turn_to_player skyblock true
/npc action skyblock ANY_CLICK add send_to_server skyblock
/npc action skyblock ANY_CLICK add play_sound entity.experience_orb.pickup
  • /npc create skyblock makes an NPC called skyblock where you stand.
  • skin copies a player's skin; use any player name, or a skin URL.
  • send_to_server skyblock must match the name in velocity.toml exactly.
  • Triggers are ANY_CLICK, LEFT_CLICK or RIGHT_CLICK.

Repeat for oneblock and chunklock. To move an NPC, stand in the new spot and run /npc move_here <name>. /npc list shows them all.

Check it worked: from a non-op account, click each NPC. You should move to that server. If nothing happens, check bungee-plugin-message-channel = true in velocity.toml and that the name matches.

7.4 A compass menu

A menu lets players switch from anywhere in the lobby. Install DeluxeMenus and PlaceholderAPI (DeluxeMenus needs it) on the lobby and restart.

  1. In Files, open plugins/DeluxeMenus/gui_menus/ and create a file games.yml:

    menu_title: '&8Choose a game'
    open_command: games
    size: 27
    items:
      'skyblock':
        material: GRASS_BLOCK
        slot: 11
        display_name: '&a&lSkyblock'
        lore:
          - '&7Build your island in the sky.'
          - '&eClick to play'
        left_click_commands:
          - '[close]'
          - '[connect] skyblock'
      'oneblock':
        material: OAK_LOG
        slot: 13
        display_name: '&6&lOneBlock'
        lore:
          - '&7One block. Endless phases.'
          - '&eClick to play'
        left_click_commands:
          - '[close]'
          - '[connect] oneblock'
      'chunklock':
        material: MAP
        slot: 15
        display_name: '&b&lChunklock'
        lore:
          - '&7Unlock the world one chunk at a time.'
          - '&eClick to play'
        left_click_commands:
          - '[close]'
          - '[connect] chunklock'
    
  2. Open plugins/DeluxeMenus/config.yml and register it under gui_menus::

    gui_menus:
      games:
        file: games.yml
    
  3. Run /dm reload, then /games. Check it worked: the menu opens and each item moves you to its server.

[connect] <server> is DeluxeMenus' send-to-server action and needs the same Velocity setting as the NPCs.

Giving players a compass that opens it: use a join-item plugin such as ItemJoin to give every player a compass in a fixed hotbar slot that runs the games command when used. Its wiki explains the item and command options. If you'd rather not add another plugin, a hologram or sign at spawn saying "Type /games" works too.

Walk-in portals: a portal plugin with proxy support, such as Advanced Portals, can send players to a server when they walk through a frame. See its docs for the portal tag that sets a proxy destination.

7.5 Holograms with player counts

Install FancyHolograms on the lobby. Above each NPC:

/hologram create text skyblock_info
/hologram edit skyblock_info setLine 1 <gold>Skyblock
/hologram edit skyblock_info addLine <gray>Players: %bungee_skyblock%

The %bungee_skyblock% placeholder comes from PlaceholderAPI's Bungee expansion: run /papi ecloud download Bungee, then /papi reload. It asks Velocity for player counts through the same plugin message channel. If it shows 0 or the raw text, check the expansion is installed and the server name matches.

7.6 Spawn behaviour

Install EssentialsX and EssentialsXSpawn on the lobby. Stand on your spawn point and run /setspawn, then in plugins/Essentials/config.yml set spawn-on-join: true so players always arrive at spawn, not where they logged out. Restart.

7.7 What not to put in the lobby

No economy, claims, survival or game-mode plugins. Fewer plugins means a lobby that starts in seconds and almost never breaks.

8

Set up each game-mode server

Now follow each mode's own guide on its own server, from its install step to its launch checklist:

  • Skyblock: Skyblock guide. Decide island size and spacing before the first start: changing them later breaks islands.
  • OneBlock: OneBlock guide. Check the Java version on Startup if AOneBlock won't load.
  • Chunklock: Chunklock guide. Set a world border and pre-generate before players arrive. Pre-generate

On every game-mode server:

  • Install LuckPerms (step 9) and CoreProtect. Give each server's CoreProtect its own database or table prefix; don't share CoreProtect between servers.
  • Separate plugins and configs. Don't copy the Skyblock plugins folder to OneBlock: each server gets only what its mode needs.
  • Give players a way back to the lobby. Players can type /server lobby (Velocity grants /server to everyone by default). For a friendlier /lobby or /hub command, install a hub-command plugin on Velocity, or add a DeluxeMenus menu with open_command: lobby and a [connect] lobby action on each game server.
9

Share ranks with LuckPerms and MySQL

With one database, a rank given on any server applies everywhere, and you can still give permissions that only apply on one server.

9.1 Create the database

On the lobby server: Databases → Create Database, name it luckperms, leave Connections From as %, Create. Open the eye to see the host, database name, username and password. Databases

All servers use these same details. If a server can't connect to the database (a Communications link failure on start-up), it may be on a different machine; contact us.

9.2 Configure LuckPerms on every server

Install LuckPerms on Velocity and on every Paper server, start each once, stop, then edit its config:

  • Paper servers: plugins/LuckPerms/config.yml
  • Velocity: plugins/luckperms/config.yml

Set these keys (the same on every server except server):

server: skyblock          # lobby, skyblock, oneblock, chunklock; use "proxy" on Velocity

storage-method: mariadb

data:
  address: 10.11.30.202:3306
  database: s22_luckperms
  username: u22_UbaU7Gpwtt
  password: 'your-database-password'

messaging-service: sql
  • server names this server for permission contexts. Use the same names as in velocity.toml.
  • storage-method: mariadb plus the data block points every server at the one database.
  • messaging-service: sql makes a change on one server reach the others within seconds, using the database itself. The pluginmsg option also works on a single-proxy network, but needs LuckPerms on the proxy and every back-end.

Start each server. Check it worked: the console says LuckPerms connected to MariaDB. Run lp creategroup test on Skyblock, then lp listgroups on OneBlock: test should be there. Delete it with lp deletegroup test.

If you already had ranks in file storage on one server, run lp export ranks there before switching, then lp import ranks once it's on the database.

9.3 Create the groups

Run these once, on any server (the database shares them). In the Velocity console, the command is lpv instead of lp.

lp creategroup vip
lp creategroup helper
lp creategroup mod
lp creategroup admin

lp group vip parent add default
lp group helper parent add vip
lp group mod parent add helper
lp group admin parent add mod

lp group default setweight 0
lp group vip setweight 10
lp group helper setweight 20
lp group mod setweight 30
lp group admin setweight 40

lp group vip meta setprefix 10 "&a[VIP] "
lp group helper meta setprefix 20 "&b[Helper] "
lp group mod meta setprefix 30 "&2[Mod] "
lp group admin meta setprefix 40 "&c[Admin] "

Each group inherits from the one below, so a mod has every helper permission too.

9.4 Grant permissions, network-wide or per server

A permission without a context applies on every server. Add server=<name> to limit it to one.

# Staff tools everywhere
lp group helper permission set coreprotect.inspect true
lp group helper permission set coreprotect.lookup true
lp group mod permission set coreprotect.rollback true
lp group mod permission set essentials.kick true
lp group mod permission set essentials.mute true
lp group mod permission set essentials.tempban true

# Proxy staff commands
lp group mod permission set velocity.command.glist true
lp group admin permission set velocity.command.send true

# Only on the lobby: builders can use WorldEdit and build
lp creategroup builder
lp group builder parent add default
lp group builder permission set worldedit.* true server=lobby
lp group builder permission set worldguard.region.bypass.world true server=lobby

# Give people ranks
lp user Steve parent add mod
lp user Alex parent add builder

Plugins are only installed where they're used (EssentialsX on servers that have it, and so on), so most nodes only take effect on servers that have that plugin anyway.

For a track to promote staff in order: lp createtrack staff, then lp track staff append helper, lp track staff append mod, lp track staff append admin, and promote with lp user Steve promote staff.

Check it worked: lp user Steve info on any server shows the group, and lp user Alex permission check worldedit.wand on the lobby says true, and false on Skyblock. For a visual editor, run lp editor and open the link.

10

Chat, tab list and bans across the network

What Recommended How
Chat Per server for game-mode networks Each mode keeps its own chat, which players of different modes usually prefer. Nothing to install.
Network-wide chat (optional) A proxy-aware chat plugin For example Carbon (Paper and Velocity) syncs across servers through Redis, NATS or RabbitMQ; ask us if you need one of those. Check any chat plugin you choose is still maintained: several older network chat plugins have been discontinued.
Tab list TAB on Velocity Shows every player on the network, grouped by server, with LuckPerms prefixes. For placeholders from back-end plugins, add TAB-Bridge on each back-end.
Bans and mutes A proxy punishment plugin with MySQL A ban on Velocity blocks the whole network. LiteBans (paid) and LibertyBans (free) both run on Velocity; check the plugin page lists your Velocity version. Give it its own database.
Staff chat Your punishment or chat plugin's staff channel Moderators on different servers can talk to each other.

If you skip a proxy ban plugin, a ban with EssentialsX on Skyblock only blocks Skyblock; the player can still join the lobby and other modes.

11

Economy and inventories

  • Keep economies separate. Use a separate economy on each game-mode server (EssentialsX's economy stores balances per server by default). Otherwise money from a mature Skyblock farm buys a head start in Chunklock, and one mode's inflation ruins the others.
  • Share an economy only on purpose, for example a cosmetic currency or vote rewards. That needs an economy plugin that stores balances in MySQL and supports several servers; check its docs say so, and give it its own database.
  • Inventories are per server. Items never travel between modes. Tell players this in the lobby. Inventory-sync plugins exist for servers running the same mode (Survival-1 and Survival-2); never sync between different modes.
12

Bedrock players and client versions

  • ViaVersion on Velocity lets players on newer clients join back-ends running an older version. Add ViaBackwards for older clients. Install the Velocity versions on the proxy, not on the back-ends.
  • Bedrock: Geyser on Velocity only, Floodgate on Velocity and every back-end, all using the same Floodgate key. Never run Geyser on a back-end. Bedrock crossplay
  • Test with an old client, a new client and a Bedrock device before launch.
13

Back up every server

Each server needs its own backup schedule. Times are UTC; stagger them so they don't all run at once. Backup schedules

Server Backup every Example cron (minute, hour) Tasks
Skyblock 6 hours 0, */6 save-all, then Create Backup after 10 s
OneBlock 6 hours 15, */6 save-all, then Create Backup after 10 s
Chunklock 6 hours 30, */6 save-all, then Create Backup after 10 s
Lobby Weekly, and before changes 0, 8, day of week 1 Create Backup
Velocity Weekly, and before changes 30, 8, day of week 1 Create Backup

For each: Schedules → Create Schedule, set the time, turn Only when Server is Online? off, Create, then Edit → Tasks → + to add the tasks. Run it once with Run now and check Backups.

Also lock a backup on every server before updating plugins or Minecraft versions, and download a copy of Velocity's velocity.toml and forwarding.secret: without them the network can't be rebuilt.

14

Restarts and maintenance order

Daily restarts

Restart game servers one at a time, so the network is never fully down. When a back-end restarts, Velocity moves its players to the lobby (try and failover), and they can go back once it's up.

Server Restart time (UTC) Tasks
Skyblock 0 9 * * * say Restarting in 1 minute, then Restart after 60 s
OneBlock 5 9 * * * same
Chunklock 10 9 * * * same
Lobby 15 9 * * * same
Velocity Weekly only, e.g. 30 9 * * 1 warning on each back-end, then Restart

09:00 UTC is 5:00 am Eastern in summer. Restarting Velocity disconnects everyone, so do it rarely: weekly, or for updates. Most velocity.toml changes (adding a server, editing the MOTD) apply with velocity reload in the Velocity console, no restart needed.

Schedules shows each screen.

Start-up order after maintenance

  1. Back-ends first (lobby, then game servers), so they're ready to receive players.
  2. Velocity last.

If Velocity starts first, players who join are sent to a lobby that isn't up yet and get a connection error.

15

Performance and monitoring

  • Profile each server separately. spark is built into Paper: /spark tps shows TPS and MSPT, /spark profiler start, wait a few minutes during busy play, then /spark profiler stop for a report link. Fix lag
  • Velocity rarely lags. If everyone lags on every server at once, check Velocity's console for errors and its memory use. If only one mode lags, it's that back-end.
  • Settings per game server (server.properties): view-distance 7–8 and simulation-distance 4–6 on Skyblock/OneBlock (islands are small, farms are the cost), and pre-generation plus a border on Chunklock. Lobby 6 and 4.
  • Paper's safe wins from Paper best practices apply to every back-end.
  • Memory: watch each server's usage on its Console page graphs. Raise memory only on the server that needs it.

Running the network long term

Updating

  1. Lock a backup on every server you'll touch, and run lp export for ranks.
  2. Update Velocity first (newer Velocity supports newer clients and older back-ends), then its plugins.
  3. Update one back-end at a time. Change the version on Startup only after checking every plugin on that server supports the new version. Use the plugins/update/ folder for plugin updates. Updating plugins safely
  4. Update LuckPerms on all servers to the same version close together: mixed LuckPerms versions on one database usually work, but staying in step avoids surprises.
  5. Test each server through Velocity before moving to the next.

Adding another game mode later

  1. Ask us for a new Paper server and rename it in Settings.
  2. Set its version on Startup, first start, EULA, stop.
  3. Do step 5 on it (forwarding secret, online-mode=false, compression -1).
  4. Add it to [servers] in velocity.toml, then velocity reload.
  5. Install LuckPerms with the shared database and a new server: name.
  6. Add an NPC, a menu item and a hologram in the lobby.
  7. Add backup and restart schedules, staggered from the others.

Removing a game mode

Remove its NPC, menu item and [servers] line first, velocity reload, then download a final backup before asking us to remove the server.

Moderation across servers

  • CoreProtect on each game server: /co inspect to check a block, /co rollback u:<player> t:1d r:50 to undo grief on that server.
  • Proxy bans for anything serious, so the player is off the whole network.
  • One staff team, one LuckPerms setup: permissions don't need to be redone per server.

Common problems

Problem Cause Fix
Players can join a back-end directly Forwarding not enabled on that server, or online-mode=true there with no Velocity setup. Redo step 5 on that server, and ask us to keep its port private.
"Unable to verify player details" or "Invalid forwarding secret" when switching The secret on that back-end doesn't match forwarding.secret. Copy the secret again, paste it in single quotes in paper-global.yml, restart that server.
"This server requires you to connect with Velocity" when joining the network [servers] points at the wrong address, or Velocity isn't using modern forwarding. Check addresses against each Network page and player-info-forwarding-mode = "modern".
NPC or menu does nothing bungee-plugin-message-channel is false, the action is /server, or the name doesn't match. Set it to true and velocity reload; use send_to_server / [connect]; match names exactly.
"Unknown command" when an NPC runs /server or /queue Those are proxy commands; the lobby doesn't have them. Use the send-to-server action. For ajQueue, install the same ajQueue jar on the lobby too so it forwards /queue.
Players get kicked to the lobby every few minutes A back-end is crashing or restarting. Read that server's console and crash reports.
Ranks differ between servers That server's LuckPerms isn't on the database, or the change hasn't synced. Check its console says MariaDB; set messaging-service: sql; run lp sync.
A per-server permission doesn't apply The server: name in that server's LuckPerms config doesn't match the context. Run lp info on that server to see its server name, and use that in server=.
Wrong skins, or UUIDs change between servers Forwarding isn't working on that server (offline-mode UUIDs). Fix step 5; check lp user <name> info shows the real UUID.
Velocity won't start after editing velocity.toml A typo (missing quote or bracket), or a forced host pointing at a server that isn't in [servers]. Read the first error in the console; restore the file from a backup if unsure.
Players on new clients can't join one server That back-end runs an older version. ViaVersion (+ ViaBackwards) on Velocity, kept up to date.
Player counts in holograms show 0 Bungee expansion missing, enable-status=false, or the name doesn't match. /papi ecloud download Bungee, /papi reload, check names.
Bedrock players can't join Geyser on a back-end, or the Floodgate key differs. Geyser on Velocity only; copy the same Floodgate key everywhere.
Items lost moving between modes Inventories are per server by design. Tell players; never sync inventories between different modes.
Everyone disconnected at once Velocity restarted or crashed. Check Velocity's console; restart Velocity rarely and only after warnings.

Launch checklist

  • [ ] Every server renamed in Settings, with an exact Minecraft version on Startup.
  • [ ] velocity.toml: online-mode = true, player-info-forwarding-mode = "modern", every server in [servers], try = ["lobby"], example forced hosts removed, bungee-plugin-message-channel = true.
  • [ ] forwarding.secret saved somewhere safe, and pasted on every back-end.
  • [ ] Every back-end: online-mode=false, network-compression-threshold=-1, proxies.velocity.enabled: true, settings.bungeecord: false.
  • [ ] Direct joins to every back-end refused (tested).
  • [ ] Lobby protected with WorldGuard, NPCs and /games menu tested from a non-op account.
  • [ ] Each game-mode server finished using its own guide and launch checklist.
  • [ ] LuckPerms on every server and Velocity, one database, unique server: names; a test group visible everywhere.
  • [ ] Staff groups created; only the owner is op.
  • [ ] Proxy-wide bans set up (or a decision to moderate per server).
  • [ ] Backup schedule on every server, staggered, with a backup visible the next day; lp export done.
  • [ ] Daily restarts staggered; Velocity restarts weekly only.
  • [ ] ViaVersion on Velocity; Bedrock tested if you use Geyser.
  • [ ] /spark tps checked on every server during the first busy hour.