Files
benilla-octo/crates/benilla-app/assets/ui/ErrorsFrame.xml
T
SamandClaude Fable 5 d245535e68 the HUD becomes UIParent's child, and cinematics fade through black
- the transcription had dropped parent= on 72 declarations the reference carries (37 to UIParent, 28 to the action bar's art frame, 7 more), so the HUD was a field of top-level frames and UIParent:Hide() reached almost nothing — which is why a cinematic had to hide the UI at the draw level and then special-case the pointer; both workarounds are deleted and the HUD hides through the reference's own route; restoring only the UIParent half would have been the dangerous part (draw order is one flat sort, so a partial restore lifts frames over the neighbours they carry), and manifest order turns out to be load-bearing — a parent name that doesn't exist yet is silently ignored, so UIParent.xml moves to the reference's own slot with a test that fails if anything declares a child first; the chat still drew over a fly-by after all that, because the reference parents the chat windows on their TEMPLATE, invisible to a name-for-name diff when both sides rename — two declarations fix it, and the sweep that replaces the method loads the whole shipped manifest, fires CINEMATIC_START and asserts the survivors are exactly three: 91 frames visible before, 3 after, and the count comes back on stop
- every cinematic boundary cuts through the reference's 0.25 s fade to black, and the next step hangs on the fade's COMPLETION, not a delay — the shot boundary is exactly where the reference does a blocking terrain load, so a delay-driven cut shows through a hitch and a completion-driven one cannot; and a fly-by now ends into black instead of a ~0.3 s loading cover: the reference raises no cover on that path, it holds black while the ground under the player loads back, so ours holds black while the stream catches up — budgeted, never an unbounded wait
- the death arc keeps its promises across a relog: the body's own state machine now dies with the session — re-entering the world as a ghost used to match no arm of the world-edge machine, so the corpse query never went out and "Resurrect Now" stayed down until the next death; and a corpse wears its owner's guild crest — the corpse descriptor carries the guild field and resolves through the same crest cache a living tabard does, where ours dressed the body crestless
- the char-select ghost gets its body kit: the screen resolves the state kit of the very "Ghost" aura a released ghost rides in the world — tint (140,185,253), alpha 0.5, and the Ghost_state wisp model at the body's attach point, pinned by a golden that decodes the row out of the shipped DBC; the airborne model is corrected before its fix lands — the address six comments called the gravity integrator is really the fall-velocity query, and a knockback is unsteerable because its launch PLANTS the forward bit, not because the arc is airborne (our guard was a velocity proxy, so a near-zero-speed knockback steered from frame 2); and the hover inspect card now decodes a picked part's mesh tag — alpha, rig slot, and both readings of the lighting payload side by side — turning a rebuild-and-two-probes hunt into a hover

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 20:13:31 +07:00

104 lines
6.4 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<Ui>
<!--
The real client's UIErrorsFrame, now declared as what it actually IS: a
`<MessageFrame>` (ref UIErrorsFrame.xml:4 — 512×60 at TOP (0,-122), displayDuration="5",
insertMode="TOP", with `<FontString inherits="ErrorFont" justifyH="CENTER"/>` as its line
font). UI_INFO_MESSAGE shows YELLOW (1,1,0) — the quest objective-progress toasts land
here — and UI_ERROR_MESSAGE red (1,0.1,0.1), the ref handler verbatim (UIErrorsFrame.lua:8-16;
its SYSMSG arm is unwired, no engine producer yet).
It used to be a hand-rolled `<Frame>` painting three stacked FontStrings from Lua, because
this engine had no MessageFrame widget. It has one now (`script::messageframe::plain`,
`widget::MessageFrameState`), so the file that stood in for it is gone and the display —
insertMode, the vertical cap, the two-phase fade — is the widget's own, exactly as in the
reference. Two consequences worth naming:
* `UIErrorsFrame:AddMessage(text, r, g, b, a)` is REAL now, so FrameXML producers call it
the way the reference does (the old `BenillaErrorsFrame_AddMessage` seam is retired),
and so does an addon: `EasyCopy`, `QuestHistory` and `QuestItem` each died on that exact
line at load. A sixth argument (all three pass one, believing it is a hold time) is
silently IGNORED — the real binding reads five, and honouring it would be unfaithful.
* The post-hold fade is the class ctor's 3.0 s (msgframe-runtime.md, byte-verified), not
the 1.0 s this file used to carry as an explicitly INTERIM guess while that curve was
unpinned. The 5 s hold is unchanged.
frameStrata HIGH is the ref's own (`UIErrorsFrame.xml:4`) and decision 0597's: this frame
overlaps the right edge of every left-slot panel window (character, quest log, loot,
merchant, mail, trainer, taxi — all at TOPLEFT (0,-104)), so in the default MEDIUM its
toasts draw UNDER whichever panel is open, invisible in exactly the state you most want to
read them. The ref also carries toplevel="true"; that is deliberately not transcribed —
HIGH already wins the strata and 0597's fix is the one that was looked at.
-->
<Script><![CDATA[
function UIErrorsFrame_OnLoad()
this:RegisterEvent("UI_INFO_MESSAGE")
this:RegisterEvent("UI_ERROR_MESSAGE")
end
-- ref UIErrorsFrame_OnEvent(event, message) (UIErrorsFrame.lua:8-15) — the message is the
-- DECLARED second parameter, not the `arg1` global: the XML passes `arg1` into it exactly
-- as the reference's own does, and an addon calling the 1.12 arity is then read correctly.
function UIErrorsFrame_OnEvent(event, message)
if not message then return end
if event == "UI_INFO_MESSAGE" then
this:AddMessage(message, 1.0, 1.0, 0.0, 1.0) -- ref UIErrorsFrame.lua:12
elseif event == "UI_ERROR_MESSAGE" then
this:AddMessage(message, 1.0, 0.1, 0.1, 1.0) -- ref UIErrorsFrame.lua:14
end
end
]]></Script>
<MessageFrame name="UIErrorsFrame" parent="UIParent" displayDuration="5" insertMode="TOP" frameStrata="HIGH">
<Size><AbsDimension x="512" y="60"/></Size>
<Anchors>
<Anchor point="TOP" relativePoint="TOP">
<Offset><AbsDimension x="0" y="-122"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>UIErrorsFrame_OnLoad()</OnLoad>
<OnEvent>UIErrorsFrame_OnEvent(event, arg1)</OnEvent>
</Scripts>
<!-- The line font AND the centring, both: the class draws its messages through this
declared child, so `justifyH="CENTER"` is what keeps the toasts centred in the 512-wide
box (a chat frame's own child says LEFT). ErrorFont = GameFontNormalLarge (ref
Fonts.xml:258), which is the face the hand-rolled version used too. -->
<FontString inherits="ErrorFont" justifyH="CENTER"/>
</MessageFrame>
<!-- RaidWarningFrame (ref RaidWarning.xml:4-24), declared here beside the frame it anchors to.
Two corpus addons push into it directly — `Participant/RaidWarn.lua:133` and
`oRA2/RaidWarn.lua:133` are the same code in two distributions, plus their MainTank.lua's
"Tank %s has died!" — and both call
`RaidWarningFrame:AddMessage(text, r, g, b, 1.0, UIERRORS_HOLD_TIME)`. That is the plain
MessageFrame arity we already ship: the 6th argument is read and DROPPED, because the
reference's own `0x795590` reads five and stops (messageframe/plain.rs's first law).
Absent, that line is `attempt to index global` and takes the handler with it.
(`BigWigs` also names it — in a LOCALISATION STRING, "Suppressing RaidWarningFrame". Not a
use; 1207.)
Geometry quoted: 512x40, insertMode TOP, HIGH + toplevel, TOP anchored to UIErrorsFrame's
BOTTOM at (0,-10), and the direct-child FontString the class draws its lines through —
GameFontNormalHuge, CENTER, exactly as the sibling above takes ErrorFont.
**No <Scripts>, deliberately.** The reference's OnLoad/OnEvent call into RaidWarning.lua to
register CHAT_MSG_RAID_WARNING and route it here. We already deliver that chat type through
`ui_chat::feed`, so wiring a second consumer would print every raid warning TWICE; and
declaring handlers whose functions we do not ship would raise at load. The frame exists and
accepts messages, which is what the corpus asks of it — the automatic routing is the
ChatFrame_OnEvent architecture question, not this frame's.
RaidBossEmoteFrame, its sibling in the same file, is NOT declared: zero corpus addons name
it, and a shadowed name with no caller is building against a guess (1222's rejected clause). -->
<MessageFrame name="RaidWarningFrame" parent="UIParent" insertMode="TOP" frameStrata="HIGH" toplevel="true">
<Size><AbsDimension x="512" y="40"/></Size>
<Anchors>
<Anchor point="TOP" relativeTo="UIErrorsFrame" relativePoint="BOTTOM">
<Offset><AbsDimension x="0" y="-10"/></Offset>
</Anchor>
</Anchors>
<FontString inherits="GameFontNormalHuge" justifyH="CENTER"/>
</MessageFrame>
</Ui>