Professional multi-arena FFA minigame plugin for Nukkit/Cloudburst servers.
This project is a full rewrite with clean architecture, form-only UX, JSON-first content storage, and optional MySQL profile storage.
- Full multi-arena system with per-arena world binding.
- Arena-safe zones with 2-click selection mode (auto-save).
- Form-only UX (
/ffa,/ffaadmin) with strict sector routing. - Advanced kit system (snapshot, item manager, armor manager, ordered remove flow).
- Live arena scoreboard (arena-only, per-player toggle, EN/DE language support).
- Profile/stat persistence by UUID with:
MYSQL(recommended for production), orJSONfallback/alternative.
- Runtime database outage protection:
- stats service goes unavailable,
- all arenas forced offline,
- 3 reconnect attempts in 15s intervals,
- plugin disables itself if DB cannot recover.
- No subcommand tree.
- Player UI is fully form-driven.
/ffa:- outside arena: Arena / Stats / Settings.
- inside arena: Leave Arena / Kits / Settings.
/ffaadmin: Admin forms only (OP orffa.adminpermission).
- Join is only possible when arena status is
Live. - Block break/place/drop are blocked in arena.
- Safe-zone blocks combat and damage interactions.
- Safe-zone setup:
- Start 2-click mode in admin forms.
- Click block #1.
- Click block #2.
- Zone is stored automatically.
If storageBackend is MYSQL and the connection drops:
- Stats/service is marked unavailable immediately.
- All arenas are forced to
Offline. - Active arena sessions are ended.
- Reconnect is attempted 3 times every 15 seconds.
- If still unreachable, plugin logs recommendation to switch to
JSONand disables itself.
When MySQL recovers before attempt 3, stats service is restored.
Arenas stay offline until an admin re-enables them.
Base package:
makisimperium.ffa
Core modules:
arena: arena models, persistence, catalog/session services.kit: kit models, JSON repository, selection/application/registry services.player: profile model, preferences, stats, repository abstractions.ui.form: complete form routing and flows.listener: game protection, lifecycle, form interaction, zone placement.scoreboard: arena-only scoreboard service.i18n: JSON language bundle loading and key resolution.config: JSON config model and loader.
- No YAML storage for runtime data systems.
- JSON used for:
- config,
- arenas,
- kits,
- language bundles,
- optional JSON player profiles.
- UUID is the canonical key for player persistence.
- Player names are display-only.
plugins/FFAGameV2/config.json:
{
"storageBackend": "MYSQL",
"database": {
"host": "127.0.0.1",
"port": 3306,
"database": "ffa",
"username": "root",
"password": "change-me",
"table": "ffa_player_profiles",
"useSsl": false,
"allowPublicKeyRetrieval": true
},
"scoreboard": {
"enabledByDefault": true,
"updateIntervalTicks": 20
}
}MYSQL: strict DB mode with outage handling and reconnect policy.JSON: no external DB dependency.
If MySQL is not configured, plugin informs and uses JSON storage.
/ffa- Open player menu (forms)./ffaadmin- Open admin console (forms).
ffa.admin(default: op)
Maven package output is configured as:
target/FFAGameV2.jar
Build command:
mvn clean package- Package namespace migrated to
makisimperium.ffa. - Bootstrap class renamed to
FFABootstrap. - Maven artifact cleaned and output jar standardized to
FFAGameV2.jar. - UI displays arena/kit names instead of internal IDs.
- Localization auto-persists discovered translation keys into
lang/en.jsonandlang/de.json.