fix(ui): match retail item appraisal semantics

Preserve PublicWeenieDesc hook identity from CreateObject through the item model so hook appraisals suppress sentinel capacities exactly. Use appraisal-only Value and Burden presence, retain AddItemInfo paragraph and authored font-color selection, and port retail lock, page, enchantment, and spell-block formatting.

Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-23 18:04:19 +02:00
parent bc47bc4917
commit d3c5e06fdd
21 changed files with 982 additions and 145 deletions

View file

@ -177,6 +177,15 @@ public sealed class ClientObject
public uint WielderId { get; set; } // PropertyInstanceId.Wielder; 0 = not wielded
public int ItemsCapacity { get; set; } // main-pack slots (containers)
public int ContainersCapacity{ get; set; } // side-pack slots (containers)
/// <summary>Retail <c>PublicWeenieDesc._hook_item_types</c>.</summary>
public uint HookItemTypes { get; set; }
/// <summary>Retail <c>PublicWeenieDesc._hook_type</c>.</summary>
public uint HookType { get; set; }
/// <summary>
/// Port of <c>ACCWeenieObject::IsHook @ 0x0058C660</c>.
/// A hook must publish both a hook type and an accepted item-type mask.
/// </summary>
public bool IsHook => HookType != 0u && HookItemTypes != 0u;
public uint Priority { get; set; } // ClothingPriority / CoverageMask layer order
public uint? Useability { get; set; } // ITEM_USEABLE from PublicWeenieDesc
public uint? TargetType { get; set; } // ITEM_TYPE mask for targeted-use compatibility
@ -274,7 +283,9 @@ public readonly record struct WeenieData(
ushort? AmmoType = null,
uint? SpellId = null,
uint? CooldownId = null,
double? CooldownDuration = null);
double? CooldownDuration = null,
uint? HookItemTypes = null,
uint? HookType = null);
/// <summary>
/// Retail ITEM_USEABLE helpers (acclient.h:6478, ItemUses::* at 0x004fccd0).