[WIP] RMMZ-OS — an authoritative multiplayer server for RPG Maker MZ

RMMZ-OS — an authoritative multiplayer server for RPG Maker MZ (work in progress)

Hi everyone,

I wanted to share a project I’ve been building: RMMZ-OS, a from-scratch client-server infrastructure that turns an RPG Maker MZ project into an online multiplayer game, without rewriting your game logic in a different engine.

The core idea

RPG Maker MZ stays exactly what it’s good at: maps, events, database, sprites, the whole editor workflow. RMMZ-OS adds a networking and server-authority layer on top of the existing MZ runtime, so multiple players can share the same live world. Conceptually it’s inspired by the old Netplay 1.7 for RPG Maker XP, but it’s a full rebuild with a modern client-server architecture — not a port.

The most important design decision: the server is authoritative, from day one. The client never decides what’s true about the shared world — it sends intent (e.g. “I want to move left”), and the server validates and confirms it. This is the same model real multiplayer games use, and it’s what makes anti-cheat and reconnect-without-desync possible later instead of being bolted on afterward.

What’s working right now

  • Accounts & characters — register/login over a real backend (Postgres), with a session-token flow. A character belongs to an account, and you pick one before joining the world (this ships with in-game Scene_Login / Scene_CharacterSelect UI, built as plugin overlays — no external launcher needed).
  • Shared world & movement sync — players see each other move on the same map in real time, with the server as the source of truth for position/direction.
  • Persistence — your character’s position is saved and restored across sessions/reconnects.
  • Chat and parties — basic chat messaging and party (group) support over the same protocol.
  • Server-authoritative events — RPG Maker events on the map can be marked as shared/authoritative, so their state (self-switches, outcomes) is resolved by the server instead of running independently on every client.
  • MMO-style nameplates — every player’s character name now floats above their sprite, driven by the same server-known character name used at login (no client-only guessing).

Everything ships as plain RPG Maker MZ plugins (no build step required to play the game) that hook into the public engine API — nothing in the MZ core runtime is modified or forked.

Architecture, briefly

RPG Maker MZ runtime  <-->  RMMZ-OS client plugin (WebSocket)  <-->  Game Server (authoritative)  <-->  Postgres

The wire protocol is a versioned JSON envelope over WebSocket. On the server side it’s a TypeScript monorepo with clearly separated packages (world/entity simulation, protocol, auth, server-core) glued together by small “composition root” files — so the simulation logic itself doesn’t know anything about WebSockets or the database, and vice versa.

What’s explicitly not done yet

Being upfront about scope — this is early:

  • No combat/PvP.
  • No inventory/quest/guild systems.
  • No sharding/multiple game servers (single game server per world right now).
  • No mobile/console — desktop/browser only, same targets MZ itself supports.

This is a foundation-first project: every phase has to produce something actually running and testable, not just scaffolding.

Why I’m posting

Mostly to share progress and get feedback from people who actually make RPG Maker games — what would you want out of an “MMO layer” for MZ that isn’t already covered above? Movement/desync feel, account flow, event authority model, anything.

Happy to answer questions about the architecture or the current feature set.

2 Likes

RMMZ-OS update — nameplates, HUD, and a draggable inventory + hotbar

Follow-up to my last post about RMMZ-OS, the authoritative multiplayer server layer for RPG Maker MZ. A few things landed since then:

MMO-style nameplates

Every player’s character name now floats above their sprite — yours and everyone else’s. This runs on the same name you picked at character select, threaded all the way from the account/character system through to the world sync, so what you see above someone’s head is the same name the server actually knows them by (not a client-side guess).

A real HUD

The map now has an always-on HUD in the corner: portrait, level, name, and HP/MP/TP bars. One honest caveat — RMMZ-OS doesn’t sync combat/stats over the network yet (that’s still on the long-term roadmap, see the architecture doc from my last post), so right now this mirrors the same local actor data any single-player MZ project has. The HUD is built so it’ll point at server-synced stats once that system exists, without changing the UI itself.

Inventory grid + hotbar

The bigger addition this round:

  • Grid panel — shows everything the party is carrying (items and equipment together), toggled with a hotkey. Click a slot to use the item or equip it on your leader (equipping auto-swaps whatever was there before, same as the vanilla Equip screen). It’s a floating panel you can drag around by its header — it doesn’t pause the map while it’s open, so you can reposition it and keep playing.
  • Hotbar — a fixed row of numbered slots always visible at the bottom of the screen. Bind a slot by opening the grid, hovering an item, and pressing its number; after that, pressing the number alone instantly uses or equips it, grid closed or not.

Since the panel overlays the map without pausing, I deliberately kept it mouse/keyboard-hybrid instead of full D-pad navigation — the arrow keys are busy moving your character, so the grid is click-driven and the hotbar is number-key-driven. Also fixed a real bug from this design: clicking on the panel or hotbar was leaking through to the engine’s own click-to-move and walking your character underneath it — that’s now correctly blocked.

Visual pass

Went through and unified the HUD, inventory, and hotbar under one consistent look — flat dark panels, no gradients or ornamentation, HP/MP as the only two spots of real color anywhere in the UI. Matches the same design language the login/character-select screens already use, so the whole client now reads as one coherent UI system instead of a few different plugins bolted together.

Still local-only

Worth repeating from last time: inventory and stats are not synced to the server yet — this is UI and interaction groundwork ahead of that system. No combat, no shared loot, no persistence of inventory across characters. That’s still ahead.

Happy to answer questions about any of this, or hear what you’d want out of the inventory/hotbar system before the networked version.