Skip to content

Proxy networks

Several servers behind one address, behaving like one.

On a single server there is nothing on this page to set up, and nothing here runs. Put the same jar on every server behind a Velocity or BungeeCord proxy, add one small plugin to the proxy, and chat, private messages, teleport requests and the player list start crossing between them. No database, no open port, no password.

What crosses

From one server to another How it looks
Chat [Paper] Steve ยป hello - the prefix says where it came from
/msg and /r Arrives in the reader's own language, with a Reply button on Java
/tpa and /tpahere The request crosses; the teleport waits for consent on their side
/tp and /tphere Moves the player between servers, then to the target
/glist Everyone on the network, grouped by server
/server Switch to a named server
Tab completion /msg, /tp and /tpa suggest names from every server

Homes, warps, mail, money and player warps cross too - but not through the bridge. They are data, not messages, and carrying data over a chat channel is how plugins lose it. They cross through a shared database; see below.

Claims never cross. A claim is bound to a world on one server, and two servers both calling their overworld world would hand a player somebody else's land.

Setting it up

On the proxy, drop EmberBridge.jar into plugins/. It is a separate, free download - a proxy plugin, not a server one - and the one jar runs on either Velocity or BungeeCord; each proxy reads its own manifest and ignores the other's.

On every backend, in config.yml:

bridge:
  enabled: true          # already the default

cross-server-chat:
  enabled: true
  server-name: "Paper"   # what the prefix says. Blank uses the MOTD
  channels:
    - global             # which channels cross. local stays local
    - staff
  format: "<#546e7a>[%server%] <reset>%message%"

Restart the backends, then the proxy. Order matters only in that the proxy is the last thing to come up; a backend that starts after the proxy is fine.

The usual proxy prerequisites still apply and are the proxy's documentation, not ours: online-mode=false on the backends, modern forwarding with a matching secret on Velocity, and nothing else able to reach the backend ports directly.

Shared storage

One setting turns the plugin's files into rows in MySQL or MariaDB:

storage:
  type: mysql
  host: 127.0.0.1
  port: 3306
  database: ember
  username: ember
  password: ""

Put the same settings on every server. From then on these are one set of data across the network: homes, warps, mail, kit and playtime claims, tag and perk choices, Discord links, jail sentences, balances, and player warps. A home set on one server is there on the next. Mail arrives wherever you log in. Money is one number everywhere.

Existing files are imported the first time a server starts on the database, and kept beside the plugin as *.yml.migrated in case you want them back. A server joining a network that already has data does not overwrite it.

Claims, portals, holograms, signs, spawn and everything else bound to a world stay in files on their own server. That list is not configurable, because sharing it would be a bug rather than a feature.

A home on another server

A home or warp remembers which server it was set on. Use one from elsewhere and the plugin sends you across through Ember Bridge, then finishes the teleport when you land - with warmup and /back behaving exactly as they do for a local one. The menus show these with the server's name in place of coordinates.

Money without another plugin

Where no economy plugin is installed, the plugin keeps its own ledger, and on the database backend that ledger is shared. With Ember Coins or any Vault economy installed, those are used instead; nothing changes.

Two knobs, for owners who want it a particular way:

  • economy.builtin: never turns the ledger off. Money features then wait for Ember Coins or a Vault economy and say so, rather than quietly keeping a balance you did not ask for.
  • /essentials importbalances moves everything the ledger holds into the economy that has since taken over. One way, and only once that economy is live; anything that cannot be paid out stays in the ledger and is reported.

Paper ships the drivers

Paper already bundles the MariaDB and MySQL JDBC drivers, so there is nothing to download. On a server that does not have them, the plugin fetches the MariaDB driver itself on first start.

How it works, and what that costs

Everything travels on a plugin message channel, which is the pipe the game already has between a proxy and a backend. A plugin message is carried by a player's connection, so a message can only leave a server while somebody is on it. For chat that is exactly right: a line nobody was there to say has nobody to read it. For a private message to a player on an empty server the proxy answers that they are not on the network, and nothing is queued.

Tab completion is served from a copy of the network roster refreshed every twenty seconds. A name can be that stale in the suggestions; the command itself still checks.

Bedrock

Chat, messages and teleports all work for Bedrock players. Two things differ, and both are the platform rather than the plugin:

  • Messages arrive as one plain line rather than a framed window, because Bedrock cannot draw the frame and its narrower chat column would wrap the title.
  • Tab completion does not reach Bedrock. Geyser only translates the static command list; suggestions computed on the server never arrive.

For Bedrock chat to work at all on a network, force-key-authentication must be false on Velocity and enforce-secure-profile false on every backend. Bedrock players have no chat signing key, and either setting alone blocks them silently.

With other Ember plugins

Ember Coins loads before Ember Essentials on purpose, so where both are installed Coins owns /balance, /pay, /baltop and /eco. Essentials uses Coins as its currency, so both read the same ledger; there is nothing to configure and no double economy.

In pictures