Sync upstream release 0.3.0 #11
Reference in New Issue
Block a user
Delete Branch "sync/upstream-20261019"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Import 25 upstream commits through
9a5f2a56(0.3.0): UI layout/font/HTML fixes, nameplate health, action and key-binding fixes, unit/bag lookups and API fidelity. Preserve MoonWell branding, ruRU support, Cyrillic deletion confirmation, and original EULA/TOS distribution. Update only the two fork package lock versions after the workspace version bump; third-party dependency versions are unchanged.Validation on Windows: locked player release build and formatting pass. Offline stock GlueXML checks pass for original EULA/TOS content, arrow and wheel scrolling, and Accept gating. Typed delete confirmation checks pass for 9 Russian and 7 English inputs, click/Enter dispatch and dialog reset, without account login or real deletion. Full test suites are not rerun for this release. Generated documentation rebuilt; upstream whitespace-significant golden rows retained.
Published production build ec8946903c6c227782f9d97917e8dc40ef6f66f4d07659636a3728c76e419934 from main
7752edb982. Active/release manifests and all 20 remote objects verified; executable/runtime/agreement SHA-256 match. All 15 MPQ archives retain their immutable keys.`TargetUnit("npc")`, `AssistUnit("npc")` and `SpellTargetUnit("npc")` did nothing with a merchant, gossip or quest window open: the app's unit-token resolver answered nobody for `npc`. In 1.12.1 the resolver (`0x515970`) matches `npc` as a whole token (`0x515bec`, an unbounded compare, so `npctarget` stays unknown) and takes the interaction NPC's guid `[0xb4e2d0]`, which `0x4930d0` writes when the window opens. `npc` now resolves to the held unit `InteractNpc` names. Tests cover the three verbs, a closed window and a streamed-out NPC, and `/script TargetUnit("npc")` typed into the stock chat box. Fixes #707 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>`PLAYER_LOGIN` fired at the end of the UI load, before the player existed: its handlers saw `UnitExists("player")` nil and level, health and XP 0, at every login and `/reload`. Ace2's `OnEnable` runs there. In 1.12.1 the load only arms a one-shot (`0x49011d`). The world-enter cascade fires `PLAYER_LOGIN` if armed (`0x49094b`), then `PLAYER_ENTERING_WORLD` (`0x49096a`), inside a sound-suppression bracket (`0x4908d5`–`0x490a56`). It runs from the player's own create (`0x5deb60`), or on `/reload` from the load (`0x490168`) with the player still in the world. A worldport re-arms nothing. Now the load arms it, and the unit feed fires both, silenced, once the player is seated. A `/reload` loads under the live player and no longer plays the target-select sound. Tests cover login, worldport and reload; they fail without the fix. Fixes #189 Fixes #191 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>bevy/dynamic_linkingin crates/benilla-app (#853) 45da0a0850Lua bindings now read their arguments the way the 1.12.1 client does: - Numeric strings parse as Storm's `SStrToInt` (`0x64ac60`) and `SStrToFloat` (`0x64aaa0`). That covers channel keys, `GetNumber` and `item:` fields. - Flag arguments go through `GetBoolOrDefault` (`0x6f1c10`) with each site's default. That is about 40 bindings, `SetChecked()` and `ShowHelm()` among them. - Colour channels take numeric strings (`lua_tonumber`), and alphas are `isnumber`-gated: no raise, 1.0 by default. A three-argument `SetVertexColor` keeps the current alpha (`0x79ae0a`). So action-bar rings dimmed by a drag stay dimmed, as in 1.12.1. - `SetTexture("1")` takes the colour form. MessageFrame channels follow `0x795590`. - `LoggingChat`/`LoggingCombat` return the flag. Binding-level tests use the reference's values. Fixes #135 Fixes #144 Fixes #160 Fixes #161 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>1.12.1's MSG_MOVE_TELEPORT_ACK handler (0x603f90) reaches none of the loading screen's raises: 0x406800 is entered only from SMSG_TRANSFER_PENDING (0x401900), the glue EnterWorld (0x46b6f1) and 0x407de0. benilla raised the cover on a same-map snap twice over: the "focus not resident" backstop on the snap frame, and a >=100 yd relocation raise. The relocation raise goes, and the backstop stays off while a snap's settle hold is up; the body is held over the destination as before. Verified live against the local realm (map 0, Gmagent): .tele ironforge from Northshire (~3960 yd) and back covered 50 and 93 frames (0-916 ms, 0-1680 ms) before, 0 and 0 after; cross-map .tele valley and back still raise the cover ("worldport"). New tests in loading_screen.rs fail on the old code at the snap frame. benilla-app and benilla-world lib tests green, install-reading tests green with BENILLA_REQUIRE_DATA=1 (the addon corpus is absent on this machine). Built on macOS (arm64). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>In 1.12.1, `TargetByName` (`0x489d60`), `TargetUnit` (`0x4899d0`) and `ClearTarget` (`0x489ff0`) commit through `SetSelection` (`0x493540`) before they return, so the next line of the chunk reads the new target. benilla queued them, so `UnitName("target")` on the next line read the old unit. The bindings now update the `"target"` view and the resolver's guid at once. They rank over a per-frame candidate feed that shares the app scan's candidate test and rank. A pick `SetSelection` refuses (not selectable, `0x4935ee`) leaves the view alone. The unit feed re-pushes the committed selection the next frame. A full tie goes to the lower guid, written as a deviation. Tests: the chunk reads the pick; namesake ties, refused picks and the re-push, in benilla-ui and through the app's real feed. Supersedes #1225, whose branch GitHub would not let us push to. Co-authored-by: kalistoking <148718830+kalistoking@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>Splitting a quest item's stack could flash its objective line ("Wolf Pelt: 4/5"). The toast rode a per-frame diff of the bag count, and a split dips it for a frame: vmangos sends the shrunk source and the new stack's create at once, and the slot naming the new stack later, in the batched update (`Player.cpp:11100`, `10316`–`10327`). 1.12.1 toasts an item objective only from `SMSG_QUESTUPDATE_ADD_ITEM` (`0x5e5ad0`, case 0x19a). It walks the log to the first quest needing the item, and `0x5dd060` shows `ERR_QUEST_ADD_ITEM_SII` with min(held + added, need), then `QUEST_WATCH_UPDATE`. An uncached quest record defers the pair to its arrival (`0x5dd180`). Item lines now toast from that packet alone; kill and complete toasts are unchanged. Tests replay a split's update sequence (no toast) and a pickup (one toast); both fail without the change. Fixes #916 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>Texture paint answered and drew unlike 1.12.1: `SetTexture("")` and non-string names answered nil, a missing file cleared desaturation, `SetTexCoord()` and an unknown `SetBlendMode` passed quietly, a failing bar path still installed a bar, and DISABLE, ALPHAKEY and MOD drew as BLEND. 1.12.1's load (`0x770200`) writes the shader slot only for a file that loads (`0x7702c0`); the binding answers 1 for a null name (`0x79bdae`). The submit draws a coloured DISABLE or ALPHAKEY texture as BLEND (`0x76fb82`); ALPHAKEY alpha-tests at 224/255 and MOD multiplies the destination (DESTCOLOR, ZERO, `0x80a1fc`). Now one texture load serves every setter, the usage lines raise, the shader draws each mode with a MOD pipeline of its own, and a new test validates the UI shader with naga. The stock UI draws as before. Fixes #1425 Fixes #1864 Fixes #1863 Fixes #1521 Fixes #1556 Fixes #1550 Fixes #1559 Fixes #1555 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>feed_party and feed_units share FieldEventPushes with no order between them. When the party feed ran first, TargetFrame's RAID_TARGET_UPDATE handler read GetRaidTargetIndex("target") off the previous snapshot, so a new mark showed over the mob but not on the target frame until the target changed. A UnitSnapshots set holds feed_units, and the party feed runs after it. the_party_feed_runs_after_the_unit_snapshots reads the order off the declared graph; it fails on the tree before this change. Verified: cargo fmt --check, clippy -D warnings, cargo test -p benilla-app --lib (5093 passed). Live on a vmangos server, a build with this change shows raid marks set in a raid on the target frame. Built on macOS only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>A level-60 character entered the world with the XP bar shown instead of the max-level bar. The stock watch bar sets the XP bar from `UnitLevel("player")` on `UPDATE_FACTION` (`ReputationFrame.lua:161-244`). The server sends the faction list before the player's create, and benilla's only login signals came from that first push, before `"player"` was seated, so the bar read level 0 and stayed shown. 1.12.1 rebuilds the list in the world-enter cascade (`0x4909d3` calls `0x4d5430`), after `PLAYER_ENTERING_WORLD`, and that rebuild's sort signals `UPDATE_FACTION` (`0x4d55de` → `0x4d5db0`); the rebuild does nothing without a player (`0x4d5453`). benilla now runs that rebuild in the cascade, and the first push into a VM is silent. A test drives the server's order: level 60 hides the XP bar and shows the max-level art, level 59 the reverse. Fixes #1973 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>9a5f2a563795a05780WIP: Sync upstream 0.3.0 and publish clientto Sync upstream release 0.3.0