Clickzz/core.lua

346 lines
11 KiB
Lua

local name, addon = ...
local parentName = addon['parentName'] or "BrokerPack"
local childName = "Clickzz"
local eventframe, db
local options
local mouseButtons = {'LEFTBUTTON','RIGHTBUTTON','WHEEL',"BUTTON4","BUTTON5"}
local buffButtons = {'Buff1', 'Buff2', 'Buff3', 'Debuff1', 'Debuff2', 'Debuff3', 'DispelDebuff1', 'DispelDebuff2', 'DispelDebuff3'}
local modifier = {'none','shift','ctrl','alt'}
ClickCastFrames = ClickCastFrames or {}
local castFrames = ClickCastFrames
local ldbicon = LibStub:GetLibrary("LibDBIcon-1.0")
local function OnClick(self, button)
if(IsShiftKeyDown() and button == "LeftButton") then
addon['db']['global']['ldbicons'][childName]['hide'] = not addon['db']['global']['ldbicons'][childName]['hide']
if(ldbicon) then
if(addon['db']['global']['ldbicons'][childName]['hide']) then
ldbicon:Hide(childName)
else
ldbicon:Show(childName)
end
end
else
if(InterfaceOptionsFrame:IsVisible() and not InCombatLockdown()) then
InterfaceOptionsFrame:Hide()
else
InterfaceOptionsFrame_OpenToCategory(childName)
InterfaceOptionsFrame_OpenToCategory(childName) -- Twice because of a bug in InterfaceOptionsFrame_OpenToCategory
end
end
end
local function unregisterAttrs(frame)
if(InCombatLockdown()) then return end
frame['attrs'] = frame['attrs'] or {}
for key, value in pairs(frame['attrs']) do
frame:SetAttribute(key, nil)
frame['attrs'][key] = nil
end
end
local function registerAttrs(frame, key, value)
if(InCombatLockdown()) then
eventframe:RegisterEvent("PLAYER_REGEN_ENABLED")
else
frame['attrs'] = frame['attrs'] or {}
frame['attrs'][key] = value
frame:SetAttribute(key, value)
end
end
local function buffButtonSwitch(frame, switch)
local fName = frame:GetName()
if(strsub(fName, 1, 7) == 'Compact') then
for i = 1, #buffButtons do
local buffBtn = _G[format("%s%s", fName, buffButtons[i])]
if(buffBtn) then
buffBtn:EnableMouse(switch)
end
end
end
end
local function disableFrame(frame)
if(InCombatLockdown()) then
eventframe:RegisterEvent("PLAYER_REGEN_ENABLED")
return
end
if(frame and frame:GetName()) then
buffButtonSwitch(frame, true)
unregisterAttrs(frame)
registerAttrs(frame, 'type', 'target')
registerAttrs(frame, 'type2', 'togglemenu')
castFrames[frame] = nil
end
end
local function gettype(v, attr)
local r = format("%s%i", attr, v['btn'])
if(v['mod'] ~= 1) then
r = format("%s-%s", v['modName'],r)
end
return r
end
local function regAtt(frame, v)
registerAttrs(frame, gettype(v, 'harmbutton'), format("nuke%i",v['btn']))
registerAttrs(frame, gettype(v, 'helpbutton'), format("heal%i",v['btn']))
registerAttrs(frame, gettype(v, 'type-heal'), 'spell')
registerAttrs(frame, gettype(v, 'type-nuke'), 'spell')
registerAttrs(frame, gettype(v, 'spell-nuke'), v['spell'])
registerAttrs(frame, gettype(v, 'spell-heal'), v['dualSpell'] and v['spellHeal'] or v['spell'])
end
local function enableFrame(frame, force)
if(InCombatLockdown()) then
eventframe:RegisterEvent("PLAYER_REGEN_ENABLED")
if(not force) then return end
end
if(frame['unit'] and strsub(frame['unit'], 1, 9) == 'nameplate') then
-- print('nameplate ignored', frame['unit'])
return
end
if(frame and frame:GetName()) then
-- disableFrame(frame)
buffButtonSwitch(frame, false)
frame:RegisterForClicks('AnyDown')
for k,v in pairs(db['clicks']) do
regAtt(frame, v)
end
castFrames[frame] = true
end
end
local firstRun = true
local function enableAllFrames()
local frames = {
'PlayerFrame', 'TargetFrame', 'TargetFrameToT', 'FocusFrame', 'FocusFrameToT','PetFrame',
}
for n = 1, 8 do
for i = 1, 5 do
if(n==1) then
if(i<5) then
frames[#frames + 1] = format("PartyMemberFrame%i",i)
frames[#frames + 1] = format("PartyMemberFrame%iPetFrame",i)
frames[#frames + 1] = format("Boss%iTargetFrame",i)
end
frames[#frames + 1] = format("CompactPartyFrameMember%i",i)
end
frames[#frames + 1] = format("CompactRaidGroup%iMember%i",n,i)
end
end
for k,v in pairs(castFrames) do
if(v) then
local frame = k:GetName()
local skip = false
for n = 1, #frames do
if(frames[n] == frame) then
skip = true
break
end
end
if(not skip and frame) then
frames[#frames + 1] = frame
end
end
end
for k,frame in ipairs(frames) do
if(_G[frame]) then
enableFrame(_G[frame], firstRun)
else
-- print('skip', frame)
end
end
firstRun = false
end
local function OnText(message)
addon:OnText(childName, message)
end
local racialSpells = {} -- Beta returns the old names with C_AlliedRaces.GetAllRacialAbilitiesFromID(raceID)
local function isRacialSpell(spellIcon) -- Replace spellIcon with spellName once the bug is fixed
-- local name, rank, icon, castTime, minRange, maxRange, spellId = GetSpellInfo(spellName)
-- print('start',spellIcon)
for k, v in pairs(racialSpells) do
-- local nameR, rankR, iconR, castTimeR, minRangeR, maxRangeR, spellIdR = GetSpellInfo(v)
-- print(' check',v)
if(v == spellIcon) then
return true
end
end
end
local function buildRacialSpells()
local raceName, raceFile, raceID = UnitRace('player')
local res = C_AlliedRaces.GetAllRacialAbilitiesFromID(raceID)
if(res) then
for k, v in pairs(C_AlliedRaces.GetAllRacialAbilitiesFromID(raceID)) do
if(type(v)=='table') then
if(not IsPassiveSpell(v['name']) and not isRacialSpell(v['icon'])) then -- Replace icon with name once the bug is fixed
racialSpells[#racialSpells+1] = v['icon'] -- Replace icon with name once the bug is fixed
end
end
end
end
end
local function buildSpells(self)
if(InCombatLockdown()) then
self:RegisterEvent("PLAYER_REGEN_ENABLED")
return
end
local currentSpec = GetSpecialization()
if currentSpec then
local classInfo = C_CreatureInfo.GetClassInfo(select(3,UnitClass('player')))
buildRacialSpells()
local _, currentSpecName = GetSpecializationInfo(currentSpec)
db['spells'] = {}
for tabIndex = 1, GetNumSpellTabs() do
local name, texture, offset, numEntries, isGuild, offspecID = GetSpellTabInfo(tabIndex)
if(name == currentSpecName or name == classInfo['className'] or tabIndex==1) then
if(offspecID==0) then
for spellIndex = offset + 1, offset + numEntries do
local skillType, special = GetSpellBookItemInfo(spellIndex, BOOKTYPE_SPELL)
if(skillType=="SPELL" and not IsPassiveSpell(spellIndex, BOOKTYPE_SPELL)) then
local spellName, spellSubName = GetSpellBookItemName(spellIndex, BOOKTYPE_SPELL)
-- print(spellName,spellSubName,IsPassiveSpell(spellIndex, BOOKTYPE_SPELL), raceSpell)
local _, _, icon = GetSpellInfo(spellName)
if(not IsAttackSpell(spellName)) then
if(spellSubName and spellSubName ~= "" and not isRacialSpell(icon)) then
-- db['spells'][special] = format("%s (%s)",spellName, spellSubName)
db['spells'][special] = spellName -- Fix when C_AlliedRaces.GetAllRacialAbilitiesFromID(raceID) returns a value
else
db['spells'][special] = spellName
end
end
end
end
end
end
end
end
end
local function OnEvent(self, event, ...)
if(event=="PLAYER_REGEN_ENABLED") then
self:UnregisterEvent(event)
elseif(event=="SPELLS_CHANGED") then
if(InCombatLockdown()) then
self:RegisterEvent("PLAYER_REGEN_ENABLED")
return
end
end
buildSpells(self)
enableAllFrames(self)
end
local function selectSpell()
local list = {}
for spellId, spellName in pairs(db['spells']) do
list[#list+1] = spellName
end
sort(list)
return list
end
local function remClick(pref)
addon['options']['args'][childName]['args']["activeClickzz"]['args'][pref[#pref-1]] = nil
db['clicks'][strsub(pref[#pref-1],10)] = nil
enableAllFrames()
end
local function buildMenu()
for clickName,v in pairs(db['clicks']) do
local grpName = v['btnName']
if(v['mod'] ~= 1) then
grpName = format("%s-%s",strupper(v['modName']),grpName)
end
local clickNum = format("clickNum-%s", clickName)
local grp = addon:AddConfigEntry(childName,"group",clickNum,grpName,'',1,true,nil,nil,nil,options['args'][childName]['args']["activeClickzz"])
addon:AddConfigEntry(childName,"execute","remClick",'Remove',nil,9,remClick,nil,nil,nil,options['args'][childName]['args']["activeClickzz"]['args'][clickNum])
addon:AddConfigEntry(childName,"toggle","dualSpell",'Dual','Set damage and heal spell on same click',8,nil,nil,nil,nil,options['args'][childName]['args']["activeClickzz"]['args'][clickNum])
addon:AddConfigEntry(childName,"select","selectSpell",'Spell',nil,7,selectSpell,nil,nil,nil,options['args'][childName]['args']["activeClickzz"]['args'][clickNum])
if(v['dualSpell']) then
addon:AddConfigEntry(childName,"select","selectSpell2",'Heal Spell',nil,6,selectSpell,nil,nil,nil,options['args'][childName]['args']["activeClickzz"]['args'][clickNum])
end
end
end
local function getPref(pref)
if(pref[#pref] == 'selectSpell') then
local spells = selectSpell()
for i = 1, #spells do
if(spells[i] == db['clicks'][strsub(pref[#pref-1],10)]['spell']) then
return i
end
end
elseif(pref[#pref] == 'selectSpell2') then
local spells = selectSpell()
for i = 1, #spells do
if(spells[i] == db['clicks'][strsub(pref[#pref-1],10)]['spellHeal']) then
return i
end
end
elseif(pref[#pref] == 'dualSpell') then
return db['clicks'][strsub(pref[#pref-1],10)]['dualSpell']
end
return db[pref[#pref]]
end
local function setPref(pref,value)
if(pref[#pref] == 'selectSpell') then
local spells = selectSpell()
db['clicks'][strsub(pref[#pref-1],10)]['spell'] = spells[value]
enableAllFrames()
return
elseif(pref[#pref] == 'dualSpell') then
db['clicks'][strsub(pref[#pref-1],10)]['dualSpell'] = value
buildMenu()
return
elseif(pref[#pref] == 'selectSpell2') then
local spells = selectSpell()
db['clicks'][strsub(pref[#pref-1],10)]['spellHeal'] = spells[value]
enableAllFrames()
return
end
db[pref[#pref]] = value
end
local function addClick()
local mod = tonumber(db['modType'])
if(modifier[mod]) then
local clickName
local btn = tonumber(db['mouseButton'])
local mf = modifier[mod]
local bf = mouseButtons[btn]
if(mod==1) then
clickName = format("type%i", btn)
else
clickName = format("%s-type%i", mf, btn)
end
db['clicks'][clickName] = db['clicks'][clickName] or {
['btnName'] = bf,
['modName'] = mf,
['btn'] = btn,
['mod'] = mod
}
buildMenu()
enableAllFrames()
end
end
hooksecurefunc("CompactUnitFrame_SetUnit", function(self, unit)
if(InCombatLockdown()) then
eventframe:RegisterEvent("PLAYER_REGEN_ENABLED")
return
end
if(unit and not castFrames[self]) then
enableFrame(self,firstRun)
end
end)
do
addon['preloads'][#addon['preloads'] + 1] = function(...)
db = addon['db']['profile'][childName]
eventframe = addon:RegisterFunc({'SPELLS_CHANGED','GROUP_ROSTER_UPDATE','RAID_ROSTER_UPDATE'},"OnEvent",OnEvent)
enableAllFrames()
end
addon:startup(name, childName, function()
options = addon:InitConfig(childName, true, {
['type'] = "launcher", -- 'data source | launcher'
['OnClick'] = OnClick
}, getPref, setPref)
addon:AddConfigEntry(childName,"select","modType",'Modifier',nil,1,modifier,nil,nil,nil,options['args'][childName])
addon:AddConfigEntry(childName,"select","mouseButton",'Mousebutton',nil,2,mouseButtons,nil,nil,nil,options['args'][childName])
addon:AddConfigEntry(childName,"execute","addClick",'Add Click',nil,3,addClick,nil,nil,nil,options['args'][childName])
addon:AddConfigEntry(childName,"group","activeClickzz","Active Clickzz",'',4,true,nil,nil,nil,options['args'][childName])
buildMenu()
end, nil, {
['spells'] = {},
['clicks'] = {},
['mouseButton'] = 1,
['modType'] = 1
})
end