Mercurial > wow > skeletonkey
comparison SkeletonStats/DamageMeter.lua @ 0:69e828f4238a
Initial Commit
author | Nenue |
---|---|
date | Mon, 20 Jun 2016 06:35:11 -0400 |
parents | |
children | cd7d06bcd98d |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:69e828f4238a |
---|---|
1 -------------------------------------------- | |
2 -- KrakTool | |
3 -- DamageMeter | |
4 -- @project-revision@ @project-hash@ | |
5 -- @file-revision@ @file-hash@ | |
6 -- Created: 6/19/2016 10:43 AM | |
7 -------------------------------------------- | |
8 -- dm | |
9 -- {...} = actor ( name, guid ) -- returns actor table | |
10 -- .showbar (bar ) -- toggle row | |
11 -- .hidebar ( bar ) -- | |
12 -- .ui () -- update chart | |
13 local KT = select(2,...) | |
14 local dm = DamageMeter | |
15 KT.register(dm) | |
16 | |
17 local segments = {} | |
18 local actors = {} | |
19 local ordered = {} | |
20 local actorsOrdered = {} | |
21 local prototypes = {} | |
22 | |
23 local segmentUID | |
24 local viewPos | |
25 local view | |
26 local handler | |
27 local viewType = 'damageDone' | |
28 local sortType | |
29 local meterWidth = 230 | |
30 | |
31 local SortByDamage = function(a, b) | |
32 end | |
33 | |
34 dm.init = function() | |
35 dm:RegisterEvent('COMBAT_LOG_EVENT_UNFILTERED') | |
36 dm:RegisterEvent('ENCOUNTER_START') | |
37 dm.bars = dm.bars or {} | |
38 dm.headings = dm.headings or {} | |
39 | |
40 sortType = SortByDamage | |
41 end | |
42 | |
43 dm.ENCOUNTER_START = function() | |
44 dm.new() | |
45 end | |
46 | |
47 dm.variables = function() | |
48 KT.db.segments = KT.db.segments or {} | |
49 KT.db.currentSegment = KT.db.currentSegment or 0 | |
50 KT.db.actors = KT.db.actors or {} | |
51 actors = KT.db.actors | |
52 segments = KT.db.segments | |
53 viewPos = KT.db.currentSegment | |
54 | |
55 | |
56 dm.handler(viewType) | |
57 | |
58 -- resolve segment | |
59 if not segments[viewPos] then | |
60 viewPos = dm.new() | |
61 else | |
62 view = segments[viewPos] | |
63 print('Using segment #', viewPos) | |
64 end | |
65 KT.db.currentSegment = viewPos | |
66 | |
67 dm.ui() | |
68 end | |
69 | |
70 dm.handler = function (viewType) | |
71 handler = prototypes[viewType] | |
72 dm.header:SetText(handler.header) | |
73 end | |
74 | |
75 dm.new = function() | |
76 segmentUID = (KT.db.segUID or 0) + 1 | |
77 KT.db.segUID = segmentUID | |
78 view = {} | |
79 viewPos = #segments+1 | |
80 segments[viewPos] = view | |
81 KT.db.currentSegment = viewPos | |
82 print('Starting new segment #', viewPos) | |
83 return viewPos | |
84 end | |
85 local dummyColor = { | |
86 r = 0, | |
87 g = 0.5, | |
88 b = 0 | |
89 } | |
90 local dummyActor = { | |
91 name = 'Unknown', | |
92 flags = 0, | |
93 class = 'NA', | |
94 classFilename = '', | |
95 race = 'Unknown', | |
96 raceFilename = '', | |
97 sex = 1, | |
98 realm = '' | |
99 } | |
100 | |
101 dm.actor = function (guid, name, flags) | |
102 --if not actors[guid] then | |
103 local class, classFilename, race, raceFilename, sex, name, realm = GetPlayerInfoByGUID(guid) | |
104 | |
105 print('|cFFFFFF00guid|r =', name, flags, 'class', class, classFilename) | |
106 actors[guid] = { | |
107 name = name, | |
108 flags = flags, | |
109 class = class, | |
110 classFilename = classFilename, | |
111 race = race, | |
112 raceFilename = raceFilename, | |
113 sex = sex, | |
114 realm = realm | |
115 } | |
116 --end | |
117 return actors[guid] | |
118 end | |
119 | |
120 | |
121 prototypes.damageDone = { | |
122 header = 'Damage Done', | |
123 } | |
124 | |
125 dm.COMBAT_LOG_EVENT_UNFILTERED = function(self, event, timeStemp, subEvent, u1, ...) | |
126 local sourceGUID, sourceName, sourceFlags, _, destGUID, destName, destFlags = ... | |
127 | |
128 | |
129 local args = {...} | |
130 for key, prototype in pairs(prototypes) do | |
131 --print(subEvent) | |
132 if prototype[subEvent] then | |
133 prototype[subEvent](subEvent, ...) | |
134 print('|cFFFFFF00' .. key .. '|r.|cFF00FFFF'..subEvent, '|r', ...) | |
135 end | |
136 end | |
137 | |
138 dm.ui() | |
139 return true | |
140 end | |
141 | |
142 --- [name] | |
143 -- .COMBAT_EVENT = function(event, ...) | |
144 -- .init = function() | |
145 -- .calculate = function(bar, data, actor) | |
146 -- .refresh = function(bar, data, actor | |
147 | |
148 dm.showbar = function(bar) | |
149 bar:Show() | |
150 bar.icon:Show() | |
151 bar.header:Show() | |
152 bar.headerRight:Show() | |
153 end | |
154 | |
155 dm.hidebar = function(bar) | |
156 bar:Hide() | |
157 bar.icon:Hide() | |
158 bar.header:Hide() | |
159 bar.headerRight:Hide() | |
160 end | |
161 | |
162 dm.ui = function() | |
163 --table.sort(view, sortType) | |
164 | |
165 | |
166 table.wipe(ordered) | |
167 for k,v in pairs(view) do | |
168 if type(v) ~= 'table' then | |
169 view[k] = nil | |
170 else | |
171 tinsert(ordered, v) | |
172 end | |
173 end | |
174 table.sort(ordered, handler.sort) | |
175 | |
176 handler.init() | |
177 | |
178 for i = 1, 12 do | |
179 if ordered[i] then | |
180 if not dm.bars[i] then | |
181 dm.bars[i] = dm:CreateTexture('MeterBar'..i, 'BORDER') | |
182 dm.bars[i]:SetHeight(24) | |
183 dm.bars[i]:SetPoint('TOPLEFT', dm, 0, i * -24) | |
184 dm.bars[i].icon = dm:CreateTexture('MeterIcon' .. i, 'OVERLAY') | |
185 dm.bars[i].icon:SetSize(24,24) | |
186 dm.bars[i].icon:SetPoint('TOPLEFT', dm.bars[i], 'TOPLEFT', -12, 0) | |
187 | |
188 dm.bars[i].header = dm:CreateFontString('MeterHeader'..i, 'OVERLAY', 'MeterHeaderLeft') | |
189 dm.bars[i].header:SetPoint('LEFT', dm.bars[i], 'LEFT', 22, 0) | |
190 | |
191 dm.bars[i].headerRight = dm:CreateFontString('MeterHeaderRight'..i, 'OVERLAY', 'MeterHeaderRight') | |
192 dm.bars[i].headerRight:SetPoint('TOP', dm.bars[i], 'TOP', 0, -6) | |
193 end | |
194 handler.calculate(dm.bars[i], ordered[i], ordered[i].actor) | |
195 end | |
196 end | |
197 | |
198 for i, bar in ipairs(dm.bars) do | |
199 if ordered[i] then | |
200 handler.refresh(bar, ordered[i], ordered[i].actor) | |
201 dm.showbar(bar) | |
202 else | |
203 dm.hidebar(bar) | |
204 end | |
205 end | |
206 dm:SetHeight((#ordered + 1) * 24) | |
207 dm:SetWidth(meterWidth) | |
208 end | |
209 --------------------------------------------------------- | |
210 -- DAMAGE DONE | |
211 local dd = prototypes.damageDone | |
212 dd.SPELL_DAMAGE = function(subEvent, ...) | |
213 local sourceGUID, sourceName, sourceFlags, _, destGUID, destName, destFlags, _, spellID, spellName, spellSchool, amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing = ... | |
214 | |
215 view[sourceName] = view[sourceName] or {} | |
216 local p = view[sourceName] | |
217 | |
218 p.actor = dm.actor(sourceGUID, sourceName, sourceFlags) | |
219 dm.actor(destGUID, destName, destFlags) | |
220 | |
221 p.last = amount | |
222 p.damage = (view[sourceName].damage or 0) + amount | |
223 p.name = (sourceName or 'Unknown') | |
224 | |
225 p.child = p.child or {} | |
226 p.child[spellName] = p.child[spellName] or {} | |
227 p.child[spellName].hit = (p.child[spellName].hit or 0) + 1 | |
228 end | |
229 dd.SPELL_DAMAGE_PERIODIC = dd.SPELL_DAMAGE | |
230 dd.RANGE_DAMAGE = dd.SPELL_DAMAGE | |
231 | |
232 dd.SWING_DAMAGE = function(subEvent, ...) | |
233 local sourceGUID, sourceName, sourceFlags, _, destGUID, destName, destFlags, _, amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing = ... | |
234 local spellID, spellName, spellSchool = -1, 'Attack', 1 | |
235 dd.SPELL_DAMAGE(subEvent, sourceGUID, sourceName, sourceFlags, _, destGUID, destName, destFlags, _, spellID, spellName, spellSchool, amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing) | |
236 end | |
237 | |
238 dd.init = function() | |
239 dd.maxDamage = 0 | |
240 end | |
241 | |
242 dd.sort = function(a, b) | |
243 return a.damage > b.damage | |
244 end | |
245 | |
246 dd.calculate = function(bar, data, actor) | |
247 if dd.maxDamage < data.damage then | |
248 dd.maxDamage = data.damage | |
249 end | |
250 | |
251 end | |
252 | |
253 dd.refresh = function(bar, data, actor) | |
254 if actor.class and CLASS_ICON_TCOORDS[actor.classFilename] then | |
255 bar.icon:Show() | |
256 bar.icon:SetTexture("Interface\\TargetingFrame\\UI-Classes-Circles") | |
257 bar.icon:SetTexCoord(unpack(CLASS_ICON_TCOORDS[actor.classFilename])) | |
258 else | |
259 bar.icon:Hide() | |
260 end | |
261 bar.header:SetText(data.name) | |
262 bar.headerRight:SetText(data.damage .. ' ('..data.last..')') | |
263 | |
264 local color = dummyColor | |
265 if actor.class and RAID_CLASS_COLORS[actor.classFilename] then | |
266 color = RAID_CLASS_COLORS[actor.classFilename] | |
267 end | |
268 | |
269 bar:SetColorTexture(color.r, color.g, color.b, 1) | |
270 | |
271 bar:SetWidth(meterWidth * (data.damage / dd.maxDamage)) | |
272 end | |
273 | |
274 | |
275 --------------------------------------------------------- | |
276 -- HEALING DONE |