Commit Graph

229 Commits

Author SHA1 Message Date
Brues f21f90d0f1 Adopt ClassicAPI accessors: cursor, item IDs, spell mechanic
Lean on ClassicAPI's backported readers instead of link-string parsing
and a hand-maintained mechanic table.

- ClassicAPI.lua: add wrappers GetCursorInfo/CursorHoldsItemID,
  GetContainerItemID, GetInventoryItemID, and GetSpellMechanicByID.
- Core.lua: in the manual equip fallback, verify the cursor holds the
  intended item (CursorHoldsItemID) before EquipCursorItem, aborting only
  on a definitive mismatch so empty/unknown cursors behave as before.
- NampowerAPI.lua / Utility.lua: replace GetContainerItemLink /
  GetInventoryItemLink + "item:(%d+)" parsing with direct C_Container/
  inventory ID lookups at the sites that only need the itemID; route the
  equipped-set scans through the GetEquippedItemID helper.
- Conditionals.lua / Utility.lua: replace the 785-entry CCSpellMechanics
  fallback table with C_Spell.GetSpellMechanicByID in GetSpellMechanic and
  GetSpellCCType (BuffLib / nampower paths unchanged); delete the table.
2026-06-21 14:02:49 -05:00
Brues 9f10dab560 Use ClassicAPI CastSpellNoToggle for the ! anti-toggle prefix
Unify both ! mechanisms (bare !spell gate-injection and bracketed
[cond] !spell dispatch skip) on ClassicAPI's CastSpellNoToggle, which
no-ops auto-repeat (Shoot/Auto Shot/Wand) and toggle auras
(forms/stances/aspects/seals) instead of toggling them off.

- Bare !spell now just sets conditionals.noSpam (no injected gate
  conditional); removed spamConditions and GetSpammableConditional.
- Dispatch: melee Attack still uses AttackTarget (CastSpellNoToggle
  doesn't cover the melee swing). For everything else under !, keep the
  ValidatePlayerBuff anti-refresh skip (CastSpellNoToggle only covers
  true toggle auras, not regular self-buffs like Mark of the Wild),
  otherwise CastSpellNoToggle. This is more reliable for auto-repeat
  than the old CheckChanneled path.

CheckChanneled is retained (still used by the [channeled]/[checkchanneled]
conditionals).
2026-06-21 02:55:40 -05:00
Brues a561d0ed20 Make cursor a [cursor] modifier instead of an @cursor token
Per design preference, drop the @ and the ParseMsg special-casing:
[cursor] is now a normal modifier keyword (added to ignoreKeywords,
mirroring [mouseuse]) rather than a pseudo unit token. The cast/use
dispatch still routes through ClassicAPI's CastAtCursor / UseAtCursor
(checked via conditionals.cursor). Reverts the @cursor ParseMsg branch.
2026-06-21 02:36:09 -05:00
Brues b9895471f0 Add @cursor token for ground-target spells/items
@cursor places a ground-target spell or on-use item at the cursor via
ClassicAPI's engine-level placement instead of the [mouseuse] reticle-
click simulation (so no auto-attack side effect).

- ParseMsg flags @cursor as conditionals.atCursor rather than setting a
  bogus "cursor" unit target, so it doesn't affect help/harm/exists/range
  checks or pass an invalid token to CastSpellByName.
- DoWithConditionals routes atCursor casts through C_Spell.CastAtCursor
  (spellID resolved from the spell index / GetSpellIdForName) and item
  uses through C_Item.UseAtCursor. Both fall back to a normal cast/use
  for non-ground actions.

New syntax, so existing macros are unaffected; MacroErrorChecker already
accepts @cursor.
2026-06-21 02:34:12 -05:00
Brues 416a716d8c Remove dead AuraScanTooltip frame
The AuraScanTooltip scanning frame was only used by CancelAura's legacy
tooltip path, which was removed when CancelAura moved to ClassicAPI's
C_Spell.CancelSpellByID. Nothing references it now.
2026-06-21 02:13:12 -05:00
Brues d4df0a3b26 CancelAura via C_Spell.CancelSpellByID; stop [focus] no-focus warning
- CancelAura: cancel matched buffs through ClassicAPI's
  C_Spell.CancelSpellByID instead of nampower CancelPlayerAuraSpellId
  and the legacy slot-based CancelPlayerBuff + tooltip-scan path. The
  buff scan (SuperWoW GetPlayerBuffID / nampower raw GetPlayerAuraDuration
  + overflow tracking) and the boolean return are preserved, so the
  ~spell cancel-vs-cast toggle still works. CancelSpellByName isn't usable
  here because it reports no match.
- Focus: GetFocusUnitId no longer warns when no focus is set. In a
  fallback macro ([@focus] as one alternative) that's a normal state;
  the clause now silently falls through like any unresolved @unit.
  Dropped the unused warn parameter and updated both callers.
2026-06-21 02:10:52 -05:00
Brues f926ac5521 Replace custom/UnitXP timers with ClassicAPI C_Timer
- ScheduleTimer now wraps C_Timer.After, removing the dedicated timer
  frame + per-frame OnUpdate loop + timers queue.
- Aura-tracking cleanup -> C_Timer.NewTicker(5) (_auraCleanupTicker);
  drop the UnitXP arm, the named global CleveRoids_AuraTrackingCleanupTimer,
  and the inline "not hasUnitXP" fallback in OnAuraCastOther.
- Libdebuff cleanup -> C_Timer.NewTicker(30) (_cleanupTicker); drop the
  UnitXP arm and CleveRoids_LibDebuffCleanupTimer.
- Shutdown cancels the tickers instead of UnitXP timer disarm.

Cleanup now always runs (was gated on hasUnitXP) and no longer depends
on UnitXP threaded timers or named global callbacks. Tickers self-guard
on isShuttingDown and are cancelled on shutdown.
2026-06-21 01:59:54 -05:00
Brues a9c031538b Use native ClassicAPI focus token; add [focus]/[nofocus]
ClassicAPI exposes a native "focus" unit token (set via its own /focus
/ FOCUSTARGET keybind), accepted by every UnitX call.

- GetFocusUnitId falls back to the native "focus" token after the pfUI
  emulated-focus check, so @focus / [cond:focus] / focus range checks
  now work for non-pfUI users (previously focus only worked via pfUI).
- TryTargetFocus uses TargetUnit("focus") for an exact switch before the
  fragile name-based TargetByName path.
- Add [focus]/[nofocus] conditionals (GetFocusUnitId ~= nil), covering
  both pfUI and native focus; registered as boolean conditionals.

No addon /focus command is needed: ClassicAPI's companion addon already
registers /focus and /clearfocus.
2026-06-21 01:50:34 -05:00
Brues c710ccf832 Identify action-bar macros by slot/index; drop name restrictions
Resolve a slot's macro by its Blizzard macro index via ClassicAPI's
GetActionInfo instead of GetActionText -> name -> GetMacro, so action-bar
macros no longer depend on the macro name.

- Core.lua: GetAction uses GetActionInfo(slot) -> macro index ->
  GetMacroByIndex; falls back to the name path for SuperMacro (no index).
  ParseMacro split into a shared BuildMacro + ParseMacroByIndex (caches by
  index) + ParseMacro(name). Added GetMacroByIndex. The macro cache is now
  keyed by index for action-bar macros, so blank/duplicate names no longer
  collide. GetMacroIndexByName remains only for genuine name references
  ({MacroName}, /runmacro, /macrocheck).
- MacroErrorUI.lua: remove the now-obsolete macro-name warnings (duplicate,
  blank, spell-conflict, item-conflict) from both the live editor validation
  and the on-close report; delete the unused name-set helpers.
- README: update the known-issue to note only name-referenced macros need
  unique names.
2026-06-21 00:30:30 -05:00
Brues 3267db6be6 Resolve macro icon via ClassicAPI GetActionInfo (no name round-trip)
Replace the three duplicated GetActionText -> GetMacroIndexByName ->
GetMacroInfo blocks in the GetActionTexture hook with a single
GetSlotMacroTexture helper that gets the macro slot directly from
ClassicAPI's GetActionInfo. More robust (no dependence on macro-name
lookups) and DRYs the fallback logic.
2026-06-21 00:15:34 -05:00
Brues 73e8938d76 Use ClassicAPI for action-bar mapping, spell IDs, and dynamic pfUI icons
GetActionInfo:
- Add ClassicAPI.GetActionInfo wrapper; rewrite GetActionButtonInfo
  (Generic.lua) to use it and resolve names via GetSpellRecField /
  GetItem / GetMacroInfo, replacing the per-slot GameTooltip scan +
  texture heuristic. Powers reactive-ability slot detection.
- Delete the dead SuperWoW-GetActionText copy of GetActionButtonInfo.

Spell IDs in the index:
- IndexSpells now uses ClassicAPI GetSpellInfo(slot, bookType), whose
  10th return is the spellID, so every Spells entry carries .id (one
  call also replaces GetSpellName + GetSpellTexture).

Dynamic pfUI action-button icons (pairs with the pfUI fork change):
- GameTooltip.SetAction hook renders spells via ClassicAPI
  SetSpellByID(spell.id) instead of SetSpell(spellSlot, bookType) +
  manual rank text. Items stay location-based (instance data).
- Drop the redundant GetActionSpellSlot -> GetSpellCooldown cooldown
  shim in the pfUI handler; pfUI now routes through the hooked
  GetActionCooldown when it defers macro scanning to us.
2026-06-21 00:11:46 -05:00
Brues b28f4452b9 Make ClassicAPI a hard requirement; remove movement fallbacks
ClassicAPI is now required, not optional. The load-time requirement
check warns when it's missing (Core.lua), the same as Nampower/UnitXP,
and ClassicAPI-backed code calls the API directly with no fallbacks.

- ClassicAPI.lua: drop the HasUnitAuras/HasUnitSpeed/HasIsFalling
  capability gates and pcall hedging; wrappers call C_UnitAuras /
  GetUnitSpeed / IsFalling directly. Keep IsAvailable (used by the
  requirement check) and the version helpers.
- [moving]: ClassicAPI GetUnitSpeed is the only source. Removed the
  MonkeySpeed integration, the Nampower PlayerIsMoving branch, and the
  100 Hz position-tracking buffer in Core.lua's OnUpdate (with its
  POS_TRACK_INTERVAL constant and UnitPosition upvalue). Removed the
  now-dead speed==nil guards and WarnNoSpeedSource.
- README: ClassicAPI moved to Required; MonkeySpeed dropped from
  Supported Addons.
- docs/CLASSICAPI-TODO.md: record the mandatory/no-fallbacks policy.
2026-06-20 23:47:23 -05:00
Brues c05fc754e6 Add ClassicAPI dispel-type conditionals via C_UnitAuras
Introduce ClassicAPI.lua, a feature-detection layer for the ClassicAPI
client mod that mirrors NampowerAPI's HasMinimumVersion pattern
(IsAvailable / HasMinimumVersion / HasUnitAuras). UnitHasDispelType
scans a unit's auras via C_UnitAuras and reports the dispel type,
scanning debuffs or buffs based on a helpful flag.

Add conditionals backed by it:
- Debuff side (defensive cleanse): [magic] [curse] [disease] [poison]
  [dispellable] + negations
- Buff side (offensive dispel/strip): [magicbuff] [dispellablebuff]
  + negations

All are no-arg booleans, default to @target (honor @unit), and degrade
gracefully without ClassicAPI: positive checks return false, negated
return true, since vanilla cannot read aura dispel types. The existing
ValidateAura path is untouched. MacroErrorChecker auto-accepts them via
the Keywords table; they're registered in BOOLEAN_CONDITIONALS so they
parse as flags. Loaded after NampowerAPI in the TOC.
2026-06-20 23:03:23 -05:00
Brues 0d95c4a0a6 update nampower link 2026-06-20 21:58:02 -05:00
Josh Sachs d863387bce add [bg]/[nobg] conditional for battleground detection
Uses GetBattlefieldStatus to check whether any battlefield queue
slot is in the "active" state, which indicates the player is
currently inside a battleground instance.
2026-04-06 21:05:03 -04:00
Josh Sachs 0a240a52c0 fix bare [pet]/[nopet] conditionals not evaluating
pet and nopet were missing from BOOLEAN_CONDITIONALS, so bare
[pet] (no type argument) was parsed as a spell-name match against
UnitCreatureFamily instead of a simple existence check.
2026-04-02 12:31:42 -04:00
Jrc13245 fbbbb1fcce updates for unified tracking 2026-04-01 16:11:47 -04:00
Jrc13245 765256642a update immunity of cc spells not mistaken for immunity to dmg type 2026-03-31 20:04:13 -04:00
Jrc13245 25b689f5cb fix non standard token usage like focustarget 2026-03-30 16:25:01 -04:00
Jrc13245 f2046497bd fix some spells not working properly when target explicitly set 2026-03-30 08:16:27 -04:00
Jrc13245 498fa90f45 fix firstaction interaction with applymain and applyoff 2026-03-28 10:25:33 -04:00
Jrc13245 719021ff65 Add set conditional, rmarkorder, Reliquary DBC integration, and fix immunity tracking false positives 2026-03-27 16:01:34 -04:00
Jrc13245 58974de765 no more forced addon disable, just warnings about required dlls, and also multiscan + help conditional works on friendlies 2026-03-24 07:50:13 -04:00
Jrc13245 5bb8ebe9b7 add item count support for inbag/noinbag conditional, fix macro frame whitelist and error log on macro frame 2026-03-21 12:03:46 -04:00
Jrc13245 72de9a00cc flyout compatibility 2026-03-20 21:44:12 -04:00
Jrc13245 137e08a209 fix target overflowframe and possible immunity system fix 2026-03-17 18:25:20 -04:00
Jrc13245 4ddac30726 fix inrange distance measuring, add distance range count threshold for enemy count, add filters for count mode, fix stopattack 2026-03-15 11:11:40 -04:00
Jrc13245 de8760f872 fix item counts on actionbars and new conditional addition facing and nofacing 2026-03-14 09:02:11 -04:00
Jrc13245 50a9cc1913 fix class conditional and stopattack defer 2026-03-13 20:53:59 -04:00
Jrc13245 efdcde3eca performance updates, meleerange conditional checks if unit is alive 2026-03-11 19:57:33 -04:00
Jrc13245 ff73210d2d some debug 2026-03-09 15:37:51 -04:00
Jrc13245 69b9c08a2b fix meleerange and count mode 2026-03-08 16:38:57 -04:00
Jrc13245 b4a442e23a fix target by class with no target selected 2026-03-08 12:49:52 -04:00
Jrc13245 470ad3fd24 fix cleartarget conditional 2026-03-07 16:34:26 -05:00
Jrc13245 46c3f3a07c update deferstopattack 2026-03-07 11:04:18 -05:00
Jrc13245 5c67b52c4e fix reatargeting and stopattack 2026-03-07 11:02:32 -05:00
Jrc13245 348c621c5d remove cleartarget conditional, update stopattack 2026-03-07 11:00:29 -05:00
Jrc13245 0de2747175 update stopattack and cleartarget 2026-03-06 21:16:38 -05:00
Jrc13245 aca7b2af3b retarget conditional, fix defer frame to use polling approach 2026-03-06 20:36:24 -05:00
Jrc13245 720246e473 defer stopattack to the next frame 2026-03-06 20:21:42 -05:00
Jrc13245 52b831c2c2 stopattack and cleartarget conditionals 2026-03-06 20:14:08 -05:00
Jrc13245 bb6b8a0d5b make stopattack faster 2026-03-06 20:04:58 -05:00
Jrc13245 17f28dcdfd feature mouseuse and attempt to fix stopattack 2026-03-06 19:43:36 -05:00
Jrc13245 34190ccbd8 fix debuff and buff tracking 2026-03-06 18:55:39 -05:00
Jrc13245 2f698403e5 fix showtooltip icon for multiple evaluation keywords 2026-03-06 17:35:44 -05:00
Jrc13245 9c05a6fc6a fix pfui loading objects without superwow 2026-03-03 11:10:55 -05:00
Jrc13245 82b2ab889f remove superwow requirement by using nampower, update nampower support to 3_1_0 2026-03-02 19:55:53 -05:00
Jrc13245 6fa4e28318 Merge branch 'no-superwow' 2026-03-02 17:52:41 -05:00
Jrc13245 b56beef4b2 remove more superwow only functions 2026-03-02 09:01:34 -05:00
Jrc13245 685f2d3c59 fix focus nil error 2026-03-01 11:27:39 -05:00