Bring every embedded Ace3 / CallbackHandler / LibStub copy in line with the
canonical Exiles/coa-ace3 bundle so LibStub resolution is predictable across
all Exiles forks regardless of which addons are enabled.
Libraries updated in this fork:
AceAddon-3.0 13 (5 → 13)
AceBucket-3.0 4
AceConsole-3.0 7
AceEvent-3.0 4 (3 → 4)
AceLocale-3.0 6 (2 → 6)
AceTimer-3.0 17 (5 → 17)
CallbackHandler-1.0 8 (5 → 8)
LibStub 2
Post-sort holes were caused by the planning phase, not the execution
phase. When GetContainerItemInfo/Link transiently returns nil for an
occupied slot during server lag, CreateBagFromID marks it <EMPTY>, the
sort algorithm moves real items into that "destination", and we end up
with literal gaps where the misclassified items used to be.
Validate the read against GetContainerNumFreeSlots before sorting; if
counts disagree, print a chat warning and abort instead of corrupting
the layout. User retries after a moment.
DoContainerMoves dropped moves entirely when PickupContainerItem didn't
land on the cursor — on a laggy server this fires constantly because
the previous swap's client state hasn't propagated yet, leaving items
un-sorted. Retry up to MAX_PICKUP_RETRIES (8 * 150ms = 1.2s) before
giving up. Also bump CONTAINER_SWAP_DELAY 50ms -> 150ms; the inline
comment already pointed at this as the knob to raise on desyncs.
Previous grace-window fix only kicked in when self.hasItem was already
set, so first-render-under-lag (login/reloadui while bag data is in
flight) still drew empty. Arm a single re-verify on any nil read so a
late-arriving item gets redrawn; the verifyArmed flag prevents
re-scheduling on genuinely empty slots — it only clears when we see a
valid link.
GetContainerItemInfo returns nil for some occupied slots during server
lag, causing Bagnon to draw the slot empty. Earlier retry-polling
approach caused massive lag because every legitimately emptied slot
also matched the "previously had item, now nil" condition and ran ~30
live reads over 3s per move.
New approach: on a nil-after-occupied read, if we're within
GRACE_WINDOW (0.5s) of the last good draw, keep the prior draw and
queue ONE re-check at the deadline — no polling. A genuinely emptied
slot resolves at the deadline; a recovered slot redraws with correct
data. lastGoodTime is set only on non-nil reads, so persistent lag
eventually accepts the empty.
The event-level retry only protected the ITEM_SLOT_UPDATE broadcast, but
ItemSlot:Update() reads GetContainerItemInfo live on every call and is
invoked from many paths (OnShow → ReloadAllItemSlots, AddItemSlot,
BAG_UPDATE_TYPE, search updates). On a laggy server those live reads
flash slots empty. Add a shared retry queue at the slot-render level so
a slot with self.hasItem set will defer rather than draw nil; cap at
RENDER_RETRY_MAX so a genuinely emptied slot still resolves within ~3s.
Single-retry was still flashing slots empty on the inventory when lag
exceeded 0.25s — the retry pass would read nil and broadcast the empty.
Track a per-slot retry counter (capped at RETRY_MAX=12, ~3s) so we keep
deferring until the link comes back or we hit the ceiling. Bank was
never affected — it goes through PLAYERBANKSLOTS_CHANGED, not BAG_UPDATE.
Under server lag BAG_UPDATE can fire before item data arrives, causing
GetContainerItemInfo to return nil for a still-occupied slot and Bagnon
to broadcast ITEM_SLOT_UPDATE with no link — the slot then renders empty
until the next bag event. UpdateItem now queues a single ~0.25s retry
for the bag when a previously occupied slot reads nil; the retry pass
trusts whatever it reads, so genuine empties still resolve.
- Bagnon_Forever: silence "Unknown Bank Type" for regular guild banks; mirror
IsPersonalBank/IsRealmBank from BANK_PERMISSIONS_PAYLOAD onto GuildBankFrame
and broadcast GUILDBANK_TYPE_DETECTED so other modules pick up the bank type
- TitleFrame: show "Personal Bank" / "Realm Bank" instead of always "Guild Bank";
re-render on GUILDBANK_TYPE_DETECTED to handle event-ordering races
- LibItemSearch: full-tooltip text scan (substring across every line, cached);
bare-text search now falls back to it at 3+ chars so typing "Agility" or
"Strength" finds matching gear. Explicit prefix tt:<text> also works
- SortBtn: rewrite DoContainerMoves to use the 3-pickup swap pattern with
client-side cursor verification and an explicit 50ms inter-swap delay;
much faster than the old link-verify loop without outpacing the realm
server and desyncing after ~10 moves
* fix(db): 🐛 Fixes an issue where personal and realm bank information wouldn't get updated
Introduce the "Blizzard_GuildBankUI" addon in constructor, ensuring that the `GuildBankFrame` is loaded for bank type detection.
Hide the Blizzard Guildbank to avoid both Bagnon and Blizzard banks being shown at the same time.
This breaks the red color from the bank tabs
* refactor(db): ♻️ Use old implementation for personal and guild bank detection
* fix: 🐛 Fix issue where personal and realm bank wasn't identified on guild bank change event
* fix(db): 🐛 Fixes an issue where only current guild bank tab would be added to db
Use `QueryGuildBankTab` to preload items in guild bank tabs and identify trigger in GUILDBANKBAGSLOTS_CHANGED event to update bags when items are ready
* fix(db): 🐛 Correctly index realm and personal banks on initial load
This was made because someone was looking for and not only that but within Bagnon when changing the frame layer there's "HIGH" and "TOPLEVEL", and both of them were doing the same thing