StanceLink = {}
StanceLink.Const = {
Cmd = {"/stancelink", "/slnk"},
Opt = {
{
option = "set",
desc = "links your currently equipped arms to your stance, so that whenever you enter that stance, you regain those arms.",
method = "Add"
},
{
option = "clear",
desc = "removes any link you might have with your current stance, so no arms will be equipped in future on changing to it.",
method = "Clear"
},
{
option = "list",
desc = "details whatever links you have setup between stances and arms.",
method = "List"
}
},
Title = "StanceLink",
Version = "r1b1",
Desc = "Automatically equip weapons on warrior stance changes.",
Chat = {
SetArmLink = "%s (main-hand) and %s (secondary-hand) will now be armed when you enter %s.",
ClearArmLink = "The link for your %s has been cleared."
},
Stance = {
Ba = "Battle Stance",
Bk = "Berserker Stance",
De = "Defensive Stance"
},
Slot = {
MH = "Main-hand",
SH = "Secondary-hand"
}
}
local const = StanceLink.Const
StanceLink.Defaults = {
[const.Stance.Ba] = {},
[const.Stance.Bk] = {},
[const.Stance.De] = {}
}
StanceLink.Obj = AceAddon:new{
name = const.Title,
version = const.Version,
description = const.Desc,
author = "Rowne",
aceCompatible = "100",
category = ACE_CATEGORY_COMBAT,
db = AceDbClass:new("StanceLinkDB"),
defaults = StanceLink.Defaults,
cmd = AceChatCmdClass:new(const.Cmd, const.Opt),
Enable = function(self)
self:RegisterEvent("PLAYER_AURAS_CHANGED", "ArmsSwap")
end,
Add = function(self)
local db = self:DetermineStance()
if not db then return end
local h1 = GetInventoryItemName(CharacterMainHandSlot:GetID())
local h2 = GetInventoryItemName(CharacterSecondaryHandSlot:GetID())
self.cmd:msg(const.Chat.SetArmLink, h1, h2, db)
db = self:Get(db)
db[const.Slot.MH] = h1
db[const.Slot.SH] = h2
end,
Clear = function(self)
local db = self:DetermineStance()
if not db then return end
self.cmd:msg(const.Chat.ClearArmLink, db)
db = self:Get(db) db = {}
end,
List = function(self)
local doList = function(t)
local db = {}
for k, v in self:Get(t) do
tinsert(db, {text = k, val = v})
end
self.cmd:report(t.."...", db)
end
doList(const.Stance.Ba)
doList(const.Stance.Bk)
doList(const.Stance.De)
end,
DetermineStance = function(self)
return self:Buffs(const.Stance.Ba, true)
or self:Buffs(const.Stance.Bk, true)
or self:Buffs(const.Stance.De, true)
end,
ArmsSwap = function(self)
local db = self:DetermineStance()
if not db then return end
db = self:Get(db)
local h1 = db[const.Slot.MH]
local h2 = db[const.Slot.SH]
h1 = self:FindItemByName(h1)
h2 = self:FindItemByName(h2)
if h1 then PickupContainerItem(h1.x, h1.y) end
if CursorHasItem() then EquipCursorItem(16) end
if h2 then PickupContainerItem(h2.x, h2.y) end
if CursorHasItem() then EquipCursorItem(17) end
end
}
StanceLink.Obj:RegisterForLoad()
ace:RegisterFunctions(StanceLink.Obj, {
version = 1.0,
Get = function(self, var)
return self.db:get(self.profilePath, var)
end,
Buffs = function(b, n)
local t = CreateFrame("GameTooltip",
"TempBuffTip",
WorldFrame,
"GameTooltipTemplate")
t:SetOwner(WorldFrame, "ANCHOR_NONE")
for k, v in b do
for j = 1, 10 do
local chk = function(f)
t[f](t, "player", j)
local m = t:GetName()
m = getglobal(m.."TextLeft1"):GetText()
if type(m) == "string" and strfind(m or "", v) then
return n and b or TRUE
end
end
chk("SetUnitBuff") chk("SetUnitDebuff")
end
end
end,
FindItemByName = function(n)
for x = 0,NUM_BAG_FRAMES do
for y = 1, GetContainerNumSlots(x) do
if strfind(GetContainerItemLink(x, y) or "", n or "") then
return {x = x, y = y}
end
end
end
end
})