Harden macros, world map and actionbar panels

This commit is contained in:
Dusk-92
2026-08-30 09:11:44 +02:00
parent 279417bd54
commit 38674064d6
5 changed files with 167 additions and 112 deletions
+48 -34
View File
@@ -1,5 +1,6 @@
local _G = ShaguTweaks.GetGlobalEnv()
local T = ShaguTweaks.T
local API = ShaguTweaks.API or {}
local module = ShaguTweaks:register({
title = T["Macro Tweaks"],
@@ -11,72 +12,85 @@ local module = ShaguTweaks:register({
})
module.enable = function(self)
-- make sure #showtooltip inside macros won't be sent
local hookSendChatMessage = SendChatMessage
function _G.SendChatMessage(msg, ...)
if msg and string.find(msg, "^#showtooltip ") then return end
hookSendChatMessage(msg, unpack(arg))
-- This interception is intentional: #showtooltip is macro metadata and must
-- not be sent as chat text by the Vanilla macro parser.
local hookSendChatMessage = _G.SendChatMessage
function _G.SendChatMessage(msg, a1, a2, a3, a4, a5, a6, a7, a8)
if msg and string.find(msg, "^#showtooltip%s") then return end
return hookSendChatMessage(msg, a1, a2, a3, a4, a5, a6, a7, a8)
end
-- do not write macro calls into chat input history
-- do not write executed macro commands into chat input history
if not ChatFrameEditBox._AddHistoryLine then
local userinput
ChatFrameEditBox._AddHistoryLine = ChatFrameEditBox.AddHistoryLine
ChatFrameEditBox.AddHistoryLine = function(self, text)
if not userinput and text and string.find(text, "^/run(.+)") then return end
if not userinput and string.find(text, "^/script(.+)") then return end
if not userinput and string.find(text, "^/cast(.+)") then return end
if not userinput and text then
if string.find(text, "^/run%s*") then return end
if string.find(text, "^/script%s*") then return end
if string.find(text, "^/cast%s*") then return end
end
ChatFrameEditBox._AddHistoryLine(self, text)
end
local OnEnter = ChatFrameEditBox:GetScript("OnEnterPressed")
ChatFrameEditBox:SetScript("OnEnterPressed", function(a1,a2,a3,a4)
userinput = true
OnEnter(a1,a2,a3,a4)
userinput = nil
if OnEnter then OnEnter(a1,a2,a3,a4) end
userinput = nil
end)
end
local function GetBagItemName(bag, slot)
if API.GetContainerItemID and API.GetItemNameByID then
local itemID = API.GetContainerItemID(bag, slot)
local name = itemID and API.GetItemNameByID(itemID)
if name then return name end
end
local itemLink = GetContainerItemLink(bag, slot)
if not itemLink then return end
local _, _, itemID = string.find(itemLink, "item:(%d+)")
return itemID and GetItemInfo(itemID) or nil
end
local function FindItem(item)
local wanted = string.lower(item or "")
for bag = 4, 0, -1 do
for slot = 1, GetContainerNumSlots(bag) do
local itemLink = GetContainerItemLink(bag,slot)
if itemLink then
local _, _, parse = strfind(itemLink, "(%d+):")
local query = GetItemInfo(parse)
if query and query ~= "" and string.lower(query) == string.lower(item) then
return bag, slot
end
local query = GetBagItemName(bag, slot)
if query and string.lower(query) == wanted then
return bag, slot
end
end
end
return nil
end
-- add /use and /equip to the macro api:
-- https://wowwiki.fandom.com/wiki/Making_a_macro
-- supported arguments:
-- /use <itemname>
-- /use <inventory slot>
-- /use <bag> <slot>
_G.SLASH_EQUIP1 = "/equip"
_G.SLASH_EQUIP2 = "/use"
_G.SlashCmdList.EQUIP = function (msg)
_G.SlashCmdList.EQUIP = function(msg)
if not msg or msg == "" then return end
local bag, slot, _
if string.find(msg, "%d+%s+%d+") then
_, _, bag, slot = string.find(msg, "(%d+)%s+(%d+)")
elseif string.find(msg, "%d+") then
_, _, slot = string.find(msg, "(%d+)")
local bag, slot
local _, _, parsedBag, parsedSlot = string.find(msg, "^(%d+)%s+(%d+)$")
if parsedBag and parsedSlot then
bag, slot = parsedBag, parsedSlot
else
bag, slot = FindItem(msg)
local _, _, inventorySlot = string.find(msg, "^(%d+)$")
if inventorySlot then
slot = inventorySlot
else
bag, slot = FindItem(msg)
end
end
bag = bag and tonumber(bag) or nil
slot = slot and tonumber(slot) or nil
if bag and slot then
UseContainerItem(bag, slot)
elseif not bag and slot then
elseif slot then
UseInventoryItem(slot)
end
end