Visual gate on the item-interaction slice found two target-use bugs: the valid-target bullseye showed over inventory ITEMS (a coat is not a valid healing-kit target) while the paperdoll doll showed blocked (it should mean SELF). - TargetCompatible is now a faithful port of ItemHolder::IsTargetCompatibleWithTargetingObject (0x00588070): a location constraint applies only when the least-limited target-use bit (ItemUses::GetLeastLimitedTargetUse 0x004fcd50, new ItemUseability.LeastLimitedTargetUse) is Contained/Wielded; the player as target requires the Self bit (IsUseable_SelfTarget 0x004fcd30); and EVERY target passes retail's kind gate source._targetType & target->InqType(). The previous hand-rolled arms (Remote => accept anything, invented Viewed/Contained accepts, self path skipping the kind gate) were the yellow-over-items bug. Retail's tradeState refusal is skipped (no trade state yet). - The paperdoll doll viewport now carries UseTargetGuidProvider = player and Clicked -> AcquireSelfTarget (UiViewport gains an opt-in Clicked handler), so hovering the doll resolves the self cursor and clicking it applies the armed kit to yourself. - AcquireTarget logs one [use-target] line (wire useability, TargetType mask, target kind, decision) so live refusals are diagnosable from the launch log. - Test fixtures updated from the guessed kit useability 0x000A0008 to the real USEABLE_SOURCE_CONTAINED_TARGET_REMOTE_OR_SELF (0x00220008, ACE Usable.SourceContainedTargetRemoteOrSelf) + TargetType masks; new coverage pins the kind gate, the Self-bit requirement, the missing-mask-matches-nothing shape, and the Contained location rule. Full suite green (3,294). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
45 lines
2 KiB
C#
45 lines
2 KiB
C#
using System.Numerics;
|
|
|
|
namespace AcDream.App.UI;
|
|
|
|
/// <summary>Leaf widget for dat Type 0xD (UIElement_Viewport). Blits the texture produced by its
|
|
/// IUiViewportRenderer (run in the pre-UI hook) as a single sprite at its own rect. The 3-D render
|
|
/// does NOT happen here (OnDraw only has a 2-D context).</summary>
|
|
public sealed class UiViewport : UiElement
|
|
{
|
|
public override bool ConsumesDatChildren => true;
|
|
|
|
/// <summary>Optional click action (e.g. the paperdoll doll = "target self"
|
|
/// during item target-use). Non-null makes the viewport handle the press
|
|
/// itself instead of it being captured as a window move.</summary>
|
|
public System.Action? Clicked { get; set; }
|
|
|
|
public override bool HandlesClick => Clicked is not null;
|
|
|
|
public override bool OnEvent(in UiEvent e)
|
|
{
|
|
if (Clicked is null) return base.OnEvent(e);
|
|
switch (e.Type)
|
|
{
|
|
case UiEventType.MouseDown: return true; // consume the press; act on Click
|
|
case UiEventType.Click: Clicked.Invoke(); return true;
|
|
}
|
|
return base.OnEvent(e);
|
|
}
|
|
|
|
/// <summary>Renderer that produces the off-screen texture. Set by GameWindow wiring (later task).</summary>
|
|
public IUiViewportRenderer? Renderer { get; set; }
|
|
|
|
/// <summary>Last GL color-texture handle produced by the pre-UI hook. 0 = nothing to blit.</summary>
|
|
public uint TextureHandle { get; set; }
|
|
|
|
protected override void OnDraw(UiRenderContext ctx)
|
|
{
|
|
if (!Visible || TextureHandle == 0) return;
|
|
// Local origin is already at this widget's Left/Top (PushTransform applied by DrawSelfAndChildren).
|
|
// V is FLIPPED (v0=1, v1=0): TextureHandle is an off-screen FBO color texture, whose origin is
|
|
// bottom-left (GL), while the UI sprite convention is top-left. Without the flip the doll renders
|
|
// upside-down. (If the doll appears upside-down at the visual gate, this is the line to revisit.)
|
|
ctx.DrawSprite(TextureHandle, 0f, 0f, Width, Height, 0f, 1f, 1f, 0f, Vector4.One);
|
|
}
|
|
}
|