Mercurial > wow > skeletonkey
comparison SkeletonKey/KeySlot.lua @ 15:32d64e42ec9b
- resolve pet bar actions for binding slots
- detect type of petaction (can be spell, stance, or 'PETACTION')
- keep track of displayed pet ability slots and update them alongside pet cache refreshes
| author | Nenue |
|---|---|
| date | Fri, 29 Jul 2016 03:27:15 -0400 |
| parents | 82170735e67c |
| children | cdd387d39137 |
comparison
equal
deleted
inserted
replaced
| 14:82170735e67c | 15:32d64e42ec9b |
|---|---|
| 5 -- All the internal slot logic is kept here | 5 -- All the internal slot logic is kept here |
| 6 | 6 |
| 7 local kb, print = LibStub('LibKraken').register(KeyBinder, 'Slot') | 7 local kb, print = LibStub('LibKraken').register(KeyBinder, 'Slot') |
| 8 local CURSOR_SPELLSLOT, CURSOR_BOOKTYPE, CURSOR_PETACTION | 8 local CURSOR_SPELLSLOT, CURSOR_BOOKTYPE, CURSOR_PETACTION |
| 9 local SUMMON_RANDOM_FAVORITE_MOUNT_SPELL = 150544 | 9 local SUMMON_RANDOM_FAVORITE_MOUNT_SPELL = 150544 |
| 10 local BORDER_UNASSIGNED = {0.2,0.2,0.2,1 } | 10 local BORDER_UNASSIGNED = {0.2,0.2,0.2,1} |
| 11 local BORDER_ASSIGNED = {0.5,0.5,0.5,1 } | 11 local BORDER_ASSIGNED = {1,1,1,1} |
| 12 local BORDER_DYNAMIC = {1,1,0,1} | 12 local BORDER_DYNAMIC = {1,1,0,1} |
| 13 local BORDER_PENDING = {1,0.5,0,1 } | 13 local BORDER_PENDING = {1,0.5,0,1 } |
| 14 | 14 |
| 15 local BUTTON_HEADERS = { | 15 local BUTTON_HEADERS = { |
| 16 ['spell'] = SPELLS, | 16 ['spell'] = SPELLS, |
| 37 do | 37 do |
| 38 -- Pet actions | 38 -- Pet actions |
| 39 local isPickup | 39 local isPickup |
| 40 hooksecurefunc("PickupPetAction", function(slot, ...) | 40 hooksecurefunc("PickupPetAction", function(slot, ...) |
| 41 isPickup = GetCursorInfo() | 41 isPickup = GetCursorInfo() |
| 42 | 42 print(slot, ...) |
| 43 CURSOR_PETACTION = isPickup and slot | 43 |
| 44 | |
| 45 if kb.PetCache.action[slot] then | |
| 46 if isPickup then | |
| 47 local key = kb.PetCache.action[slot][1] | |
| 48 local spellName = _G[key] or key | |
| 49 if spellName and kb.PetCache.spellslot[spellName] then | |
| 50 print('picked up', spellName, kb.PetCache.spellslot[spellName][1]) | |
| 51 CURSOR_SPELLSLOT = kb.PetCache.spellslot[spellName][1] | |
| 52 CURSOR_BOOKTYPE = BOOKTYPE_PET | |
| 53 end | |
| 54 | |
| 55 else | |
| 56 print('Dropped pet action =', GetPetActionInfo(slot)) | |
| 57 end | |
| 44 print('|cFFFF4400PickupPetAction|r', isPickup, CURSOR_PETACTION) | 58 print('|cFFFF4400PickupPetAction|r', isPickup, CURSOR_PETACTION) |
| 59 end | |
| 60 | |
| 61 local name, subtext, texture, isToken = GetPetActionInfo(slot) | |
| 62 if name then | |
| 63 kb.PetCache.action[slot] = {name, subtext, texture, isToken} | |
| 64 end | |
| 65 | |
| 45 end) | 66 end) |
| 46 end | 67 end |
| 47 | 68 |
| 48 | 69 |
| 49 kb.DropToSlot = function(self) | 70 kb.DropToSlot = function(self) |
| 57 ResetCursor() | 78 ResetCursor() |
| 58 return | 79 return |
| 59 end | 80 end |
| 60 | 81 |
| 61 | 82 |
| 62 local macroName, macroText | 83 local name, icon, _ |
| 63 local command, name, icon, _ | |
| 64 local pickupID, pickupBook | 84 local pickupID, pickupBook |
| 65 | 85 |
| 66 if actionType == 'spell' then | 86 if actionType == 'spell' then |
| 67 actionID = subData | 87 actionID = subData |
| 68 name, _, icon = GetSpellInfo(actionID) | 88 name, _, icon = GetSpellInfo(actionID) |
| 69 | 89 |
| 70 elseif actionType == 'macro' then | 90 elseif actionType == 'macro' then |
| 71 name, icon = GetMacroInfo(actionID) | 91 name, icon = GetMacroInfo(actionID) |
| 72 elseif actionType == 'petaction' then | 92 elseif actionType == 'petaction' then |
| 73 if not (CURSOR_SPELLSLOT and CURSOR_BOOKTYPE) then | 93 if CURSOR_SPELLSLOT and CURSOR_BOOKTYPE then |
| 74 | 94 |
| 75 ClearCursor() | 95 local spellType, spellID = GetSpellBookItemInfo(CURSOR_SPELLSLOT, CURSOR_BOOKTYPE) |
| 76 ResetCursor() | 96 local spellName, spellText = GetSpellBookItemName(CURSOR_SPELLSLOT, CURSOR_BOOKTYPE) |
| 77 end | 97 if spellType == 'PETACTION' then |
| 78 | 98 actionID = spellText |
| 79 local bookType, spellID = GetSpellBookItemInfo(CURSOR_SPELLSLOT, CURSOR_BOOKTYPE) | 99 else |
| 80 actionID = spellID | 100 name, _, icon = GetSpellInfo(spellID) |
| 81 pickupID = CURSOR_SPELLSLOT | 101 actionID = spellID |
| 82 pickupBook = CURSOR_BOOKTYPE | 102 end |
| 83 name, _, icon = GetSpellInfo(spellID) | 103 |
| 104 pickupID = CURSOR_SPELLSLOT | |
| 105 pickupBook = CURSOR_BOOKTYPE | |
| 106 else | |
| 107 | |
| 108 end | |
| 109 | |
| 84 elseif actionType == 'mount' then | 110 elseif actionType == 'mount' then |
| 85 if subType == 0 then | 111 if subType == 0 then |
| 86 name, _, icon = GetSpellInfo(SUMMON_RANDOM_FAVORITE_MOUNT_SPELL) | 112 name, _, icon = GetSpellInfo(SUMMON_RANDOM_FAVORITE_MOUNT_SPELL) |
| 87 actionID = 0 | 113 actionID = 0 |
| 88 else | 114 else |
| 97 local speciesID, customName, level, xp, maxXp, displayID, isFavorite, petName, petIcon, petType, creatureID = C_PetJournal.GetPetInfoByPetID(detail); | 123 local speciesID, customName, level, xp, maxXp, displayID, isFavorite, petName, petIcon, petType, creatureID = C_PetJournal.GetPetInfoByPetID(detail); |
| 98 name = customName or petName | 124 name = customName or petName |
| 99 icon = petIcon | 125 icon = petIcon |
| 100 | 126 |
| 101 end | 127 end |
| 102 macroName, macroText, command = kb.RegisterAction(actionType, actionID, name) | 128 local macroName, macroText, command = kb.RegisterAction(actionType, actionID, name) |
| 103 | 129 |
| 104 | 130 |
| 105 local isAssigned, isBound, assignedBy, boundBy = kb.IsCommandBound(self, command) | 131 local isAssigned, isBound, assignedBy, boundBy = kb.IsCommandBound(self, command) |
| 106 if isAssigned then | 132 if isAssigned then |
| 107 local popup = StaticPopupDialogs["SKELETONKEY_CONFIRM_ASSIGN_SLOT"] | 133 local popup = StaticPopupDialogs["SKELETONKEY_CONFIRM_ASSIGN_SLOT"] |
| 133 local GetPickupValue = { | 159 local GetPickupValue = { |
| 134 spell = function(self) return select(7, GetSpellInfo(self.actionID)) end, | 160 spell = function(self) return select(7, GetSpellInfo(self.actionID)) end, |
| 135 petaction = function(self) return self.pickupSlot, self.pickupBook end, | 161 petaction = function(self) return self.pickupSlot, self.pickupBook end, |
| 136 } | 162 } |
| 137 kb.PickupSlot = function(self) | 163 kb.PickupSlot = function(self) |
| 138 if not self.command then | 164 if not (self.command and self.isAvailable) then |
| 139 return | 165 return |
| 140 end | 166 end |
| 141 print(self.actionType) | 167 print(self.actionType) |
| 142 if self.actionType == 'spell' then | 168 if self.actionType == 'spell' then |
| 143 -- It can't be picked up if SpellInfo(name) returns void | 169 -- It can't be picked up if SpellInfo(name) returns void |
| 173 end | 199 end |
| 174 | 200 |
| 175 if self.command then | 201 if self.command then |
| 176 print('['..slot..'] =', self.command, GetBindingKey(self.command)) | 202 print('['..slot..'] =', self.command, GetBindingKey(self.command)) |
| 177 | 203 |
| 178 if self.pending then | 204 if not self.isAvailable then |
| 179 self.border:SetColorTexture(unpack(BORDER_PENDING)) | 205 self.border:SetColorTexture(1,0,0,1) |
| 180 elseif self.isDynamic then | 206 self.ignoreTexture:Show() |
| 181 self.border:SetColorTexture(unpack(BORDER_DYNAMIC)) | 207 else |
| 182 else | 208 self.ignoreTexture:Hide() |
| 183 self.border:SetColorTexture(unpack(BORDER_ASSIGNED)) | 209 |
| 184 end | 210 if self.pending then |
| 211 self.border:SetColorTexture(unpack(BORDER_PENDING)) | |
| 212 elseif self.isDynamic then | |
| 213 self.border:SetColorTexture(unpack(BORDER_DYNAMIC)) | |
| 214 else | |
| 215 self.border:SetColorTexture(unpack(BORDER_ASSIGNED)) | |
| 216 end | |
| 217 end | |
| 218 | |
| 185 | 219 |
| 186 if self.actionType == 'macro' then | 220 if self.actionType == 'macro' then |
| 187 self.macro:Show() | 221 self.macro:Show() |
| 188 else | 222 else |
| 189 self.macro:Hide() | 223 self.macro:Hide() |
| 197 | 231 |
| 198 end | 232 end |
| 199 end | 233 end |
| 200 | 234 |
| 201 if self.isDynamic then | 235 if self.isDynamic then |
| 202 print('|cFFFFBB00UpdateSlot|r: ', self.isDynamic, self.isAvailable, self.actionID) | 236 print('|cFF00BBFFUpdateSlot|r:', self.isDynamic, self.isAvailable, self.actionID) |
| 203 end | 237 end |
| 204 | 238 |
| 205 if self.isDynamic == 'profession' then | 239 if self.isDynamic == 'profession' then |
| 206 local profText = (self.spellNum == 1) and TRADE_SKILLS or (BUTTON_HEADERS[self.profIndex] or GetProfessionInfo(self.profIndex)) | 240 local profText = (self.spellNum == 1) and TRADE_SKILLS or (BUTTON_HEADERS[self.profIndex] or GetProfessionInfo(self.profIndex)) |
| 207 if self.isAvailable then | 241 if self.isAvailable then |
| 224 print(self.actionID, #kb.inactiveTalentBindings[self.actionID]) | 258 print(self.actionID, #kb.inactiveTalentBindings[self.actionID]) |
| 225 self.bindingText= kb.BindingString(unpack(kb.inactiveTalentBindings[self.actionID])) | 259 self.bindingText= kb.BindingString(unpack(kb.inactiveTalentBindings[self.actionID])) |
| 226 end | 260 end |
| 227 | 261 |
| 228 end | 262 end |
| 263 elseif self.isDynamic == 'petaction' and self.command:match("special") then | |
| 264 self.statusText = '|cFF00FF00Pet Special|r' | |
| 265 self.bindingText = kb.BindingString(GetBindingKey(self.command)) | |
| 229 else | 266 else |
| 230 self.statusText = '|cFF00FF00'.. (BUTTON_HEADERS[self.actionType] and BUTTON_HEADERS[self.actionType] or self.actionType) .. '|r' | 267 self.statusText = '|cFF00FF00'.. (BUTTON_HEADERS[self.actionType] and BUTTON_HEADERS[self.actionType] or self.actionType) .. '|r' |
| 231 self.bindingText = kb.BindingString(GetBindingKey(self.command)) | 268 self.bindingText = kb.BindingString(GetBindingKey(self.command)) |
| 232 end | 269 end |
| 233 | 270 |
| 298 self.profile = nil | 335 self.profile = nil |
| 299 self.icon:SetTexture(nil) | 336 self.icon:SetTexture(nil) |
| 300 self.border:SetColorTexture(unpack(BORDER_UNASSIGNED)) | 337 self.border:SetColorTexture(unpack(BORDER_UNASSIGNED)) |
| 301 self:EnableKeyboard(false) | 338 self:EnableKeyboard(false) |
| 302 self:SetScript('OnKeyDown', nil) | 339 self:SetScript('OnKeyDown', nil) |
| 340 self.ignoreTexture:Hide() | |
| 303 end | 341 end |
| 304 | 342 |
| 305 kb.SetSlot = function(self, command, name, icon, actionType, actionID, macroName, macroText, pickupSlot, pickupBook) | 343 kb.SetSlot = function(self, command, name, icon, actionType, actionID, macroName, macroText, pickupSlot, pickupBook) |
| 306 local slot = self:GetID() | 344 local slot = self:GetID() |
| 307 local isDynamic, isAvailable | 345 local isDynamic, isAvailable |
| 333 isDynamic = 'talent' | 371 isDynamic = 'talent' |
| 334 print(' Special slot: |cFFBBFF00talent|r', name, isAvailable) | 372 print(' Special slot: |cFFBBFF00talent|r', name, isAvailable) |
| 335 end | 373 end |
| 336 | 374 |
| 337 isAvailable = GetSpellInfo(name) | 375 isAvailable = GetSpellInfo(name) |
| 376 end | |
| 377 elseif actionType == 'petaction' then | |
| 378 isDynamic = 'petaction' | |
| 379 if kb.PetCache.spellslot and kb.PetCache.spellslot[name] then | |
| 380 isAvailable = true | |
| 381 kb.RemoveCacheButton(kb.petFrames, self) | |
| 382 else | |
| 383 print('|cFFFF4400OnCacheUpdate, re-do #', slot) | |
| 384 tinsert(kb.petFrames, self) | |
| 338 end | 385 end |
| 339 elseif actionType == 'macro' then | 386 elseif actionType == 'macro' then |
| 340 if not actionID then | 387 if not actionID then |
| 341 actionID = GetMacroIndexByName(name) | 388 actionID = GetMacroIndexByName(name) |
| 342 end | 389 end |
| 364 end | 411 end |
| 365 end | 412 end |
| 366 kb.LoadBinding(command, name, icon, actionType, actionID, macroName, macroText) | 413 kb.LoadBinding(command, name, icon, actionType, actionID, macroName, macroText) |
| 367 end | 414 end |
| 368 | 415 |
| 369 if actionType == 'petaction' then | |
| 370 self.pickupSlot = pickupSlot | |
| 371 self.pickupBook = pickupBook | |
| 372 else | |
| 373 self.pickupSlot = nil | |
| 374 self.pickupBook = nil | |
| 375 end | |
| 376 | 416 |
| 377 actionID = actionID or 0 | 417 actionID = actionID or 0 |
| 378 self:EnableKeyboard(true) | 418 self:EnableKeyboard(true) |
| 379 print(' |cFF00FF00kb.currentProfile.buttons['..slot..'] |cFF00FFFF=|r |cFF00FFFF"'.. command.. '"|r |cFF00FF00"'.. name, '"|r |cFFFFFF00icon:'.. icon .. '|r |cFFFF8800"'.. actionType, '"|r |cFFFF0088id:'.. actionID ..'|r |cFF00FF00"'.. macroName .. '"|r') | 419 print(' |cFF00FF00kb.currentProfile.buttons['..slot..'] |cFF00FFFF=|r |cFF00FFFF"'.. command.. '"|r |cFF00FF00"'.. name.. '"|r |cFFFFFF00icon:'.. icon .. '|r |cFFFF8800"'.. actionType, '"|r |cFFFF0088id:'.. actionID ..'|r |cFF00FF00"'.. macroName .. '"|r') |
| 380 kb.currentProfile.buttons[slot] = {command, name, icon, actionType, actionID, macroName, macroText, pickupSlot, pickupBook} | 420 kb.currentProfile.buttons[slot] = {command, name, icon, actionType, actionID, macroName, macroText, pickupSlot, pickupBook} |
| 381 | 421 |
| 382 -- Clean up conflicting entries for loaded button | 422 -- Clean up conflicting entries for loaded button |
| 383 local previous = kb.currentProfile.commands[command] | 423 local previous = kb.currentProfile.commands[command] |
| 384 if previous ~= slot and kb.buttons[previous] then | 424 if previous ~= slot and kb.buttons[previous] then |
| 388 end | 428 end |
| 389 | 429 |
| 390 self.isAvailable = isAvailable | 430 self.isAvailable = isAvailable |
| 391 self.isDynamic = isDynamic | 431 self.isDynamic = isDynamic |
| 392 | 432 |
| 433 self.pickupSlot = pickupSlot | |
| 434 self.pickupBook = pickupBook | |
| 393 self.macroText = macroText | 435 self.macroText = macroText |
| 394 self.macroName = macroName | 436 self.macroName = macroName |
| 395 self.actionType = actionType | 437 self.actionType = actionType |
| 396 self.actionID = actionID | 438 self.actionID = actionID |
| 397 self.actionName = name | 439 self.actionName = name |
