annotate Turok/Modules/Timer/Status.lua @ 11:0b1a2f3dbfc4 tip

aura duration override triggering activation twice when aura data still exists briefly after duration end
author Nenue
date Mon, 22 Feb 2016 03:11:54 -0500
parents 9400a0ff8540
children
rev   line source
Nenue@6 1 local _G, T = _G, Turok
Nenue@6 2 local mod = T.modules.TimerControl
Nenue@6 3 local P = mod.prototype
Nenue@6 4 local GetInventoryItemID, GetItemInfo, GetInventoryItemTexture = GetInventoryItemID, GetItemInfo, GetInventoryItemTexture
Nenue@6 5 local GetSpellDescription, GetSpellInfo, GetSpellCharges = GetSpellDescription, GetSpellInfo, GetSpellCharges
Nenue@6 6 local tinsert, type, tonumber, pairs, ipairs, unpack = tinsert, type, tonumber, pairs, ipairs, unpack
Nenue@6 7 local UnitGUID = UnitGUID
Nenue@6 8 local GetTalentInfo, GetTalentInfoByID, GetItemSpell, PaperDoll_IsEquippedSlot = GetTalentInfo, GetTalentInfoByID, GetItemSpell, PaperDoll_IsEquippedSlot
Nenue@6 9 --@debug@
Nenue@6 10 local DEBUG = true
Nenue@6 11 --@end-debug@
Nenue@6 12 local cType, cText, cNum, cWord, cKey, cPink, cBool = cType, cText, cNum, cWord, cKey, cPink, cBool
Nenue@6 13 local print = function(...)
Nenue@6 14 if not DEBUG then return end
Nenue@6 15 if _G.Devian and _G.DevianDB.workspace ~= 1 then
Nenue@6 16 _G.print('Timer', ...)
Nenue@6 17 end
Nenue@6 18 end
Nenue@9 19 local tfprint = function(...)
Nenue@9 20 if not DEBUG then return end
Nenue@9 21 if _G.Devian and _G.DevianDB.workspace ~= 1 then
Nenue@9 22 _G.print('TimerFocus', ...)
Nenue@9 23 end
Nenue@9 24 end
Nenue@6 25 ------------------------------------------
Nenue@6 26 --- Parameter Prototypes
Nenue@6 27
Nenue@6 28 local Timer_GetPrintHandler = function(self)
Nenue@6 29 return self.trace and function(...)
Nenue@6 30 print(...)
Nenue@9 31 tfprint( ...)
Nenue@6 32 end or print
Nenue@6 33 end
Nenue@6 34
Nenue@6 35 local Timer_UpdateIndex = function(self, key, value)
Nenue@6 36 local print = Timer_GetPrintHandler(self)
Nenue@6 37 -- sfk[value] = frame index key-value handle
Nenue@6 38 -- mfkv = key-value frame index
Nenue@6 39 -- mfkv[sfk[value]] = *frame
Nenue@6 40 if self.frames[key] then
Nenue@6 41 local sfk = self.frames[key]
Nenue@6 42 -- for each unique value
Nenue@6 43 for oldValue, index in pairs(sfk) do
Nenue@6 44 local mfkv = mod.frames[key][oldValue]
Nenue@6 45 -- for each offset after index
Nenue@6 46 for i = index+1, #mfkv do
Nenue@6 47 mfkv[i-1] = mfkv[i] -- slide it down
Nenue@6 48 end
Nenue@6 49 sfk[oldValue] = nil
Nenue@6 50 print(cText(' *= self.frames')..'['..cKey(key)..']['..cNum(value)..'] =', cNum(self.frames[key][value]))
Nenue@6 51 print(cText(' *= mod.frames')..'['..cKey(key)..']['..cNum(value)..']['..cNum(index)..'] =', cNum(self:GetName()))
Nenue@6 52 end
Nenue@6 53 else
Nenue@6 54 self.frames[key] = {}
Nenue@6 55 end
Nenue@6 56
Nenue@6 57 if value then
Nenue@6 58 local mfkv = mod.frames[key][value]
Nenue@6 59 local sfk = self.frames[key]
Nenue@6 60 mfkv[#mfkv+1] = self
Nenue@6 61 sfk[value] = #mfkv
Nenue@6 62 print(' *= self.frames['..cKey(key)..']['..cNum(value)..'] = ', sfk[value])
Nenue@6 63 end
Nenue@6 64 end
Nenue@6 65
Nenue@9 66 --- update conditional cvars (i.e. talentRow(5) pulls up column 3, so cvars.x = args[talentRow][3].x)
Nenue@9 67 local Timer_SetAttributeValues = function(self, key, value)
Nenue@9 68 print(' ', cKey(key), 'sub-value =', cNum(value))
Nenue@9 69 local sda = self.dvars.args
Nenue@9 70 if sda and sda[key] then
Nenue@9 71 print(cText(' conditional:'))
Nenue@9 72 local dvals = (value and sda[key][value]) and sda[key][value] or sda[key].default
Nenue@9 73 for k, v in pairs(dvals) do
Nenue@9 74 print(cText(' '), 'cvars.'..cKey(k), '=', cWord(v))
Nenue@9 75 self.cvars[k] = v
Nenue@9 76 end
Nenue@9 77 end
Nenue@9 78 end
Nenue@9 79
Nenue@6 80 --- spellID
Nenue@6 81 do
Nenue@6 82 local spellID = P.status.spellID
Nenue@6 83 spellID.Init = function(self, spellID)
Nenue@6 84 local print = Timer_GetPrintHandler(self)
Nenue@6 85
Nenue@6 86 if type(spellID) == 'table' then
Nenue@6 87 spellID = spellID[T.specPage]
Nenue@6 88 end
Nenue@6 89
Nenue@6 90 -- May have changed if invoked through a slot assignment
Nenue@6 91 if spellID ~= self.spellID then
Nenue@6 92 self.spellID = spellID
Nenue@6 93 self.charges, self.maxCharges, self.chargeStart, self.chargeDuration = GetSpellCharges(spellID)
Nenue@6 94 self.spellDescription = GetSpellDescription(spellID)
Nenue@6 95 self.spellName, self.spellRank, self.spellIcon, self.castingTime, self.minRange, self.maxRange = GetSpellInfo(spellID)
Nenue@6 96 --@debug@
Nenue@6 97 print(' ', cWord('spellID ='), cKey(self.spellID), cNum(self.spellName), cText(self.spellDescription and '<desc>' or '<empty>'))--@end-debug@
Nenue@6 98
Nenue@6 99 Timer_UpdateIndex(self, 'spellID', spellID)
Nenue@6 100 end
Nenue@6 101 end
Nenue@6 102 end
Nenue@6 103
Nenue@6 104 --- spellName
Nenue@6 105 do
Nenue@6 106 local spellName = P.status.spellName
Nenue@6 107 spellName.Init = function(self, spellName)
Nenue@6 108 local print = Timer_GetPrintHandler(self)
Nenue@6 109 -- attempt to get spell info
Nenue@6 110 local exists, _, _, _, _, _, spellID = GetSpellInfo(spellName)
Nenue@6 111 if exists then
Nenue@6 112 local charges, maxCharges, start, duration = GetSpellCharges(spellID or spellName)
Nenue@6 113 Timer_UpdateIndex(self, 'spellName', nil)
Nenue@6 114 print(' ', cKey("spellID"), '=', spellID)
Nenue@6 115 P.status.spellID.Init(self, spellID)
Nenue@6 116 else
Nenue@6 117 print(' ', cPink("spellID"), '=', 'not sure')
Nenue@6 118 Timer_UpdateIndex(self, 'spellID', nil)
Nenue@6 119 Timer_UpdateIndex(self, 'spellName', spellName)
Nenue@6 120 end
Nenue@9 121 Timer_SetAttributeValues(self, 'spellName', spellID)
Nenue@6 122 end
Nenue@6 123 end
Nenue@6 124
Nenue@6 125
Nenue@6 126 --- talentID
Nenue@6 127 do
Nenue@6 128 local talentID = P.status.talentID
Nenue@6 129 local GetTalentInfoByID = GetTalentInfoByID
Nenue@6 130 talentID.type = 'status'
Nenue@6 131 talentID.Init = function(self, talentID)
Nenue@6 132 local print = Timer_GetPrintHandler(self)
Nenue@6 133
Nenue@6 134 self.talentID, self.spellName, self.spellIcon, self.talentSelected = GetTalentInfoByID(talentID, T.specGroup)
Nenue@6 135
Nenue@6 136 if self.talentSelected then
Nenue@6 137 print(' ', cKey("spellName"), '=', cWord(self.spellName))
Nenue@6 138 P.status.spellName.Init(self, self.spellName)
Nenue@6 139 else
Nenue@6 140 self.disable = true
Nenue@6 141 self.debug_info ('Talent not selected.')
Nenue@6 142 end
Nenue@6 143
Nenue@6 144 print(' ', cKey('talentID ('..cNum(self.talentID)..', '..cNum(T.specGroup)..'):'), self.spellName, self.talentSelected )
Nenue@6 145 Timer_UpdateIndex(self, 'talentID', talentID)
Nenue@9 146 Timer_SetAttributeValues(self, 'talentID', self.talentSelected and 1 or 'default')
Nenue@6 147 end
Nenue@6 148 end
Nenue@6 149
Nenue@6 150 --- talentRow - use whatever is in that row as data
Nenue@6 151 do
Nenue@6 152 local talentRow = P.status.talentRow
Nenue@6 153 talentRow.Init = function(self, row)
Nenue@6 154 local print = Timer_GetPrintHandler(self)
Nenue@6 155 self.talentRow = row
Nenue@9 156 local match
Nenue@9 157 for i = 1, 3 do
Nenue@9 158 local talentID, _, _, selected = GetTalentInfo(row, i, T.specGroup)
Nenue@9 159 if selected then
Nenue@9 160 P.status.talentID.Init(self, talentID)
Nenue@9 161 match = i
Nenue@9 162 end
Nenue@9 163 end
Nenue@9 164
Nenue@9 165 if not match then
Nenue@6 166 self.disable = true
Nenue@6 167 self.debug_info("No talent selected in target row.")
Nenue@6 168 end
Nenue@6 169 Timer_UpdateIndex(self, 'talentRow', row)
Nenue@9 170 Timer_SetAttributeValues(self, 'talentRow', match)
Nenue@6 171 end
Nenue@6 172 end
Nenue@6 173
Nenue@6 174
Nenue@6 175 --- talentOffset
Nenue@6 176 do
Nenue@6 177 local talentOffset = P.status.talentOffset
Nenue@6 178 talentOffset.Init = function(self, coords)
Nenue@6 179 local print = Timer_GetPrintHandler(self)
Nenue@6 180
Nenue@6 181 local tier, column = unpack(coords)
Nenue@6 182
Nenue@6 183
Nenue@6 184 local selected, usable, _
Nenue@6 185 self.talentID, self.spellName, self.spellIcon, selected, usable = GetTalentInfo(tier, column, T.specGroup)
Nenue@6 186 print(' ', cKey('talentOffset'), '=', cNum(tier), cNum(column), self.spellName, selected, usable)
Nenue@6 187 if not (selected and usable) then
Nenue@6 188 self.disable = true
Nenue@6 189 self.debug_info ((not usable) and 'Unavailable at current level.' or 'Talent not selected.')
Nenue@6 190 end
Nenue@6 191 Timer_UpdateIndex(self, 'talentID', self.talentID)
Nenue@6 192 end
Nenue@6 193 end
Nenue@6 194
Nenue@6 195 --- specPage
Nenue@6 196 do
Nenue@6 197 local specPage = P.status.specPage
Nenue@6 198 specPage.type = 'status'
Nenue@6 199 specPage.Init = function(self, specPage)
Nenue@6 200 local print = Timer_GetPrintHandler(self)
Nenue@6 201 local match
Nenue@6 202 if tonumber(specPage) then
Nenue@6 203 match = specPage == T.specPage
Nenue@6 204 elseif type(specPage) == 'table' then
Nenue@6 205 for _, pageID in ipairs(specPage) do
Nenue@6 206 if T.specPage == pageID then
Nenue@6 207 specPage = pageID
Nenue@6 208 match = true
Nenue@6 209 break
Nenue@6 210 end
Nenue@6 211 end
Nenue@6 212 else
Nenue@6 213 self.disable = true
Nenue@6 214 self.debug_info ('Bad value for', '('..cWord(self.timerName)..').'..cKey('specPage'))
Nenue@6 215 Timer_UpdateIndex(self,'specPage', nil)
Nenue@6 216 end
Nenue@6 217
Nenue@6 218 if match then
Nenue@6 219 print(' ', cKey('specPage'), '=', '['..cNum(specPage)..']')
Nenue@6 220 Timer_UpdateIndex(self,'specPage', specPage)
Nenue@6 221 else
Nenue@6 222 print(' ', cKey('specPage'), '~=', '['..cNum(specPage)..']')
Nenue@6 223 self.disable = true
Nenue@6 224 self.debug_info('Not active spec.')
Nenue@6 225 end
Nenue@6 226 end
Nenue@6 227 end
Nenue@6 228
Nenue@6 229 --- itemID
Nenue@6 230 do
Nenue@6 231 local itemID = P.status.itemID
Nenue@6 232 itemID.type = 'status'
Nenue@6 233 itemID.Init = function(self, item)
Nenue@6 234 local print = Timer_GetPrintHandler(self)
Nenue@6 235
Nenue@6 236 if not self.dvars.inventoryID then
Nenue@6 237 self.itemID = item or self.dvars.itemID
Nenue@6 238 self.itemType = self.dvars.itemType
Nenue@6 239 else
Nenue@6 240 self.itemID = item
Nenue@6 241 end
Nenue@6 242
Nenue@6 243 --@debug@
Nenue@6 244 --name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(itemID) or GetItemInfo("itemName") or GetItemInfo("itemLink")
Nenue@6 245 if not self.itemID then
Nenue@6 246 self.disable = true
Nenue@6 247 self.debug_info ('bad itemID value')
Nenue@6 248 end
Nenue@6 249
Nenue@9 250 local spellName = GetItemSpell(self.itemID)
Nenue@6 251
Nenue@9 252 if not spellName then
Nenue@6 253 self.disable = true
Nenue@9 254 self.debug_info('no spell detected')
Nenue@9 255 if self.spellName then
Nenue@9 256 self.spellName = nil
Nenue@6 257 end
Nenue@6 258 end
Nenue@9 259
Nenue@9 260 Timer_UpdateIndex(self, 'spellName', spellName)
Nenue@9 261 Timer_SetAttributeValues(self, 'itemID', spellName)
Nenue@9 262
Nenue@6 263 print(' ', cKey('itemID'), cNum(self.itemID), self.isEquipped)--@end-debug@
Nenue@6 264 end
Nenue@6 265 end
Nenue@6 266
Nenue@6 267 do
Nenue@6 268 local inventoryID = P.status.inventoryID
Nenue@6 269 inventoryID.type = 'status'
Nenue@6 270 inventoryID.Init = function(self, slot)
Nenue@6 271 local print = Timer_GetPrintHandler(self)
Nenue@6 272
Nenue@6 273 self.inventoryID = slot
Nenue@9 274 local itemID = GetInventoryItemID(self.dvars.unit, slot)
Nenue@9 275 local name = GetItemInfo(itemID)
Nenue@6 276 if not PaperDoll_IsEquippedSlot(slot) then
Nenue@6 277 self.disable = true
Nenue@6 278 self.debug_info('slot un-equipped')
Nenue@6 279 return
Nenue@6 280 end
Nenue@6 281
Nenue@9 282 Timer_SetAttributeValues(self, 'inventoryID', itemID)
Nenue@9 283 P.status.itemID.Init(self, itemID)
Nenue@6 284 self.spellIcon = GetInventoryItemTexture(self.dvars.unit, slot)
Nenue@6 285 print(' ', cKey('inventoryID'), '=', '{'..cNum(self.inventoryID).. ' -> '.. cNum(self.itemID or 'no-equip').. '}')
Nenue@6 286 end
Nenue@6 287 end
Nenue@6 288
Nenue@6 289
Nenue@6 290 --- unit
Nenue@6 291 local unit = P.status.unit
Nenue@6 292 unit.type = 'status'
Nenue@6 293 unit.Init = function(self, unit)
Nenue@6 294 local print = Timer_GetPrintHandler(self)
Nenue@6 295
Nenue@6 296 self.unitGUID = UnitGUID(unit)
Nenue@6 297 self.unit = unit
Nenue@6 298 print(' ', cWord('unitGUID'), '=', cText(self.unitGUID))
Nenue@6 299 tinsert(mod.frames.unit[unit], self)
Nenue@6 300 self.frames.unit = #mod.frames.unit[unit]
Nenue@6 301 end