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