Mercurial > wow > skeletonkey
comparison ActionTemplates.lua @ 74:9824d524a661
- binding slot mixin:
- store key binding definitions under their slot's data table
- apply action button attributes when a slot is assigned
- obtain correct macro body text when a macro is slotted
- fix algorithm for resolving renamed macro indices
- move spell detail lookup code out of mixin script
- event chains:
- initialize addon from PLAYER_LOGIN
- reload keybinds from PLAYER_SPECIALIZATION_CHANGED, after spec profile is resolved
- refresh interface content from SPELLS_CHANGED
- hotkey text:
- restore communication and detection of key binding updates and reflect them accordingly
- properly respond to dynamic bindings that result from talent updates
author | Nenue |
---|---|
date | Sat, 14 Jan 2017 02:29:33 -0500 |
parents | 68365bda5ab5 |
children | e75a2fd448c0 |
comparison
equal
deleted
inserted
replaced
73:68365bda5ab5 | 74:9824d524a661 |
---|---|
104 | 104 |
105 | 105 |
106 --- Resolves the SecureActionButton attribute names used for the given action | 106 --- Resolves the SecureActionButton attribute names used for the given action |
107 kb.RegisterAction = function(actionType, id, name) | 107 kb.RegisterAction = function(actionType, id, name) |
108 assert(atype[actionType], 'Missing actionType handler for `'..tostring(actionType)..'`') | 108 assert(atype[actionType], 'Missing actionType handler for `'..tostring(actionType)..'`') |
109 local target, attributeName, attributeValue, button = atype[actionType](id, name) | 109 local prefix, attributeName, attributeValue, button = atype[actionType](id, name) |
110 local command = target .. attributeName | 110 local command = prefix .. attributeName |
111 | 111 return attributeName, attributeValue, command, prefix, button |
112 return attributeName, attributeValue, command, target, button | 112 end |
113 end | 113 |
114 | 114 |
115 | 115 local spells = {} |
116 local SkeletonKey_GetGenericSpell = function(spellName, spellID, icon) | |
117 if not spells[spellID] then | |
118 spells[spellID] = {} | |
119 spells[spellID].actionType = 'spell' | |
120 spells[spellID].actionID = spellID | |
121 spells[spellID].actionName = spellName | |
122 spells[spellID].iconPath = icon | |
123 spells[spellID].statusText = '|cFFBBBBBBSpell|r' | |
124 spells[spellID].dynamicType = nil | |
125 end | |
126 return spells[spellID] | |
127 end | |
128 | |
129 -- tries to resolve spells from talent overrides/profession book/etc | |
130 local dynamicTypes = {['profession'] = 'ProfessionCache', ['talent'] = 'TalentCache', ['petaction'] = 'PetInfoCache'} | |
131 kb.ResolveSpellSlot = function(self) | |
132 local spellName, spellID, command, icon = self.actionName, self.actionID, self.command, self.iconPath | |
133 --print(' In:', spellName, spellID, command) | |
134 --print(GetSpellInfo(spellName or spellID)) | |
135 local internalName, _, internalIcon, _, _, _, _ = GetSpellInfo(spellName or spellID) | |
136 local isAvailable = internalName and true | |
137 | |
138 if internalName and (internalName ~= spellName) then | |
139 -- it's a binding for the originating spell, leave it as is | |
140 print(' |cFFFF4400spell is an override(', internalName, '~=', spellName,') leave the name info alone') | |
141 self.statusText = '|cFFFFFF00Spell|r' | |
142 self.isAvailable = true | |
143 return | |
144 end | |
145 | |
146 -- let's us match spells replaced by talents | |
147 local info = kb.DynamicSpells[internalName or spellName] | |
148 if not info then | |
149 local dynamicType, dynamicIndex, dynamicSubIndex = command:match("(%a+)_(%S+)_(%S+)") | |
150 if kb.DynamicSpells[dynamicType] then | |
151 print('|cFFFF4400resolving dynamic type index:', internalName, spellName, command) | |
152 dynamicIndex = tonumber(dynamicIndex) | |
153 dynamicSubIndex = tonumber(dynamicSubIndex) | |
154 local cache = kb.DynamicSpells[dynamicType] | |
155 print('type:', dynamicType) | |
156 if dynamicIndex and cache[dynamicIndex] then | |
157 info = kb.DynamicSpells[dynamicType][dynamicIndex] | |
158 print('index:', dynamicIndex) | |
159 if dynamicSubIndex and info[dynamicSubIndex] then | |
160 info = info[dynamicSubIndex] | |
161 print('sub-index:', dynamicSubIndex) | |
162 end | |
163 isAvailable = true | |
164 end | |
165 end | |
166 if not info then | |
167 info = SkeletonKey_GetGenericSpell(spellName, spellID, internalIcon or icon) | |
168 end | |
169 end | |
170 info.isAvailable = isAvailable | |
171 | |
172 print('|cFF00FF88Slot Details:|r', info.actionName, info.actionID, info.dynamicType, info.isAvailable) | |
173 for k,v in pairs(info) do | |
174 --cprint(' ',k,v) | |
175 self[k] = v | |
176 end | |
177 | |
178 return info | |
179 end | |
116 | 180 |
117 | 181 |
118 kb.ApplyTalentBinding = function(talentInfo, cache) | 182 kb.ApplyTalentBinding = function(talentInfo, cache) |
119 talentInfo.assignedKeys = talentInfo.assignedKeys or {} | 183 talentInfo.assignedKeys = talentInfo.assignedKeys or {} |
120 for i , key in pairs(talentInfo.assignedKeys) do | 184 for i , key in pairs(talentInfo.assignedKeys) do |
310 configTable.assignedKeys = talent.assignedKeys | 374 configTable.assignedKeys = talent.assignedKeys |
311 end | 375 end |
312 if not configTable.assignedKeys then | 376 if not configTable.assignedKeys then |
313 configTable.assignedKeys = {GetBindingKey(configTable.command) } | 377 configTable.assignedKeys = {GetBindingKey(configTable.command) } |
314 end | 378 end |
315 if configTable.dynamicType then | 379 if configTable.dynamicType == 'talent' then |
316 kb:print(table.concat(configTable.assignedKeys, ', ') .. ' bound to '.. configTable.actionName) | 380 --kb:print(table.concat(configTable.assignedKeys, ', ') .. ' bound to '.. configTable.actionName) |
317 end | 381 end |
382 for _, key in pairs(configTable.assignedKeys) do | |
383 | |
384 SetBinding(key, configTable.command) | |
385 end | |
386 | |
318 end | 387 end |
319 end | 388 end |
320 end | 389 end |
321 | 390 |
322 kb.ApplyAllBindings =function () | 391 kb.ApplyAllBindings =function () |
323 cprint('|cFF0088FFApplyAllBindings()') | 392 print('|cFFFFFF00ApplyAllBindings()') |
324 wipe(kb.TalentBindings) | 393 wipe(kb.TalentBindings) |
325 wipe(kb.bindings) | 394 wipe(kb.bindings) |
326 --kb:print('Loading binding profile', kb.profileName) | 395 --kb:print('Loading binding profile', kb.profileName) |
327 | 396 |
328 -- reflect action key settings | 397 -- reflect action key settings |
364 kb.UpdateTalentInfo = function() | 433 kb.UpdateTalentInfo = function() |
365 print('|cFFFFFF00kb.UpdateTalentInfo()|r') | 434 print('|cFFFFFF00kb.UpdateTalentInfo()|r') |
366 if kb.talentsPushed then | 435 if kb.talentsPushed then |
367 return | 436 return |
368 end | 437 end |
369 wipe(kb.TalentCache) | |
370 for row =1, MAX_TALENT_TIERS do | 438 for row =1, MAX_TALENT_TIERS do |
371 for col = 1, NUM_TALENT_COLUMNS do | 439 for col = 1, NUM_TALENT_COLUMNS do |
372 local talentID, talentName, icon, selected, available, spellID = GetTalentInfo(row, col, 1) | 440 local talentID, talentName, icon, selected, available, spellID = GetTalentInfo(row, col, 1) |
373 local talentInfo = kb.TalentCache[spellID] or {} | 441 local talentInfo = kb.TalentCache[spellID] or {} |
374 if spellID then | 442 if spellID then |
404 end | 472 end |
405 end | 473 end |
406 end | 474 end |
407 | 475 |
408 kb.talentsPushed = true | 476 kb.talentsPushed = true |
409 | |
410 kb.UpdateDynamicButtons('talent') | 477 kb.UpdateDynamicButtons('talent') |
411 end | 478 end |
412 | 479 |
413 kb.UpdateProfessionInfo = function() | 480 kb.UpdateProfessionInfo = function() |
414 wipe(kb.ProfessionCache) | 481 wipe(kb.ProfessionCache) |
636 kb.SecureAttribute = function(target, name, value) | 703 kb.SecureAttribute = function(target, name, value) |
637 if InCombatLockdown() then | 704 if InCombatLockdown() then |
638 if #kb.pendingAttributes == 0 then | 705 if #kb.pendingAttributes == 0 then |
639 kb:print(kb.L('Key bindings will be applied when you exit combat.')) | 706 kb:print(kb.L('Key bindings will be applied when you exit combat.')) |
640 end | 707 end |
641 | |
642 tinsert(kb.pendingAttributes, {target, name, value}) | 708 tinsert(kb.pendingAttributes, {target, name, value}) |
643 SkeletonKey:RegisterEvent('PLAYER_REGEN_ENABLED') | 709 SkeletonKey:RegisterEvent('PLAYER_REGEN_ENABLED') |
644 | |
645 else | 710 else |
646 | |
647 --cprint('|cFFFF4444' .. target:GetName()..'|r.|cFFFFFF00'.. tostring(name)..'|r = "'..tostring(value)..'"') | 711 --cprint('|cFFFF4444' .. target:GetName()..'|r.|cFFFFFF00'.. tostring(name)..'|r = "'..tostring(value)..'"') |
648 target:SetAttribute(name, value) | 712 target:SetAttribute(name, value) |
649 end | 713 end |
650 end | 714 end |
651 | 715 |