From 82b2ab889f7e70cc2e4248b785d0ba076de42482 Mon Sep 17 00:00:00 2001 From: Jrc13245 Date: Mon, 2 Mar 2026 19:55:53 -0500 Subject: [PATCH] remove superwow requirement by using nampower, update nampower support to 3_1_0 --- Core.lua | 12 +++---- Extensions/Mouseover/GameTooltip.lua | 2 +- Init.lua | 2 +- NampowerAPI.lua | 51 +++++++++++++++++++++++++--- Utility.lua | 17 ++++++++-- 5 files changed, 70 insertions(+), 14 deletions(-) diff --git a/Core.lua b/Core.lua index b1e1e89..4fec944 100644 --- a/Core.lua +++ b/Core.lua @@ -2556,7 +2556,7 @@ function CleveRoids.DoCast(msg) local parts = CleveRoids.splitStringIgnoringQuotes(msg) for i = 1, table.getn(parts) do local v = parts[i] - if CleveRoids.DoWithConditionals(v, CleveRoids.Hooks.CAST_SlashCmd, CleveRoids.FixEmptyTarget, not CleveRoids.hasSuperwow, CastSpellByName) then + if CleveRoids.DoWithConditionals(v, CleveRoids.Hooks.CAST_SlashCmd, CleveRoids.FixEmptyTarget, false, CastSpellByName) then -- If /firstaction was used, stop macro evaluation after first successful cast if CleveRoids.stopOnCastFlag then CleveRoids.stopMacroFlag = true @@ -2602,7 +2602,7 @@ function CleveRoids.DoPfCast(msg) v = string.gsub(v, "%[", "[@" .. unit .. ",", 1) end end - if CleveRoids.DoWithConditionals(v, CleveRoids.Hooks.PFCAST_SlashCmd, CleveRoids.FixEmptyTarget, not CleveRoids.hasSuperwow, CastSpellByName) then + if CleveRoids.DoWithConditionals(v, CleveRoids.Hooks.PFCAST_SlashCmd, CleveRoids.FixEmptyTarget, false, CastSpellByName) then if CleveRoids.stopOnCastFlag then CleveRoids.stopMacroFlag = true end @@ -3643,7 +3643,7 @@ function CleveRoids.DoStopMacro(msg) -- PERFORMANCE: Use numeric iteration to avoid pairs() iterator allocation local parts = CleveRoids.splitStringIgnoringQuotes(CleveRoids.Trim(msg)) for i = 1, table.getn(parts) do - if CleveRoids.DoWithConditionals(parts[i], nil, nil, not CleveRoids.hasSuperwow, "STOPMACRO") then + if CleveRoids.DoWithConditionals(parts[i], nil, nil, false, "STOPMACRO") then return true end end @@ -3655,7 +3655,7 @@ function CleveRoids.DoSkipMacro(msg) -- PERFORMANCE: Use numeric iteration to avoid pairs() iterator allocation local parts = CleveRoids.splitStringIgnoringQuotes(CleveRoids.Trim(msg)) for i = 1, table.getn(parts) do - if CleveRoids.DoWithConditionals(parts[i], nil, nil, not CleveRoids.hasSuperwow, "SKIPMACRO") then + if CleveRoids.DoWithConditionals(parts[i], nil, nil, false, "SKIPMACRO") then return true end end @@ -3676,7 +3676,7 @@ function CleveRoids.DoFirstAction(msg) -- Has conditionals - use DoWithConditionals to evaluate them local parts = CleveRoids.splitStringIgnoringQuotes(CleveRoids.Trim(msg)) for i = 1, table.getn(parts) do - if CleveRoids.DoWithConditionals(parts[i], nil, nil, not CleveRoids.hasSuperwow, "FIRSTACTION") then + if CleveRoids.DoWithConditionals(parts[i], nil, nil, false, "FIRSTACTION") then return true end end @@ -3703,7 +3703,7 @@ function CleveRoids.DoNoFirstAction(msg) -- Has conditionals - use DoWithConditionals to evaluate them local parts = CleveRoids.splitStringIgnoringQuotes(CleveRoids.Trim(msg)) for i = 1, table.getn(parts) do - if CleveRoids.DoWithConditionals(parts[i], nil, nil, not CleveRoids.hasSuperwow, "NOFIRSTACTION") then + if CleveRoids.DoWithConditionals(parts[i], nil, nil, false, "NOFIRSTACTION") then return true end end diff --git a/Extensions/Mouseover/GameTooltip.lua b/Extensions/Mouseover/GameTooltip.lua index 797460a..7b1b893 100644 --- a/Extensions/Mouseover/GameTooltip.lua +++ b/Extensions/Mouseover/GameTooltip.lua @@ -56,7 +56,7 @@ function Extension.OnNonUnitTooltip() -- Also explicitly clear the game's mouseover to ensure UnitIsPlayer returns false. -- This is defensive - the main fix is in Utility.lua:apply() using "" instead of nil. - if CleveRoids.hasSuperwow and _G.SetMouseoverUnit then + if _G.SetMouseoverUnit then CleveRoids.__mo.selfTriggered = true _G.SetMouseoverUnit("") end diff --git a/Init.lua b/Init.lua index b0471e1..5a1ec0e 100644 --- a/Init.lua +++ b/Init.lua @@ -17,7 +17,7 @@ CleveRoids.mouseOverUnit = nil -- Environment flags CleveRoids.hasSuperwow = SetAutoloot and true or false CleveRoids.hasTurtle = (type(_G.TURTLE_WOW_VERSION) ~= "nil") -CleveRoids.supported = (CleveRoids.hasSuperwow or CleveRoids.hasTurtle) +CleveRoids.supported = CleveRoids.hasTurtle CleveRoids.ParsedMsg = {} CleveRoids.Items = {} diff --git a/NampowerAPI.lua b/NampowerAPI.lua index db24f8e..7e74b13 100644 --- a/NampowerAPI.lua +++ b/NampowerAPI.lua @@ -165,7 +165,16 @@ APIs (UnitBuff/UnitDebuff won't show it). Useful for detecting hidden CC spells. - luaSlot in BUFF/DEBUFF events now returns 0 for hidden auras (was incorrect before). - Current version: v3.0.0 + No-Queue Cast by ID & SPELL_CAST_EVENT Target Default (v3.1+): + - CastSpellNoQueue(spellId, spellBook [, unit]) - Cast by spell ID without spell queueing. + spellBook: 0 for player spells, "pet" for pet spells. + Optional unit parameter for targeting (same tokens as CastSpellByName). + - CastSpellByNameNoQueue now accepts unit token as second parameter (same as CastSpellByName). + - SPELL_CAST_EVENT targetGuid now defaults to current target's GUID instead of null GUID + ("0x0000000000000000"). Still overridden by explicit target (CastSpellByName 2nd param, + SpellTargetUnit mouseover). + + Current version: v3.1.0 ]] local _G = _G or getfenv(0) @@ -365,6 +374,10 @@ API.VERSION_REQUIREMENTS = { ["GetUnitGUID"] = { 3, 0, 0, "GetUnitGUID" }, ["IsAuraHidden"] = { 3, 0, 0, "IsAuraHidden" }, ["HiddenAuraLuaSlotFix"] = { 3, 0, 0 }, + + -- v3.1+ - CastSpellNoQueue by ID, SPELL_CAST_EVENT target default + ["CastSpellNoQueue"] = { 3, 1, 0, "CastSpellNoQueue" }, -- Cast by spell ID without queueing; accepts optional unit token + ["SpellCastEventDefaultTarget"] = { 3, 1, 0 }, -- SPELL_CAST_EVENT targetGuid now defaults to current target instead of null GUID } -- Check if a specific feature is available @@ -548,6 +561,10 @@ local function InitializeFeatures() f.hasIsAuraHidden = API.HasFeature("IsAuraHidden") f.hasHiddenAuraLuaSlotFix = API.HasFeature("HiddenAuraLuaSlotFix") + -- v3.1+ CastSpellNoQueue by ID, SPELL_CAST_EVENT default target + f.hasCastSpellNoQueue = API.HasFeature("CastSpellNoQueue") + f.hasSpellCastEventDefaultTarget = API.HasFeature("SpellCastEventDefaultTarget") + -- Runtime detection for enhanced spell functions (verify by testing) if f.hasEnhancedSpellFunctions and GetSpellTexture then local success, result = pcall(function() @@ -3117,19 +3134,23 @@ function API.SmartCast(spellName, target, forceQueue, forceNoQueue) return false end --- Cast without queuing (uses CastSpellByNameNoQueue if available, v2.12+) +-- Cast without queuing (uses CastSpellByNameNoQueue if available, v2.12+; v3.1+ supports unit target) function API.CastNoQueue(spellName, target) if not spellName then return false end -- Use Nampower's no-queue function if available (v2.12+) if API.features.hasCastSpellByNameNoQueue and CastSpellByNameNoQueue then - CastSpellByNameNoQueue(spellName) + if target then + CastSpellByNameNoQueue(spellName, target) + else + CastSpellByNameNoQueue(spellName) + end return true end -- Fall back to standard cast if CastSpellByName then - if target and CleveRoids.hasSuperwow then + if target then CastSpellByName(spellName, target) else CastSpellByName(spellName) @@ -3140,6 +3161,28 @@ function API.CastNoQueue(spellName, target) return false end +-- Cast by spell ID without queuing (v3.1+) +function API.CastNoQueueById(spellId, target) + if not spellId then return false end + + if API.features.hasCastSpellNoQueue and _G.CastSpellNoQueue then + if target then + _G.CastSpellNoQueue(spellId, 0, target) + else + _G.CastSpellNoQueue(spellId, 0) + end + return true + end + + -- Fall back to CastNoQueue by name + local name = API.GetSpellNameById(spellId) + if name then + return API.CastNoQueue(name, target) + end + + return false +end + -- Force queue a spell (uses QueueSpellByName directly, v2.0+) function API.ForceQueue(spellName) if not spellName then return false end diff --git a/Utility.lua b/Utility.lua index 1bd2bc7..91a445d 100644 --- a/Utility.lua +++ b/Utility.lua @@ -313,13 +313,26 @@ do local function apply(unit) if _G.SetMouseoverUnit then + local resolved = unit + -- "focus" is not a valid unit token in 1.12.1; resolve to real token + if unit == "focus" then + if pfUI and pfUI.uf and pfUI.uf.focus and pfUI.uf.focus.label and pfUI.uf.focus.id + and UnitExists(pfUI.uf.focus.label .. pfUI.uf.focus.id) then + resolved = pfUI.uf.focus.label .. pfUI.uf.focus.id + else + -- No resolvable unit token; use fallback path + CleveRoids.mouseoverUnit = unit + if CleveRoids.QueueActionUpdate then CleveRoids.QueueActionUpdate() end + return + end + end -- Available via SuperWoW or Nampower v2.37+ -- Set flag so UPDATE_MOUSEOVER_UNIT handler knows we triggered this CleveRoids.__mo.selfTriggered = true -- Use empty string instead of nil to properly clear mouseover. -- SetMouseoverUnit(nil) doesn't properly clear the game's internal state, -- causing UnitIsPlayer("mouseover") to return stale data (TurtleRP bug). - _G.SetMouseoverUnit(unit or "") + _G.SetMouseoverUnit(resolved or "") else CleveRoids.mouseoverUnit = unit end @@ -8783,7 +8796,7 @@ local function ProcessSpellMissSelf(spellId, targetGuid, missInfo) end -- Resolve spell name - local spellName = GetSpellRecField and GetSpellRecField(spellId, "name") + local spellName = GetSpellRecField and type(spellId) == "number" and spellId > 0 and GetSpellRecField(spellId, "name") local baseName = spellName and string.gsub(spellName, "%s*%(.-%)%s*$", "") or nil -- ========================================================================