v2026.22-45-g423c20e
Details
-
FilenameSilverDragon-v2026.22-45-g423c20e.zip
-
Uploaded by
-
UploadedAug 2, 2026
-
Size550.22 KB
-
Downloads176
-
MD562025c1540194c67f4dff5cf47a9b501
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 mistypeddata.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.
- OnDisable unregistered against