v2026.22-45-g423c20e

Details

  • Filename
    SilverDragon-v2026.22-45-g423c20e.zip
  • Uploaded by
  • Uploaded
    Aug 2, 2026
  • Size
    550.22 KB
  • Downloads
    176
  • MD5
    62025c1540194c67f4dff5cf47a9b501

Supported WoW Retail Versions

  • 12.0.7

Supported WoW Mists of Pandaria Classic Versions

  • 5.5.4

Supported WoW Wrath of the Lich King Classic Versions

  • 3.4.5

Supported WoW Classic Versions

  • 1.15.8

Supported WoW Burning Crusade Classic Versions

  • 2.5.6

Changelog

SilverDragon

v2026.22-45-g423c20e (2026-08-02)

Full Changelog Previous Releases

  • Changelog for v2026.23
  • Systems update: let "current character only" decide whether undroppable loot is notable
    Reward:Notable() has always required MightDrop, while the loot lists only ask for
    it when charloot says to, so notability was quietly the stricter of the two. Now
    they take the same answer. The option is off by default, so loot that can't drop
    for your specialisation counts again unless you say otherwise -- the previous
    behaviour was really the old hardcoded strictness showing through, not a choice.
    The announcement filters used to state the old behaviour outright; they now point
    at the option instead, the way the Transmog one already points at "transmog exact
    items".
  • Systems update: turning on "transmog exact items" didn't take until a reload
    HasAppearance was keeping "known from another item sharing the appearance" in the
    cache that outlives a run, alongside the answers that genuinely can't change. That
    one only holds while the option is off, so switching it on left those items reading
    as known for the rest of the session.
    The map had a second reason not to notice: nothing tells it when a core option
    changes, and it holds its pins until asked to think again. Fire an event from both
    setters that write to the core profile -- the loot ones here, and the notability
    ones over in Announce -- and have the Overlay redraw on it. Tooltips and the broker
    were only ever the caching half, since they rebuild as you hover them.
  • Changelog for v2026.23
  • A BoE mount read as unsellable until the game had cached the item
    GetItemInfo answers nothing for an item it hasn't fetched yet, so the bind type
    came back nil and the check quietly concluded "not BoE". For a mount you already
    own that's the difference between a rare being worth announcing and not, so one
    seen soon after a login could be passed over for a reason that stopped being true
    a moment later.
    Take nil as a yes. Asking has already started the fetch, so it settles on the real
    answer by the next sighting, and an extra mention costs less than a missed one.
  • Mobs we know nothing about were dressed up as ones you want
    A rare with no quest, no achievement and no loot was sharing the "something for
    you" colour, because that's where MobIsNotable's nil ends up and the states didn't
    look any further. It's a claim we can't back: plenty of the older data is a name
    and a location and that's all.
    Give it a state of its own -- a plain white icon, and no row colour at all in the
    broker -- and leave the announcement filter alone. Not being able to tell is still
    a reason to speak up, it's just not a reason to promise anything.
  • A rare meant different things on the map and in the broker tooltip
    The tooltip was still colouring rows green, yellow and red off its own reading of
    quest and achievement completion -- the partial/done idea the map pins have just
    grown out of -- so the same rare could be yellow in one place and grey in the
    other, and rows with neither a quest nor an achievement went uncoloured entirely.
    Move the five states into notable.lua as MobState, with the colours beside them,
    and have both ask. The Overlay ships as its own addon so it couldn't have been the
    home for this even if it looked like the obvious one.
    Every row is coloured now. Ones we know nothing about come out as "something for
    you", which is the same benefit of the doubt they get everywhere else.
  • Turning on "scan in instances" on its own did nothing you could hear
    Scanning and announcing each had their own instance switch, both starting off and
    sitting in different sections of the config, so they were two switches in series
    with no hint of each other. Flipping the one that sounds like the answer left
    Announce quietly dropping everything it found.
    Let core's cover both. That loses the pair of mixed settings -- scan but stay
    quiet, or announce without scanning -- but neither was reachable on purpose, and
    target and nameplate scanning ignore the scanning switch anyway, so "announce
    without scanning" was never quite what it claimed either.
  • Overlay: colour map icons by what's left on a mob by default
    Now that the states each say one thing, and there are five of them, the colours
    earn their place on the map more than a unique hue per mob does -- that only ever
    answered "which one is this", which the tooltip does better anyway.
    Anyone who'd rather have the old look picks "Unique per-mob", and anyone who set
    that deliberately already has it stored and keeps it.
  • Macro: "skip completed mobs" only ever checked the tracking quest
    CompletionStatus returns three things and the test used it as a boolean, so it saw
    quest completion and nothing else. A mob you'd collected every drop from still took
    one of the macro's limited slots, which is the same blind spot the map pins had.
    Ask MobIsNotable instead, and only give up the slot on a definite "nothing left" --
    nil means we couldn't tell, and a wasted slot beats not being able to target the
    thing.
  • Point out the notable rewards in loot tooltips
    The rewards system has always been able to colour a reward's label when it's
    something you still want, and the shim answered no to that because there was
    nothing here deciding what "want" meant. There is now, so let it.
    Left as a plain yes rather than following the announcement filter. The notability
    options hold whatever that's set to, so tooltips going quiet because you'd asked
    to hear about every rare would take some working out.
  • Rares with appearances you haven't learned counted as having nothing on them
    transmog_notable was being carried over from the old already_transmog and starting
    off, which turned out to invert it. That option meant "count appearances when
    working out whether you already have everything", so switched off a transmog-only
    rare could never be called finished and kept announcing. transmog_notable off does
    the opposite: appearances stop being a reason to want the rare, but hasKnowableLoot
    asks with ignore_notable and still sees them, so it reads as knowably-not-wanted
    and goes quiet -- grey on the map, silent in the alerts, while its own tooltip sat
    there showing the appearance as uncollected.
    Default it on, like the HandyNotes plugins do, and stop migrating the old key,
    since the two don't mean the same thing in either position.
  • Overlay: a rare with nothing on it looked like one worth killing
    Colouring by completion had three states across a prefix and a suffix, and the
    prefix ones meant "there's loot here" while the suffixes meant "you've done some
    of it" -- so a mob you could still kill but had no reason to came out the same
    red as one you wanted. "Partial" also meant two unrelated things depending on
    which branch reached it.
    Ask the notability code instead, and let the states each mean one thing: a mount
    you'd want, something else you'd want, nothing you want, nothing left at all.
    That retires partial and the separate loot icons, and nine keys a theme becomes
    four.
  • Overlay: map pins ignored the alt-credit setting, and all loot
    The alt-completion flag was pulled out of CompletionStatus and then never read, so
    saying an alt's achievement counts changed the announcements but left the map
    showing those mobs as unfinished.
    "Show achieved" also only ever meant the achievement. A mob with no achievement
    and nothing left you want -- every collectible already yours -- kept a
    full-strength pin for good, which is the same blind spot the announcements had
    before they learned about notability. Ask MobIsNotable, but only when the toggle
    is off: answering means dropping the reward caches, and there's no reason to pay
    that per pin for people who show everything anyway.
  • Two niche loot options were the first thing in the General section
    "Current character only" and "Transmog exact items" are both fine-tuning, but the
    Loot group's order put it above announcements, sounds, messages, tooltips and the
    rest. Send it to the bottom, where its contents suit.
  • Announce: the Mount option was greyed out while still doing work
    "What's notable?" disabled itself whenever neither filter was set to notable, but
    the Mount option in it also picks which sightings earn the mount sound and flash,
    and that happens whatever the filters say. Anyone announcing all rares was looking
    at a greyed-out checkbox that was still deciding something for them.
    Stop disabling the group, and say where the mount alerts get their answer from, in
    each of the three places they can be turned on. The treasure filter's description
    loses its "this has never been filtered before" opening, which won't mean much once
    that stops being news.
  • Explanation of announce to chat was showing above the heading
  • Announce: let the Mount option decide what makes a mount worth noticing
    "Known mounts are boring" was a second, older answer to a question the notability
    options already ask, and its off position -- a mount you own still counts -- was
    the only thing keeping it around. Fold it in: mounts matter if you say they do,
    and then an unknown or BoE one is what marks a sighting out.
    That leaves one definition of an interesting mount for both the filter and the
    choice of sound and flash, so it moves next to the rest of the notability code
    rather than living on the Announce module and being fetched back out of it.
  • Announce: ask whether a rare can still drop before asking if you want it
    Notability was letting the quest answer the whole question: an incomplete one
    announced the rare without ever looking at its loot, and a vignette skipped the
    check altogether. Between them that covered nearly every modern rare, so the
    notable options had almost nothing left to decide.
    They're really two questions in a row. Whether the mob can still give you anything
    is a gate -- a finished quest fails it, a vignette passes it, since the game only
    puts one up while something remains -- and only what's left after that gets weighed
    against the notable options.
  • Announce: fold the treasure on/off switch into its filter
    The Treasures checkbox and the new treasure filter were two settings answering the
    same question, so the checkbox becomes the "None" end of the filter instead. Rares
    get a "None" of their own for consistency, which they never really had: turning
    them off meant going through the message, sound, flash and controller options one
    at a time.
  • Announce: drop the middle filter option and notice more rares by default
    Keeping the old completion logic as a third choice meant asking people to pick
    between two settings whose practical difference was almost impossible to describe.
    They only really parted ways on rares with no quest and no achievement, where the
    old logic never looked at loot at all and so announced them forever; everything
    with a quest, and everything first seen through a vignette, was already treated
    the same by both.
    That isn't a preference, so it shouldn't be a setting. Filtering on what's notable
    is the default now, and "All of them" is there for anyone who wants none of it.
  • Actions: use the luacheck action instead of installing it from luarocks
    The lint job ran apt-get install with no apt-get update ahead of it, which
    fails whenever the runner image package index is stale.
    lunarmodules/luacheck@v1 replaces those three steps and runs the same
    luacheck . --no-color -q. Updates the changelog action to v2, which fixes
    generating a changelog when the file holds only one version section.
    Updates the checkout action from v2 to v7, which was still running a node
    version GitHub is retiring; nothing in that range affects a push-triggered
    workflow. Pins the packager to v2 rather than master, so an upstream change
    can no longer land in a release without warning; v2 is the maintained major
    tag, so fixes within the v2 line still arrive.
  • The transmog appearance option reset itself on every login
    The lootappearances migration never cleared the key it read, so it re-derived
    transmog_specific from it every time the addon loaded, and changing that option
    never survived a reload. Clear the old key, and run the migration on profile
    change, copy and reset as well, so an old profile switched to later gets
    converted too.
  • Announce: switching profile left the old announce options unmigrated
    The already* options only moved onto the new filter during OnInitialize, so a
    profile you switched to later kept them and quietly fell back to the default
    filter instead. Run the migration on profile change, copy and reset too, the way
    the other modules already handle profile switches.
  • Announce: filter rares and treasures by whether they're notable
    Deciding whether to announce a rare meant reading five booleans that interacted in
    ways nobody could predict, and treasures were never filtered at all. The
    HandyNotes plugins already answer a tidier version of the same question, so ask it
    here too: one option picks how much to filter, and the *_notable options say what
    counts.
    The old logic stays as the "lootable" filter and is still the default, so nothing
    changes until you choose otherwise. Existing settings migrate onto the new
    options, and anyone who had turned off "Got the loot" moves to the notable filter,
    which is what they were asking for.
    Unlike the plugins this has to answer "nothing knowable" separately from "nothing
    wanted", and only the latter silences a rare. Plenty of mobs have no loot, quest
    or achievement to go on, and item data is often still loading the moment a rare is
    spotted.
  • Warfront rares needed a quest shape nothing else understood
    The Arathi Highlands and Darkshore rares track their kill with a different quest
    for each faction, which the data wrote as quest=. Only two
    places could read it, and one of those was a private copy of the shared quest
    tests kept only for this. Pick the quest in the data file instead, so the shared
    tests work on it as they are.
  • Systems update: share the notability tests with the handler
    The handler kept the tests that decide whether a reward is still worth showing in
    its config.lua, so they were the one part of that system SilverDragon could not
    use. It has carried the reward half for a while now without ever asking the
    question.
    Nothing composes them here yet.
  • Systems update: a secret creature name threw instead of being skipped
    Regression from 858e0bd475fb45a49b648278bb6ae7000e5e1160 which reordered
    the check for UNKNOWNOBJECT and wound up with it before the secretvalue
    test.
    Fixes #359
  • Systems update: leave conditions with nothing to say out of explanations
    A condition can now be marked SILENT, for the ones that can't usefully
    explain themselves, and summarize returns nothing at all when everything it
    was given is silent. Callers drop the line rather than print an empty one.
  • Systems update: conditions for map pois, map art, indoors and faction
    These cover checks the HandyNotes handler currently does by hand, ahead of
    folding those keys into its requires. Nothing here uses them yet.
  • Systems update: cache condition checks, and hold buffs through combat
    Conditions gain Test(), which memoises a check against an identity key for
    the rest of the frame, so points sharing a world quest or a vignette ask the
    game once between them rather than once each.
    Aura lookups read as secret for the whole of combat, and AuraActive answered
    "no buff" to that, so anything gated on a zone-wide buff hid itself the
    moment you pulled. It now keeps answering with the last value it could
    actually read. Calendar conditions do the same through chat lockdown.
  • Systems update: nestable conditions, and share upgradeloot
    Conditions gain All and Any, which wrap a group up as a condition so
    groups can nest.
    upgradeloot moves to systems/rewards and is now the same file as the
    handler's. Ours had drifted: no expansion support, and a requires=
    group on loot was flattened into an and, so satisfying one alternative
    wasn't enough. Keeps our class and covenant fields for the loot popup
    icons, which the handler's copy didn't have.
  • Systems update: share the token formatting with the handler
    RenderString was a hand-maintained mirror of the handler's render_replacer
    and had drifted: no secret guard on the replacement, no //,
    and non-numeric ids became nil before the branches were reached. The
    implementation now lives in systems/formatting.lua and gets copied across
    like the other systems files, with RenderString, RenderStringList and
    CacheString reduced to entry points.
    mob_name keeps the parts that need our database -- the mobdb fallback and
    the name-to-id index -- over the shared lookup.
  • Systems update: unknowable appearances, NotMajorFaction, tooltip tidying
    The one that matters is HasAppearance, which cached "the API has no
    appearance for this item" as false and then handed that false back on every
    later call. An item that should read as unknowable started reading as
    known-and-not-collected instead, which is the same vibe as 3841235: it
    stops being hidden from the only-knowable loot lists and tooltips.
  • Custom mob list rebuilt itself on every change
    CustomChanged looked for the zone group under custom.args rather than
    custom.args.zones.args, so it never found one and always fell through to
    a full BuildCustomList.
    Side benefit: the unchecked toggle left behind by removing a mob now
    sticks around reliably, instead of being purged the next time a rebuild
    happened to run. It's there so you can re-add a mob you removed by
    mistake.
  • History: clearing the window left the broker list alone
    self.rares was accumulated in parallel with self.data and never consulted
    self.removed, so neither Clear All nor dismissing a single line took
    anything out of the broker's "seen this session" list. It held the same
    tables as self.data anyway, so derive it instead of keeping both.
  • Quest-gated rewards were hidden from only-knowable loot lists
    The rewards system reads a handful of *_notable keys that SilverDragon
    has no config for, so they came back nil. That matters for quest_notable:
    without it Reward:Obtained() returns nil rather than false for a quest
    reward you haven't earned, and nil reads as "unknowable" downstream, so
    those rewards vanished from tooltips and loot windows with regular loot
    turned off.
    Give the shim fallbacks for the keys we don't configure. The rest only
    feed Notable(), which is gated on show_npcs_emphasizeNotable and so does
    nothing today; that one stays off.
  • Achievement criteria could be half-loaded and then never revisited
    achievements_loaded was set inside the innermost criteria loop, so it
    meant "we read at least one criterion off at least one achievement"
    rather than "we finished a pass". If the client wasn't handing over
    achievement data yet, whichever achievements happened to come back empty
    were skipped, and the flag then stopped LoadAllAchievementMobs from ever
    looking again -- so those mobs had no achievement status for the rest of
    the session, varying run to run with pairs() order.
    Set the flag after the full pass instead, and record each achievement in
    achievements_scanned only once it has actually yielded criteria, so
    anything that wasn't ready is left for later. RECEIVED_ACHIEVEMENT_LIST
    clears the flag to trigger that later pass.
    Deliberately not "only set the flag once every achievement has criteria":
    the table carries achievements that legitimately don't exist on older
    clients, so that would rescan forever. AchievementMobStatus is called
    per-mob while drawing tooltips and overlay pins, which makes an
    event-driven retry a lot safer than a polled one -- and the
    achievements_scanned check keeps the retry to a table walk plus one cheap
    call per achievement still missing.
  • Overlay: in Classic minimap zoom cache went stale, or was never filled
    Retail has C_Minimap.GetViewRadius and so is unaffected.
    MINIMAP_UPDATE_ZOOM and CVAR_UPDATE called RefreshAllData directly,
    skipping UpdateMinimapIcons -- the only thing that caches indoors/zoom
    for GetMinimapViewDiameter.
  • Loot detail tooltips could lose the treasure/shared flags
    Preventative. Only caller was in outputs/ldb.lua and didn't pass any of
    the varargs.
  • ClickTarget: do not push an unshowable popup onto the stack
    ShowFrame could return nil, so check that. If it did fail it'd make the
    length check and ipairs iteration disagree.
  • Vignettes: cope with vignettes that have no id or atlas
    Keep firing the maybe-nil raw vignetteID because event consumers expect
    it.
  • Announcement flash would only check mounts for mobs
  • Announcement flash would be stuck with loot/not-loot settings from first flash
    Follow-up to af8c4fe572a4c03b7379b44089b340fd31b85398
  • History: fix disabling, clearing, and vignette positions
    • OnDisable unregistered against self, but the callbacks are
      registered against the "History" string, so disabling never actually
      stopped them -- the window would pop back open the next time a rare
      was seen. ShardChanged wasn't being unregistered at all.
    • The Seen callback stopped one argument short and dropped the
      vignetteGUID, and GetPositionFromData checked a mistyped data.GUID,
      so vignette and point-of-interest entries never refreshed their
      position from the live vignette. Pass it through and store it the way
      ClickTarget does, and use it for the tooltip's Vignette ID line
      too. (This only became available recently with 381981fd4.)
    • "Clear all" in the context menu only flushed the data provider without
      marking entries removed, so any later refresh (including a shard
      change) brought them all back. Both clear paths now share one method.