Revision 38
This commit is contained in:
commit
8bdf839b68
|
@ -0,0 +1,9 @@
|
||||||
|
## Interface: 90002
|
||||||
|
## Title: Clickzz
|
||||||
|
## Notes: Clickcasting for Unitframes
|
||||||
|
## Author: Rilgamon
|
||||||
|
## X-WoWI-ID: 25674
|
||||||
|
## SavedVariables: ClickzzDB
|
||||||
|
## OptionalDeps: Ace3, BrokerPack, zzLibCommon
|
||||||
|
Common\common.xml
|
||||||
|
pack.xml
|
|
@ -0,0 +1,346 @@
|
||||||
|
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
|
|
@ -0,0 +1,6 @@
|
||||||
|
The following license excludes the libraries (Libs) included. See the libraries directory or website.
|
||||||
|
|
||||||
|
This AddOn is public domain. That means you can change it, rename it or paint it yellow.
|
||||||
|
My name (Rilgamon) is valid only for WoWInterface.com and curse.com.
|
||||||
|
If you use/offer this addon on another website please remove my name.
|
||||||
|
If you want to give me credit you can replace it with a link to my profile on WoWInterface.com.
|
Loading…
Reference in New Issue