-- benilla's own: tolerate the server's AIO blocks this client has no feature for. -- -- AIO dispatches a server block by name through `AIO_BLOCKHANDLES`, and an unregistered name is -- an `error()` (`AIO.lua:547-549`). That is the right shape — except **pfUI replaces the global -- `error` with one that prints to chat and returns** (`pfUI.lua:453-460`, which it does to feed -- `seterrorhandler`). A non-raising `error` turns AIO's clean abort into a fall-through: the -- next line calls the handler it just failed to find, so the player sees two errors, the real -- one being `attempt to call local 'handledata' (a nil value)` at `AIO.lua:558`. -- -- That is pfUI's bug and it would bite the reference client the same way; what changed here is -- only that benilla now loads AIO at all (for the calendar). So the blocks this client does not -- implement are registered as no-ops, which is what "no handler" was always supposed to mean. -- -- `IGNORED` is empty, and the shape around it is what matters. `AIO.RegisterEvent` *asserts* when -- a name is already taken (`AIO.lua:736`) and AIO has no way to unregister, so a name claimed -- here is claimed against every later registration — including the realm's own, if a client -- update implements the block we were standing in for. That is not hypothetical: this file used to -- claim `OctoRadio` on the evidence that `OctoRadioPlaceholder.lua` carried no AIO call at all, -- and the 2026-10-23 update built the radio out into a file twice the size whose -- `RegisterNowPlayingFeed` registers exactly that name at `VARIABLES_LOADED` — ten tests' worth of -- raise, from a row that had simply gone stale. -- -- Hence both halves below. The claim waits for `PLAYER_LOGIN`, after the `VARIABLES_LOADED` where -- FrameXML and addons register and before any block can arrive, and each name goes through -- `pcall`, so a realm that implements one of these takes the name and this file steps aside -- instead of raising. `reference_ui`'s tests fail a row the realm has implemented, so the next one -- is caught in the gate rather than in a session. local IGNORED = {} if AIO and AIO.RegisterEvent and not AIO_SERVER then local claim = CreateFrame("Frame", "BenillaAioShimFrame") claim:RegisterEvent("PLAYER_LOGIN") claim:SetScript("OnEvent", function() for _, name in ipairs(IGNORED) do -- Discarded on purpose: a failure means the name is taken, which is the good case. pcall(AIO.RegisterEvent, name, function() -- Nothing: the block is for a feature this client does not implement. end) end end) end