|
1 | 1 | # Changelog |
2 | 2 |
|
| 3 | +## [v3.1.10] - 2026-08-27 |
| 4 | + |
| 5 | +### Fixed |
| 6 | +- **3.1.9 crashed at login on every Apple Silicon Mac.** `pthread_jit_write_protect_np` answers a process without `com.apple.security.cs.allow-jit` by trapping rather than by failing, and the app is signed with the hardened runtime and no entitlements at all, so the first Warden module the realm sent took the client out in `JitWriteWindow`'s constructor. Two things were wrong at once. The window was gated on arm64 macOS while the mapping it guards is gated on macOS *and* no Unicorn, and release builds have Unicorn, so the image was never mapped `MAP_JIT` and the window was pure liability; both now read one `WOWEE_MAP_JIT`, so the guard cannot come apart from the thing it guards again. And the entitlement is granted, because a build without Unicorn does map `MAP_JIT` and cannot without it. `verify_signature.sh` fails the release if the entitlement is not on the signature, which nothing checked before: a missing entitlement is not a signing error, so every existing check passed on the build that crashed. Reported in #131 |
| 7 | +- **A random suffix named no stats.** The suffix tooltip read `itemStatName`, which answers nothing for Strength through Spirit because a query response prints those from fields of their own. A suffix has no such fields, so "of the Boar" and every other animal suffix listed a name and nothing under it. `itemModStatName` names them |
| 8 | +- **An item dragged out of a bag onto the world came back on the next bag update.** The drag release cleared the cursor whenever it landed on nothing, which is right for an action taken off a bar and wrong for an item out of a bag. The delete confirmation reads the cursor after the dispatch returns, so it found nothing to ask about |
| 9 | +- **The auction browse tab's column headers sorted nothing on a single page.** Clicking one re-queries with the ordering attached, which is that tab's design, but AzerothCore only sorts once the result runs past one page, so a search returning fifty rows or fewer came back in the realm's own order however the headers were clicked. The page is sorted before it is drawn with the keys the click already set, and a page the realm ordered is left alone |
| 10 | +- **An action-bar slot naming a key never found it.** `useItemById` walked the backpack and the four bags only, and a key lives in neither. `/use` with an equipment slot number reads that slot's item id and passes it here too, so the one call site written for equipped items could not work either. Both are searched last, so nothing that already resolved moves |
| 11 | +- **The objective tracker listed quests from every zone.** `trackerFilter` defaulted to 7, which ticks "quests in other zones"; three is the stock value. Clearing that bit filters on `CURRENT_MAP_QUESTS`, which `WatchFrame_GetCurrentMapQuests` built from the POIs the realm had sent rather than from the player's zone, so that is rebuilt from the quest log's zone headers |
| 12 | +- **Scrolling up scrolled down.** `hybridscrollframe.lua` is `if delta == 1 then up else down`, so a wheel reporting 2 or 3 went the wrong way. Down was never affected: every negative delta fails that test into the branch it wanted. The camera keeps the magnitude |
| 13 | +- **The helm and cloak switches came back on at every login.** `helmVisible_` was written by `toggleHelm` and nothing else, so it started true each session while the realm still had the flag set. It is read from `PLAYER_FLAGS` on create as well as on change, because login delivers the player as a CREATE block |
| 14 | +- **Every interactable answered the same hand cursor.** A vendor shows `Buy.blp`, a hostile the attack cursor and a corpse the loot cursor |
| 15 | +- **Every session began windowed with vsync at its default.** The window is built from a `WindowConfig` written by hand, so the saved fullscreen and vsync choices were never read. They are applied beside `applySavedAntiAliasing`, before the first frame |
| 16 | +- **An item dropped into the auction sell slot had no icon, and Create Auction stayed disabled.** `AuctionSellItemButton_OnEvent` is the only thing that draws that slot, it runs on `NEW_AUCTION_UPDATE`, and nothing fired it. `ValidateAuction` reads the stack and total counts that handler sets |
| 17 | +- **A quest item could not be used at all.** `UseContainerItem` chose equip on `inventoryType` alone; some quest items carry one, so the right-click sent `CMSG_AUTOEQUIP_ITEM` and the realm answered `ERR_NOT_EQUIPPABLE`. Class 12 is never equipment |
| 18 | +- **One frame of whatever memory held when the world map was opened.** The composite image's contents are undefined until the first composite pass and `ImGui::Image` drew it unconditionally. A zone change is not this case: `invalidateComposite` only says the picture is stale |
| 19 | +- **The world map dropdowns came up empty.** `SetMapToCurrentZone` raises a recenter flag and fires `WORLD_MAP_UPDATE` at once, but the move happens a frame later, so `GetCurrentMapContinent` answered 0 while the dropdowns were being built. Zero is the branch that runs `UIDropDownMenu_ClearAll` and asks `GetMapZones(0)`, and nothing asked again. The map now says when it has moved, and `setMapByIndex` returns whether the pair was taken |
| 20 | +- **An off-hand weapon swung with the main hand's animation.** Both places that asked for a dual wield tested `ONE_HAND` alone, so an off-hand-only weapon (INVTYPE 22) set no `hasOffHand`: no off-hand animation and no unsheathe from that hand. The off-hand swing also chose its chain from the main hand's `isFist`/`isDagger`, so a sword and a dagger each swung with the other's |
| 21 | + |
3 | 22 | ## [v3.1.8] - 2026-08-21 |
4 | 23 |
|
5 | 24 | ### Changed |
|
0 commit comments