PATCH  ·  v1.0.18  ·  2026-05-25

Quest reward selection — visibility patch + override layer for missing reward slots

Follow-up to the v1.0.12 selective-reward index fix. Audit revealed two distinct failure modes for "I picked option N and got nothing":

1. Content gaps — the server's canonical SQLite is missing rows for some selective options. Pick option 3 on a quest where the server only knows about options 1 and 2 and the equality check never matches, granting nothing. Silent failure — no log, no error. 2. Display reads as "always first" — same root cause, different symptom. If selection 0 is the only one that matches (because higher indices have no act defined), the player gets the first item AND the always-granted items in the inventory, which looks like "selection isn't working — I always get the same thing."

The audit

314 quests in the canonical data have selective rewards. Count distribution:

| Selectives | Quests | |---|---| | 1 | 1 | | 2 | 27 | | 3 | 182 | | 4 | 96 | | 5 | 8 |

The 27 two-only quests fall into two camps: 18 are cloth + leather armor pairs (level 6–12 quests, the kind a new character runs). Looked for the matching plate option in the items table — the plate items don't exist in this client's data at all. These quests were genuinely designed as cloth + leather choices in ArcheAge 3.0; we don't have data for a third option.

The other 9 are mixed-content quests (test data, scroll choices, faction-cosmetic, Russian-locale "The Old Man and the Sea" fishing quest) where the second option being missing is the design intent.

So the "missing slot" theory was wrong for those 27 — but the same content-gap pattern almost certainly hits other quests where the client renders three options (e.g., class-weapon triples) and the server only has two. We need infrastructure to fix those as they surface.

What this patch ships

Override layer — new MariaDB table aaemu_game_3030.rookery_quest_selective_overrides keyed by (quest_id, op, item_id, grade_id). Same pattern as v1.0.15 (loot pack), v1.0.16 (merchant + npc-stat) — fourth member of the Rookery override family. Author SQL like:

INSERT INTO rookery_quest_selective_overrides
  (quest_id, op, item_id, count, grade_id, note, created_ts, created_by)
VALUES
  (2246, 'add', 12345, 1, 0, 'Plate Top Box equivalent', UNIX_TIMESTAMP(), 'ashley');

op='add' appends a new selective slot to the quest's reward component with a fresh ThisSelectiveIndex (continues from existing count). op='remove' strips matching (item_id, grade_id) rows AND re-indexes the survivors so the index stays contiguous 0..N-1 (otherwise removing the middle slot would break later picks).

Boot log:

[Rookery] quest-selective overrides: +N adds, -K removes, T quests touched

Visibility loggingQuestActSupplySelectiveItem.RunAct now logs at Info level whenever a match grants a reward:

[Rookery] quest 3488 reward: player Ashley picked index 2 -> item 41749 x1 (grade 0)

And at Warn level when the player's pick exceeds the number of acts the server has (the silent-failure case from before):

[Rookery] quest 2246: player Ashley picked index 2 but only 2 selective acts exist
(client/server reward count mismatch). Player will get nothing from the selective pool.
Author missing rows via rookery_quest_selective_overrides.

We can now grep Server.log for [Rookery] quest and see every selective grant + every count-mismatch in production, with the player and quest id. No more silent "I got nothing" reports.

What to do as a player

If you complete a quest and the rewards look wrong — got an item that doesn't match what you clicked, or got nothing for the selective slot — screenshot it and post in the dev Discord channel with the quest name. The Warn log will catch it server-side and we'll seed the missing slot in the override table.

Behind the scenes

  • Two C# files changed:
  • QuestManager.cs — new LoadRookeryQuestSelectiveOverrides() method called at the end of Load(), before _loaded = true. Reads MariaDB, applies adds and removes, re-indexes after removes, logs summary.
  • QuestActSupplySelectiveItem.cs — promoted match log from Debug to Info; added Warn branch for "pick exceeds count" (only fires once per turn-in attempt, gated on ThisSelectiveIndex == 0).
  • One new MariaDB table — rookery_quest_selective_overrides (8 columns, PK on quest+item+grade+op).
  • No client patch — same .pak, no download.

« All Patch Notes