Extension metadata
Defines your extension and each game it exposes: IDs, names, descriptions, icons, player counts, flags (Mashup-compatible, supports settings, etc.).
MiniModes is designed so that games live outside the core plugin as extensions.
This page gives you a high‑level, implementation‑oriented overview of what that means and how to approach building your own game.
If you already build Spigot/Paper plugins, you’ll feel at home: MiniModes handles parties, worlds, game flow, and GUIs so you can focus on game logic.
A MiniModes extension is:
.mmx file)From MiniModes’ point of view, an extension answers:
“What games do you provide, which parties can play them, and how do they run?”
You don’t fork or touch the core plugin to add a new game.
You just drop a new extension into the MiniModes extensions folder, and it shows up in /minimodes.
MiniModes gives you a set of engine services so your game doesn’t have to reinvent them:
GameManager
Starts/stops your game instance, tracks who’s playing, and wires it into the rest of the system.
PartyManager
Ensures your game always runs for a well‑defined group (a party) with a leader and members.
WorldManager
Gives you game worlds / instances to run in, then cleans them up when the game ends.
RematchManager
Lets players replay your game with the same teams and settings via /party rematch.
MashupManager
Opt‑in support for being picked automatically in Mashup playlists.
As a game developer, you primarily:
The exact code interfaces live in the api/ package of the MiniModes plugin, but at a high level you’ll work with:
Extension metadata
Defines your extension and each game it exposes: IDs, names, descriptions, icons, player counts, flags (Mashup-compatible, supports settings, etc.).
Game implementation
One or more classes implementing the MiniModes game interface: lifecycle hooks (onPrepare, onStart, onTick, onEnd), access to players, teams, and worlds.
Settings schema
Optional schema describing your configurable options (maps, time limits, rules). MiniModes uses this to render Settings Voting and Runtime Settings GUIs.
Assets & resources
Optional assets (schematics, config files, messages, icons) accessed via the Extension Resource Manager.
Packaging (.mmx)
Your compiled code + metadata + assets, zipped/packaged into a .mmx file so the ExtensionLoader can find it and register your games.
Each game exposed by an extension needs (conceptually):
/minimodes menutrue/false)true/false)true/false)true/false)MiniModes uses this metadata to:
GameSelectionGUITo implement a game cleanly, map your logic onto MiniModes’ standard lifecycle:
Registration
When the server starts (or reloads extensions), ExtensionLoader discovers your extension and registers your game(s) with GameManager.
Pre‑checks
When a party leader picks your game from /minimodes, the engine checks:
[minPlayers, maxPlayers]?Pre‑game flow (optional)
Depending on your metadata, MiniModes may:
Game preparation
The engine:
WorldManager to prepare a game world / instanceGame start
Players are teleported in, teams and settings are passed to your game, and onStart (or equivalent) is called.
At this point you:
Game loop
While running, your game:
Game end
You decide when the game ends:
/mm game stop)/mm game win <players…>)You then:
Cleanup & rematch
Once the game is done, MiniModes:
RematchManagerYour game doesn’t need to build complex inventories or titles from scratch.
Instead, you plug into shared GUIs that the core plugin already provides.
Handled entirely by MiniModes via GameSelectionGUI.
You don’t code this; you just provide good metadata and an icon.
If your game is team‑based, you can mark that in metadata so MiniModes runs TeamSelectionGUI before your game starts. It will:
Your game then simply consumes those teams in its logic.
For configurable games (maps, durations, rule variants), define a settings schema. MiniModes uses SettingsVotingGUI to:
Your game receives one resolved settings object; you don’t need to handle voting yourself.
If your game supports settings that can be changed mid‑match (e.g., toggle friendly fire, adjust spawn rate):
MiniModes’ RuntimeSettingsGUI then:
MiniModes guarantees that everyone is always in some party:
Your game can rely on this:
Use the party concept to:
Mashup is MiniModes’ automatic, endless playlist.
To play nicely with it, your game should:
When Mashup picks your game:
Mashup is great for short, replayable modes (arena duels, quick parkour, Spleef variants, etc.).
Here are recommendations to keep your extensions robust and user‑friendly:
Player references longer than needed; prefer UUIDs and resolve as needed./mm game leave should cleanly detach a player from your logic./mm game spectate should be able to teleport spectators to relevant places (if supported)./mm game stop should end the match and trigger your cleanup./minimodes:
A typical development loop for a new extension looks like:
Set up a dev server
plugins/ folder.Create a new extension project
Implement your first game
Package as .mmx
ExtensionLoader expects.my-first-minigame.mmx).Drop into the extensions folder
.mmx into MiniModes’ configured extensions directory./minimodes.Iterate
Understand the game flow
Learn how party ➝ teams ➝ settings ➝ game ➝ results is orchestrated and where your code fits.
See command & API reference
Explore commands and API surfaces that your extension will interact with.
Plan your first game
Sketch a small, replayable game mode (e.g., quick duels or Spleef) and map its phases onto MiniModes’ lifecycle.
Once you’re comfortable with this conceptual model, you’re ready to dive into the concrete APIs and start building your first MiniModes extension.