v2.3.38
Oxed Hub
v2.3.38 (2026-08-27)
Full Changelog Previous Releases
- Release 2.3.38
- Register the new modules and ignore local reference addons
Also raises the Interface version for 12.1. - Release an animation frame even if its ticker never finishes
The frame was released only on the ticker's final tick, and the ticker was
created with exactly enough iterations to reach it. Anything that stopped
that one tick left the last sprite frame on screen for the rest of the
session: an error raised inside the callback, or the iteration budget
running out before the release branch was reached.
Rather than guess which, playback now records the time it should be done by
and a sweeper clears anything still active past it. A healthy animation is
long gone before the sweeper looks at it.
ActionHub runs its own ticker instead of the shared player and had the same
fault, so it records a deadline too. It also names the clicked slot for the
error journal. - Stop PvP kill triggers firing on raid and dungeon trash
A hidden target GUID was treated as proof of instanced PvP, but 12.0 hides
GUIDs across all instanced content, so every NPC kill passed the "victim is
a player" check. Hidden GUIDs now only count inside a battleground or
arena.
The honorable-kill fallback had a second fault: with no baseline recorded,
the first reading after achievement data loaded looked like an increase and
fired on an unrelated kill. That is the "random in raid" part.
PvP triggers also default to their own zones now instead of every zone.
Kills default to battlegrounds; the aura alerts get arenas too, since that
is where they matter. A zone ticked by hand opts the trigger out of these
defaults for good, and a zone table that was never the trigger's own no
longer swallows the tick.
Carries the slash command for the What's New window. - Add a What's New window
Shown once after an update, then not again for that version. Reopen at any
time with /oxedhub whatsnew, which lists the full history rather than only
what is new.
Seen-version and the opt-out are tracked separately because they answer
different questions, and both live in globalSettings: an update is an
account level event, so the notes should not re-announce themselves on
every character or after a profile switch.
Marking as seen happens on hide rather than on the Close button, so
dismissing with Escape or the title bar counts too. - Rework toy boxes: ID categories, hiding, and names that fit
The suggested boxes matched keywords against toy names, so they only
worked on an English client and missed any toy whose name did not happen
to contain the word. Eight shipped categories now match on toy ID and are
seeded per category, so one added in a later version still reaches an
install that already has the earlier set.
Boxes can be hidden instead of deleted. Deleting a filled box was easy to
do by accident and impossible to undo; the Hidden button only appears once
something is hidden, which is also the hint that it can be brought back.
The sidebar leaves about ninety pixels for a name, which truncated the
shipped names to "Stuff & Ca...". They are shorter now and the font steps
down for anything that still does not fit. Two category icons pointed at
paths that do not exist in the client and rendered as a blank square. - Call the aura sound API directly instead of through pcall
Registering an aura sound was blocked on every attempt, so Self Aura and
all five PvP alerts never fired. pcall puts a C boundary between the addon
and the protected function, and the blocked-action traceback pointed
straight at it.
The existence checks around the call are what keep this safe on clients
without the API; the pcall was never doing that job.
SelfAura also gives up after the first refusal instead of repeating the
call for every configured spell ID, which is what produced 86 blocked
actions per session, and names the trigger for the error journal. - Add an error journal with a Debug tab
OxedHub's own failures were only visible through BugGrabber, which reports
the file and line but not which of the user's triggers was running. A
blocked call in SelfAura read as "SelfAura.lua:353" and nothing more.
The journal records that context, collapses repeats into a counter, and
filters out other addons' errors. It chains the previous error handler
rather than replacing it, so BugGrabber and BugSack keep working unchanged.
Also carries the toy box strings used by the next commits.