Comprehensive Paper 1.21+ plugin for CalyxMC — server administration, player features, and mini-games in one modular system.
Gradle project folder is still
CalyxServerSystem; the plugin on the server is CalyxAPI (CalyxAPI-1.0.0.jar).
- Server: Paper 1.21.4+ (or compatible fork)
- Java: 21 (required for Paper 1.21)
- Optional: Vault, PlaceholderAPI, LuckPerms
- Build the plugin:
./gradlew build - Copy
build/libs/CalyxAPI-1.0.0.jarto your server'splugins/folder (Paper plugin name: CalyxAPI) - Start the server once to generate
config.ymland message files - Edit configuration and restart or run
/calyx reload
| File | Purpose |
|---|---|
config.yml |
Main settings, module toggles, database |
messages_de.yml |
German MiniMessage strings |
messages_en.yml |
English MiniMessage strings |
Set default-language in config.yml to de or en.
- SQLite (default): file path under
database.sqlite.file - MySQL/MariaDB: set
database.typetomysqland configuredatabase.mysql.*
| Command | Description | Permission |
|---|---|---|
/calyx |
Admin help | calyx.admin |
/calyx reload |
Reload config, DB pool, modules | calyx.admin.reload |
/calyx version |
Show plugin version | calyx.admin |
Alias: /cx
| Permission | Description |
|---|---|
calyx.admin |
Base admin command access |
calyx.admin.reload |
Reload command |
Additional granular permissions will be added per module.
Modules work like PlaceholderAPI expansions: register at runtime, unique id, enable/disable lifecycle.
| Type | How it loads |
|---|---|
| Built-in | config.yml → modules: admin: true (only ids with a Java class in CalyxServerSystem) |
| External addon | Your plugin calls new MyModule(this).register() in onEnable() |
| Built-in id | Package | Commands (skeleton) |
|---|---|---|
admin |
modules.admin |
/calyx admin, /ban, /kick |
economy |
modules.economy |
/calyx economy, /balance, /pay, /baltop |
chat |
modules.chat |
/calyx chat, /msg, /r |
homes |
modules.homes |
/calyx homes, /home, /sethome, /warp, /tpa |
games |
modules.games |
/calyx games, /game, /leave |
cosmetics |
modules.cosmetics |
/calyx cosmetics, /cosmetics |
All six are included in the JAR under de.calyx.serversystem.modules.*. Toggle each in config.yml; per-module settings in plugins/CalyxAPI/modules/<id>.yml.
1. Depend on CalyxAPI (paper-plugin.yml):
dependencies:
server:
CalyxAPI:
load: AFTER
required: true
join-classpath: true2. Gradle: compileOnly("de.calyx:CalyxServerSystem:1.0.0") or copy API interfaces into your project.
3. Module class:
public final class ShopModule extends AbstractCalyxModule {
public ShopModule(JavaPlugin owner) { super(owner); }
@Override public String getId() { return "shop"; }
@Override public void enable() {
// listeners, commands, ...
markEnabled();
}
@Override public void disable() { markDisabled(); }
@Override public void reload() { }
}4. Register in onEnable():
if (getServer().getPluginManager().getPlugin("CalyxAPI") != null) {
new ShopModule(this).register();
}Or: CalyxAPI.registerModule(new ShopModule(this));
5. Unregister in onDisable(): new ShopModule(this).unregister(); (same id)
CalyxAPI.registerModule(module);
CalyxAPI.unregisterModule("shop");
CalyxAPI.getModule("admin");
CalyxAPI.getModules();Events: CalyxModuleRegisterEvent, CalyxModuleUnregisterEvent
Override persist() → true on external modules to keep them registered across /calyx reload (built-ins always follow config.yml).
Each module implements registerCommands(ModuleCommandRegistrar):
| Method | Result |
|---|---|
registrar.register(node, "help") |
Root command, e.g. /pay, /home |
registrar.registerCalyxBranch(node) |
Under /calyx, e.g. /calyx admin |
Built-in example: AdminModule adds /calyx admin.
@Override
public void registerCommands(ModuleCommandRegistrar registrar) {
registrar.register(
Commands.literal("pay").executes(ctx -> { ... }).build(),
"Pay another player",
List.of()
);
registrar.registerCalyxBranch(
Commands.literal("shop").executes(ctx -> { ... }).build()
);
}Commands are registered via Paper LifecycleEvents.COMMANDS. Built-in modules load before that pass; external modules get an extra lifecycle registration when register() succeeds.
./gradlew build # Output: build/libs/CalyxAPI-1.0.0.jar (server plugin)
./gradlew publish # Maven: de.calyx:CalyxAPI (API only, for addon compileOnly)HikariCP and SQLite JDBC are loaded at runtime via CalyxPluginLoader (see paper-plugin.yml).
Maven repository: repo.dergamer09.at
- Copy
gradle.properties.exampleor set ingradle.properties/~/.gradle/gradle.properties:reposlite.usernamereposlite.passwort
- Adjust
reposilite.urlif your repository path differs (default:https://repo.dergamer09.at/releases) - Publish:
./gradlew publishCoordinates (API only): de.calyx:CalyxAPI:1.0.0 (jar + sources)
The full plugin JAR is not published — build it locally with ./gradlew jar.
repositories {
maven {
url = uri("https://repo.dergamer09.at/releases")
credentials {
username = findProperty("reposlite.username") as String? ?: ""
password = findProperty("reposlite.passwort") as String? ?: ""
}
}
}
dependencies {
compileOnly("de.calyx:CalyxAPI:1.0.0")
}Do not commit real credentials; prefer ~/.gradle/gradle.properties for secrets.
api/src/main/java/ # Published API (Reposilite)
de/calyx/serversystem/api/
src/main/java/de/calyx/serversystem/
├── CalyxAPI.java # Main plugin class (JavaPlugin)
├── bootstrap/
├── core/
├── commands/
└── modules/ # Built-in standard modules (in plugin JAR)
├── AbstractBuiltinModule.java
├── BuiltinModules.java
├── admin/
├── economy/
├── chat/
├── homes/
├── games/
└── cosmetics/
src/main/resources/modules/ # Default configs copied on first run
CalyxAPI.registerModule(new MyModule(this));
CalyxAPI.getModule("shop");Published artifact: de.calyx:CalyxAPI (api/ subproject, package de.calyx.serversystem.api.*).
Proprietary — CalyxMC. All rights reserved.