From 0535fe9097defcfc5def711ee29ef6ca36953e77 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 4 Sep 2026 20:48:52 +0700 Subject: [PATCH] a body lands with a thud, and twelve lists scroll again MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - a dying body lands with a sound: the `$DTH` marker makes three calls in the reference (`0x624a94`) and benilla had built only the middle one, so the screen shook and nothing landed; the thud is a two-axis join — size class against terrain sound, through `DeathThudLookups.dbc` to a land or water kit — behind exactly three gates: more than 2.0 yd of liquid over the feet is complete silence, a size class outside 0..=4, and no terrain, no row or a kit of 0; it plays on bus 0, uncapped, so a battlefield's worth of bodies all land — the shake is the rare thing (49 of 430 models name a preset), the thud the universal one (329 key a `$DTH`, players included); the size axis had sat in our `CreatureDisplayInfo` schema labelled a string column 5875 does not have, and `StringLookups` stays unparsed on purpose — 9 rows benilla already resolves (1866) - twelve faux-scroll lists showed their bar, moved their thumb and never moved their list: the reference's kit writes `frame.offset` from one handler the OWNER declares, and ours were wired to a `frame.updateFunc` field the reference does not have — Skill, Craft, TradeSkill, ScriptLog, the auction and the social panes are rewired, and a gate fails any faux frame without a handler of its own, because a list only scrolls when something drives it (1868); and the macro window's "Change Name/Icon" raised on a nil offset: `MacroPopupScrollFrame` inherits a template the manifest never loaded, and a missing template is a warning, so the frame was built BARE — no scroll bar, no scripts, no `offset = 0` — and the reference's offset read has no `or 0` cushion; the line is in the manifest, and a static gate fails any `inherits=` the manifest declares nowhere (1862) - the character geoset selector's missing eighth branch is the tabard designer: B6 of `0x477520` is gated on "the guild registrar's tabard designer is open", not an ItemDisplayInfo column, and wears the tabard flap with an EMPTY tabard slot; dormant until `TabardFrame` migrates, but reading the whole function turned up three branches wrong since their first pass: B4-short never disabled [501,599], so the bare foot — a real submesh on 11 of the 18 character models — rendered inside every boot; B3 asked "is a chest equipped?" where the reference asks whether anything but the shirt paints the ArmLower tile, wrong more often than right (533 of 637 chest displays leave it empty, 566 of 570 wrist displays fill it); and B7 had no tabard guard, an ungated doublet arm, and a leg arm read off chest-or-legs where the reference reads the chest's bit alone (1864) - a GameObject's display sounds have one trigger and two lanes: `GameObjectDisplayInfo.Sound[0..9]` has one reader (`0x5f4010`), reached only from the anim-event dispatcher, so benilla's state-transition arm — 19 Open and 4 Close rows the reference leaves silent, 80 Open and 38 Close doubled against the clip's own `$GO1`/`$GO3` — is deleted; and the kit's `0x200` flag is a LANE SELECT, not a loop flag: set means the ambient pool, which every campfire, brazier, torch and fountain names (37 live slots), and which had been starting untracked forever-channels (1867); and `WOW_PROBE_SERVICE=1` reads the NPC-service ladder back off a live server — four real NPCs, reporting the arm taken, the opcode sent and the window opened — with every hop inside the reference's own service reach, after a first run parked ~29 yd from Deputy Willem and blamed the client for a dropped packet (1865) Co-Authored-By: Claude Fable 5.1 --- crates/benilla-app/assets/ui/AuctionFrame.xml | 38 +- crates/benilla-app/assets/ui/CraftFrame.xml | 16 +- crates/benilla-app/assets/ui/FriendsFrame.xml | 36 +- .../benilla-app/assets/ui/QuestLogFrame.xml | 2 +- .../benilla-app/assets/ui/ScriptLogFrame.xml | 10 +- crates/benilla-app/assets/ui/SkillFrame.xml | 23 +- .../benilla-app/assets/ui/TradeSkillFrame.xml | 17 +- crates/benilla-app/assets/ui/benilla.toc | 11 + crates/benilla-app/src/capture/mod.rs | 2 + .../benilla-app/src/capture/probe_service.rs | 544 ++++++++++++++++++ crates/benilla-app/src/dev.rs | 8 + crates/benilla-app/src/entities.rs | 7 + .../src/entities/attach/char_skin.rs | 18 +- crates/benilla-app/src/entities/attach/mod.rs | 2 +- crates/benilla-app/src/go_anim.rs | 158 ++++- crates/benilla-app/src/sound/anim_events.rs | 59 +- crates/benilla-app/src/sound/death_thud.rs | 259 +++++++++ .../sound/{doodad_pool.rs => emitter_pool.rs} | 237 +++++--- crates/benilla-app/src/sound/gameobject.rs | 184 +++--- crates/benilla-app/src/sound/kit.rs | 2 +- crates/benilla-app/src/sound/mod.rs | 6 +- crates/benilla-app/src/target/click.rs | 4 +- crates/benilla-app/src/target/cursor_mode.rs | 2 +- .../benilla-app/src/ui_script/macro_tests.rs | 34 ++ .../benilla-app/src/ui_script/reference_ui.rs | 224 ++++++++ .../src/ui_script/shipped_xml_tests.rs | 57 ++ .../src/bin/benilla-extract/charatlas.rs | 12 +- .../src/bin/benilla-extract/main.rs | 24 +- .../src/bin/benilla-extract/scan/mod.rs | 4 +- .../src/bin/benilla-extract/scan/sequence.rs | 225 +++++++- .../src/bin/benilla-extract/thudcensus.rs | 206 +++++++ .../benilla-formats/src/characters/geosets.rs | 238 +++++++- crates/benilla-formats/src/characters/mod.rs | 4 +- .../src/characters/sections.rs | 23 + crates/benilla-formats/src/creatures.rs | 108 +++- crates/benilla-formats/src/death_thud.rs | 211 +++++++ crates/benilla-formats/src/lib.rs | 8 +- 37 files changed, 2759 insertions(+), 264 deletions(-) create mode 100644 crates/benilla-app/src/capture/probe_service.rs create mode 100644 crates/benilla-app/src/sound/death_thud.rs rename crates/benilla-app/src/sound/{doodad_pool.rs => emitter_pool.rs} (74%) create mode 100644 crates/benilla-formats/src/bin/benilla-extract/thudcensus.rs create mode 100644 crates/benilla-formats/src/death_thud.rs diff --git a/crates/benilla-app/assets/ui/AuctionFrame.xml b/crates/benilla-app/assets/ui/AuctionFrame.xml index 48960683..066b3f1a 100644 --- a/crates/benilla-app/assets/ui/AuctionFrame.xml +++ b/crates/benilla-app/assets/ui/AuctionFrame.xml @@ -231,10 +231,6 @@ BuyoutPrice.onValueChanged = AuctionsFrameAuctions_ValidateAuction StartPriceGold:SetMaxLetters(6) -- Each faux list repaints through its own tab's Update. - BrowseScrollFrame.updateFunc = AuctionFrameBrowse_Update - BrowseFilterScrollFrame.updateFunc = AuctionFrameFilters_Update - BidScrollFrame.updateFunc = AuctionFrameBid_Update - AuctionsScrollFrame.updateFunc = AuctionFrameAuctions_Update end function AuctionFrame_OnShow() @@ -783,6 +779,7 @@ end end FauxScrollFrame_Update(BrowseFilterScrollFrame, total, BENILLA_FILTER_ROWS, BENILLA_FILTER_ROW_HEIGHT) + BenillaScrollTrough_Follow("BrowseFilterScrollFrame") end -- Clicking a filter row NEVER queries — it only moves the selection, which the next Search @@ -940,6 +937,7 @@ local rows = auctionPagerUpdate("Browse", AuctionFrameBrowse.page, numBatch, total, lastSlotEmpty) FauxScrollFrame_Update(BrowseScrollFrame, rows, BENILLA_BROWSE_ROWS, BENILLA_AUCTION_ROW_HEIGHT) + BenillaScrollTrough_Follow("BrowseScrollFrame") end -- The two Browse turners re-SEARCH rather than scroll: the next 50 rows live on the server @@ -2056,7 +2054,13 @@ - + + + FauxScrollFrame_OnVerticalScroll(BENILLA_FILTER_ROW_HEIGHT, AuctionFrameFilters_Update) + +