Mercurial > wow > turok
comparison Turok/Modules/Timer/Timer.lua @ 6:a9b8b0866ece
clear out log jam
| author | Nenue |
|---|---|
| date | Sun, 21 Feb 2016 08:32:53 -0500 |
| parents | |
| children | 9400a0ff8540 |
comparison
equal
deleted
inserted
replaced
| 5:8a9a6637f082 | 6:a9b8b0866ece |
|---|---|
| 1 --- Turok - Timer/Timer.lua | |
| 2 -- @file-author@ | |
| 3 -- @project-revision@ @project-hash@ | |
| 4 -- @file-revision@ @file-hash@ | |
| 5 --- Defines common elements for the various timer HUDs | |
| 6 local ADDON, _A = ... | |
| 7 local _G, CreateFrame, tconcat, GetInventoryItemsForSlot, GetInventoryItemID = _G, CreateFrame, table.concat, GetInventoryItemsForSlot, GetInventoryItemID | |
| 8 local T, F, tostring, type, max, tinsert, unpack, UIParent, loadstring = _A.Addon, _A.LibFog, tostring, type, max, table.insert, unpack, _G.UIParent, loadstring | |
| 9 local mod = T.modules.TimerControl | |
| 10 local P = mod.prototype | |
| 11 local db | |
| 12 | |
| 13 local pairs, ipairs, gsub, sub, setmetatable = pairs, ipairs, string.gsub, string.sub, setmetatable | |
| 14 local INVTYPE_FINGER, INVSLOT_FINGER1, INVSLOT_FINGER2, INVTYPE_TRINKET, INVSLOT_TRINKET1, INVSLOT_TRINKET2 = | |
| 15 INVTYPE_FINGER, INVSLOT_FINGER1, INVSLOT_FINGER2, INVTYPE_TRINKET, INVSLOT_TRINKET1, INVSLOT_TRINKET2 | |
| 16 --@debug@ | |
| 17 local DEBUG = true | |
| 18 --@end-debug@ | |
| 19 local cType, cText, cNum, cWord, cKey, cPink, cBool = cType, cText, cNum, cWord, cKey, cPink, cBool | |
| 20 local print = function(...) | |
| 21 if not DEBUG then return end | |
| 22 if _G.Devian and _G.DevianDB.workspace ~= 1 then | |
| 23 _G.print('Timer', ...) | |
| 24 end | |
| 25 end | |
| 26 | |
| 27 local Timer_GetPrintHandler = function(self) | |
| 28 if self.trace then | |
| 29 return function(...) | |
| 30 print(...) | |
| 31 _G.print('TimerFocus', ...) | |
| 32 end else | |
| 33 return print | |
| 34 end | |
| 35 end | |
| 36 local pb_suppressed = {} | |
| 37 | |
| 38 function mod:OnInitialize() | |
| 39 | |
| 40 --@debug@ | |
| 41 TurokData.spirit.timers = Turok.defaults.spirit.timers | |
| 42 --@end-debug@ | |
| 43 self.db = TurokData.spirit | |
| 44 db = self.db | |
| 45 self.active_cooldowns = {} | |
| 46 self.cast_units = {} | |
| 47 self.buff_units = {} | |
| 48 self.loaded_types = {} | |
| 49 self.loaded_triggers = {} | |
| 50 self.equipped = {} | |
| 51 self.containers = {} | |
| 52 self.timers = {} -- active timers | |
| 53 self.empty_frames = {} -- foster table for frames released by talent change | |
| 54 | |
| 55 | |
| 56 T:RegisterChatCommand("tsp", self.Import_Open) | |
| 57 T:RegisterChatCommand("tka", self.Dialog_Command) | |
| 58 T:RegisterChatCommand("tki", self.CreateIndex) | |
| 59 --T:Print("/tsp to import spells. /tka to open create dialog") | |
| 60 -- suppress cacophony from all cooldowns activating at login | |
| 61 self.quiet = true | |
| 62 --self:ScheduleTimer(function() self:Dialog_Command() end, 4) | |
| 63 | |
| 64 end | |
| 65 | |
| 66 local mt_single = { | |
| 67 __mode = "v", | |
| 68 __newindex = function(t,k,v) | |
| 69 rawset(t,k,v) | |
| 70 _G.print('DB', 'TCMeta: adding leaf', k, '=', v) | |
| 71 end} | |
| 72 local mt_double = { | |
| 73 __index = function(t,k) | |
| 74 t[k] = setmetatable({}, mt_single) | |
| 75 _G.print('DB', 'TCMeta: add layer', k, '=', t[k]) | |
| 76 return t[k] | |
| 77 end, | |
| 78 __newindex = function(t,k,v) | |
| 79 rawset(t,k,v) | |
| 80 _G.print('DB', 'TCMeta: adding to top layer', k, '=', v) | |
| 81 end | |
| 82 } | |
| 83 local mt_error = { | |
| 84 __call =function (t, txt) | |
| 85 t.disable = true | |
| 86 tinsert(t, txt) | |
| 87 end | |
| 88 } | |
| 89 | |
| 90 --- Sets and cleans up index data used by event handlers | |
| 91 local Timer_UpdateIndex = function(self, key) | |
| 92 | |
| 93 -- Is there already an entry for this key/value? | |
| 94 if self.frames[key] then | |
| 95 local lim = #mod.frames[key] | |
| 96 --[[ | |
| 97 for i = self.frames[key]+1, lim, 1 do | |
| 98 mod.frames[key][i] = mod.frames[key+1] | |
| 99 end]] | |
| 100 --self.frames[key] = nil | |
| 101 print(' ', cText('mod.frames.')..cWord(key), '=', #mod.frames[key]) | |
| 102 print(' ', cText('self.frames.')..cWord(key), '=', cNum(self.frames[key])) | |
| 103 end | |
| 104 | |
| 105 if key then | |
| 106 local i = #mod.frames[key]+1 | |
| 107 --mod.frames[key][i] = self | |
| 108 self.frames[key] = i | |
| 109 print(' ', cText('self.frames.')..cWord(key), '=', #mod.frames[key]) | |
| 110 end | |
| 111 mod.loaded_types[key] = (#mod.frames[key] == 0) and nil or true | |
| 112 print(' ',cText(key..'_is_loaded'), '=', cBool(mod.loaded_types[key])) | |
| 113 end | |
| 114 | |
| 115 --- Loading initators | |
| 116 function mod:OnEnable() | |
| 117 mod.LoadPresets() | |
| 118 mod.GetIndex() | |
| 119 -- setup indexes, use nested weak table for status since they implicitly have a key variable | |
| 120 mod.frames = {} | |
| 121 for class, p in pairs(mod.prototype.status) do | |
| 122 print('nested index table', class) | |
| 123 mod.frames[class] = setmetatable({}, mt_double) | |
| 124 end | |
| 125 mod.frames.spellName = setmetatable({}, mt_double) | |
| 126 for class, p in pairs(mod.prototype.display) do | |
| 127 mod.frames[class] = setmetatable({}, mt_single) | |
| 128 end | |
| 129 for class, p in pairs(mod.prototype.trigger) do | |
| 130 mod.frames[class] = setmetatable({}, mt_single) | |
| 131 end | |
| 132 | |
| 133 local srcIndex = mod.timers | |
| 134 if T.playerClass and mod.index[T.playerClass] then | |
| 135 srcIndex = mod.index[T.playerClass] | |
| 136 print('*** Found index for '..tostring(T.playerClass)..', using that.') | |
| 137 else | |
| 138 print(cWord('*** Using global index.')) | |
| 139 end | |
| 140 mod.activeSpec = T.specID | |
| 141 | |
| 142 --- go through that list | |
| 143 for id, timer in pairs(srcIndex) do | |
| 144 local result, message = mod:EnableTimer(id, timer) | |
| 145 end | |
| 146 | |
| 147 mod.InitTimers() | |
| 148 --- Delay sound activations so there isn't a giant cacophony on load | |
| 149 mod:ScheduleTimer(function() | |
| 150 self.quiet = nil | |
| 151 end, db.audio_delay or 2) | |
| 152 end | |
| 153 | |
| 154 function mod:EnableTimer(id, dvars) | |
| 155 local print = Timer_GetPrintHandler(dvars) | |
| 156 print('-{', cPink(dvars.name)) | |
| 157 if not dvars then | |
| 158 if not mod.index.global[id] then | |
| 159 return false, "Unable to resolve dvars table." | |
| 160 end | |
| 161 dvars = mod.index.global[id] | |
| 162 end | |
| 163 if dvars.virtual then | |
| 164 return | |
| 165 end | |
| 166 | |
| 167 local spirit, newFrame = mod:GetTimer(id, dvars) | |
| 168 if not spirit then return spirit, newFrame end | |
| 169 | |
| 170 local cvars = spirit.cvars | |
| 171 local dvars = spirit.dvars | |
| 172 local trigger = P.trigger[cvars.type] | |
| 173 local display = P.display[cvars.display] | |
| 174 local cvars = spirit.cvars | |
| 175 local index = mod.frames | |
| 176 local print = Timer_GetPrintHandler(cvars) | |
| 177 | |
| 178 if spirit.disable then | |
| 179 return false, "Manually disabled." -- nothing to do, nothing to say | |
| 180 end | |
| 181 | |
| 182 --- Interpret STATUS vars | |
| 183 print(cText(' *** Merging Status Data')) | |
| 184 spirit.disable = dvars.disable | |
| 185 local pcount = 1 | |
| 186 for k, handler in pairs(P.status) do | |
| 187 if cvars[k] then | |
| 188 if handler.Init then | |
| 189 print(cWord(' * Firing ')..cKey(k)..cWord('.Init'), cNum(cvars[k])) | |
| 190 handler.Init(spirit, cvars[k]) | |
| 191 else | |
| 192 print(' ', cText('skipped'), cKey(k)) | |
| 193 end | |
| 194 pcount = pcount + 1 | |
| 195 end | |
| 196 end | |
| 197 | |
| 198 spirit.Event = trigger.Event | |
| 199 spirit.Value = trigger.Value | |
| 200 spirit.SetText = mod.SetText | |
| 201 spirit.LoadText = mod.LoadText | |
| 202 spirit.Query = trigger.Query | |
| 203 spirit.Set = trigger.Set | |
| 204 | |
| 205 --- Display handler init | |
| 206 if display.Init then | |
| 207 print(cText(' * Display Init:'), cKey(dvars.display)) | |
| 208 display.Init(spirit) | |
| 209 end | |
| 210 | |
| 211 --- Trigger handler and events Load() | |
| 212 print(cText(' * Trigger Init:'), cKey(dvars.type)) | |
| 213 trigger.Init(spirit) | |
| 214 | |
| 215 | |
| 216 if C_PetBattles.IsInBattle() then | |
| 217 spirit.disable = true | |
| 218 spirit.debug_info("Hidden for pet battle") | |
| 219 pb_suppressed[id] = true | |
| 220 end | |
| 221 | |
| 222 | |
| 223 if spirit.disable then | |
| 224 spirit:UnregisterAllEvents() | |
| 225 spirit.displayState = nil | |
| 226 spirit.prevState = nil | |
| 227 spirit:Hide() | |
| 228 return false, tconcat(spirit.debug_info,"\n") | |
| 229 else | |
| 230 print('--', self.disable and cPink('DISABLED') or cNum('ENABLED'), #spirit.debug_info > 0 and tconcat(spirit.debug_info,"\n"), '}') | |
| 231 return true, tconcat(spirit.debug_info,"\n") | |
| 232 end | |
| 233 end | |
| 234 | |
| 235 function mod:GetTimer(id, dvars) | |
| 236 local print = Timer_GetPrintHandler(dvars) | |
| 237 local newFrame | |
| 238 if not mod.timers[id] then | |
| 239 print(cKey(' [[CreateTimer')) | |
| 240 newFrame = true | |
| 241 --- Compile the cvar table from the various config layers: | |
| 242 -- Start with timer dvars, overwritten by any container settings, then a disable check, then merge in prototype values | |
| 243 local cvars = T.Config_Push({}, dvars, nil, cKey('['..id..']')..'.'..cWord('cvars')) | |
| 244 cvars.name = dvars.name -- push function ignores name keys | |
| 245 | |
| 246 if dvars.container and db.containers[dvars.container] then | |
| 247 print(cText(' * Merging Container overrides')) | |
| 248 T.Config_Push(cvars, db.containers[dvars.container], cvars, cKey('['..id..']')..'.'..cWord('cvars')) | |
| 249 end | |
| 250 | |
| 251 --- Stop here if disabled via SavedVars | |
| 252 if cvars.disable then | |
| 253 return false, "Manually disabled" | |
| 254 end | |
| 255 | |
| 256 --- Localize the stuff we are going to loop over | |
| 257 local display = P.display[cvars.display] | |
| 258 local trigger = P.trigger[cvars.type] | |
| 259 local displayType = cvars.display | |
| 260 local triggerType = cvars.type | |
| 261 if not (display and trigger) then | |
| 262 return nil, "Missing prototype data. Summary: "..tostring(displayType).."="..(display and 'OK' or 'MISSING') .. | |
| 263 " "..tostring(triggerType).."="..(trigger and 'OK' or 'MISSING') | |
| 264 end | |
| 265 | |
| 266 --- Establish the order in which values are merged | |
| 267 print(cText(' * Merging object CVars')) | |
| 268 local cvar_class = {cWord('db.'..displayType), cWord('db.'..triggerType), cWord('db.global')} | |
| 269 local cvar_array = { | |
| 270 db[displayType], | |
| 271 db[triggerType], | |
| 272 db.global, | |
| 273 } | |
| 274 local override_class = {cWord('trigger.'..cvars.type), cWord('display.'.. cvars.display)} | |
| 275 local override_array = { | |
| 276 display.cvars, | |
| 277 trigger.cvars } | |
| 278 | |
| 279 --- Table merge user settings | |
| 280 for i, p in pairs(cvar_array) do | |
| 281 print(' '..cNum(i)..' merge ['..cvar_class[i]..']') | |
| 282 T.Config_Merge(cvars, p, cvars, cKey('['..id..']')..'.'..cWord('cvars')) | |
| 283 end | |
| 284 | |
| 285 --- Overwrite with anything defined by the prototype structure because it's important | |
| 286 local _, odiff | |
| 287 for i, p in ipairs(override_array) do | |
| 288 _, odiff = T.Config_Push(cvars, p, cvars, cKey('['..id..']')..'.'..cWord('cvars')) | |
| 289 end | |
| 290 local print = Timer_GetPrintHandler(cvars) | |
| 291 | |
| 292 --- Create the UI frame and seed it with the data we just composed | |
| 293 local spirit = CreateFrame('Frame', 'TurokTimerFrame'..gsub(dvars.name, "[^%a%d]", ''), UIParent, display.inherits) | |
| 294 spirit.trace = cvars.trace | |
| 295 spirit.timerID = id | |
| 296 spirit.timerName = dvars.name | |
| 297 spirit.container = dvars.container | |
| 298 spirit.cvars = cvars | |
| 299 spirit.dvars = dvars | |
| 300 spirit.Update = display.Update | |
| 301 spirit.SetState = display.SetState | |
| 302 spirit.Report = mod.Report | |
| 303 spirit.Stats = trigger.Stats | |
| 304 | |
| 305 --- Set Layout Statics | |
| 306 T.SetFrameLayout(spirit, cvars) | |
| 307 | |
| 308 --- Create troubleshooting collection | |
| 309 spirit.debug_info = setmetatable({}, mt_error) | |
| 310 | |
| 311 --- Add the frame to corresponding prototype indexes | |
| 312 spirit.frames = {} | |
| 313 spirit.events = {} | |
| 314 | |
| 315 if spirit.display ~= displayType then | |
| 316 spirit.display = displayType | |
| 317 Timer_UpdateIndex(spirit, displayType) | |
| 318 end | |
| 319 if spirit.type ~= triggerType then | |
| 320 spirit.type = triggerType | |
| 321 Timer_UpdateIndex(spirit, triggerType) | |
| 322 end | |
| 323 --- Add the frame to global index | |
| 324 mod.timers[id] = spirit | |
| 325 end | |
| 326 | |
| 327 return mod.timers[id], newFrame | |
| 328 end | |
| 329 | |
| 330 function mod.InitTimers() | |
| 331 local print = function(...) _G.print('TimerEvent', ...) end | |
| 332 print('INIT TIMERS ====================') | |
| 333 for id, spirit in pairs(mod.timers) do | |
| 334 if spirit.disable then | |
| 335 print(id, 'disabled:', tconcat(spirit.debug_info or {}, ', ')) | |
| 336 else | |
| 337 | |
| 338 print(cText('init'), cNum(id), cWord(spirit.name)) | |
| 339 --- Throw a dry event to initialize values | |
| 340 print(cText(' *'), cWord('prototype.'..cKey(spirit.dvars.type)..'.'..cWord('Load'))) | |
| 341 P.trigger[spirit.dvars.type].Event(spirit) | |
| 342 | |
| 343 --- Set loose | |
| 344 print(cText(' *'), cWord('prototype')..'.'..cKey('events')..'.'..cWord('Load')) | |
| 345 mod.UpdateEvents(spirit, P.trigger[spirit.dvars.type].events) | |
| 346 end | |
| 347 end | |
| 348 print('INIT DONE =========================') | |
| 349 end | |
| 350 | |
| 351 function mod:DisableTimer(name, timer) | |
| 352 local timer_frame = mod.db.timers[name] | |
| 353 if timer_frame and not timer_frame.disable then | |
| 354 timer_frame.disable = true | |
| 355 timer_frame:UnregisterAllEvents() | |
| 356 timer_frame:Hide() | |
| 357 end | |
| 358 end | |
| 359 | |
| 360 function mod.UpdateEvents(self, events) | |
| 361 local print = Timer_GetPrintHandler(self) | |
| 362 | |
| 363 self:SetScript('OnEvent', nil) | |
| 364 self:UnregisterAllEvents() | |
| 365 | |
| 366 local proxy, listen = {}, {} | |
| 367 for event, handler in pairs(events) do | |
| 368 if mod[event] then | |
| 369 tinsert(proxy, cNum(event)) | |
| 370 else | |
| 371 tinsert(listen, cWord(event)) | |
| 372 self:RegisterEvent(event) | |
| 373 end | |
| 374 self.events[event] = handler | |
| 375 end | |
| 376 | |
| 377 if #proxy > 0 then | |
| 378 print( ' -', cKey(self.name), cWord('receiving'), tconcat(proxy, ', ')) | |
| 379 end | |
| 380 if #listen > 0 then | |
| 381 print( ' -', cKey(self.name), cText('listening'), tconcat(listen, ', ')) | |
| 382 end | |
| 383 | |
| 384 self:SetScript('OnEvent', self.Event) | |
| 385 end | |
| 386 | |
| 387 local match_sub = { | |
| 388 {'%%c', "' .. tostring(t.caster).. '"}, | |
| 389 {'%%h', "' .. tostring((t.valueFull >= 60) and (math.floor(t.valueFull/60)) or t.value) .. '"}, | |
| 390 {'%%i', "' .. tostring((t.valueFull >= 60) and (t.value % 60) or ((t.valueFull < 6) and math.floor((t.ValueFull * 100) % 100) or '')) .. '"}, | |
| 391 {'%%n', "' .. tostring(t.spellName) .. '"}, | |
| 392 {'%%p', "' .. tostring(t.value) .. '"}, | |
| 393 {'%%d', "' .. tostring(t.chargeDuration or t.duration) .. '"}, | |
| 394 {'%%%.p', "' .. string.sub(tostring((t.valueFull %% 1) * 100),0,1) .. '"}, | |
| 395 {"%%s", "' .. (t.stacks or t.charges or '') .. '"}, | |
| 396 } | |
| 397 | |
| 398 -- dot syntax implies use as embedded method | |
| 399 function mod.LoadText(self) | |
| 400 print(cKey('parsing textRegions for'), self.timerName, self.timerID) | |
| 401 self.textTypes = {} | |
| 402 self.textValues = {} | |
| 403 for name, region in pairs(self.textRegions) do | |
| 404 print(' ', cWord('textRegions')..'["'.. cType(self.timerName)..'"].'..cType(name)) | |
| 405 if self.cvars[name..'Text'] then | |
| 406 | |
| 407 -- todo: collect match counts and index the text fields by match types | |
| 408 local str = self.cvars[name..'Text'] | |
| 409 for i, args in ipairs(match_sub) do | |
| 410 if str:match(args[1]) then | |
| 411 if not self.textTypes[args[1]] then | |
| 412 self.textTypes[args[1]] = {} | |
| 413 end | |
| 414 tinsert(self.textTypes[args[1]], region) | |
| 415 str = str:gsub(args[1], args[2]) | |
| 416 end | |
| 417 end | |
| 418 str = "local t = _G.Turok.modules.TimerControl.timers["..self.timerID.."]\n" | |
| 419 .. "\n return '" .. str .. "'" | |
| 420 local func = assert(loadstring(str)) | |
| 421 self.textValues[name] = func | |
| 422 end | |
| 423 end | |
| 424 | |
| 425 --mod.SetText(self) | |
| 426 end | |
| 427 | |
| 428 --- generic text setter | |
| 429 local HIDDEN, PASSIVE, ACTIVE = 0, 1, 2 | |
| 430 mod.SetText = function(self) | |
| 431 if self.displayState ~= ACTIVE then | |
| 432 for name, region in pairs(self.textRegions) do | |
| 433 region:SetText(nil) | |
| 434 end | |
| 435 return | |
| 436 end | |
| 437 | |
| 438 if not self.textValues then | |
| 439 self.textValues = {} | |
| 440 mod.LoadText(self, self.cvars) | |
| 441 end | |
| 442 | |
| 443 -- hide when above a certain number | |
| 444 | |
| 445 if self.spiral and self.spiral.subCounter then | |
| 446 if self.valueFull > 6 then | |
| 447 if self.textValues.subCounter then | |
| 448 --print('hiding milliseconds') | |
| 449 self.textRegions.subCounter:Hide() | |
| 450 self.textRegionsSub = self.textRegions.subCounter | |
| 451 self.textValuesSub = self.textValues.subCounter | |
| 452 self.textRegions.subCounter = nil | |
| 453 self.textValues.subCounter = nil | |
| 454 end | |
| 455 else | |
| 456 if not self.textValues.subCounter then | |
| 457 --print('showing milliseconds') | |
| 458 self.textValues.subCounter = self.textValuesSub | |
| 459 self.textRegions.subCounter = self.textRegionsSub | |
| 460 self.textRegions.subCounter:Show() | |
| 461 end | |
| 462 end | |
| 463 end | |
| 464 | |
| 465 for name, region in pairs(self.textRegions) do | |
| 466 --print(name) | |
| 467 --print(name, self.timerName, self.textValues[name](self)) | |
| 468 region:SetText(self.textValues[name](self)) | |
| 469 end | |
| 470 end | |
| 471 | |
| 472 | |
| 473 ------------------------------------------------------------------------- | |
| 474 --- Second-tier handlers to cut down on the number of Status:Event() polls | |
| 475 | |
| 476 --- UNIT_SPELLCAST_*** use args to filter out the number of full handler runs | |
| 477 function mod:UNIT_SPELLCAST_SUCCEEDED (e, unit, spellName, rank, castID, spellID) | |
| 478 if not mod.frames.unit[unit] then | |
| 479 return | |
| 480 end | |
| 481 | |
| 482 if #mod.frames.spellName[spellName] > 0 then | |
| 483 print('spellName-ID relation detected:', cWord(spellName), cNum(spellID)) | |
| 484 for i, frame in pairs(mod.frames.spellName[spellName]) do | |
| 485 if not frame.frames.spellID then | |
| 486 frame.frames.spellID = {} | |
| 487 end | |
| 488 if not frame.frames.spellID[spellID] then | |
| 489 | |
| 490 tinsert(mod.frames.spellID[spellID], frame) | |
| 491 frame.frames.spellID[spellID] = #mod.frames.spellID[spellID] | |
| 492 print(cText(' updating'), cKey(frame.timerName)) | |
| 493 end | |
| 494 end | |
| 495 mod.frames.spellName[spellName] = nil | |
| 496 end | |
| 497 | |
| 498 | |
| 499 | |
| 500 if mod.frames.spellID[spellID] then | |
| 501 for i, timer_frame in pairs(mod.frames.spellID[spellID]) do | |
| 502 print(cText('caught spell'), cWord(spellName), 'for', timer_frame:GetName()) | |
| 503 timer_frame:Event(e, unit, spellName, rank, castID, spellID) | |
| 504 end | |
| 505 end | |
| 506 end | |
| 507 mod.UNIT_SPELLCAST_CHANNEL_START = mod.UNIT_SPELLCAST_SUCCEEDED | |
| 508 | |
| 509 --- Fire a dry event to force status updates on units with changing GUID's | |
| 510 function mod:PLAYER_TARGET_CHANGED(e, unit) | |
| 511 print('doing a target swap thing') | |
| 512 for k, v in pairs( self.frames.unit.target) do | |
| 513 print(k, v) | |
| 514 v:Event(nil, 'target') | |
| 515 end | |
| 516 end | |
| 517 | |
| 518 --- Same thing but for talent/spec-driven | |
| 519 function mod:PLAYER_TALENT_UPDATE(e, unit) | |
| 520 print('') | |
| 521 print('') | |
| 522 print(cText(e), T.specPage, T.specName) | |
| 523 | |
| 524 local update_queue = {} | |
| 525 for _, k in ipairs({'talentID', 'talentRow', 'specPage'}) do | |
| 526 for value, frameSet in pairs(mod.frames.talentID) do | |
| 527 for id, frame in ipairs(frameSet) do | |
| 528 print(frame.timerID, frame.timerName) | |
| 529 update_queue[frame.timerID] = frame | |
| 530 end | |
| 531 end | |
| 532 end | |
| 533 | |
| 534 for id, frame in pairs(update_queue) do | |
| 535 print('Refreshing spec-related frames', id, frame.timerName) | |
| 536 frame.disable = nil | |
| 537 table.wipe(frame.debug_info) | |
| 538 local res, msg = mod:EnableTimer(id, frame.dvars) | |
| 539 end | |
| 540 | |
| 541 end | |
| 542 | |
| 543 function mod:PLAYER_EQUIPMENT_CHANGED(e, slot, hasItem) | |
| 544 print(e, slot, hasItem) | |
| 545 local itemCheckList | |
| 546 if mod.frames.inventoryID and mod.frames.inventoryID[slot] then | |
| 547 print(' Inventory Frames:') | |
| 548 itemCheckList = GetInventoryItemsForSlot(slot, {}, false) | |
| 549 for id, slotFrame in pairs(mod.frames.inventoryID[slot]) do | |
| 550 print(' * Updating', cNum(id), cWord(slotFrame.timerName)) | |
| 551 local res, msg = mod:EnableTimer(slotFrame.timerID, slotFrame.dvars) | |
| 552 print(' ', cBool(res), cText(msg)) | |
| 553 end | |
| 554 end | |
| 555 if itemCheckList then | |
| 556 print(unpack(itemCheckList)) | |
| 557 end | |
| 558 local itemID = GetInventoryItemID('player', slot) | |
| 559 if itemID and mod.frames.itemID[itemID] then | |
| 560 print(' Item ID Frames:') | |
| 561 for id, itemFrame in pairs(mod.frames.itemID[itemID]) do | |
| 562 print(' * Updating', cNum(id), cWord(itemFrame.timerName)) | |
| 563 | |
| 564 local res, msg = mod:EnableTimer(itemFrame.timerID, itemFrame.dvars) | |
| 565 print(' ', cBool(res), cText(msg)) | |
| 566 end | |
| 567 end | |
| 568 end | |
| 569 function mod:PET_BATTLE_OPENING_START () | |
| 570 for i, v in pairs(mod.timers) do | |
| 571 if not v.disable then | |
| 572 print('suppressing', v:GetName()) | |
| 573 v.disable = true | |
| 574 v:Hide() | |
| 575 pb_suppressed[i] = true | |
| 576 end | |
| 577 end | |
| 578 end | |
| 579 function mod:PET_BATTLE_CLOSE() | |
| 580 for id, v in pairs(mod.timers) do | |
| 581 if pb_suppressed[id] then | |
| 582 print('restoring', v:GetName()) | |
| 583 mod:EnableTimer(id) | |
| 584 pb_suppressed[id] = nil | |
| 585 end | |
| 586 end | |
| 587 end |
