feat(quest): QT6 — plugins can read the contract tracker
The last piece of QT6's own scope: r10-quest-dialogs.md §11.6's contract half. IGameState.Contracts exposes what the client structurally knows about quests, which — per that same research — is the tracker and nothing else. The rest of §11.6 (chat stream, tells, give, use, confirmations) is other features and stays out of this campaign. A pull-through source rather than a pushed mirror. Contracts change rarely and are already owned canonically, so a second copy would only be a thing to keep in step; reading through means a plugin cannot observe a stale list. Both hosts implement it. The headless one carries contract id, stage and progress but no names — a bot has no dat access — because losing the TEXT is expected while losing the QUEST would leave a bot silently unable to see what it is on. Same rule covers a contract the installed dat has never heard of: it still projects, with empty text and a correct status, rather than vanishing. The interface member is defaulted so a host predating this campaign still satisfies IGameState. Two lazy catalog loads exist (the panel's and this one) rather than one shared instance. That is deliberate: threading a shared ContractCatalog through three composition records to avoid reading a 322-row immutable table at most twice per session would be plumbing for no correctness or performance gain, and the comment at the call site says so. Campaign QT is complete; the connected user gate is owed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
56beeb720d
commit
fe1e68e5fe
8 changed files with 305 additions and 0 deletions
41
src/AcDream.Plugin.Abstractions/ContractSnapshot.cs
Normal file
41
src/AcDream.Plugin.Abstractions/ContractSnapshot.cs
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
namespace AcDream.Plugin.Abstractions;
|
||||
|
||||
/// <summary>
|
||||
/// One tracked contract, as a plugin sees it.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// This is the ONLY structured view of quest state a client ever has. The
|
||||
/// retail client stores no quest flags and is never told one changed; it learns
|
||||
/// about quests through NPC dialogue, generic error text, and this tracker. A
|
||||
/// plugin asking "what quests am I on?" is asking this and nothing else.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// <paramref name="Name"/>, <paramref name="Description"/> and
|
||||
/// <paramref name="Status"/> come from the installed dat and may be empty on a
|
||||
/// host with no dat access (a headless bot), or for a contract the installed
|
||||
/// dat build has never heard of. The numeric fields are always present.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
/// <param name="ContractId">Key into the dat's ContractTable.</param>
|
||||
/// <param name="Stage">
|
||||
/// Raw wire stage: 1 available, 2 in progress, 3 done-or-pending-repeat, and
|
||||
/// <c>4 + n</c> for a progress counter with n steps done — see
|
||||
/// <paramref name="Progress"/>.
|
||||
/// </param>
|
||||
/// <param name="Progress">Completed steps, or 0 when the stage carries no counter.</param>
|
||||
/// <param name="IsDisplayed">Whether the server nominated this as the shown contract.</param>
|
||||
/// <param name="Name">Authored contract name.</param>
|
||||
/// <param name="Description">Authored long-form description.</param>
|
||||
/// <param name="Status">
|
||||
/// The progress text retail's own panel shows — "Available", "In Progress",
|
||||
/// "5/20 Tuskers", "Done (1h 30s to Repeat)".
|
||||
/// </param>
|
||||
public readonly record struct ContractSnapshot(
|
||||
uint ContractId,
|
||||
uint Stage,
|
||||
uint Progress,
|
||||
bool IsDisplayed,
|
||||
string Name = "",
|
||||
string Description = "",
|
||||
string Status = "");
|
||||
|
|
@ -4,4 +4,15 @@ namespace AcDream.Plugin.Abstractions;
|
|||
public interface IGameState
|
||||
{
|
||||
IReadOnlyList<WorldEntitySnapshot> Entities { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The player's tracked contracts — the client's only structured view of
|
||||
/// quest state (<c>r10-quest-dialogs.md</c> §1.3). Empty when the server
|
||||
/// has sent none.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Defaulted so a host predating Campaign QT still satisfies the interface;
|
||||
/// both in-tree hosts implement it.
|
||||
/// </remarks>
|
||||
IReadOnlyList<ContractSnapshot> Contracts => [];
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue