PATCH  ·  v1.0.16  ·  2026-05-25

Merchant inventories and NPC stats are now editable in the database

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:

  • level
  • exp_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. Standard MySQL.CreateConnection() plumbing; try/catch around each loader so a missing table or a DB stutter logs Warn and 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.

« All Patch Notes