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 |