Yesterday's v1.0.15 patch made loot-pack contents editable in MariaDB. This patch extends the same override pattern to two more surfaces Ashley already had tables for but no C# loader behind: vendor inventories and per-NPC stat overrides.
What changed
The server now reads two more MariaDB tables at boot, after it loads canonical NPC data:
aaemu_game_3030.rookery_merchant_overrides— add or remove items from any vendor's inventory without touching the canonical SQLite data.aaemu_game_3030.rookery_npc_stat_overrides— bump a specific NPC template's Level, faction, aggression, honor reward, or experience yield.
Same family as rookery_loot_pack_overrides (chest contents, shipped yesterday), rookery_merchant_overrides was Ashley-authored months ago but had nothing reading it. Now it does.
Merchant overrides
| Column | Meaning |
|---|---|
| npc_id | Which vendor (NPC template id). |
| op | add to append, remove to strip. |
| item_id | The item to add or remove. |
| grade_id | Item grade (0 = default). |
| kind_id | Merchant pack kind id (matches the canonical merchant_packs.kind_id). |
Add a Credit Box to the Mirage Isle Marketplace clerk? One INSERT. Strip a deprecated item from every vendor that carries it? One row per vendor with op='remove'.
NPC stat overrides
Six fields wired straight through to NpcTemplate:
levelexp_adder(flat XP bonus on kill)exp_mul(XP multiplier)honor_point(honor reward on kill)faction_id(re-faction an existing NPC without spawning a new template)aggression(toggle whether they attack on sight)
Two fields read but currently ignored: hp_mul and dmg_mul. NpcTemplate doesn't have multiplier fields for max HP or melee damage yet — those need a small stat-finalisation hook at spawn time before the overrides can land. The columns exist in the table so the design is forward-compatible; when the hook lands we just wire two more _templates[id].HpMul = … lines.
What this doesn't change
No NPC has been re-statted by this patch. The two loaders read empty tables right now and log:
[Rookery] merchant overrides: +0 adds, -0 removes, 0 npcs touched
[Rookery] npc-stat overrides: 0 templates patched
This is wiring, not content. Anything Ashley INSERTs into either table starts taking effect on the next .reloadconfigs or server restart.
Behind the scenes
- One C# file changed:
NpcManager.cs(+110 lines). Two new methods (LoadRookeryMerchantOverrides,LoadRookeryNpcStatOverrides) called at the end of the existing NPC load path. StandardMySQL.CreateConnection()plumbing; try/catch around each loader so a missing table or a DB stutter logsWarnand the server still boots. - No new MariaDB tables — both schemas were already present.
- No client patch — same
.pak, no download.
Three of the four override surfaces are now live: loot packs (chests), merchant inventories (vendors), and per-NPC stats. The fourth, rookery_loot_overrides (monster drop tables), is deferred until there's real content to seed against it — its architecture is different enough from the pack-keyed approach to need its own design pass, and we don't want to ship a loader nobody is actually using yet.