Skip to main content

Server development

Shatterveil runs on a custom Minestom server written in Java. The code lives in the Preckster/mcrpg repository; this section documents how that server is built, how it is put together, and how to add to it.

The server is not a Bukkit/Spigot/Paper plugin. Minestom is a from-scratch server implementation with no vanilla gameplay in it, which is exactly why it fits an RPG: every mechanic Shatterveil has is one the project wrote, as a module that can be switched on and off while the server runs.

Where things stand​

The server is in Phase 0 (Foundations) of the roadmap. Nothing game-related exists yet — no combat, classes, items or quests. What exists is the foundation every later system will be built on:

  • a multi-project Gradle build with rules enforced at build time,
  • the module system (ShatterveilModule, ModuleContext, /module),
  • nine shared libraries,
  • the four kernel modules (permissions, logging, player data, admin API) and one reference module (welcome),
  • a local ClickHouse database.

See Modules & libraries for the full inventory.

Pages in this section​

PageWhat it covers
Getting startedToolchain, clone, build, run, branch workflow, local ClickHouse
ArchitectureThe seven ground rules every piece of server code follows
Modules & librariesReference pages for every module and library
CommandsThe in-game command reference, generated from the server
Adding contentThe (not yet built) content pipeline and what to do meanwhile
Versioning & releasesVersion numbers, changelogs and releases
RepositoryRole
Preckster/mcrpgThe game server. Source of truth for design documents, branding and the architecture rules.
Preckster/mcrpg-docsThis site.
Preckster/mcrpg-discordThe Discord bot: a client of the server's admin API.

:::note Keeping this section current These pages are written by hand from the server repository's README.md files, design/ documents and generated docs/commands.md. There is no automated pipeline yet; when a module or library changes in mcrpg, the matching page here has to be updated in the same change. :::