Mercurial > wow > skeletonkey
comparison SkeletonKey/ActionTypes.lua @ 19:67db6b712bf3
- option checkbutton literals are stored by enclosure
- detect and save any old keybindings when a slot is assigned (anything that begins with 'CLICK KeyBinder*' is ours)
- mouseover mode key input will stay active after leaving a button
- button border flashes when a non-modifier key is pressed
author | Nenue |
---|---|
date | Sat, 30 Jul 2016 19:08:11 -0400 |
parents | 500f9b2bd9ac |
children | 564015ef0317 |
comparison
equal
deleted
inserted
replaced
18:91398d284a99 | 19:67db6b712bf3 |
---|---|
19 [PET_MODE_DEFENSIVE] = {SLASH_PET_DEFENSIVE1, 'pet_defensive'}, | 19 [PET_MODE_DEFENSIVE] = {SLASH_PET_DEFENSIVE1, 'pet_defensive'}, |
20 [PET_MODE_PASSIVE] = {SLASH_PET_PASSIVE1, 'pet_passive'}, | 20 [PET_MODE_PASSIVE] = {SLASH_PET_PASSIVE1, 'pet_passive'}, |
21 [PET_MODE_ASSIST] = {SLASH_PET_ASSIST1, 'pet_assist'}, | 21 [PET_MODE_ASSIST] = {SLASH_PET_ASSIST1, 'pet_assist'}, |
22 } | 22 } |
23 | 23 |
24 kb.ActionTypes = {} | |
25 kb.PetCache = {} | |
26 kb.TalentCache = {} | |
27 kb.ProfessionCache = {} | |
28 | |
29 local atype = kb.ActionTypes | |
30 | |
24 --- Caps Lock | 31 --- Caps Lock |
25 local ACTION_HANDLERS = {} | 32 atype['mount'] = function(id, name) |
26 ACTION_HANDLERS['mount'] = function(id, name) | |
27 if id == SUMMON_RANDOM_FAVORITE_MOUNT_SPELL then | 33 if id == SUMMON_RANDOM_FAVORITE_MOUNT_SPELL then |
28 return 'mount_random', "/script C_MountJournal.SummonByID(0)", CLICK_KEYBINDER_MACRO | 34 return 'mount_random', "/script C_MountJournal.SummonByID(0)", CLICK_KEYBINDER_MACRO |
29 else | 35 else |
30 return 'mount_'..id, "/script C_MountJournal.SummonByID("..id..")", CLICK_KEYBINDER_MACRO | 36 return 'mount_'..id, "/script C_MountJournal.SummonByID("..id..")", CLICK_KEYBINDER_MACRO |
31 end | 37 end |
32 end | 38 end |
33 ACTION_HANDLERS['macro'] = function(id, name) | 39 |
40 atype['macro'] = function(id, name) | |
34 return CLICK_KEYBINDER_MACRO, 'macro_' .. tostring(name), id | 41 return CLICK_KEYBINDER_MACRO, 'macro_' .. tostring(name), id |
35 end | 42 end |
36 ACTION_HANDLERS['equipset'] = function(id, name) | 43 |
44 atype['equipset'] = function(id, name) | |
37 return CLICK_KEYBINDER_MACRO, 'equipset_'..tostring(name), "/script UseEquipmentSet("..tostring(id)..")" | 45 return CLICK_KEYBINDER_MACRO, 'equipset_'..tostring(name), "/script UseEquipmentSet("..tostring(id)..")" |
38 end | 46 end |
39 ACTION_HANDLERS['spell'] = function(id, name) | 47 |
48 atype['spell'] = function(id, name) | |
40 local attributeName = name | 49 local attributeName = name |
41 if kb.ProfessionCache[id] then | 50 if kb.ProfessionCache[id] then |
42 attributeName = "profession_".. kb.ProfessionCache[id].profOffset .. '_' .. kb.ProfessionCache[id].spellNum | 51 attributeName = "profession_".. kb.ProfessionCache[id].profOffset .. '_' .. kb.ProfessionCache[id].spellNum |
43 end | 52 end |
44 return CLICK_KEYBINDER_KEY, attributeName, name | 53 return CLICK_KEYBINDER_KEY, attributeName, name |
45 end | 54 end |
46 ACTION_HANDLERS['petaction'] = function(_, name) | 55 |
56 atype['petaction'] = function(_, name) | |
47 -- ID doesn't exist for basic commands, even though they can be picked up | 57 -- ID doesn't exist for basic commands, even though they can be picked up |
48 local attributeName, attributeValue = "petaction_" .. tostring(name), "/cast "..tostring(name) | 58 local attributeName, attributeValue = "petaction_" .. tostring(name), "/cast "..tostring(name) |
49 if PETACTION_SCRIPT[name] then | 59 if PETACTION_SCRIPT[name] then |
50 attributeValue, attributeName = unpack(PETACTION_SCRIPT[name]) | 60 attributeValue, attributeName = unpack(PETACTION_SCRIPT[name]) |
51 end | 61 elseif kb.PetCache.special[name] then |
52 | 62 attributeName = "petaction_special" .. tonumber(kb.PetCache.special[name][2]) |
63 end | |
53 return CLICK_KEYBINDER_MACRO, attributeName, attributeValue | 64 return CLICK_KEYBINDER_MACRO, attributeName, attributeValue |
54 end | 65 end |
55 | 66 |
56 ACTION_HANDLERS['battlepet'] = function(id, name) | 67 atype['battlepet'] = function(id, name) |
57 return CLICK_KEYBINDER_MACRO, 'battlepet_' .. tostring(name), SLASH_SUMMON_BATTLE_PET1 .. " " .. tostring(name) | 68 return CLICK_KEYBINDER_MACRO, 'battlepet_' .. tostring(name), SLASH_SUMMON_BATTLE_PET1 .. " " .. tostring(name) |
58 end | 69 end |
59 ACTION_HANDLERS['item'] = function(id, name) | 70 |
71 atype['item'] = function(id, name) | |
60 return CLICK_KEYBINDER_KEY, 'item_' .. tostring(name), id | 72 return CLICK_KEYBINDER_KEY, 'item_' .. tostring(name), id |
61 end | 73 end |
62 | 74 |
63 | 75 |
64 --- Resolves the SecureActionButton attribute names used for the given action | 76 --- Resolves the SecureActionButton attribute names used for the given action |
65 kb.RegisterAction = function(actionType, id, name) | 77 kb.RegisterAction = function(actionType, id, name) |
66 | 78 |
67 assert(ACTION_HANDLERS[actionType], 'Missing actionType handler for `'..tostring(actionType)..'`') | 79 assert(atype[actionType], 'Missing actionType handler for `'..tostring(actionType)..'`') |
68 local target, attributeName, attributeValue = ACTION_HANDLERS[actionType](id, name) | 80 local target, attributeName, attributeValue = atype[actionType](id, name) |
69 | 81 |
70 local command = target .. attributeName | 82 local command = target .. attributeName |
71 local baseName, iterative = attributeName, 1 | 83 local baseName, iterative = attributeName, 1 |
72 while (kb.macros[attributeName] and kb.macros[attributeName][1] ~= attributeValue) do | 84 while (kb.macros[attributeName] and kb.macros[attributeName][1] ~= attributeValue) do |
73 print(' * cannot use|cFF00FF00', attributeName, '|r"'.. tostring(kb.macros[attributeName][1]) .. '"') | 85 print(' * cannot use|cFF00FF00', attributeName, '|r"'.. tostring(kb.macros[attributeName][1]) .. '"') |
87 end | 99 end |
88 | 100 |
89 | 101 |
90 | 102 |
91 | 103 |
92 kb.inactiveTalentBindings = {} | |
93 kb.ApplyTalentBinding = function(talentInfo, cache) | 104 kb.ApplyTalentBinding = function(talentInfo, cache) |
94 for i = 5, #talentInfo do | 105 for i = 5, #talentInfo do |
95 local command = CLICK_KEYBINDER_KEY.. talentInfo[2] | 106 local command = CLICK_KEYBINDER_KEY.. talentInfo[2] |
96 SetBinding(talentInfo[i], command) | 107 SetBinding(talentInfo[i], command) |
97 cprint(' **', talentInfo[i], '->', command) | 108 cprint(' **', talentInfo[i], '->', command) |
99 end | 110 end |
100 end | 111 end |
101 kb.CacheTalentBinding = function(talentInfo, cache) | 112 kb.CacheTalentBinding = function(talentInfo, cache) |
102 | 113 |
103 local spellID = talentInfo[4] | 114 local spellID = talentInfo[4] |
104 kb.inactiveTalentBindings[spellID] = kb.inactiveTalentBindings[spellID] or {} | 115 cache[spellID] = cache[spellID] or {} |
105 kb.inactiveTalentBindings[spellID] = {select(5,unpack(talentInfo)) } | 116 cache[spellID] = {select(5,unpack(talentInfo)) } |
106 --cprint(spellID, unpack(kb.inactiveTalentBindings[spellID])) | 117 --cprint(spellID, unpack(kb.TalentBindings[spellID])) |
107 end | 118 end |
108 | 119 |
109 do | 120 do |
110 local bindings = kb.bindings | 121 local bindings = kb.bindings |
111 local key, macro = KeyBinderKey, KeyBinderMacro | 122 local key, macro = KeyBinderKey, KeyBinderMacro |
148 end | 159 end |
149 | 160 |
150 for spellName, talentInfo in pairs(profile.talents) do | 161 for spellName, talentInfo in pairs(profile.talents) do |
151 local dummy = GetSpellInfo(spellName) | 162 local dummy = GetSpellInfo(spellName) |
152 local func = kb.CacheTalentBinding | 163 local func = kb.CacheTalentBinding |
153 local dest = kb.inactiveTalentBindings | 164 local dest = kb.TalentBindings |
154 if dummy then | 165 if dummy then |
155 cprint('|cFFBBFF00Active:|r', dummy) | 166 cprint('|cFFBBFF00Active:|r', dummy) |
156 local macroName, spellName, actionType, actionID = unpack(talentInfo) | 167 local macroName, spellName, actionType, actionID = unpack(talentInfo) |
157 bindings[actionType] = bindings[actionType] or {} | 168 bindings[actionType] = bindings[actionType] or {} |
158 bindings[actionType][actionID] = {} | 169 bindings[actionType][actionID] = {} |
166 end | 177 end |
167 | 178 |
168 end | 179 end |
169 | 180 |
170 kb.ApplyAllBindings =function () | 181 kb.ApplyAllBindings =function () |
171 table.wipe(kb.inactiveTalentBindings) | 182 table.wipe(kb.TalentBindings) |
172 | 183 |
173 | 184 |
174 -- reflect action key settings | 185 -- reflect action key settings |
175 if GetCVarBool("ActionButtonUseKeyDown") then | 186 if GetCVarBool("ActionButtonUseKeyDown") then |
176 KeyBinderMacro:RegisterForClicks("AnyDown") | 187 KeyBinderMacro:RegisterForClicks("AnyDown") |
188 | 199 |
189 | 200 |
190 SaveBindings(GetCurrentBindingSet()) | 201 SaveBindings(GetCurrentBindingSet()) |
191 end | 202 end |
192 end | 203 end |
204 | |
205 | |
206 local PET_SPECIAL_SUBTEXT = 'Special Ability' | |
207 local SECONDARY_PROFESSIONS = { | |
208 [5] = 3, | |
209 [7] = 4, | |
210 [9] = 5, | |
211 [10] = 6 | |
212 } | |
213 | |
214 kb.TalentCache = {} | |
215 kb.ProfessionCache = {} | |
216 kb.PetCache = {} | |
217 kb.specInfo = {} | |
218 kb.UpdateSpecInfo = function() | |
219 kb.specInfo.id = GetSpecialization() | |
220 kb.specInfo.globalID, kb.specInfo.name, kb.specInfo.desc, kb.specInfo.texture = GetSpecializationInfo(kb.specInfo.id) | |
221 print('|cFF00FF00current spec:|r', kb.specInfo.id, 'of', GetNumSpecializations()) | |
222 end | |
223 | |
224 kb.UpdateTalentInfo = function() | |
225 if kb.talentsPushed then | |
226 return | |
227 end | |
228 table.wipe(kb.TalentCache) | |
229 for row =1, MAX_TALENT_TIERS do | |
230 for col = 1, NUM_TALENT_COLUMNS do | |
231 local talentID, talentName, icon, selected, available, spellID = GetTalentInfo(row, col, 1) | |
232 local talentInfo = kb.TalentCache[spellID] or {} | |
233 talentInfo.row = 1 | |
234 talentInfo.col = col | |
235 talentInfo.name = talentName | |
236 talentInfo.talentID = talentID | |
237 talentInfo.selected = selected | |
238 talentInfo.available = available | |
239 talentInfo.spellID = spellID | |
240 kb.TalentCache[spellID] = talentInfo | |
241 kb.TalentCache[talentName] = talentInfo | |
242 print('Talent ', row, col, spellID, talentName) | |
243 end | |
244 end | |
245 kb.talentsPushed = true | |
246 | |
247 kb.UpdateDynamicButtons('talent') | |
248 end | |
249 | |
250 kb.UpdateProfessionInfo = function() | |
251 table.wipe(kb.ProfessionCache) | |
252 local profs = {GetProfessions() } | |
253 local primaryNum = 0 | |
254 for i, index in ipairs(profs) do | |
255 local profName, texture, rank, maxRank, numSpells, spellOffset = GetProfessionInfo(index) | |
256 print(i, index, profName, numSpells, spellOffset) | |
257 if not SECONDARY_PROFESSIONS[index] then | |
258 primaryNum = primaryNum + 1 | |
259 end | |
260 local profNum = SECONDARY_PROFESSIONS[index] or primaryNum | |
261 | |
262 | |
263 kb.ProfessionCache[profNum] = kb.ProfessionCache[i] or {} | |
264 | |
265 for j = 1, numSpells do | |
266 local spellName, _, icon, _, _, _, spellID = GetSpellInfo(spellOffset+j, BOOKTYPE_PROFESSION) | |
267 | |
268 local profInfo = { | |
269 spellName = spellName, | |
270 spellID = spellID, | |
271 icon = icon, | |
272 profOffset = i, | |
273 profIndex = index, | |
274 spellOffset = (spellOffset+j), | |
275 spellNum = j | |
276 } | |
277 KeyBinderKey:SetAttribute("*type-profession_"..i .. '_' ..j, "spell") | |
278 KeyBinderKey:SetAttribute("*spell-profession_"..i .. '_' ..j, spellName) | |
279 | |
280 kb.ProfessionCache[i .. '_' .. j] = profInfo | |
281 kb.ProfessionCache[spellName] = profInfo | |
282 kb.ProfessionCache[spellID] = profInfo | |
283 print(' |cFF0088FF['..i..']|r|cFFFF44BB['..spellOffset+i..']|r', spellName, "profession_"..i .. '_' ..j) | |
284 end | |
285 | |
286 end | |
287 | |
288 kb.UpdateDynamicButtons('profession') | |
289 end | |
290 | |
291 | |
292 | |
293 kb.UpdatePetInfo = function() | |
294 kb.PetCache.spell = kb.PetCache.spell or {} | |
295 kb.PetCache.spellslot = kb.PetCache.spellslot or {} | |
296 kb.PetCache.action = kb.PetCache.action or {} | |
297 kb.PetCache.special = kb.PetCache.action or {} | |
298 local hasPetSpells, petType = HasPetSpells() | |
299 if PetHasSpellbook() then | |
300 print('PET SPELLBOOK') | |
301 local i = 1 | |
302 local specialNum = 0 | |
303 repeat | |
304 | |
305 local spellType, spellID = GetSpellBookItemInfo(i, BOOKTYPE_PET) | |
306 local spellName, subText = GetSpellBookItemName(i, BOOKTYPE_PET) | |
307 local isPassive = IsPassiveSpell(i, BOOKTYPE_PET) | |
308 if not isPassive then | |
309 if spellName then | |
310 kb.PetCache.spellslot[spellName] = {i, spellName, subText} | |
311 print('|cFF00FF88spellslot['..spellName..']|r', '=>', i, subText) | |
312 | |
313 if subText == PET_SPECIAL_SUBTEXT then | |
314 specialNum = specialNum + 1 | |
315 kb.PetCache.special[spellName] = {i, specialNum, spellID, subText } | |
316 print('|cFF00FFFFspecial['..spellName..']|r', '=>', i, specialNum, spellID, subText) | |
317 KeyBinderMacro:SetAttribute("*macrotext-pet_special_"..specialNum, "/cast "..spellName) | |
318 end | |
319 | |
320 if spellID then | |
321 kb.PetCache.spell[i] = {spellID, spellName, subText} | |
322 print('|cFF0088FFspell['..i..']|r', '=>', spellID, spellName, subText) | |
323 end | |
324 end | |
325 | |
326 | |
327 end | |
328 | |
329 i = i + 1 | |
330 until spellType == nil | |
331 else | |
332 print('NO PET SPELLBOOK') | |
333 table.wipe(kb.PetCache.spell) | |
334 table.wipe(kb.PetCache.spellslot) | |
335 end | |
336 | |
337 if PetHasActionBar() then | |
338 print('PET ACTION BAR') | |
339 for i = 1, 10 do | |
340 | |
341 | |
342 local name, subtext, texture, isToken, isActive = GetPetActionInfo(i) | |
343 if name then | |
344 kb.PetCache.action[i] = {name, subtext, texture, isToken, isActive } | |
345 | |
346 | |
347 end | |
348 print('|cFFFFFF00action['..i..']|r', name, subtext, texture) | |
349 end | |
350 else | |
351 print('NO PET ACTION BAR') | |
352 table.wipe(kb.PetCache.action) | |
353 end | |
354 | |
355 kb.UpdateDynamicButtons('petaction') | |
356 | |
357 end | |
358 | |
359 kb.UpdateSystemBinds = function() | |
360 table.wipe(kb.SystemBindings) | |
361 local n = GetNumBindings() | |
362 for i=1, n do | |
363 local command, key1, key2 = GetBinding(i) | |
364 if key1 then | |
365 kb.SystemBindings[key1] = command | |
366 end | |
367 if key2 then | |
368 kb.SystemBindings[key2] = command | |
369 end | |
370 end | |
371 end | |
372 | |
373 kb.UpdateDynamicButtons = function(dynamicType) | |
374 for i, button in ipairs(kb.buttons) do | |
375 if button.isDynamic == dynamicType then | |
376 kb.UpdateSlot(button, true) | |
377 end | |
378 end | |
379 end |