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 |
