SentinelBuffMeThen_v007.zip
What's new
Changelog
1.2.4
Fixed
- Strangers outside the group were never detected on Forever: the friendly
nameplate CVar there is
nameplateShowFriendlyPlayers, notnameplateShowFriends- the addon set a nonexistent CVar, friendly plates stayed off and zeronameplateNunit tokens ever existed (verified via/sbmt debug:nameplates: 0 unitswithshowAll=1). Both CVar names are now set, and the existing 5s ticker re-asserts them if another addon turns them back off./sbmt debugprintsfriendlyPlayers=too. - Strangers appeared in the list but could not be buffed: the secure
spell path does not resolve nameplate/focus/mouseover unit tokens on
this client. Non-group entries now always cast through the proven
target-by-name macro (
/target <full name>+ cast + targetlasttarget); the full "First Last" name can only match that exact player. Group members keep the direct unit cast. - Strangers could silently vanish for a whole session: a single failed unit API call (dead unit, combat-protected call, bad argument) blacklisted that API forever, after which the friendly check had no answer and dropped every nearby player. Probes now only blacklist after three consecutive failures - a sporadic per-unit miss no longer kills the API.
- When no friendliness check can answer at all (
UnitIsFriend,UnitReactionandUnitCanAttackall unavailable) a nameplate player is now listed anyway - a failed cast on a hostile beats an invisible friendly stranger. - An unreadable aura state is unknown, not "buffed": entries whose auras the client refuses to read (denied) now count as missing and stay in the list with a castable button - on clients that block aura reads on nameplate units this is the only way a stranger can ever appear. Their icons show the buffable border instead of the grey "unreadable" one.
UnitIsPlayerbeing refused or secret no longer drops a stranger:UnitPlayerControlledand the GUID prefix ("Player-") are fallbacks, which cannot misfire on NPCs.
1.2.3
Changed
- The window now sizes to its content instead of a fixed 230px: the buff icons form one right-aligned column on every row (same position in each, like PallyPower), names fill the rest and the frame shrinks to the widest name plus the most icons a row carries. No more dead space or shifted icons on a single row.
- When DaylightUI is installed the window borrows its font, text colors
and softened class colors through the public plugin API
(
OptionalDeps: DaylightUI), so the list looks related to the rest of the UI while keeping its own Sentinel shell. Without DaylightUI nothing changes - it is not required. - The auto-buff button moved to the right edge of the header (before the counter), so it can no longer cover the "BuffMeThen" title on a narrow window.
- Rows allow up to 6 buff icons now (was 4): if a class gains another buff the window simply grows wider - no layout change needed.
/sbmt debuglists the current candidates with their per-buff state (MISSING/ok, in/out of range), showing exactly why a player is or is not offered for a buff.
Fixed
- "Cannot anchor protected frames to regions" error at load: the buff icons anchored directly to the name font string, which secure buttons may not do. They now anchor to the row at an offset computed from the name width.
- Name width could not be measured on this client (
GetStringWidthreturns a secret value), so every row fell back to a fixed 96px and icons sat too far right. The width is now estimated from the name's character count instead. - Strangers beyond ~10yd vanished for classes whose buff names the range
API could not resolve (priest, mage): the interact-distance cross-check
used index 4 (follow range, ~5yd) instead of index 1 (~28yd inspect),
and
UnitInRangedoes not cover non-group units at all, so the final verdict was always "out of range" and "hide out-of-range" removed the row. The check now uses index 1, and a stranger with no range answer at all stays listed - a failed cast is a better signal than an invisible row. - The spell-range probe tries the spell id first, then the localized
name (modern
C_Spell.IsSpellInRangewants an id, legacyIsSpellInRangea name), with separate blacklist keys so a signature the client rejects cannot kill the working one. - Friendliness fallback was inverted: reaction 1-4 (hostile/neutral) counted as friendly, so enemy players on nameplates could end up in the list. Only reaction 5+ (friendly and better) counts now.
- The auto-buff button (the icon with the counter) sat on top of the "BuffMeThen" title; it and the paladin header icons moved to the right.
- The reagent strip no longer lands on the "no one to buff" text: an empty window keeps its own text area and the text sits at the top.
- Saved settings with the old 14-row default made the list ignore the new 5-row default (15 rows in a city). The row limit is reset to 5 once; the "Max rows" slider still changes it afterwards.
1.2.2
Changed
- The resting crowd filter is gone: strangers are detected whenever "Include strangers in range" is on, also inside cities and rest areas. "Max rows" already caps the visible list, so a crowd can no longer hide everyone — this was the reason players showed up on one character and not another (resting state + 6+ friendly plates).
- The "Include strangers while resting" option was removed with the filter it controlled.
/sbmt debugnow also prints the resolved class, flavor and each buff slot'ssKnown/sId/sName, so broken slot resolution is visible at a glance.
Fixed
- The History tab no longer errors on Forever:
SetFontthere requires the thirdflagsargument, which the search edit box was missing. - A missing localized spell name no longer breaks a slot:
IsSpellInRangeis skipped for empty names instead of erroring (which would blacklist the API for everyone), and both the range check and the cast buttons fall back to the spell id when the name does not resolve.
1.2.1
Added
logo.pngis used everywhere: addon list icon (TOC), minimap button and the headers of the buff window, settings window and assignment matrix.- Option "Include myself": you appear in your own list and are buffed through the direct unit token.
- Option "Auto-enable friendly nameplates": switches
nameplateShowFriendson once at login and on zone change (out of combat), so strangers get a unit token. Mouseover is an additional stranger source next to target and focus. - Settings window: the General, Buffs, Window and About pages scroll (mouse wheel and a draggable scrollbar) and follow the content height. The window is more compact (560x520). The History tab keeps its fixed layout with its own list scroll.
Changed
- Minimap button: registered as a LibDataBroker launcher through LibDBIcon
(when any loaded addon provides the libraries), so it looks like the other
addons' buttons and collectors (SentinelForeverUI button bars,
MinimapButtonHide) can pick it up. Without the libraries a LibDBIcon-style
fallback button
LibDBIcon10_SentinelBuffMeThenis built on the Minimap. - Name macro restored for strangers and buffers:
/target Name,/cast [help,nodead] Spell,/targetlasttarget. Buffers without a unit token are listed again so you can buff back without targeting them first; after a click they stay hidden for two minutes because their buff state cannot be read. Group members and yourself keep the direct unit path. - The buff window always anchors at its top-left corner (bottom-left with "Grow upwards") and re-anchors old saved positions, so new rows only extend it downward instead of growing in both directions.
- Every unit name is read as the full character name ("First Last", via
GetUnitName) instead of the first name returned byUnitName, so assignments, buffers, history, overrides, sync and the macro no longer mix up players who share a first name (WoW Forever surnames). Initializeruns every step isolated and creates the minimap button first; an error in one step can no longer take the button or the event wiring down.
Fixed
16001was missing from the TOCInterfaceline, so the Forever client treated the addon as out of date and did not load it.- Strangers outside the group could not be buffed first because they only appear with a unit token (see friendly nameplates above).
- Nearby players were not detected:
nameplateShowAllis now enabled next tonameplateShowFriends(master switch — without it only the target has a plate and nonameplateNtoken resolves), and the check retries every few seconds so a combat-locked first attempt no longer disables it for the whole session. - Friendliness no longer relies on
UnitIsFriendalone (unreliable on nameplate tokens): it falls back toUnitReactionandUnitCanAttack. IsSpellInRangereturning "out of range" on nameplate tokens no longer hides the row —CheckInteractDistance(~28 yd) cross-checks first, so a false negative cannot make nearby strangers invisible when "hide out-of-range rows" is on.- A missing
UnitIsConnectedAPI no longer marks every unit out of range. - Combat taint fixed:
CheckInteractDistance/UnitInRangeare protected calls on Forever during combat and threwADDON_ACTION_BLOCKED. In combat onlyIsSpellInRangeanswers, falling back to the last known range per player+buff; the extra probes only run out of combat. Group members are friendly by definition and skip the friendly check entirely, so they can never vanish mid-combat ifUnitIsFriendfails. - The resting filter no longer hides strangers in every rest area — villages
and camps in the open world also report
IsResting(). Strangers are only suppressed while resting when a real crowd is around (6+ friendly nameplates). A deliberately targeted/focused/hovered player is never suppressed, and "include strangers while resting" still disables the filter completely. /sbmt debugprints the nameplate CVars, whichnameplateNtokens resolve and their friendliness — use it to diagnose stranger detection on any client.- Forever has no usable combat log for addons: registering
COMBAT_LOG_EVENT_UNFILTEREDthrowsADDON_ACTION_FORBIDDENat load. Strangers on Forever are discovered through nameplate tokens instead —nameplateShowAllis enabled automatically (verified working: friendly players resolve withfriend=true). The combat log remains active on the classic flavors (Era/TBC/Wrath/Cata/MoP). - The "recently clicked" memory for tokenless entries is now per buff, not per player: after casting Fortitude on a stranger, Spirit/Shadow Protection stay clickable instead of hiding the whole row for 2 minutes.
- The list defaults to 5 rows ("Max rows" setting, 3-30). Rows that finish drop out and the next candidates slide in automatically, so the window stays a rolling queue instead of a wall of names.
- Priest "spinnt" fixed: Fear Ward only lasts ~3 minutes — always under the
warn threshold — so every unit wearing it sat permanently in "expiring"
state: amber rows that never cleared, plus auto-buff re-casting it on a
loop. Slots can now be flagged
noWarn(missing/present only, never "expiring") and Fear Ward uses it. All four classes' spell ids verified against the Forever trainer data. ADDON_ACTION_FORBIDDENspam stopped: every optional API call now goes throughB.Probe(name, fn, ...), which blacklists a function after its first failure so a protected API logs once and is never retried. Covered:GetPlayerInfoByGUID,UnitGUID,UnitReaction,UnitCanAttack,CheckInteractDistance,UnitInRange,UnitIsConnected,IsResting,Ambiguate,GetItemCount,PlaySound/PlaySoundFile,SendChatMessage,SendAddonMessage,RegisterAddonMessagePrefixand the nameplate CVar reads/writes. Unknown stranger classes fall back to the people DB./sbmt debugnames the blacklisted APIs and captures the Lua stack of the last forbidden/blocked call for diagnosis.- Strangers with a live unit token (nameplate/target/focus/mouseover) now
cast through the token directly instead of the
/targetmacro — the macro only remains for tokenless entries (combat-log strangers, buffers without a token).
1.2.0
Added
- Multi-client support: Classic Era, TBC Anniversary, Wrath/Titan Reforged, Cataclysm, Mists of Pandaria Classic, WoW Forever (Camelot) and Retail including Midnight. The TOC lists every current interface number and no longer restricts loading to the Camelot client.
- Client flavor detection (
B.flavor): classic-style flavors keep ranks, group variants and reagents; modern flavors (Retail, MoP, Cata) use the single raid-wide spell, so the group spell is folded into the single slot and reagents are ignored. - Spell database extended with the TBC ranks (Fortitude, Spirit, Shadow Protection, Mark/Gift of the Wild, Thorns, Arcane Intellect/Brilliance, Dampen/Amplify Magic, all paladin blessings and greater blessings) and the extra paladin auras and seals of TBC and MoP. Spell ids that do not exist on the running client are skipped, so the highest known id always wins.
- Who-buffed-me tracking falls back to the legacy
UnitAuraon clients withoutC_UnitAurasand additionally uses the combat log (SPELL_AURA_APPLIED) on Era/TBC/Wrath/Cata/MoP, which finds strangers without a unit token. Retail and Forever keep the aura-source path.
Changed
- Spell-known lookup falls back through
C_SpellBook,C_Spell,IsPlayerSpellandIsSpellKnown; addon messages and chat useC_ChatInfoor the legacy globals, and the instance channel where applicable. - Unit predicates and names are read through guarded wrappers so Midnight cannot raise "boolean test on a secret value".
- Texture gradients work with either
SetGradientor the legacySetGradientAlpha; secure buttons force key-up so clicks behave the same regardless of theActionButtonUseKeyDownsetting. - Paladin on Retail has no raid blessings: the list stays empty there, the aura self-bar and the assignment matrix remain available.
1.1.1
Fixed
- Class-token lookup for grouped players; paladin blessings resolve from the target's class instead of its localized class name.
- Paladin self-bar aura scan error; tracked buffers survive entering the world and reloads.
- Spell-info lookups are guarded against invalid ids and client API errors; the missing tooltip accent color is restored.
- Secure buttons register release clicks only, avoiding duplicate casts.
- An explicit "no blessing" assignment is kept instead of silently reverting to the automatic fallback.
- Unsupported aura lookup APIs fall back to another reader; unreadable aura scans count as unknown, not missing, and failed reads during reload or combat no longer clear tracking state or replay chat announcements.
- The player is counted in raid blessing buckets and expiring raid buffs are refreshed.
- Range checks no longer return false positives from secret values and no cast is offered when the target is unknown or out of range.
- Paladin assignment sync is stable on roster changes; the Clear button no longer wipes other paladins' assignments.
- The History cast target stays stable in combat; the settings and assignment windows are large enough for their contents.
Changed
- Nearby strangers and History casts use secure unit tokens; entries without a live unit token stay in History but are not castable.
1.1.0
Added
- PallyPower-style paladin tools: blessing assignment matrix (paladins x
classes plus an aura column, click or mouse wheel to cycle), player-level
overrides, Auto-Assign, Report to raid/party chat, Clear, and addon-channel
sync between SentinelBuffMeThen users (
Pbutton in the header). - Paladin self bar: aura, Righteous Fury and seal icons, red when missing, green with a timer when active; click to cast, right-click to cycle.
- Auto-buff button in the header: casts the next needed buff and rotates through all actionable targets.
- Remaining time on buff icons with an amber warning under a configurable threshold; the remembered expiry keeps timers ticking through combat-secret auras.
- Sound and frame flash when a new buff lands on you.
- Reagent strip along the bottom of the window: item icons and counts for the reagents your known group buffs need.
- History tab in the settings window with search and filters (all / buffed /
not buffed / can't buff);
/sbmt historyjumps straight to it. - Persistent people database and buff event log (who buffed you, when and how often), saved across sessions; "Clear history" button in the settings.
- Raid mode: one row per raid subgroup (Priest/Druid/Mage) or per class (Paladin) with missing counts and click-through rotation.
- Locales: deDE in full; frFR, esES/esMX, ptBR and ruRU for visible strings. Spell names come from the client's localized database.
Changed
- Chat announcements dedupe per buff family and only fire on the absent-to-present transition.
- Resting areas no longer flood the list with strangers (opt-in setting).
1.0.0
- Initial release: buff-back list for Paladin, Priest, Druid and Mage.
- Detects who buffs you via the aura
sourceUnitand announces it in chat. - Rows for buffers, group members and friendly strangers (nameplates), with left-click single buff and right-click group buff.
- Always casts the highest known rank; reagent tracking for group buffs.
- Paladin blessings follow SentinelForeverBlessings assignments when installed.
- Sentinel glass look, minimap button and settings window (
/sbmt).
This mod has no additional files

