Skip to content

Releases: Softrix/SmartBuff-Retail

39.130226a

01 Mar 02:41
5d2949b

Choose a tag to compare

SmartBuff Retail

39.130226a (2026-03-01)

Full Changelog Previous Releases

  • Fix in-combat falst positive due to a race condition (#86)

39.130226

13 Feb 19:17
ea9d92a

Choose a tag to compare

SmartBuff Retail

39.130226 (2026-02-13)

Full Changelog Previous Releases

  • Templates and combat removal (#85)
    • feat: Retain template option, blocklist rename, combat/PvP updates
    • Add Retain checkbox to copy buff settings when switching to fresh templates
    • Inclusivity: Rename blacklist → blocklist (with migration)
    • Default InCombat to off
    • Add PvP prep-only message for Arena/BG
    • Add play-sound tooltip.
    • bump version to r39.130226
    • updated what's new.

39.120226

13 Feb 02:55
564dc52

Choose a tag to compare

SmartBuff Retail

39.120226 (2026-02-13)

Full Changelog Previous Releases

  • feat: template switching, split templates, locale fixes, pvp prep buffing (#84)
    • feat: template switching, split templates, locale fixes
      Template switching:
    • Add Battleground/Arena template switching for pvp/arena instance types
    • Add Solo fallback for unknown instance types
    • Refactor template selection into single if/elseif chain
    • Merge chat message: "Switch template (reason) current -> new"
      Template structure:
    • Split into GENERICS, INSTANCES, CUSTOM in all locales
    • Assemble SMARTBUFF_TEMPLATES at load (SmartBuff.lua)
    • Replace SMARTBUFF_INSTANCES with enum lookup on assembled templates
    • Refactor Enum.SmartBuffGroup to 9-entry loop from generic keys
      Localization:
    • de: fix Danish strings → German (generics + instances)
    • zhCN: fix Nerub-ar Palace (奈幽贝扎宫 → 奈幽贝尔宫殿)
    • Clarify INSTANCES comment: must match GetInstanceInfo()
      Other:
    • Remove trailing/blank-line whitespace
    • Update .cursorrules whitespace rules
    • feat(ui): bottom bar layout, News button, R: labels, tooltips. New release
    • Add News button: opens changelog panel, toggle to close
    • Add "R:" prefix to reset buttons: R: Timers, R: All, R: Buffs, R: List
    • Shrink RBT button (88→64px), add gaps between bottom buttons
    • Add tooltips to all bottom buttons (RBT, All, Buffs, List, News, Done)
    • Simplify help plate: "Reset buttons (hover for details)", remove per-button text
    • Localize all new strings (en, de, fr, es, ru, tw, cn)
    • properly reset each time and template switching fix, no longer default to same buff settings in each template due to bug. Leaving a note for later if the 'default' propagation is somehow useful.
    • Lockdown in pvp, but buff in prep.

38.110226a

11 Feb 18:30
6afa616

Choose a tag to compare

SmartBuff Retail

38.110226a (2026-02-11)

Full Changelog Previous Releases

  • THIS IS A WRAP-UP RELEASE
    • The Changelog is long because it is auto-generated based from last release, and it wasn't built here for a while
  • Combat Safety! (#83)
    keeping another protected function from combat
  • Fix chained buffs and add rogue/warrior updates (#82)

    Chained buffs

    • They work again now!

    Rogue

    • Assassination rogues can use 4 poisons with Dragon-Tempered Blades talent

    Warrior

    • Add Berserker Stance
  • Async buff init & midnight combat fixes (#81)
    • Implement comprehensive buff caching system with event-driven updates

    Caching Infrastructure

    • Add persistent caching for items/spells in SmartBuffItemSpellCache
    • Add per-character valid spells cache (SmartBuffValidSpells)
    • Add cache synchronization with expected data tracking
    • Add cache invalidation on version mismatch

    Event-Driven Updates

    • Handle ITEM_DATA_LOAD_RESULT and SPELL_DATA_LOAD_RESULT events
    • Update static buff tables when data loads asynchronously
    • Accept partial data following AllTheThings pattern

    Toy Management

    • Cache all toys in S.Toybox for faster initialization
    • Fix toy matching to handle placeholder itemLinks
    • Update toy cache when itemLinks become available

    Spell Validation

    • Filter invalid/uncastable spells using spellbook checks
    • Track valid spells per character in SavedVariables
    • Add isSpellbookSpell parameter to differentiate class vs item spells

    Debug Tools

    • Add /sb cache command for cache statistics
    • Add SMARTBUFF_PrintCacheStats() helper function
    • Perf/memory: O(1) DATA_LOAD_RESULT lookups, ToyboxByID, throttle OnUpdate, compact toy cache, rebuild only on cache update
    • Add itemIDToVarName/spellIDToVarName for O(1) var lookup in DATA_LOAD_RESULT handlers
    • Add ToyboxByID index for O(1) toy lookup in FindItem; optimize LoadToys cache restore
    • Throttle OnUpdate 0.2s->0.5s; guard debug path when Debug off
    • Store toy cache as [toyID]=icon; support legacy load
    • Schedule full buff rebuild only when DATA_LOAD_RESULT actually updated cache
    • Extract cache helpers to SmartBuff.cache.lua

    Cache refactor

    • Add SmartBuff.cache.lua with load/save/sync/invalidate and PrintCacheStats helpers
    • Remove cache function definitions from SmartBuff.lua (call into cache.lua)
    • Update SmartBuff.toc: add SmartBuff.cache.lua after globals, document load order

    Buffs.lua readability

    • Add section headers (Globals and constants, Helper functions, Init: item list, Init: spell IDs, Init: per-class buff list)
    • Add one-line comments above each helper (GetItems, getSpellBookItemByName, ValidateSpellData/ValidateItemData, GetSpellInfoIfNeeded, GetSpellInfoDirectIfNeeded, GetItemInfoIfNeeded, InsertItem, AddItem, SMARTBUFF_LoadToys)
    • Adding summon water elemental for mage.
    • nit
    • harded incombat group buff checking to only react when values are non-secret (out of combat)
    • Defensive handling for combat secret values and API types
      Guard aura name in UnitBuffByBuffName and UnitAuraBySpellName (nil/secret for other units).
      Guard spell/item cooldown: check cooldown table and use tonumber(cds/cd) or 0 in SMARTBUFF_BuffUnit and SMARTBUFF_doCast.
      Normalize returned duration/expirationTime and all timeleft - GetTime() uses with tonumber(...) or 0.
      Guard debuff icon in SMARTBUFF_IsDebuffTexture before string.find.
    • few more passes of defences
    • some more hardening and workarounds for edge cases.
    • Fixing reset all
    • let's not do global on reset
    • preparing for release
    • nit
    • fixing couple of edge cases with data reset and
    • don't rebind keys in combat.
    • oops forgot to update the reminder
    • Fix buff food display
      Move cache resets into dedicated helper functions
      Some additional housekeeping
    • adding type and safe validation checks for all the saved variables so that if they're not... 'right' they will get fixed up before proceeding.
    • updating changelog
    • prismatic barrier for mages
    • further optimizations:
      slow down set buffs pending to once every half second
      Lets just not react to toys_updated event in case we're causing it. This may fix edgecase performane issue
    • buff state init is consistent (enabled/disabled)
    • attempt number 2 at keep buff state after relogin, now with more changes
    • alrighty, finally looks like buffinit is fixed
    • fixing occasional nil error n find aura by name.
    • release prep
    • Fixing or at least clarifying in combat notifications and buff logic
      proper conjure refreshment spell for retail
    • Fix weapon buffs not filtering out when they don't exist.
    • nil edge case.
    • Add cruft removal to saved buffs to avoid ambiguity and hopefully fix 'enabled disabled' inconsistency forever.
    • Display items as items
      Don't over-stress cleanup
    • Use canonical item:ID keys, dedupe potions/flasks, show names in UI, refresh options on data load
    • Store item:ID in cBuffs/Order; normalize and dedupe on init
    • Resolve item:ID to display name in splash, chat, options; redraw options list after SetBuffs when open
    • Init: BuildItemTables then InitSpellList; SavedVariables guards; delayed retry for flasks/toys
    • maybe finally no dupes?!
    • adding guard for initial loop state to keep on trying till it's healthy.
    • release prep
    • Updating Shaman Buffs that changed in 12.0
    • Internal version bump
    • init even when version upgrade
    • moving newer toys up the list to maybe init them faster. Honestly i should make toys... toys...
    • Adding deadly poison for rogues
    • reset toybox to default filters to be able to index toys.

v1

26 Jan 15:56
2bfd91a

Choose a tag to compare

v1

SmartBuff Retail

v1 (2026-01-26)

Full Changelog Previous Releases

  • Update README to remove deprecated macro usage
    Removed outdated instructions for using Smartbuff in macros.
  • Add GitHub Actions workflows for automated packaging and releases (#79)
    • Adding GitHub workflows and new release prep

    Workflows

    • Added release.yml for tag-based packaging with BigWigs packager
    • Added sync-externals.yml for manual library updates from CurseForge
    • Added README.md documenting workflow setup and usage

    Broker_SmartBuff

    • Updated TOC interface version to 120000 for Midnight compatibility
    • Updated version to 1.120000 in TOC manifest
    • Added clarifying comment for modern API usage

    Release

    • Bumped SmartBuff.toc version to 36.120000 in preparation for release
    • Updated changelog in localization.en.lua with r36.250126 user-facing changes
    • Updated version comment in SmartBuff.lua to reflect optional version bumps

    Packaging

    • Added documentation comments to .pkgmeta explaining external library strategy

    Development

    • Added .cursorrules with project development guidelines and git commit message format
    • Nit fixes from code review
    • allow manual trigger for release workflow from actions.
    • chore: Update external libraries from CurseForge and GitHub
      Auto-synced external libraries:
    • LibStub (CurseForge)
    • CallbackHandler-1.0 (CurseForge)
    • LibSharedMedia-3.0 (CurseForge)
    • LibDataBroker-1.1 (GitHub)
    • updating release to be able to do a manual vs release action and get a proper zip file
    • debugging manual execution.
    • nit: artifact path fix.
    • nit: more release debug
    • nit2. more manual testing
    • fix for popup of new changes. It seems to have become broken at some point or another...

    Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
  • Merge pull request #78 from ynazar1/fix-buff-order-reaarange-from-main
  • Fix: Preserve custom buff order and filter toys correctly
    • Fix buff order reset when opening/closing options window
    • Fix buff order reset when toggling "Include Toys" setting
    • Add toy filtering when "Include Toys" is disabled
    • Improve InitBuffOrder() to preserve custom order while cleaning up
      Fixes issues where user's custom buff arrangements were lost.
  • Merge pull request #77 from ynazar1/fix-data-bugs-and-add-help-overlay
  • Refactor item detection and fix ITEM type buff handling
    Unified Item Search Functions:
    • Merged SMARTBUFF_CountReagent() and SMARTBUFF_FindItem() into shared SMARTBUFF_FindItemInternal() function
    • Both functions now use identical search logic with consistent ItemLink extraction for Dragonflight item qualities
    • SMARTBUFF_CountReagent() returns total count across all bags and item ID
    • SMARTBUFF_FindItem() returns first match location, stack count, and texture
    • Eliminated ~50 lines of duplicate code while maintaining backward compatible return values
      ITEM Type Buff Initialization Fix:
    • Modified SMARTBUFF_SetBuff() to skip item count filtering for SMARTBUFF_CONST_ITEM type during setup
    • ITEM type buffs (Create Healthstone, etc.) are now kept in buff list even when count == 0
    • Item existence check moved to runtime in SMARTBUFF_BuffUnit() where it correctly triggers creation spells
    • Prevents conjured item buffs from being incorrectly removed during initialization when items don't exist yet
      ITEM Type Buff Runtime Handling:
    • Removed premature r=20 assignment in SMARTBUFF_BuffUnit() ITEM type handling block
    • Added early return when item found in inventory to prevent false "item not found" warnings
    • Added check timer reset (tLastCheck = GetTime()) in UNIT_SPELLCAST_SUCCEEDED handler for ITEM type spells
    • Prevents extra out-of-order checks immediately after casting creation spells before item appears in inventory
      Performance and Code Quality:
    • Optimized SMARTBUFF_SetBuff() to extract both minLevel and texture from single C_Item.GetItemInfo() call
    • Fixed variable shadowing by renaming local 'texture' to 'chainTexture' in ITEM type fallback logic
    • Reused buffTexture from initial GetItemInfo() call instead of making redundant second call
    • Added comprehensive inline comments documenting all local variables in SMARTBUFF_BuffUnit() function
      Item Data Loading Enhancement:
    • Enhanced GetItems() function in SmartBuff.buffs.lua with two-stage validation and loading pattern
    • Stage 1: Validate item IDs using C_Item.GetItemInfoInstant() for instant, cache-independent validation
    • Stage 2: Async load localized item links using Item:CreateFromItemID() and ContinueOnItemLoad()
    • Chains now store numeric IDs initially, updating to localized links as async callbacks complete
    • SMARTBUFF_FindItem() handles both numeric IDs and item link strings seamlessly
  • Clarifying that it's not name but itemlink that's being generated due to caching and api availability
  • Fixing init on ui reload not triggering in correct order.
  • Fix: Read definition data from cBuffs[] instead of profiles
    • Fix Bug #1: SMARTBUFF_CheckUnitBuffs() reads Type/Links from cBuffs[]
    • Fix Bug #2: SMARTBUFF_SetInCombatBuffs() copies all definition data
    • Add help overlay for reset buttons in options frame
    • Update version comment clarifying version bump requirements
      Definition changes in buffs.lua now work after /reload without profile resets.
  • Merge pull request #76 from ynazar1/midnight-fixes
  • Removed/Commented Out Spells
    Trueshot Aura (288613) — Commented out (doesn't exist in retail WoW)
    Bark of the Wild (159988) — Commented out (removed)
    Greater Blessing of Kings (203538) — Commented out (doesn't exist per Wowhead)
    Embrace of the Shale Spider (90363) — Commented out (doesn't exist per Wowhead)
    Strength of the Earth (160077) — Commented out (doesn't exist per Wowhead)
    Invigorating Roar (50256) — Commented out (doesn't exist per Wowhead)
    Qiraji Fortitude (90364) — Commented out (doesn't exist per Wowhead)
    Sturdiness (160014) — Commented out (doesn't exist per Wowhead)
    Savage Vigor (160003) — Commented out (doesn't exist per Wowhead)
    Roar of Courage (93435) — Commented out (doesn't exist per Wowhead)
    Keen Senses (160039) — Commented out (doesn't exist per Wowhead)
    Spirit Beast Blessing (128997) — Commented out (doesn't exist per Wowhead)
    Plainswalking (160073) — Commented out (doesn't exist per Wowhead)
    IMPPRISBARRIER — Removed from mage buff list (undefined)
    Restored/Added Spells
    Amplifying Poison (381664) — Restored and added to rogue buff list
    Atrophic Poison (381637) — Already restored (from previous commit)
    Chain Updates
    S.ChainWarriorStance — Removed SMARTBUFF_GLADSTANCE (commented out)
    S.ChainWarriorShout — Removed SMARTBUFF_COMMANDINGSHOUT (commented out)
    S.ChainPaladinAura — Added SMARTBUFF_CRUSADERAURA, removed SMARTBUFF_RETRIBUTIONAURA (not defined)
    S.ChainRoguePoisonsLethal — Added SMARTBUFF_AMPLIFYPOISON
    S.LinkStats — Removed undefined variables and commented out removed spells
    S.LinkSta — Removed undefined variables and commented out removed spells
    S.LinkAp — Removed entirely (only contained BATTLESHOUT, which doesn't need to link to itself)
    S.LinkMa — Removed entirely (empty after all spells commented out)
    Buff List Updates
    PWF — Removed S.LinkSta reference (chain only contains PWF itself)
    BATTLESHOUT — Removed S.LinkAp reference (chain only contained BATTLESHOUT itself)
    TRUESHOTAURA — Commented out from hunter buff list
    AMPLIFYPOISON — Added to rogue buff list
    Code Cleanup
    Normalized blank lines (removed excessive consecutive blank lines)
    Normalized line endings (CRLF)
  • Bringing back missing buffs
  • Removed vscode files.
    Oops.
  • Midnight
    Prep for Midnight, updated TOC, added new raids and translations, added flasks and corrected SpellId's etc.
  • Merge pull request #75 from ynazar1/augment-rune
  • Adding Ethereal Augment Rune in 11.2.0
  • Merge pull request #73 from ynazar1/release-updates
  • 11.2 ToC Bump
  • Merge pull request #70 from ynazar1/release-updates
  • release notes and internal version bump
  • Merge pull request #68 from speedwaystar/main
  • removed legacy Dragonflight raid templates
    cf. #48
  • Merge pull request #67 from speedwaystar/main
    • ADDED: horrific visions template
      • FIXED: incorrect itemIds for Oil of Beledar's Grace, Oil of Deep Toxins and Algari Mana Oil
      • ADDED: guns and warglaives to SMARTBUFF_WEAPON_STANDARD
      • ADDED: warglaives to SMARTBUFF_WEAPON_SHARP
  • Merge pull request #66 from speedwaystar/main
  • fix: GROUP_ROSTER_UPDATE bug workaround disabled since it was prevented Delve detection
  • Merge pull request #65 from speedwaystar/main
  • new: Delve template support
    new: Liberation of Undermine raid template
    new: Delicate Ebony Parasol toy
    new: Stylish Black Parasol toy
  • Merge pull request #64 from speedwaystar/main
  • new: support for "Hearty Well Fed" buff
    new: localized string SMARTBUFF_LOC_HEARTY = "Hearty"
    refactored: SMARTBUFF_IsPicnic(unit)
    added: SMARTBUFF_IsWellFed(unit) ...
Read more