Skip to content

feat(gateway): send the quest and group messages the client expects - #698

Merged
Mathih13 merged 1 commit into
mainfrom
feat/opcode-parity-quest-instance
Oct 15, 2026
Merged

Mathih13 merged 1 commit into
mainfrom
feat/opcode-parity-quest-instance

Conversation

@Mathih13

@Mathih13 Mathih13 commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Several quest and group states had no message to the client. A refused quest accept left the window silent. The client never heard that a quest log was full, that a member was kicked, or that an objective was done.

This change sends the vmangos message for each state that already exists:

  • A refused accept sends SMSG_QUESTGIVER_QUEST_INVALID (level, race, already on the quest, other requirements), SMSG_QUESTLOG_FULL, or SMSG_QUESTGIVER_QUEST_FAILED with the inventory-full reason when the source item does not fit. Each refusal, a giver Refusal (range, role) included, ends with SMSG_GOSSIP_COMPLETE, as vmangos closes the gossip on every refusal path.
  • The Module now refuses an accept when the quest log has no free slot. A slot is any un-rewarded row, failed ones included, because the client log shows them. A new row, or a rewarded repeatable row, needs a free slot. A failed or open row already holds one.
  • CMSG_QUESTGIVER_CANCEL closes the gossip with SMSG_GOSSIP_COMPLETE.
  • A finished explore objective, and a new external-event credit, send SMSG_QUESTUPDATE_COMPLETE before the quest-log sync.
  • A member kicked from a Group that survives hears SMSG_GROUP_UNINVITE before SMSG_GROUP_DESTROYED. A kick that disbands the Group sends only SMSG_GROUP_DESTROYED. vmangos sends an empty SMSG_GROUP_LIST after the uninvite instead.

The acceptance Refusal text now lives in lyracore_shared::quest, so the Module and the Gateway cannot drift. The text is unchanged.

Tests: byte tests for the three new quest packets, Fake dispatcher tests for each Refusal, relay tests, and durable tests for the log-full check (new, repeatable and failed quests) and the kick events. CI runs the durable tests.

Verification:

  • cargo fmt --all -- --check, Gateway clippy with -D warnings, Gateway tests (2028), Module lib tests (1581), shared tests (312) and the wasm check pass. The durable tests quest_log_full and group_uninvite compile with --no-run. CI runs them.
  • Comment review: I read all added and changed comments in the final diff against origin/main, new test files included. It passed. I removed narration and kept one-line contracts: three packet layouts with opcodes, the Live insert replay rule, the gossip-close ordering, and the UNINVITED event meaning. No removed comment held a pointer or tool annotation.

Claude Sonnet 5.5 in Claude Code.

Quest accept Refusals reach the client as SMSG_QUESTGIVER_QUEST_INVALID,
SMSG_QUESTLOG_FULL or SMSG_QUESTGIVER_QUEST_FAILED, each followed by
SMSG_GOSSIP_COMPLETE. The Module refuses an accept with no free quest-log slot.
CMSG_QUESTGIVER_CANCEL closes the gossip. Finished explore and event objectives
send SMSG_QUESTUPDATE_COMPLETE. A member kicked from a surviving Group hears
SMSG_GROUP_UNINVITE.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@Mathih13
Mathih13 force-pushed the feat/opcode-parity-quest-instance branch from 3660b2e to b292793 Compare October 15, 2026 09:04
@Mathih13
Mathih13 merged commit c33c21e into main Oct 15, 2026
9 checks passed
@Mathih13
Mathih13 deleted the feat/opcode-parity-quest-instance branch October 15, 2026 10:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant