Nenue@16
|
1 -- SkeletonKey
|
Nenue@27
|
2 -- ActionTemplates.lua
|
Nenue@16
|
3 -- Created: 7/29/2016 9:14 PM
|
Nenue@16
|
4 -- %file-revision%
|
Nenue@27
|
5 -- Code dealing with the implementation of action hotkeys
|
Nenue@27
|
6
|
Nenue@21
|
7 local tostring, tonumber, pairs, ipairs = tostring, tonumber, pairs, ipairs
|
Nenue@21
|
8 local unpack, SetBinding = unpack, SetBinding
|
Nenue@21
|
9 local tinsert, tContains, select, wipe = tinsert, tContains, select, table.wipe
|
Nenue@21
|
10 local GetSpellBookItemInfo, GetSpellBookItemName, GetSpellInfo = GetSpellBookItemInfo, GetSpellBookItemName, GetSpellInfo
|
Nenue@21
|
11 local GetSpecialization, GetSpecializationInfo, IsPassiveSpell, IsTalentSpell = GetSpecialization, GetSpecializationInfo, IsPassiveSpell, IsTalentSpell
|
Nenue@21
|
12 local PetHasSpellbook, PetHasActionBar, GetPetActionInfo, HasPetSpells = PetHasSpellbook, PetHasActionBar, GetPetActionInfo, HasPetSpells
|
Nenue@21
|
13 local GetProfessions, GetProfessionInfo, GetTalentInfo = GetProfessions, GetProfessionInfo, GetTalentInfo
|
Nenue@21
|
14 local GetNumBindings, GetBinding = GetNumBindings, GetBinding
|
Nenue@21
|
15
|
Nenue@21
|
16 local kb, print, wrap = LibStub('LibKraken').register(KeyBinder, 'Info')
|
Nenue@34
|
17 local cprint = (DEVIAN_PNAME == 'SkeletonKey') and function(...) _G.print('Cfg', ...) end or function() end
|
Nenue@16
|
18
|
Nenue@17
|
19 local CLICK_KEYBINDER_MACRO = "CLICK KeyBinderMacro:"
|
Nenue@17
|
20 local CLICK_KEYBINDER_KEY = "CLICK KeyBinderKey:"
|
Nenue@21
|
21 local PET_BASIC_SUBTEXT = 'Basic Attack'
|
Nenue@21
|
22 local PET_SPECIAL_SUBTEXT = 'Special Ability'
|
Nenue@16
|
23 local PETACTION_SCRIPT = {
|
Nenue@22
|
24 [PET_ACTION_MOVE_TO] = {'pet_move_to', SLASH_PET_MOVE_TO1},
|
Nenue@22
|
25 [PET_ACTION_ATTACK] = {'pet_attack', SLASH_PET_ATTACK1},
|
Nenue@22
|
26 [PET_ACTION_FOLLOW] = {'pet_follow', SLASH_PET_FOLLOW1},
|
Nenue@22
|
27 [PET_ACTION_WAIT] = {'pet_stay', SLASH_PET_STAY1 },
|
Nenue@22
|
28 [PET_MODE_AGGRESSIVE] = {'pet_aggressive', SLASH_PET_AGGRESSIVE1 },
|
Nenue@22
|
29 [PET_MODE_DEFENSIVE] = { 'pet_defensive', SLASH_PET_DEFENSIVE1},
|
Nenue@22
|
30 [PET_MODE_PASSIVE] = { 'pet_passive', SLASH_PET_PASSIVE1},
|
Nenue@22
|
31 [PET_MODE_ASSIST] = {'pet_assist', SLASH_PET_ASSIST1},
|
Nenue@16
|
32 }
|
Nenue@21
|
33 local SECONDARY_PROFESSIONS = {
|
Nenue@21
|
34 [5] = 3,
|
Nenue@21
|
35 [7] = 4,
|
Nenue@21
|
36 [9] = 5,
|
Nenue@21
|
37 [10] = 6
|
Nenue@21
|
38 }
|
Nenue@54
|
39 local petSpellCache,petSubtextCache
|
Nenue@21
|
40 local SUMMON_RANDOM_FAVORITE_MOUNT_SPELL = 150544
|
Nenue@16
|
41
|
Nenue@27
|
42 --kb.ChangedBindings = {}
|
Nenue@27
|
43 --kb.ActionTypes = {}
|
Nenue@19
|
44
|
Nenue@19
|
45 local atype = kb.ActionTypes
|
Nenue@19
|
46
|
Nenue@17
|
47 --- Caps Lock
|
Nenue@19
|
48 atype['mount'] = function(id, name)
|
Nenue@17
|
49 if id == SUMMON_RANDOM_FAVORITE_MOUNT_SPELL then
|
Nenue@24
|
50 return CLICK_KEYBINDER_MACRO, 'mount_random', "/script C_MountJournal.SummonByID(0)"
|
Nenue@17
|
51 else
|
Nenue@24
|
52 return CLICK_KEYBINDER_MACRO, 'mount_'..id, "/script C_MountJournal.SummonByID("..id..")"
|
Nenue@17
|
53 end
|
Nenue@16
|
54 end
|
Nenue@19
|
55
|
Nenue@19
|
56 atype['macro'] = function(id, name)
|
Nenue@17
|
57 return CLICK_KEYBINDER_MACRO, 'macro_' .. tostring(name), id
|
Nenue@17
|
58 end
|
Nenue@19
|
59
|
Nenue@19
|
60 atype['equipset'] = function(id, name)
|
Nenue@17
|
61 return CLICK_KEYBINDER_MACRO, 'equipset_'..tostring(name), "/script UseEquipmentSet("..tostring(id)..")"
|
Nenue@17
|
62 end
|
Nenue@19
|
63
|
Nenue@19
|
64 atype['spell'] = function(id, name)
|
Nenue@17
|
65 local attributeName = name
|
Nenue@17
|
66 if kb.ProfessionCache[id] then
|
Nenue@17
|
67 attributeName = "profession_".. kb.ProfessionCache[id].profOffset .. '_' .. kb.ProfessionCache[id].spellNum
|
Nenue@17
|
68 end
|
Nenue@17
|
69 return CLICK_KEYBINDER_KEY, attributeName, name
|
Nenue@17
|
70 end
|
Nenue@19
|
71
|
Nenue@19
|
72 atype['petaction'] = function(_, name)
|
Nenue@17
|
73 -- ID doesn't exist for basic commands, even though they can be picked up
|
Nenue@17
|
74 local attributeName, attributeValue = "petaction_" .. tostring(name), "/cast "..tostring(name)
|
Nenue@54
|
75
|
Nenue@54
|
76 if not petSpellCache then
|
Nenue@54
|
77 kb.UpdatePetInfo()
|
Nenue@54
|
78 end
|
Nenue@54
|
79 -- Compose a multi-macro for subtext abilities
|
Nenue@54
|
80 if petSpellCache[name] then
|
Nenue@54
|
81 attributeValue = ""
|
Nenue@54
|
82 for spellName, enabled in pairs(petSubtextCache[petSpellCache[name]]) do
|
Nenue@54
|
83 attributeValue = attributeValue .. "/cast " .. spellName .. "\n"
|
Nenue@54
|
84 end
|
Nenue@54
|
85 end
|
Nenue@54
|
86
|
Nenue@17
|
87 if PETACTION_SCRIPT[name] then
|
Nenue@22
|
88 attributeName, attributeValue = unpack(PETACTION_SCRIPT[name])
|
Nenue@19
|
89 elseif kb.PetCache.special[name] then
|
Nenue@21
|
90 attributeName = "petaction_"..kb.PetCache.special[name][3].."_" .. tonumber(kb.PetCache.special[name][6])
|
Nenue@17
|
91 end
|
Nenue@17
|
92 return CLICK_KEYBINDER_MACRO, attributeName, attributeValue
|
Nenue@16
|
93 end
|
Nenue@16
|
94
|
Nenue@19
|
95 atype['battlepet'] = function(id, name)
|
Nenue@17
|
96 return CLICK_KEYBINDER_MACRO, 'battlepet_' .. tostring(name), SLASH_SUMMON_BATTLE_PET1 .. " " .. tostring(name)
|
Nenue@17
|
97 end
|
Nenue@19
|
98
|
Nenue@19
|
99 atype['item'] = function(id, name)
|
Nenue@17
|
100 return CLICK_KEYBINDER_KEY, 'item_' .. tostring(name), id
|
Nenue@17
|
101 end
|
Nenue@16
|
102
|
Nenue@16
|
103
|
Nenue@17
|
104 --- Resolves the SecureActionButton attribute names used for the given action
|
Nenue@16
|
105 kb.RegisterAction = function(actionType, id, name)
|
Nenue@16
|
106
|
Nenue@19
|
107 assert(atype[actionType], 'Missing actionType handler for `'..tostring(actionType)..'`')
|
Nenue@19
|
108 local target, attributeName, attributeValue = atype[actionType](id, name)
|
Nenue@17
|
109
|
Nenue@17
|
110 local command = target .. attributeName
|
Nenue@17
|
111 local baseName, iterative = attributeName, 1
|
Nenue@17
|
112 while (kb.macros[attributeName] and kb.macros[attributeName][1] ~= attributeValue) do
|
Nenue@62
|
113 --print(' * cannot use|cFF00FF00', attributeName, '|r"'.. tostring(kb.macros[attributeName][1]) .. '"')
|
Nenue@17
|
114 attributeName = baseName .. '_' .. iterative
|
Nenue@17
|
115 iterative = iterative + 1
|
Nenue@17
|
116 end
|
Nenue@21
|
117 if attributeName ~= baseName then
|
Nenue@62
|
118 --print(' * Creating|cFF00FF00', attributeName)
|
Nenue@17
|
119 else
|
Nenue@62
|
120 --print(' * Re-using|cFF00FF00', attributeName)
|
Nenue@17
|
121 end
|
Nenue@17
|
122 kb.macros[attributeName] = {attributeValue, command}
|
Nenue@17
|
123
|
Nenue@17
|
124
|
Nenue@62
|
125 --print('RegisterAction', actionType, id, '->', attributeName, attributeValue, target .. attributeName)
|
Nenue@17
|
126 return attributeName, attributeValue, command
|
Nenue@17
|
127 end
|
Nenue@17
|
128
|
Nenue@17
|
129
|
Nenue@17
|
130
|
Nenue@17
|
131
|
Nenue@17
|
132 kb.ApplyTalentBinding = function(talentInfo, cache)
|
Nenue@17
|
133 for i = 5, #talentInfo do
|
Nenue@17
|
134 local command = CLICK_KEYBINDER_KEY.. talentInfo[2]
|
Nenue@17
|
135 SetBinding(talentInfo[i], command)
|
Nenue@62
|
136 --cprint(' **', talentInfo[i], '->', command)
|
Nenue@17
|
137 tinsert(cache, talentInfo[i])
|
Nenue@17
|
138 end
|
Nenue@17
|
139 end
|
Nenue@17
|
140 kb.CacheTalentBinding = function(talentInfo, cache)
|
Nenue@17
|
141
|
Nenue@17
|
142 local spellID = talentInfo[4]
|
Nenue@19
|
143 cache[spellID] = cache[spellID] or {}
|
Nenue@19
|
144 cache[spellID] = {select(5,unpack(talentInfo)) }
|
Nenue@19
|
145 --cprint(spellID, unpack(kb.TalentBindings[spellID]))
|
Nenue@17
|
146 end
|
Nenue@17
|
147
|
Nenue@27
|
148
|
Nenue@17
|
149 do
|
Nenue@17
|
150 local bindings = kb.bindings
|
Nenue@17
|
151 local key, macro = KeyBinderKey, KeyBinderMacro
|
Nenue@17
|
152 kb.LoadBinding = function(command, name, icon, actionType, actionID, macroName, macroText )
|
Nenue@17
|
153
|
Nenue@62
|
154 local buttonTypeKey, buttonTypeValue = "*type-"..name, actionType
|
Nenue@62
|
155 local buttonActionKey, buttonActionValue = "*"..actionType.."-"..name, actionID
|
Nenue@62
|
156 local button = key
|
Nenue@17
|
157 if actionType == 'spell' then
|
Nenue@62
|
158 buttonTypeKey = "*type-"..name
|
Nenue@62
|
159 buttonTypeValue = actionType
|
Nenue@62
|
160 buttonActionKey = "*"..actionType.."-"..name
|
Nenue@62
|
161 buttonActionValue = name
|
Nenue@17
|
162 elseif actionType == 'item' then
|
Nenue@62
|
163 buttonTypeKey = "*type-"..name
|
Nenue@62
|
164 buttonTypeValue = actionType
|
Nenue@62
|
165 buttonActionKey = "*"..actionType.."-"..name
|
Nenue@62
|
166 buttonActionValue = actionID
|
Nenue@17
|
167 elseif actionType == 'macro' then
|
Nenue@62
|
168 button = macro
|
Nenue@62
|
169 buttonTypeKey = "*macro-"..macroName
|
Nenue@62
|
170 buttonTypeValue = actionID
|
Nenue@62
|
171 buttonActionKey = nil
|
Nenue@16
|
172 else
|
Nenue@62
|
173 button = macro
|
Nenue@62
|
174 buttonTypeKey = "*macrotext-"..macroName
|
Nenue@62
|
175 buttonTypeValue = macroText
|
Nenue@62
|
176 buttonActionKey = nil
|
Nenue@16
|
177 end
|
Nenue@62
|
178
|
Nenue@62
|
179 --cprint(actionType, actionID, name)
|
Nenue@62
|
180 --cprint(button:GetName(), buttonTypeKey,'=', buttonTypeValue)
|
Nenue@62
|
181 kb.SecureAttribute(button, buttonTypeKey, buttonTypeValue)
|
Nenue@62
|
182 if buttonActionKey then
|
Nenue@62
|
183 --cprint(button:GetName(), buttonActionKey,'=', buttonActionValue)
|
Nenue@62
|
184 kb.SecureAttribute(button, buttonActionKey, buttonActionValue)
|
Nenue@62
|
185 end
|
Nenue@62
|
186
|
Nenue@50
|
187 local indexKey = actionType..'_'..actionID
|
Nenue@50
|
188 bindings[indexKey] = bindings[indexKey] or {}
|
Nenue@50
|
189 bindings[command] = bindings[indexKey]
|
Nenue@50
|
190 return bindings[indexKey], actionID
|
Nenue@16
|
191 end
|
Nenue@16
|
192
|
Nenue@17
|
193 kb.ApplyBindings = function (profile)
|
Nenue@62
|
194 --cprint('binding profile', profile)
|
Nenue@17
|
195 for slot, data in pairs(profile.buttons) do
|
Nenue@17
|
196 kb.LoadBinding(unpack(data))
|
Nenue@17
|
197 end
|
Nenue@17
|
198
|
Nenue@17
|
199 for key, command in pairs(profile.bindings) do
|
Nenue@17
|
200
|
Nenue@62
|
201 --cprint(' *', key, '->', command)
|
Nenue@17
|
202
|
Nenue@17
|
203 --_G.print('HotKey','loading', key, command)
|
Nenue@17
|
204 SetBinding(key, command)
|
Nenue@17
|
205 if bindings[command] and not tContains(bindings[command], key) then
|
Nenue@17
|
206 tinsert(bindings[command], key)
|
Nenue@17
|
207 end
|
Nenue@17
|
208 end
|
Nenue@17
|
209
|
Nenue@17
|
210 for spellName, talentInfo in pairs(profile.talents) do
|
Nenue@17
|
211 local dummy = GetSpellInfo(spellName)
|
Nenue@17
|
212 local func = kb.CacheTalentBinding
|
Nenue@19
|
213 local dest = kb.TalentBindings
|
Nenue@17
|
214 if dummy then
|
Nenue@62
|
215 --cprint('|cFFBBFF00Active:|r', dummy)
|
Nenue@17
|
216 local macroName, spellName, actionType, actionID = unpack(talentInfo)
|
Nenue@50
|
217 local indexKey = actionType .. '_' .. actionID
|
Nenue@50
|
218 bindings[indexKey] = {}
|
Nenue@17
|
219 func = kb.ApplyTalentBinding
|
Nenue@50
|
220 dest = kb.bindings[indexKey]
|
Nenue@17
|
221 else
|
Nenue@17
|
222
|
Nenue@62
|
223 --cprint('|cFFFF4400Inactive:|r', talentInfo[2])
|
Nenue@17
|
224 end
|
Nenue@17
|
225 func(talentInfo, dest)
|
Nenue@17
|
226 end
|
Nenue@17
|
227
|
Nenue@17
|
228 end
|
Nenue@17
|
229
|
Nenue@17
|
230 kb.ApplyAllBindings =function ()
|
Nenue@21
|
231 wipe(kb.TalentBindings)
|
Nenue@62
|
232 wipe(kb.bindings)
|
Nenue@62
|
233 kb:print('Loading binding profile', kb.profileName)
|
Nenue@17
|
234
|
Nenue@17
|
235 -- reflect action key settings
|
Nenue@17
|
236 if GetCVarBool("ActionButtonUseKeyDown") then
|
Nenue@17
|
237 KeyBinderMacro:RegisterForClicks("AnyDown")
|
Nenue@17
|
238 KeyBinderKey:RegisterForClicks("AnyDown")
|
Nenue@17
|
239 else
|
Nenue@17
|
240 KeyBinderMacro:RegisterForClicks("AnyUp")
|
Nenue@17
|
241 KeyBinderKey:RegisterForClicks("AnyUp")
|
Nenue@17
|
242 end
|
Nenue@17
|
243
|
Nenue@17
|
244 for i, profile in ipairs(kb.orderedProfiles) do
|
Nenue@17
|
245 kb.ApplyBindings(profile)
|
Nenue@17
|
246 end
|
Nenue@17
|
247 -- do this after to ensure that profession binds are properly overridden
|
Nenue@17
|
248 kb.UpdateProfessionInfo()
|
Nenue@17
|
249
|
Nenue@17
|
250
|
Nenue@17
|
251 SaveBindings(GetCurrentBindingSet())
|
Nenue@17
|
252 end
|
Nenue@19
|
253 end
|
Nenue@19
|
254
|
Nenue@19
|
255
|
Nenue@19
|
256 kb.specInfo = {}
|
Nenue@19
|
257 kb.UpdateSpecInfo = function()
|
Nenue@19
|
258 kb.specInfo.id = GetSpecialization()
|
Nenue@19
|
259 kb.specInfo.globalID, kb.specInfo.name, kb.specInfo.desc, kb.specInfo.texture = GetSpecializationInfo(kb.specInfo.id)
|
Nenue@19
|
260 end
|
Nenue@19
|
261
|
Nenue@19
|
262 kb.UpdateTalentInfo = function()
|
Nenue@19
|
263 if kb.talentsPushed then
|
Nenue@19
|
264 return
|
Nenue@19
|
265 end
|
Nenue@21
|
266 wipe(kb.TalentCache)
|
Nenue@19
|
267 for row =1, MAX_TALENT_TIERS do
|
Nenue@19
|
268 for col = 1, NUM_TALENT_COLUMNS do
|
Nenue@19
|
269 local talentID, talentName, icon, selected, available, spellID = GetTalentInfo(row, col, 1)
|
Nenue@19
|
270 local talentInfo = kb.TalentCache[spellID] or {}
|
Nenue@19
|
271 talentInfo.row = 1
|
Nenue@19
|
272 talentInfo.col = col
|
Nenue@19
|
273 talentInfo.name = talentName
|
Nenue@19
|
274 talentInfo.talentID = talentID
|
Nenue@19
|
275 talentInfo.selected = selected
|
Nenue@19
|
276 talentInfo.available = available
|
Nenue@19
|
277 talentInfo.spellID = spellID
|
Nenue@19
|
278 kb.TalentCache[spellID] = talentInfo
|
Nenue@19
|
279 kb.TalentCache[talentName] = talentInfo
|
Nenue@62
|
280 --print('Talent ', row, col, spellID, talentName)
|
Nenue@19
|
281 end
|
Nenue@19
|
282 end
|
Nenue@19
|
283 kb.talentsPushed = true
|
Nenue@19
|
284
|
Nenue@19
|
285 kb.UpdateDynamicButtons('talent')
|
Nenue@19
|
286 end
|
Nenue@19
|
287
|
Nenue@19
|
288 kb.UpdateProfessionInfo = function()
|
Nenue@21
|
289 wipe(kb.ProfessionCache)
|
Nenue@19
|
290 local profs = {GetProfessions() }
|
Nenue@62
|
291 --print(GetProfessions())
|
Nenue@19
|
292 local primaryNum = 0
|
Nenue@30
|
293 for i = 1, 6 do
|
Nenue@30
|
294 if profs[i] then
|
Nenue@30
|
295 local index = profs[i]
|
Nenue@30
|
296 local profName, texture, _, _, numSpells, spellOffset = GetProfessionInfo(index)
|
Nenue@62
|
297 --print(i, index, profName, numSpells, spellOffset)
|
Nenue@30
|
298 if not SECONDARY_PROFESSIONS[index] then
|
Nenue@30
|
299 primaryNum = primaryNum + 1
|
Nenue@30
|
300 end
|
Nenue@30
|
301 local profNum = SECONDARY_PROFESSIONS[index] or primaryNum
|
Nenue@62
|
302 --print(i, profNum)
|
Nenue@19
|
303
|
Nenue@19
|
304
|
Nenue@30
|
305 kb.ProfessionCache[profNum] = kb.ProfessionCache[profNum] or {}
|
Nenue@19
|
306
|
Nenue@30
|
307 for j = 1, numSpells do
|
Nenue@30
|
308 local spellName, _, icon, _, _, _, spellID = GetSpellInfo(spellOffset+j, BOOKTYPE_PROFESSION)
|
Nenue@19
|
309
|
Nenue@30
|
310 local profInfo = {
|
Nenue@30
|
311 spellName = spellName,
|
Nenue@30
|
312 spellID = spellID,
|
Nenue@30
|
313 icon = icon,
|
Nenue@30
|
314 profOffset = i,
|
Nenue@30
|
315 profIndex = index,
|
Nenue@30
|
316 spellOffset = (spellOffset+j),
|
Nenue@30
|
317 spellNum = j
|
Nenue@30
|
318 }
|
Nenue@26
|
319
|
Nenue@30
|
320 kb.SecureAttribute(KeyBinderKey, "*type-profession_"..i .. '_' ..j, "spell")
|
Nenue@30
|
321 kb.SecureAttribute(KeyBinderKey, "*spell-profession_"..i .. '_' ..j, spellName)
|
Nenue@19
|
322
|
Nenue@30
|
323 kb.ProfessionCache[i .. '_' .. j] = profInfo
|
Nenue@30
|
324 kb.ProfessionCache[spellName] = profInfo
|
Nenue@30
|
325 kb.ProfessionCache[spellID] = profInfo
|
Nenue@62
|
326 --print(' |cFF0088FF['..i..']|r|cFFFF44BB['..spellOffset+i..']|r', spellName, "profession_"..i .. '_' ..j)
|
Nenue@30
|
327 end
|
Nenue@19
|
328 end
|
Nenue@19
|
329
|
Nenue@19
|
330 end
|
Nenue@19
|
331
|
Nenue@19
|
332 kb.UpdateDynamicButtons('profession')
|
Nenue@19
|
333 end
|
Nenue@19
|
334
|
Nenue@19
|
335
|
Nenue@19
|
336
|
Nenue@19
|
337 kb.UpdatePetInfo = function()
|
Nenue@19
|
338 local hasPetSpells, petType = HasPetSpells()
|
Nenue@34
|
339
|
Nenue@56
|
340 -- reconcile saved data if it becomes available
|
Nenue@56
|
341 if kb.db then
|
Nenue@56
|
342 kb.db.petSpellsDB = kb.db.petSpellsDB or {}
|
Nenue@56
|
343 kb.db.petSpellsDB.subtext = kb.db.petSpellsDB.subtext or {}
|
Nenue@56
|
344 kb.db.petSpellsDB.spell = kb.db.petSpellsDB.spell or {}
|
Nenue@56
|
345 local spellCache = kb.db.petSpellsDB.spell
|
Nenue@56
|
346 local subtextCache = kb.db.petSpellsDB.subtext
|
Nenue@56
|
347 if petSpellCache then
|
Nenue@56
|
348 for k,v in pairs(petSpellCache) do
|
Nenue@56
|
349 if not spellCache[k] then
|
Nenue@56
|
350 spellCache[k] = v
|
Nenue@56
|
351 end
|
Nenue@56
|
352 end
|
Nenue@56
|
353 end
|
Nenue@57
|
354 petSpellCache = spellCache
|
Nenue@56
|
355 if petSubtextCache then
|
Nenue@56
|
356 for k,v in pairs(petSubtextCache) do
|
Nenue@56
|
357 if not subtextCache[k] then
|
Nenue@56
|
358 subtextCache[k] = v
|
Nenue@56
|
359 end
|
Nenue@56
|
360 end
|
Nenue@56
|
361 end
|
Nenue@57
|
362 petSubtextCache = subtextCache
|
Nenue@56
|
363 else
|
Nenue@56
|
364 petSpellCache = {}
|
Nenue@56
|
365 petSubtextCache = {}
|
Nenue@56
|
366 end
|
Nenue@54
|
367
|
Nenue@19
|
368 if PetHasSpellbook() then
|
Nenue@62
|
369 --print('PET SPELLBOOK')
|
Nenue@19
|
370 local i = 1
|
Nenue@21
|
371 local specialNum = {}
|
Nenue@19
|
372 repeat
|
Nenue@19
|
373
|
Nenue@19
|
374 local spellType, spellID = GetSpellBookItemInfo(i, BOOKTYPE_PET)
|
Nenue@19
|
375 local spellName, subText = GetSpellBookItemName(i, BOOKTYPE_PET)
|
Nenue@21
|
376 local texture = GetSpellBookItemTexture(i, BOOKTYPE_PET)
|
Nenue@19
|
377 local isPassive = IsPassiveSpell(i, BOOKTYPE_PET)
|
Nenue@19
|
378 if not isPassive then
|
Nenue@19
|
379 if spellName then
|
Nenue@21
|
380 kb.PetCache.spellslot[spellName] = {i, spellName, subText, spellID, texture}
|
Nenue@62
|
381 --print('|cFF00FF88spellslot['..spellName..']|r', '=>', i, subText)
|
Nenue@19
|
382
|
Nenue@21
|
383 if subText then
|
Nenue@34
|
384 -- make sure that pet specialization subtext maps correctly
|
Nenue@34
|
385 --if match(subText, kb.PetCache.specName) then
|
Nenue@34
|
386 -- subText = 'specialization'
|
Nenue@34
|
387 --end
|
Nenue@21
|
388 kb.PetCache.subtext[subText] = kb.PetCache.subtext[subText] or {}
|
Nenue@21
|
389 specialNum[subText] = (specialNum[subText] or 0) + 1
|
Nenue@21
|
390
|
Nenue@54
|
391 petSpellCache[spellName] = subText
|
Nenue@54
|
392 petSubtextCache[subText] = petSubtextCache[subText] or {}
|
Nenue@54
|
393
|
Nenue@54
|
394 -- add to the list
|
Nenue@54
|
395 if not petSubtextCache[subText][spellName] then
|
Nenue@54
|
396 petSubtextCache[subText][spellName] = true
|
Nenue@54
|
397
|
Nenue@54
|
398 local macrotext = ""
|
Nenue@54
|
399 for spellName, enabled in pairs(petSubtextCache[subText]) do
|
Nenue@54
|
400 macrotext = macrotext .. "/cast " .. spellName .. "\n"
|
Nenue@54
|
401 end
|
Nenue@54
|
402 kb.SecureAttribute(KeyBinderMacro, "*macrotext-petaction_"..subText.."_"..specialNum[subText], macrotext)
|
Nenue@62
|
403 --print('|cFF00FFFFspecial['..spellName..']|r', '\n','|cFF00FFFFsubtext['..subText..']['..specialNum[subText]..']|r', '=>', i, spellName, subText, spellID, texture, specialNum[subText])
|
Nenue@54
|
404 end
|
Nenue@54
|
405
|
Nenue@54
|
406
|
Nenue@54
|
407
|
Nenue@21
|
408 local entry = {i, spellName, subText, spellID, texture, specialNum[subText]}
|
Nenue@21
|
409
|
Nenue@21
|
410 kb.PetCache.special[spellName] = entry
|
Nenue@21
|
411 kb.PetCache.subtext[subText][specialNum[subText]] = entry
|
Nenue@19
|
412 end
|
Nenue@19
|
413
|
Nenue@19
|
414 if spellID then
|
Nenue@19
|
415 kb.PetCache.spell[i] = {spellID, spellName, subText}
|
Nenue@62
|
416 --print('|cFF0088FFspell['..i..']|r', '=>', spellID, spellName, subText)
|
Nenue@19
|
417 end
|
Nenue@19
|
418 end
|
Nenue@19
|
419
|
Nenue@19
|
420
|
Nenue@19
|
421 end
|
Nenue@19
|
422
|
Nenue@19
|
423 i = i + 1
|
Nenue@19
|
424 until spellType == nil
|
Nenue@19
|
425 else
|
Nenue@62
|
426 --print('NO PET SPELLBOOK')
|
Nenue@21
|
427 wipe(kb.PetCache.spell)
|
Nenue@21
|
428 wipe(kb.PetCache.spellslot)
|
Nenue@19
|
429 end
|
Nenue@19
|
430
|
Nenue@19
|
431 if PetHasActionBar() then
|
Nenue@62
|
432 --print('PET ACTION BAR')
|
Nenue@19
|
433 for i = 1, 10 do
|
Nenue@19
|
434
|
Nenue@19
|
435
|
Nenue@19
|
436 local name, subtext, texture, isToken, isActive = GetPetActionInfo(i)
|
Nenue@19
|
437 if name then
|
Nenue@19
|
438 kb.PetCache.action[i] = {name, subtext, texture, isToken, isActive }
|
Nenue@19
|
439
|
Nenue@19
|
440
|
Nenue@19
|
441 end
|
Nenue@62
|
442 --print('|cFFFFFF00action['..i..']|r', name, subtext, texture)
|
Nenue@19
|
443 end
|
Nenue@19
|
444 else
|
Nenue@62
|
445 --print('NO PET ACTION BAR')
|
Nenue@21
|
446 wipe(kb.PetCache.action)
|
Nenue@19
|
447 end
|
Nenue@19
|
448
|
Nenue@19
|
449 kb.UpdateDynamicButtons('petaction')
|
Nenue@19
|
450
|
Nenue@19
|
451 end
|
Nenue@19
|
452
|
Nenue@19
|
453 kb.UpdateSystemBinds = function()
|
Nenue@21
|
454 wipe(kb.SystemBindings)
|
Nenue@19
|
455 local n = GetNumBindings()
|
Nenue@19
|
456 for i=1, n do
|
Nenue@19
|
457 local command, key1, key2 = GetBinding(i)
|
Nenue@34
|
458 if not command:match('ACTION.*%d+') then
|
Nenue@34
|
459 if key1 then
|
Nenue@34
|
460 kb.SystemBindings[key1] = command
|
Nenue@34
|
461 end
|
Nenue@34
|
462 if key2 then
|
Nenue@34
|
463 kb.SystemBindings[key2] = command
|
Nenue@34
|
464 end
|
Nenue@34
|
465 else
|
Nenue@62
|
466 --print('ignoring action button binding', command)
|
Nenue@19
|
467 end
|
Nenue@19
|
468 end
|
Nenue@19
|
469 end
|
Nenue@19
|
470
|
Nenue@19
|
471 kb.UpdateDynamicButtons = function(dynamicType)
|
Nenue@19
|
472 for i, button in ipairs(kb.buttons) do
|
Nenue@19
|
473 if button.isDynamic == dynamicType then
|
Nenue@19
|
474 kb.UpdateSlot(button, true)
|
Nenue@19
|
475 end
|
Nenue@19
|
476 end
|
Nenue@26
|
477 end
|
Nenue@26
|
478
|
Nenue@26
|
479 kb.pendingAttributes = {}
|
Nenue@26
|
480 kb.SecureAttribute = function(target, name, value)
|
Nenue@26
|
481 if InCombatLockdown() then
|
Nenue@34
|
482 if #kb.pendingAttributes == 0 then
|
Nenue@49
|
483 kb:print(kb.L('Key bindings will be applied when you exit combat.'))
|
Nenue@34
|
484 end
|
Nenue@34
|
485
|
Nenue@26
|
486 tinsert(kb.pendingAttributes, {target, name, value})
|
Nenue@26
|
487 kb:RegisterEvent('PLAYER_REGEN_ENABLED')
|
Nenue@34
|
488
|
Nenue@26
|
489 else
|
Nenue@26
|
490
|
Nenue@62
|
491 --print(target:GetName(), 'attribute', '"'.. tostring(name)..'" = "'..tostring(value)..'"')
|
Nenue@26
|
492 target:SetAttribute(name, value)
|
Nenue@26
|
493 end
|
Nenue@26
|
494 end
|
Nenue@26
|
495
|
Nenue@26
|
496 kb.PLAYER_REGEN_ENABLED = function()
|
Nenue@26
|
497 if #kb.pendingAttributes >= 1 then
|
Nenue@26
|
498 local args = tremove(kb.pendingAttributes)
|
Nenue@26
|
499 while args do
|
Nenue@26
|
500 local target, name, value = unpack(args)
|
Nenue@62
|
501 --print(target:GetName(), 'attribute', '"'.. tostring(name)..'" = "'..tostring(value)..'"')
|
Nenue@26
|
502 target:SetAttribute(name, value)
|
Nenue@26
|
503 args = tremove(kb.pendingAttributes)
|
Nenue@26
|
504 end
|
Nenue@26
|
505 end
|
Nenue@27
|
506
|
Nenue@27
|
507 if #kb.pendingCalls >= 1 then
|
Nenue@27
|
508
|
Nenue@27
|
509 local func = tremove(kb.pendingCalls)
|
Nenue@27
|
510 while func do
|
Nenue@27
|
511 func()
|
Nenue@27
|
512 end
|
Nenue@27
|
513 end
|
Nenue@27
|
514 end
|
Nenue@27
|
515
|
Nenue@27
|
516 kb.UpdateBindingsCache = function(actionType, actionID, bindings)
|
Nenue@50
|
517 local indexKey = actionType .. '_' .. actionID
|
Nenue@50
|
518 kb.bindings[indexKey] = bindings
|
Nenue@27
|
519
|
Nenue@62
|
520 --print('|cFF00FF00'..indexKey..'|r = {', table.concat(bindings,', '), '}')
|
Nenue@27
|
521 tinsert(kb.ChangedBindings, {actionType, actionID})
|
Nenue@16
|
522 end |