Files
benilla-octo/crates/benilla-app/assets/ui/CinematicFrame.xml
T
SamandClaude Fable 5 f3ecb5c968 a cinematic holds your body, and all seven chat windows exist
- a cinematic holds the body while the camera flies: the streaming focus follows the eye — a Tauren's intro opens 1741 yards from the body — so the body's own ground unloaded under it and it fell (z=59.4 to −62 in four seconds, the server yanking it back); it now takes the same hold a teleport takes, released when the focus comes home to a resident tile, and the loading screen stops covering the fly-by, because "the player's ground is missing" is not a load while the eye is deliberately elsewhere; the letterbox measurement prints as an ordinary info line, and scripts/cine.sh plays any one cinematic and prints what the client did to the world while the camera was away
- a cinematic cuts the zone music: the reference asserts exactly what /console EnableMusic 0 asserts, through the same setter — a cut, not a fade, the music pump dead for the duration, resume at +3.000 s — and benilla asserts the runtime flag, never the CVar, or quitting during a 102-second intro would save your music off for good; ambience is deliberately untouched (it has the analogous flag and the cinematic never writes it); the narration has no category at all — its flags route it around every volume slider but not around the Enable Sound Effects gate, so unchecking that silences it — and the listener follows the cinematic camera for the duration
- addons can walk a UI they did not build: GetChildren/GetNumChildren/GetRegions/GetNumRegions land — the basis of the whole reskin genre, and the wall four of the twenty most-installed 1.12 addons died on: pfUI drew nothing before and now paints 495 quads, ShaguDPS 71 → 566, pfQuest 3 → 498 — with the reference's own quirks: the title region is NOT in the list (its creation path never reaches the region linker), hidden regions are returned and counted, oldest first; the Model widget gets its Lua surface (SetModel, SetSequence and siblings, read out of the shipped image, where SetRotation and SetFacing are two names for one slot); and the Minimap carries the nine engine-created Model children no XML declares, built before the frame descent, the ninth being the player arrow Questie indexes as ({Minimap:GetChildren()})[9]
- all seven chat windows come from one template, tabs and scroll buttons included — whether a window is shown has nothing to do with whether its globals resolve, and pfUI reads every piece of that furniture for all seven, unguarded; isDocked only on windows 1 and 2 (the chat-cache's own DOCKED byte), SELECTED_CHAT_FRAME seated beside DEFAULT_CHAT_FRAME (the window you last picked vs the one FrameXML prints to), and the four per-window fields ChatFrame_OnLoad seats; two more one-name walls fell — a Button's label answers to its second spelling NormalText, which KLHThreatMeter's column headers die without, and ABANDON_QUEST_WITH_ITEMS is declared because a dialog table is read at load whatever the client later shows, leaving Questie with zero errors of ours — and the addon harness gains --probe/--eval, one addon's VM answering a question in ~5 s instead of a 90 s corpus run

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

66 lines
3.2 KiB
XML

<Ui>
<!--
The cinematic frame — what makes InCinematic() true, and the ESC that skips a fly-by.
Transcribed from the reference's Interface\FrameXML\CinematicFrame.xml + .lua (decision
1602 permits it); the engine half is crate::cinematic.
This frame is load-bearing for exactly one thing, and it is not a picture: it is the WHOLE
skip path. In the reference, StopCinematic (0x48b970) has zero native callers and no
Bindings.xml row — the only thing that ever calls it is the OnKeyDown below, reached
because this fullscreen frame is keyboard-enabled and showing. No frame on screen means no
way out of a 102-second Night Elf intro.
THE BLACK BARS ARE NOT HERE, deliberately. The reference draws them as two textures on this
frame; we draw them as Bevy UI nodes in crate::cinematic instead, because a cinematic hides
the HUD through UiHidden — which kills both of ui_pass's quad lanes wholesale, and the
FrameXML layer is one of them. Bars declared here would go dark along with the action bars
they exist to replace. The bar LAW is unchanged and still the reference's — but it is BOTH
halves of it (decision 1701): the Lua's `if width/height > 4/3` guards a *recompute*, not
whether there are bars, and below it the XML's own `1024x128` textures stand on the native
1024x768 sheet, i.e. height/6 — which is the 2:1 crop evaluated at exactly 4:3. One
expression covers both: `min((h - min(w/2, h))/2, h/6)`. See `drive_letterbox`.
So this frame draws nothing at all. It is kept rather than replaced with an engine-side key
handler because the skip path IS a frame in the reference: keeping it means ESC works for
the same reason it works there, and an addon that hooks CinematicFrame still finds it.
RunBinding("SCREENSHOT") is kept as the reference has it: while this frame eats the
keyboard, the screenshot key is the one binding that still has to get through.
-->
<Script><![CDATA[
function CinematicFrame_OnLoad()
this:RegisterEvent("CINEMATIC_START");
this:RegisterEvent("CINEMATIC_STOP");
end
function CinematicFrame_OnEvent()
if ( event == "CINEMATIC_START" ) then
ShowUIPanel(this, 1);
return;
end
if ( event == "CINEMATIC_STOP" ) then
HideUIPanel(this);
return;
end
end
]]></Script>
<Frame name="CinematicFrame" setAllPoints="true" hidden="true" enableKeyboard="true" enableMouse="true">
<Scripts>
<OnLoad>
CinematicFrame_OnLoad();
</OnLoad>
<OnEvent>
CinematicFrame_OnEvent();
</OnEvent>
<OnKeyDown>
local screenshotKey = GetBindingKey("SCREENSHOT");
if ( arg1 == "ESCAPE" ) then
StopCinematic();
elseif ( screenshotKey and (arg1 == screenshotKey) ) then
RunBinding("SCREENSHOT");
end
</OnKeyDown>
</Scripts>
</Frame>
</Ui>