Revision 38

This commit is contained in:
Robin 2021-01-13 15:50:31 +01:00
commit 8bdf839b68
5 changed files with 364 additions and 0 deletions

9
Clickzz.toc Normal file
View File

@ -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

346
core.lua Normal file
View File

@ -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

BIN
icon2.tga Normal file

Binary file not shown.

6
license.txt Normal file
View File

@ -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.

3
pack.xml Normal file
View File

@ -0,0 +1,3 @@
<Ui xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd">
<Script file="core.lua"/>
</Ui>