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