acdream/tests/AcDream.Core.Net.Tests
Erik ab3934e21d feat(quest): QT1 — parse the contract-tracker events we have been dropping
Both opcodes have been named in GameEventType since the wire-catalog work with
nothing behind them, so every contract the server has ever sent us arrived and
was discarded.

Three details that a reimplementation from the enum alone would get wrong, and
each has a test:

The two trailing flags on 0x0315 are widened bools, not bytes, and they sit
OUTSIDE the struct writer — ACE's ContractTracker.Write has them commented out
precisely because the event appends them itself. Reading them as bytes decodes
the delete flag from the wrong four bytes and silently drops contracts.

The stage is not a dense enum. Retail encodes N completed steps as
ProgressCounter + N, so a switch over the four named values sees stage 9 as
unknown and shows nothing. Progress/HasProgressCounter do that arithmetic once
here rather than leaving every caller to remember it.

The countdown anchor is not on the wire. FillProgressString @0x00498DE0 counts
down from CContractTracker::_time_of_server_update, which the server never
sends — so arrival has to be stamped at parse time or the repeat timer has
nothing to tick against.

An empty table is a valid answer rather than a decode failure: it is how the
server says "you have no contracts", and confusing the two would leave stale
quests on screen permanently. A truncated one is rejected outright instead of
decoding to its prefix, which would drop quests just as silently.

Campaign QT slice 1 of 6.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 14:38:00 +02:00
..
Cryptography feat(net): PacketHeader + PacketHeaderFlags + Hash32 checksum (Phase 4.2) 2026-04-11 14:17:37 +02:00
Messages feat(quest): QT1 — parse the contract-tracker events we have been dropping 2026-08-21 14:38:00 +02:00
Packets feat(net): N6 - ConnectResponse retransmit + fragment assembler eviction 2026-07-29 17:20:12 +02:00
Transport test: introduce Lane=Timing for load-sensitive tests, and stop chasing them individually 2026-08-19 15:29:10 +02:00
AcDream.Core.Net.Tests.csproj test: revert Core.Net serialization; widen the virtual-clock harness patience instead 2026-08-19 13:59:42 +02:00
CombatStateWiringTests.cs feat(inventory): port retail weapon switching 2026-07-12 23:06:31 +02:00
GameEventWiringTests.cs fix(chat): announce enchantment expiry; stop double-printing tells 2026-08-21 06:11:33 +02:00
LiveHandshakeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
NetClientTests.cs perf(net): own one pooled async receive 2026-07-25 05:50:18 +02:00
NetProbeTests.cs feat(net): N6 - ConnectResponse retransmit + fragment assembler eviction 2026-07-29 17:20:12 +02:00
NetProcessStaticsCollection.cs feat(net): N6 - ConnectResponse retransmit + fragment assembler eviction 2026-07-29 17:20:12 +02:00
ObjectTableWiringTests.cs fix(ui): preserve retail item titles and spacing 2026-07-24 05:21:01 +02:00
packages.neutral.lock.json build: make release restore reproducible 2026-08-18 10:29:00 +02:00
PlayerDescriptionParserTests.cs feat: port retail magic lifecycle and retained spell UI 2026-07-15 10:55:22 +02:00
PrivateUpdateVitalTests.cs feat(player): #5 PlayerDescription parser — Stam/Mana via attribute block 2026-04-25 16:42:24 +02:00
SubscriptionSetTests.cs refactor(net): own live session composition 2026-07-22 10:36:06 +02:00
WorldSessionCharacterCreationTests.cs CC2 review fix round: latch scope narrowed, AD-100, creationFailed reason key 2026-08-15 13:10:24 +02:00
WorldSessionCharacterSelectionTests.cs feat(net,runtime): Campaign CC CC2 — CharacterCreate wire, 0xF643 correlation, creation status events 2026-08-15 12:49:52 +02:00
WorldSessionChatTests.cs feat(chat): port retail's @pklite client command (EnterPkLite 0x028F) 2026-08-03 18:57:17 +02:00
WorldSessionCombatTests.cs feat(ui): finish retail toolbar controls 2026-07-11 12:11:53 +02:00
WorldSessionConstructionTests.cs perf(net): own one pooled async receive 2026-07-25 05:50:18 +02:00
WorldSessionInboundBudgetTests.cs fix(net): timeslice WorldSession.Tick inbound drain (#2 flood) 2026-06-22 15:39:50 +02:00
WorldSessionInventoryActionTests.cs fix #234: port retail appraisal floaty and inscriptions 2026-07-23 12:12:57 +02:00
WorldSessionLinkStatusTests.cs feat(ui): share indicator detail panels 2026-07-17 10:27:41 +02:00
WorldSessionNegotiationShutdownTests.cs fix(net): conform character entry and session shutdown 2026-07-21 10:33:03 +02:00
WorldSessionNetReceiveLoopResilienceTests.cs feat(net): N3 - AckNakScheduler, retail 2.0s cumulative ack replaces per-packet acks 2026-07-29 13:51:57 +02:00
WorldSessionRadarTests.cs fix(ui): preserve retail item titles and spacing 2026-07-24 05:21:01 +02:00
WorldSessionShutdownTests.cs fix(net): conform character entry and session shutdown 2026-07-21 10:33:03 +02:00
WorldSessionVendorTests.cs feat(vendor): Slice 6b/6c — move-to-use, buy staging, selling; the vendor arc is functionally complete 2026-08-08 11:43:11 +02:00
WorldSessionWiringOwnershipTests.cs refactor(net): own live session routing 2026-07-21 11:17:09 +02:00