v2026.22-18-ga7f5669

Details

  • Filename
    SilverDragon-v2026.22-18-ga7f5669.zip
  • Uploaded by
  • Uploaded
    Jul 27, 2026
  • Size
    537.93 KB
  • Downloads
    29
  • MD5
    96ed757d44f475389cf8a1b00c85ee8d

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-18-ga7f5669 (2026-07-27)

Full Changelog Previous Releases

  • 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.