fix(journal): the location readout is a FIELD, refresh at the click, and Abandon works
Three fixes from the first connected round. The location readout is authored EDITABLE (0x16), so it builds as a UiField — not the UiText its "00.0S, 00.0W" placeholder suggests. The controller resolved it as text, got null, and threw every write away in silence: Record reached the model and reached the FILE, and never reached the screen. That is exactly what was reported, and it is a whole class of bug, so the sweep that found it is now a test over every element all three controllers bind. The handlers mutated the model and left redrawing to the next frame's Tick. Retail's ListenToElementMessage @0x004968D0 ends every one of them in Update() instead — at the moment of the click. The deferred version happened to work in the client and made the behaviour untestable and a frame late; the notes-page tests I had not written until now fail against it. Abandon is wired. "Retail's abandon path is a contract-registry command we have not ported" was wrong — it is game action 0x0316 with a single contract id, and ACE replies with the 0x0315 delete QT3 already handles. Nothing is removed locally, so a refusal leaves the quest visibly intact rather than vanishing it optimistically and having it reappear on the next full table. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
0b27c5d0fe
commit
e35d9386e4
12 changed files with 556 additions and 16 deletions
|
|
@ -25,6 +25,7 @@ public static class ClientCommandRequests
|
|||
public const uint SetAfkMessageOpcode = 0x0010u;
|
||||
public const uint EmoteOpcode = 0x01DFu;
|
||||
public const uint AddFriendOpcode = 0x0018u;
|
||||
public const uint AbandonContractOpcode = 0x0316u;
|
||||
public const uint RemoveFriendOpcode = 0x0017u;
|
||||
public const uint ClearFriendsOpcode = 0x0025u;
|
||||
public const uint ModifyCharacterSquelchOpcode = 0x0058u;
|
||||
|
|
@ -143,6 +144,15 @@ public static class ClientCommandRequests
|
|||
public static byte[] BuildAddFriend(uint sequence, string name) =>
|
||||
BuildString(sequence, AddFriendOpcode, name);
|
||||
|
||||
/// <summary>
|
||||
/// Campaign QJ: abandon a tracked contract — game action <c>0x0316</c>,
|
||||
/// payload one contract id. The server answers with <c>0x0315</c> carrying
|
||||
/// <c>DeleteContract</c>, which is why the client does not remove the row
|
||||
/// itself (ACE: <c>GameActionAbandonContract</c>).
|
||||
/// </summary>
|
||||
public static byte[] BuildAbandonContract(uint sequence, uint contractId) =>
|
||||
BuildUInt32(sequence, AbandonContractOpcode, contractId);
|
||||
|
||||
public static byte[] BuildRemoveFriend(uint sequence, uint friendId) =>
|
||||
BuildUInt32(sequence, RemoveFriendOpcode, friendId);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue