# HG changeset patch
# User Nenue
# Date 1469777235 14400
# Node ID 32d64e42ec9b8bd3ef1c694757afd8b6101389fc
# Parent 82170735e67c4fec768604205b2758faa3a98c11
- 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
diff -r 82170735e67c -r 32d64e42ec9b SkeletonKey/BindingsUI.lua
--- a/SkeletonKey/BindingsUI.lua Thu Jul 28 23:58:53 2016 -0400
+++ b/SkeletonKey/BindingsUI.lua Fri Jul 29 03:27:15 2016 -0400
@@ -226,7 +226,6 @@
--- Retrieves button at index; creates said button and instates any stored parameters
do
local leftSlot, upSlot
- local buttonsDepth = 0
kb.GetSlot = function(index)
local slot = index + kb.scrollOffset
@@ -245,11 +244,9 @@
if index == 1 then
button:SetPoint('TOPLEFT', kb.bg, 'TOPLEFT', BUTTON_PADDING, - BUTTON_PADDING)
upSlot = button
- buttonsDepth = KEY_BUTTON_SIZE + BUTTON_PADDING * 2
elseif newRow then
button:SetPoint('TOPLEFT', upSlot, 'BOTTOMLEFT', 0, -BUTTON_SPACING)
upSlot = button
- buttonsDepth = buttonsDepth + KEY_BUTTON_SIZE + BUTTON_SPACING
else
button:SetPoint('TOPLEFT', leftSlot, 'TOPRIGHT', BUTTON_HSPACING, 0)
end
diff -r 82170735e67c -r 32d64e42ec9b SkeletonKey/Cache.lua
--- a/SkeletonKey/Cache.lua Thu Jul 28 23:58:53 2016 -0400
+++ b/SkeletonKey/Cache.lua Fri Jul 29 03:27:15 2016 -0400
@@ -5,6 +5,7 @@
-- Cached data regarding talent options, pet spells, etc.
local kb, print = LibStub('LibKraken').register(KeyBinder, 'PlayerInfo')
+local PET_SPECIAL_SUBTEXT = 'Special Ability'
local BINDING_TYPE_SPECIALIZATION = 3
local BINDING_TYPE_CHARACTER = 2
local BINDING_TYPE_GLOBAL = 1
@@ -103,6 +104,112 @@
end
+
kb.UpdatePetInfo = function()
+ kb.PetCache.spell = kb.PetCache.spell or {}
+ kb.PetCache.spellslot = kb.PetCache.spellslot or {}
+ kb.PetCache.action = kb.PetCache.action or {}
+ kb.PetCache.special = kb.PetCache.action or {}
+ local hasPetSpells, petType = HasPetSpells()
+ if PetHasSpellbook() then
+ print('PET SPELLBOOK')
+ local i = 1
+ local specialNum = 0
+ repeat
+
+ local spellType, spellID = GetSpellBookItemInfo(i, BOOKTYPE_PET)
+ local spellName, subText = GetSpellBookItemName(i, BOOKTYPE_PET)
+ local isPassive = IsPassiveSpell(i, BOOKTYPE_PET)
+ if not isPassive then
+ if spellName then
+ kb.PetCache.spellslot[spellName] = {i, spellName, subText}
+ print('|cFF00FF88spellslot['..spellName..']|r', '=>', i, subText)
+
+ if subText == PET_SPECIAL_SUBTEXT then
+ specialNum = specialNum + 1
+ kb.PetCache.special[spellName] = {i, specialNum, spellID, subText }
+ print('|cFF00FFFFspecial['..spellName..']|r', '=>', i, specialNum, spellID, subText)
+ end
+
+ if spellID then
+ kb.PetCache.spell[i] = {spellID, spellName, subText}
+ print('|cFF0088FFspell['..i..']|r', '=>', spellID, spellName, subText)
+ end
+ end
+
+
+ end
+
+ i = i + 1
+ until spellType == nil
+ else
+ print('NO PET SPELLBOOK')
+ table.wipe(kb.PetCache.spell)
+ table.wipe(kb.PetCache.spellslot)
+ end
+
+ if PetHasActionBar() then
+ print('PET ACTION BAR')
+ for i = 1, 10 do
+
+
+ local name, subtext, texture, isToken, isActive = GetPetActionInfo(i)
+ if name then
+ kb.PetCache.action[i] = {name, subtext, texture, isToken, isActive }
+
+
+ end
+ print('|cFFFFFF00action['..i..']|r', name, subtext, texture)
+ end
+ else
+ print('NO PET ACTION BAR')
+ table.wipe(kb.PetCache.action)
+ end
+
+ kb.UpdateCacheButtons(kb.petFrames)
+
+end
+
+kb.SystemBinds = {}
+kb.UpdateSystemBinds = function()
+ table.wipe(kb.SystemBinds)
+ local n = GetNumBindings()
+ for i=1, n do
+ local command, key1, key2 = GetBinding(i)
+ if key1 then
+ kb.SystemBinds[key1] = command
+ end
+ if key2 then
+ kb.SystemBinds[key2] = command
+ end
+ end
+
+end
+
+do
+ local garbage = {}
+ kb.UpdateCacheButtons = function(pending)
+ for i, button in ipairs(pending) do
+ if button.isDynamic then
+ print('flushing button', button:GetID())
+ kb.UpdateSlot(button, true)
+ end
+ end
+ end
+end
+
+
+kb.RemoveCacheButton = function(pending, button)
+ local found
+ for index, frame in ipairs(pending) do
+ if button == frame then
+ found = index
+ break
+ end
+ end
+ if found then
+ print('|cFFFF4400pruning', button:GetName(), 'from update queue')
+ tremove(pending, found)
+ end
end
\ No newline at end of file
diff -r 82170735e67c -r 32d64e42ec9b SkeletonKey/Events.lua
--- a/SkeletonKey/Events.lua Thu Jul 28 23:58:53 2016 -0400
+++ b/SkeletonKey/Events.lua Fri Jul 29 03:27:15 2016 -0400
@@ -4,14 +4,16 @@
-- %file-revision%
-- Event handlers, and the init block that sets them up; nothing else should be here
-local kb = LibStub("LibKraken").register(KeyBinder)
+local kb, print = LibStub("LibKraken").register(KeyBinder)
kb.init = function()
kb:RegisterEvent('PLAYER_ENTERING_WORLD')
kb:RegisterEvent('UPDATE_MACROS')
kb:RegisterUnitEvent('PLAYER_SPECIALIZATION_CHANGED', 'player', 'pet')
kb:RegisterUnitEvent('UNIT_PORTRAIT_UPDATE', 'player', 'pet')
+ kb:RegisterUnitEvent('SPELLS_CHANGED')
kb:RegisterUnitEvent('TALENT_UPDATE', 'player', 'pet')
+
kb:RegisterEvent('PLAYER_REGEN_DISABLED')
kb:RegisterEvent('PLAYER_REGEN_ENABLED')
end
@@ -52,10 +54,8 @@
return true
end
-kb.UNIT_PET = function(self, event, unit)
- if unit ~= 'player' then
- return
- end
-
+-- only need to respond to this for pet actions
+kb.SPELLS_CHANGED = function(self, event, unit)
+ print('|cFFFF0088'.. event..'|r', unit)
kb.UpdatePetInfo()
end
\ No newline at end of file
diff -r 82170735e67c -r 32d64e42ec9b SkeletonKey/KeyBinds.xml
--- a/SkeletonKey/KeyBinds.xml Thu Jul 28 23:58:53 2016 -0400
+++ b/SkeletonKey/KeyBinds.xml Fri Jul 29 03:27:15 2016 -0400
@@ -60,6 +60,13 @@
+
+
+
+
+
+
+
diff -r 82170735e67c -r 32d64e42ec9b SkeletonKey/KeySlot.lua
--- a/SkeletonKey/KeySlot.lua Thu Jul 28 23:58:53 2016 -0400
+++ b/SkeletonKey/KeySlot.lua Fri Jul 29 03:27:15 2016 -0400
@@ -7,8 +7,8 @@
local kb, print = LibStub('LibKraken').register(KeyBinder, 'Slot')
local CURSOR_SPELLSLOT, CURSOR_BOOKTYPE, CURSOR_PETACTION
local SUMMON_RANDOM_FAVORITE_MOUNT_SPELL = 150544
-local BORDER_UNASSIGNED = {0.2,0.2,0.2,1 }
-local BORDER_ASSIGNED = {0.5,0.5,0.5,1 }
+local BORDER_UNASSIGNED = {0.2,0.2,0.2,1}
+local BORDER_ASSIGNED = {1,1,1,1}
local BORDER_DYNAMIC = {1,1,0,1}
local BORDER_PENDING = {1,0.5,0,1 }
@@ -39,9 +39,30 @@
local isPickup
hooksecurefunc("PickupPetAction", function(slot, ...)
isPickup = GetCursorInfo()
+ print(slot, ...)
- CURSOR_PETACTION = isPickup and slot
+
+ if kb.PetCache.action[slot] then
+ if isPickup then
+ local key = kb.PetCache.action[slot][1]
+ local spellName = _G[key] or key
+ if spellName and kb.PetCache.spellslot[spellName] then
+ print('picked up', spellName, kb.PetCache.spellslot[spellName][1])
+ CURSOR_SPELLSLOT = kb.PetCache.spellslot[spellName][1]
+ CURSOR_BOOKTYPE = BOOKTYPE_PET
+ end
+
+ else
+ print('Dropped pet action =', GetPetActionInfo(slot))
+ end
print('|cFFFF4400PickupPetAction|r', isPickup, CURSOR_PETACTION)
+ end
+
+ local name, subtext, texture, isToken = GetPetActionInfo(slot)
+ if name then
+ kb.PetCache.action[slot] = {name, subtext, texture, isToken}
+ end
+
end)
end
@@ -59,8 +80,7 @@
end
- local macroName, macroText
- local command, name, icon, _
+ local name, icon, _
local pickupID, pickupBook
if actionType == 'spell' then
@@ -70,17 +90,23 @@
elseif actionType == 'macro' then
name, icon = GetMacroInfo(actionID)
elseif actionType == 'petaction' then
- if not (CURSOR_SPELLSLOT and CURSOR_BOOKTYPE) then
+ if CURSOR_SPELLSLOT and CURSOR_BOOKTYPE then
- ClearCursor()
- ResetCursor()
+ local spellType, spellID = GetSpellBookItemInfo(CURSOR_SPELLSLOT, CURSOR_BOOKTYPE)
+ local spellName, spellText = GetSpellBookItemName(CURSOR_SPELLSLOT, CURSOR_BOOKTYPE)
+ if spellType == 'PETACTION' then
+ actionID = spellText
+ else
+ name, _, icon = GetSpellInfo(spellID)
+ actionID = spellID
+ end
+
+ pickupID = CURSOR_SPELLSLOT
+ pickupBook = CURSOR_BOOKTYPE
+ else
+
end
- local bookType, spellID = GetSpellBookItemInfo(CURSOR_SPELLSLOT, CURSOR_BOOKTYPE)
- actionID = spellID
- pickupID = CURSOR_SPELLSLOT
- pickupBook = CURSOR_BOOKTYPE
- name, _, icon = GetSpellInfo(spellID)
elseif actionType == 'mount' then
if subType == 0 then
name, _, icon = GetSpellInfo(SUMMON_RANDOM_FAVORITE_MOUNT_SPELL)
@@ -99,7 +125,7 @@
icon = petIcon
end
- macroName, macroText, command = kb.RegisterAction(actionType, actionID, name)
+ local macroName, macroText, command = kb.RegisterAction(actionType, actionID, name)
local isAssigned, isBound, assignedBy, boundBy = kb.IsCommandBound(self, command)
@@ -135,7 +161,7 @@
petaction = function(self) return self.pickupSlot, self.pickupBook end,
}
kb.PickupSlot = function(self)
- if not self.command then
+ if not (self.command and self.isAvailable) then
return
end
print(self.actionType)
@@ -175,14 +201,22 @@
if self.command then
print('['..slot..'] =', self.command, GetBindingKey(self.command))
- if self.pending then
- self.border:SetColorTexture(unpack(BORDER_PENDING))
- elseif self.isDynamic then
- self.border:SetColorTexture(unpack(BORDER_DYNAMIC))
+ if not self.isAvailable then
+ self.border:SetColorTexture(1,0,0,1)
+ self.ignoreTexture:Show()
else
- self.border:SetColorTexture(unpack(BORDER_ASSIGNED))
+ self.ignoreTexture:Hide()
+
+ if self.pending then
+ self.border:SetColorTexture(unpack(BORDER_PENDING))
+ elseif self.isDynamic then
+ self.border:SetColorTexture(unpack(BORDER_DYNAMIC))
+ else
+ self.border:SetColorTexture(unpack(BORDER_ASSIGNED))
+ end
end
+
if self.actionType == 'macro' then
self.macro:Show()
else
@@ -199,7 +233,7 @@
end
if self.isDynamic then
- print('|cFFFFBB00UpdateSlot|r: ', self.isDynamic, self.isAvailable, self.actionID)
+ print('|cFF00BBFFUpdateSlot|r:', self.isDynamic, self.isAvailable, self.actionID)
end
if self.isDynamic == 'profession' then
@@ -226,6 +260,9 @@
end
end
+ elseif self.isDynamic == 'petaction' and self.command:match("special") then
+ self.statusText = '|cFF00FF00Pet Special|r'
+ self.bindingText = kb.BindingString(GetBindingKey(self.command))
else
self.statusText = '|cFF00FF00'.. (BUTTON_HEADERS[self.actionType] and BUTTON_HEADERS[self.actionType] or self.actionType) .. '|r'
self.bindingText = kb.BindingString(GetBindingKey(self.command))
@@ -300,6 +337,7 @@
self.border:SetColorTexture(unpack(BORDER_UNASSIGNED))
self:EnableKeyboard(false)
self:SetScript('OnKeyDown', nil)
+ self.ignoreTexture:Hide()
end
kb.SetSlot = function(self, command, name, icon, actionType, actionID, macroName, macroText, pickupSlot, pickupBook)
@@ -336,6 +374,15 @@
isAvailable = GetSpellInfo(name)
end
+ elseif actionType == 'petaction' then
+ isDynamic = 'petaction'
+ if kb.PetCache.spellslot and kb.PetCache.spellslot[name] then
+ isAvailable = true
+ kb.RemoveCacheButton(kb.petFrames, self)
+ else
+ print('|cFFFF4400OnCacheUpdate, re-do #', slot)
+ tinsert(kb.petFrames, self)
+ end
elseif actionType == 'macro' then
if not actionID then
actionID = GetMacroIndexByName(name)
@@ -366,17 +413,10 @@
kb.LoadBinding(command, name, icon, actionType, actionID, macroName, macroText)
end
- if actionType == 'petaction' then
- self.pickupSlot = pickupSlot
- self.pickupBook = pickupBook
- else
- self.pickupSlot = nil
- self.pickupBook = nil
- end
actionID = actionID or 0
self:EnableKeyboard(true)
- 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')
+ 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')
kb.currentProfile.buttons[slot] = {command, name, icon, actionType, actionID, macroName, macroText, pickupSlot, pickupBook}
-- Clean up conflicting entries for loaded button
@@ -390,6 +430,8 @@
self.isAvailable = isAvailable
self.isDynamic = isDynamic
+ self.pickupSlot = pickupSlot
+ self.pickupBook = pickupBook
self.macroText = macroText
self.macroName = macroName
self.actionType = actionType
diff -r 82170735e67c -r 32d64e42ec9b SkeletonKey/SkeletonKey.lua
--- a/SkeletonKey/SkeletonKey.lua Thu Jul 28 23:58:53 2016 -0400
+++ b/SkeletonKey/SkeletonKey.lua Fri Jul 29 03:27:15 2016 -0400
@@ -49,6 +49,18 @@
['item'] = "/use %s"
}
+
+local PETACTION_SCRIPT = {
+ [PET_ACTION_MOVE_TO] = SLASH_PET_MOVE_TO1,
+ [PET_ACTION_ATTACK] = SLASH_PET_ATTACK1,
+ [PET_ACTION_FOLLOW] = SLASH_PET_FOLLOW1,
+ [PET_ACTION_WAIT] = SLASH_PET_STAY1,
+ [PET_MODE_AGGRESSIVE] = SLASH_PET_AGGRESSIVE1,
+ [PET_MODE_DEFENSIVE] = SLASH_PET_DEFENSIVE1,
+ [PET_MODE_PASSIVE] = SLASH_PET_PASSIVE1,
+ [PET_MODE_ASSIST] = SLASH_PET_ASSIST1,
+}
+
local professionMappings = {
[5] = 3,
[7] = 4,
@@ -74,6 +86,9 @@
kb.orderedProfiles = {}
kb.buttons = {}
kb.macros = {}
+kb.petFrames = {} -- pet data is slightly delayed, their buttons are indexed here so they can be refreshed
+kb.talentFrames = {}
+kb.professionFrames = {}
-- these are sent to plugin
@@ -208,6 +223,18 @@
end
print('|cFFFFFF00received|cFFFFFF00', self:GetID(), '|cFF00FFFF', key)
+ local modifier = ''
+ if IsAltKeyDown() then
+ modifier = 'ALT-'
+ end
+ if IsControlKeyDown() then
+ modifier = modifier.. 'CTRL-'
+ end
+ if IsShiftKeyDown() then
+ modifier = modifier..'SHIFT-'
+ end
+ local binding = modifier..key
+
if key == 'ESCAPE' then
local keys = {GetBindingKey(self.command) }
--print('detected', #keys, 'bindings')
@@ -232,30 +259,22 @@
bindsCommitted = false
self.active = false
else
-
- local modifier = ''
- if IsAltKeyDown() then
- modifier = 'ALT-'
- end
- if IsControlKeyDown() then
- modifier = modifier.. 'CTRL-'
- end
- if IsShiftKeyDown() then
- modifier = modifier..'SHIFT-'
+ if kb.SystemBinds[binding] then
+ kb.statustext:SetText(L('BINDING_FAILED_PROTECTED', key, kb.SystemBinds[binding]))
+ return
end
if self.command then
- self.binding = modifier..key
local previousKeys
- local previousAction = GetBindingAction(self.binding)
+ local previousAction = GetBindingAction(binding)
local binding1, binding2, new1, new2
print(type(previousAction), previousAction)
if previousAction ~= "" and previousAction ~= self.command then
if protected[previousAction] then
-- bounce out if trying to use a protected key
- kb.statustext:SetText(L('BINDING_FAILED_PROTECTED', key, GetBindingAction(previousAction)))
+ kb.statustext:SetText(L('BINDING_FAILED_PROTECTED', key, GetBindingAction(binding)))
kb.bindingstext:SetText(nil)
return
else
@@ -265,6 +284,7 @@
end
self.pending = true
+ self.binding = binding
bindsCommitted = false
SetBinding(self.binding, self.command)
@@ -387,6 +407,7 @@
kb.ApplyAllBindings =function ()
table.wipe(kb.inactiveTalentBindings)
+
-- reflect action key settings
if GetCVarBool("ActionButtonUseKeyDown") then
KeyBinderMacro:RegisterForClicks("AnyDown")
@@ -493,7 +514,7 @@
kb.UpdateTalentInfo()
kb.orderedProfiles = {kb.loadedProfiles[BINDING_TYPE_GLOBAL], kb.loadedProfiles[BINDING_TYPE_CHARACTER], kb.loadedProfiles[BINDING_TYPE_SPECIALIZATION]}
- if db.bindMode and (not kb.configTitle[db.bindMode]) then
+ if (not db.bindMode) or (not kb.configTitle[db.bindMode]) then
print('fixing bad bindMode value, was', db.bindMode)
db.bindMode = defaultMode
end
@@ -527,15 +548,8 @@
end
kb.ConfirmBindings = function()
- SaveBindings(GetCurrentBindingSet())
- bindsCommitted = true
- for i, button in ipairs(buttons) do
- button.pending = false
- end
kb.ApplyAllBindings()
-
kb.ui()
- kb:print('Keybinds saved.')
end
@@ -553,8 +567,7 @@
kb.SelectProfileSet(kb.profileName)
-- todo: redo import checking
-
-
+ kb.UpdateSystemBinds()
kb.ApplyAllBindings()
kb.ui(true)