Skip to content

Tooling — stctl

stctl is the umbrella CLI for authoring .rcmod bundles. It lives under splintertree-ctl/ and ships with the unified service image.

Subcommand families

Family Output Target
stctl bundle (new / build / validate / inspect) <name>.rcmod Mod packaging
stctl patch build / validate client-patch MPQ DBC + LUAXML + raw-file edits
stctl image to-blp / from-blp *.blp / *.png Texture conversion
stctl creatures / quests / items / gameobjects build <dir>/<entry>.json AC world.*_template content rows
stctl loot build loot_<target>/<id>.json AC world.*_loot_template (12 pools)
stctl conditions build conditions/<source>_<group>.json AC world.conditions
stctl smart build smart_scripts/<entry>.json AC world.smart_scripts
stctl ach build achievement_rewards/<id>.json AC server-side achievement helpers
stctl channels build scripts/_channels.py Typed pub/sub channel registry
stctl orm build db/orm.sql + scripts/_orm.py Mod-defined cluster.* tables
stctl inline build scripts/<id>.py Inline-Python author shortcuts
stctl mods migrate-to-oci (DB write) Backfill OCI delivery for legacy mods
stctl content (resolve / build-game / sync / import / export / diff / alloc-ids) (varied) Cluster DB content pipeline
stctl exe patch patched Wow.exe Binary patcher (large-address / view-distance / …)
stctl mpq (list / extract / pack) MPQ ops Low-level archive ops
stctl dbc dump text DBC inspection

Every builder accepts named-string forms for the most-used enums (school: fire, quest_type: dungeon, event: aggro, condition: aura, quality: epic, bonding: bind_when_picked_up, …) and falls back to raw integers for anything not enumerated. Backwards-compatible with hand-written manifests.

Author loop

The fast iteration loop looks like:

# scaffold a new mod
stctl bundle new my_mod

# author content under my_mod/
$EDITOR my_mod/mod.yaml my_mod/scripts/welcome.py

# build a candidate bundle
stctl bundle build my_mod

# upload to a realm via the admin portal,
# or push to the OCI registry directly

stctl bundle validate runs the same checks the activator uses, so a green local validation means activation will not fail.

Live reload

Once a mod is loaded on a realm, GMs can reload Python scripts without re-uploading the bundle:

.script reload python

YAML content changes still require a bundle rebuild + activation — they touch DB rows and DBC tables.