Bundle layout¶
A .rcmod is a tar+gzip of a directory tree:
my_mod/
├── mod.yaml # manifest: name, version, scripts, addons, …
├── i18n.yaml # central string registry (cluster.i18n_strings)
├── scripts/ # Python script hooks (server-side)
├── addons/ # Client UI addons → Interface/AddOns/
├── client_files/ # Loose client-side overrides (textures, models)
├── db/ # Idempotent SQL migrations run on activation
├── dbc/ # DBC table overrides (Item.dbc, Spell.dbc, …)
│
├── items/, quests/, creatures/ # AC `world.*_template` content rows
├── gameobjects/, spells/, maps/ # (one JSON file per entry)
├── item_locales/, quest_locales/ # AC `world.*_template_locale` rows for
├── creature_locales/, … # non-base translations (auto-generated
│ # from LocalisedString fields by stctl)
├── loot_creature/, loot_gameobj./ # `world.*_loot_template` -- one file per pool
├── conditions/, smart_scripts/ # `world.conditions` / `smart_scripts`
├── achievement_rewards/, … # `world.achievement_reward` + criteria_data
│
└── config_schema/ # Per-realm tunable knobs in the admin UI
Each section is optional. A pure-script mod has only mod.yaml +
scripts/. A pure-rebalance mod might be mod.yaml + dbc/.
mod.yaml reference¶
name: my_mod # snake_case ID, must be unique
version: 1.0.0 # semver
author: "Acme Realms"
description: |
Multi-line free-form description shown in the admin UI.
target_versions: # Client builds the bundle declares
- wrath # support for. Currently: wrath.
# Server-side Python script files. The mod runtime loads these on
# patch activation and wires every declared hook (see scripting docs).
scripts:
- path: scripts/boss_overhaul.py
- path: scripts/welcome.py
# Client UI addons. Every file under each folder ships into the
# launcher patch as Interface\AddOns\<FolderName>\*.
addons:
- path: addons/MyHUD
Content directories¶
YAML manifests in the content directories compile to the AC
world.* row shape. The stctl <domain> build family of commands
handles the named-enum DSL — school: fire,
flags: [stay_alive, party_accept], event: aggro,
condition: aura — and falls back to raw integers for anything not
enumerated.
See Tooling for the full stctl surface.
Localisation¶
i18n.yaml ships a per-mod string registry. Activation upserts
into cluster.i18n_strings; the admin portal lets operators edit
strings live (/admin/design/i18n-strings). Server-side resolution
runs through instance.localize(player, key, *args), with
offline-player fallback through characters.last_locale.
Per-entity content text (quest titles, item names, NPC names, etc.)
flows through AC's *_template_locale siblings via the
LocalisedString type in every content builder.
Tunables¶
config_schema/ declares per-realm knobs. The admin UI auto-renders
typed forms; values flow back into scripts through
instance.get_mod_config_* calls. Tunable schemas survive mod
updates so realms keep their tweaks.