Quiver

Hunter sphere UI for TBC Classic. Instant access to aspects, pet, traps, tracking, and food from a single draggable orb. Smart right-click calls or revives your pet in any situation, even mid-combat.

File Details

v0.2.0-bcc

  • R
  • May 26, 2026
  • 126.50 KB
  • 2
  • 2.5.4
  • Classic TBC

File Name

Quiver-v0.2.0-bcc.zip

Supported Versions

  • 2.5.4

Quiver

v0.2.0 (2026-05-26)

Full Changelog Previous Releases

  • Version 0.2.0: macro bindings, config overhaul, feed pet fixes
    Sphere click bindings now support full macros — type any multi-line
    macro body into the settings panel, no macro slots used. Supports all
    standard macro features: conditionals, focus targets, cancel-aura, etc.
    Settings panel rebuilt with native scrollable spell lists (mouse wheel
    supported) showing every known spell dynamically. No more missing spells
    from a fixed whitelist.
    Sphere plays a ripple animation on every click.
    Fixed food picker icons disappearing on click (PushedTexture was not
    updated to match the food icon). Fixed picker buttons getting stuck in
    a pressed visual state after selection. Fixed backdrop API error on
    Anniversary client.
  • Pet food: pet-buff items first, disable food button when no pet active
    • Add petBuffIDs to PetFoods.lua (Kibler's Bits 33874, Sporeling Snack
      27656); these items bypass diet filtering and always appear first in
      the food picker regardless of pet type.
    • GetSuitableFood sorts pet-buff items before regular food (numeric
      priority sort avoids Lua boolean-return edge cases).
    • Food orbit button dims to 40% and blocks picker when no pet is active.
    • Pet:UpdateState() drives food button state so it reacts immediately
      on Call/Dismiss Pet without UNIT_PET timing race.
    • Fix RebuildFoodPicker count-disappearing bug: "not in top-5" restore
      branch no longer clears the count set by RefreshFoodPicker's bag scan.
    • Store foodID and foodIsBuff alongside food name in menuSelections for
      reliable icon restoration and correct macro (direct /use vs Feed Pet).
    • BAG_UPDATE → BAG_UPDATE_DELAYED so count updates after slots settle.
  • Update README: add food/feed pet button, five orbit buttons
  • Pet food system: itemID database, select/right-click feed, live count badge
    • Add Data/PetFoods.lua: hardcoded itemID→diet lookup (Meat/Fish/Bread/
      Cheese/Fruit/Fungus) covering Vanilla+TBC era items, sourced from
      FeedOMatic with attribution. Excludes item 6889 (Small Egg — bird egg,
      rejected by pets in TBC Classic).
    • Rewrite GetSuitableFood to use PetFoods:IsPetFood() instead of the
      unreliable itemSubType heuristic (GetItemInfo returns "Food & Drink"
      for all food, never the diet category name).
    • Food orbit button: select food via left-click in picker, right-click
      orbit button quick-feeds. Count badge shows stack count of selected food.
    • Count badge updates via BAG_UPDATE_DELAYED (fires after all bag slots
      settle) using a direct bag scan instead of the top-5 list, so feeding
      decrements correctly and looting/buying increments correctly.
    • Food picker expands rightward from food button (was leftward, caused
      overlap with traps button at same y-level).
    • Remove all debug prints from Pet.lua and Menus.lua.
  • Fix food buttons intercepting clicks when hidden: EnableMouse(false) at alpha 0
  • Add verbose bag scan debug to diagnose food filter mismatch
  • Move food orbit button to 330deg (mirror of traps at 210deg)
  • Fix debug prints: use print() not Quiver:Print()
  • Move food picker to top-level orbit button (300deg), add debug prints
  • Fix bag scan: use C_Container API for TBC Classic Anniversary client
  • Feed Pet: bag-scanning food picker with diet filter, count badges, top 5 by item level
  • Disable OmniCC/cooldown addons on trap menu cooldown frames
  • Cooldown text: hardcode FRIZQT__ 12pt instead of NumberFontNormal face
  • Fix cooldown font: use (fn()) to truncate multi-return, both buttons now 11pt
  • Cooldown display: desaturate icon, fix text alignment, bump trigger font to 11pt
  • Fix cooldown text: restore OUTLINE flag, use select() to avoid multi-return drop
  • Consistent 10pt font for cooldown countdown text on all buttons
  • Persist quick-cast selections across reloads
  • Fix GitHub releases permission for packager
  • Exclude .mcp.json and .claude from release package
  • Add CurseForge release pipeline
    BigWigs packager action triggers on version tags, uploads to CurseForge
    and creates a GitHub release. .pkgmeta excludes dev files from the package.
  • Trap cooldown on trigger button, fix decimal overflow, add README
    • Mirror trap cooldown (dim + countdown) onto the orbit trigger button
    • Run cd ticker always, not just when trap menu is open
    • Use NumberFontNormalSmall so "9.3" fits in the 26px button
    • Add README
  • Fix trap cooldown display: remove invalid TBC API calls, add dark icon tint
    SetDrawEdge/SetSwipeColor may not exist in TBC Classic and were silently
    breaking the Cooldown frame. Removed them; the bare Cooldown frame should
    now render its sweep. Added a dark texture overlay over each trap icon so
    the on-cooldown state is clearly visible regardless of sweep support.
  • Trap cooldown sweep + live countdown text on menu icons
    • Remove non-existent CooldownFrameTemplate; use plain Cooldown frame type
    • Add FontString overlay showing remaining seconds (one decimal < 10s)
    • Refresh cooldown display when the trap menu is opened
    • 0.1s OnUpdate ticker keeps the countdown live while the menu is visible
  • Fix: move UpdateTriggerReadiness before PopulateMenu so local is in scope
    Lua resolves local names at compile time; declaring the function after
    its call site caused the 'attempt to call global' error on load.
  • Trap cooldowns, clarify click behavior, fix immediate-cast on aspects/tracking
    Menu item buttons use type2 (right-click cast only); left-click selects
    for quick-cast without immediately firing the spell. This fixes aspects
    and tracking casting on left-click unintentionally.
    Trap menu buttons get a Cooldown frame overlay driven by SPELL_UPDATE_COOLDOWN.
    Menu item tooltips now show "Left-click: select / Right-click: cast now".
  • Add quick-cast readiness indicator on trigger buttons
    Trigger buttons dim to 60% alpha and show "no quick-cast set" in the
    tooltip when no selection has been made. Full alpha and the selected
    spell name appear in the tooltip once a left-click selection is stored.
  • Defer SetAttribute for quick-cast selection to next OnUpdate frame
    Calling SetAttribute on a secure trigger button from PostClick immediately
    after a secure spell cast fires can be silently blocked in TBC Classic.
    Writing to pendingSelectionMenu and applying it in the next OnUpdate frame
    sidesteps this restriction.
  • Restore right-click menu behavior: cast without closing or changing selection
    Left-click: casts spell, selects it for quick-cast, closes menu.
    Right-click: casts spell only, menu stays open, selection unchanged.
    Both clicks use type/type2 so casting works in combat lockdown.
  • Fix menu buttons: set type2/macrotext2 so right-click also casts
    Bare 'type' is left-click only; right-click needs explicit type2.
    Both left and right click on menu items now cast and select.
  • Fix menu buttons casting in combat: use type/macrotext (any-click) not type2
    Clicking a menu button now casts the spell on any button press and also
    selects it for quick-cast via the trigger button's right-click.
  • Implement quick-cast selection for all menus (issue #17)
    Left-click a menu button to select it as the active choice for that
    section — trigger button icon updates to match. Right-click the trigger
    button to cast the selection instantly without opening the menu.
    Right-click a menu button to cast it directly. Selection is validated
    on rebuild (clears if spell becomes unknown). Trigger buttons are now
    SecureActionButtonTemplate so right-click cast works in combat.
  • Fix mana API: UnitPower/UnitPowerMax(unit, 0) and UNIT_POWER_UPDATE event
  • Add low mana blue pulse and change no-aspect pulse to maroon (issues #10, #19)
    New Mana module tracks player mana via UNIT_MANA + 2s poll. Sphere now
    pulses maroon when no aspect is active, blue when mana < 30% and not on
    Viper. Blue takes priority over maroon. Stops pulsing once conditions clear.
  • Revert sphere texture and vertex colors to original
  • Darker sphere: deep orb texture + stronger aspect colour overlay
  • Replace sphere texture with 3D-shaded orb (specular, rim, engraved rings)
  • Remove /quiverdebug diagnostic command
  • Poll aspect state every second to catch removal missed by UNIT_AURA
    In TBC Classic Anniversary, UNIT_AURA does not reliably fire when an
    aspect is cancelled. A 1s OnUpdate ticker ensures the sphere responds
    within a second regardless of which events fire.
  • Revert aspect detection to UnitBuff — aspects are buffs in TBC Anniversary
    Debug confirmed GetShapeshiftForm()=0 and GetNumShapeshiftForms()=0.
    UnitBuff correctly returns 'Aspect of the Hawk'. Shapeshift approach
    was wrong for this server version.
  • Add /quiverdebug command for aspect detection diagnostics
  • Fix aspect detection: use shapeshift form API instead of UnitBuff
    In TBC Classic, aspects are shapeshift forms, not aura buffs.
    UnitBuff never returned aspect names so Aspects.current was always nil,
    causing the pulse to run continuously. Switch to GetShapeshiftForm() +
    GetShapeshiftFormInfo() and UPDATE_SHAPESHIFT_FORM event.
  • Fix menus blocked during combat lockdown
    Show()/Hide() on SecureActionButtonTemplate frames is protected and
    fails during combat. Pre-position all menu buttons in PopulateMenu
    (which only runs outside combat) and use SetAlpha() in Toggle/HideAll
    instead — alpha is not a protected operation and works in combat.
  • Fix aspect pulse: use dedicated frame for OnUpdate, increase pulse intensity
    SecureActionButtonTemplate can block OnUpdate in TBC Classic. A plain
    Frame is used instead. Pulse is now white at 0-0.7 alpha for a clearly
    visible glow effect.
  • Add aspect reminder pulse when no aspect is active (issue #19)
    Sphere overlay pulses silver/white at a ~2-second cycle via OnUpdate +
    math.sin when Aspects.current is nil. Stops immediately and shows the
    aspect tint color once an aspect is detected.
  • Fall back to entry icon for trigger button when GetSpellInfo returns no icon
  • Trim sphere spell list to relevant utility/offensive spells, sorted alphabetically
  • Show UIErrorsFrame hint when sphere clicked with no spell configured
  • Block middle and right clicks from catching left-click spell via type3/type2 no-ops
  • Move sphere drag to middle mouse button
  • Simplify drag: OnMouseDown StartMoving + ResetCursor, drop OnUpdate
  • Fix drag: deferred StartMoving via OnUpdate threshold, drop RegisterForDrag
  • Use OnDragStart+Alt check for drag so cursor only changes when actually dragging
  • Add Alt+Left-click drag hint to sphere tooltip
  • Change sphere drag to Alt+LeftClick; suppress secure cast when Alt held
  • Fix sphere click: CVar RegisterForClicks, MiddleButton drag, bare type attributes
  • Fix UpdateOnClick called before self.frame assigned in Initialize
  • Fix sphere click attributes: use *type1/*type2 wildcard prefix for SecureActionButtonTemplate
  • Migrate leftClick/rightClick saved variables from old table schema to string
  • Simplify sphere click config: spell dropdowns, fix window sizing
    Replace free-text + type-dropdown with a single spell dropdown per
    binding, populated from the player's known spells. Leftclick/rightclick
    DB schema simplified to a plain spell name string. Config window sized
    to fit its contents.
  • Add configurable sphere click actions with settings panel
    Left-click and right-click on the sphere can now be bound to any spell or
    macro text via a config panel opened with Alt+Right-click. Sphere converted
    to SecureActionButtonTemplate so click actions cast in combat without taint.
    Hover tooltip shows the configured bindings and the settings shortcut.
  • Add Beast Training to pet menu (#15)
  • Fix spell button casting via SecureActionButtonTemplate
    Rewrote menu button system to use SecureActionButtonTemplate with
    macro-based casting (/cast SpellName). Key fixes:
    • Scan spellbook to build a known-spells cache (GetSpellInfo searches
      the full DB in TBC, not just the player's book)
    • Alias "Call Pet" → actual "Call <PetName>" entry from spellbook
    • Use DIALOG strata so buttons aren't blocked by ElvUI frames
    • Match ActionButtonUseKeyDown CVar for RegisterForClicks so clicks
      fire at the right time (was always registering LeftButtonUp, breaking
      keydown-mode users)
    • Buttons are children of UIParent for secure frame ancestry
    • Guard RebuildAll with InCombatLockdown; rebuild on PLAYER_REGEN_ENABLED
  • Fix aspect detection/cast and API correctness issues
    • Aspects are regular buffs in TBC Anniversary, not shapeshift forms;
      replace GetShapeshiftFormInfo loop with UnitBuff index iteration
    • Switch aspect detection event from UPDATE_SHAPESHIFT_FORM to UNIT_AURA
    • Aspects:Cast reverted to CastSpellByName (CastShapeshiftForm returned 0 forms)
    • Menu action buttons now rebuild on PLAYER_ENTERING_WORLD so spell icons
      populate correctly after the spell book is available
    • Remove bogus SavedVariablesPerCharacter QuiverCharDB from toc;
      AceDB-3.0 stores char scope inside QuiverDB
    • Strip debug prints, remove unused spellID fields from ASPECTS table
  • Visual overhaul: sphere texture, spell icons, lock placeholder, pet ring
    • Replace minimap background with custom sphere.tga (128x128 with specular shading)
    • Replace ammo dot indicator with ring.tga border around sphere for pet happiness
    • Trigger buttons now show spell icon via GetSpellInfo; fallback to empty slot
    • Lock icon (lock.tga) shown on trigger buttons when no spells are learned yet
    • Tooltip on locked buttons: "No spells learned yet"
    • Remove stings radial menu (sting is rotation, not a QoL menu)
    • Pet menu entries now use spell names for IsSpellKnown filtering
    • Menu buttons fetch spell icons from GetSpellInfo in PopulateMenu
    • Trigger button spacing: radius = SPHERE_SIZE/2 + BTN_SIZE/2 + 6
  • Get addon loading and functional in-game
    • Fix .toc load order: Quiver.lua must precede all other files
    • Remove AceDB-3.0 from NewAddon mixin (not embeddable)
    • Merge charDB into single AceDB using char scope
    • Fix menu anchoring: each menu now anchors to its trigger button
    • Left-side menus (Traps, Tracking) expand leftward
    • Filter menu buttons to known spells via GetSpellInfo
    • Rebuild menus on SPELLS_CHANGED for leveling compatibility
    • Fix Tracking.lua charDB ref -> db.char
    • Replace missing Media textures with built-in WoW textures
    • Copy Ace3 libs from existing installed addons
  • Add wow-api-mcp project config and update CLAUDE.md
  • Initial scaffold for Quiver hunter addon
    Necrosis-style sphere UI for TBC Anniversary hunters. Skeleton
    structure for all core modules: aspects, ammo, pet, stings, traps,
    tracking. Sphere and menu UI stubs ready for full implementation.