Mercurial > wow > skeletonkey
diff SkeletonStats/DamageMeter.lua @ 0:69e828f4238a
Initial Commit
author | Nenue |
---|---|
date | Mon, 20 Jun 2016 06:35:11 -0400 |
parents | |
children | cd7d06bcd98d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SkeletonStats/DamageMeter.lua Mon Jun 20 06:35:11 2016 -0400 @@ -0,0 +1,276 @@ +-------------------------------------------- +-- KrakTool +-- DamageMeter +-- @project-revision@ @project-hash@ +-- @file-revision@ @file-hash@ +-- Created: 6/19/2016 10:43 AM +-------------------------------------------- +-- dm +-- {...} = actor ( name, guid ) -- returns actor table +-- .showbar (bar ) -- toggle row +-- .hidebar ( bar ) -- +-- .ui () -- update chart +local KT = select(2,...) +local dm = DamageMeter +KT.register(dm) + +local segments = {} +local actors = {} +local ordered = {} +local actorsOrdered = {} +local prototypes = {} + +local segmentUID +local viewPos +local view +local handler +local viewType = 'damageDone' +local sortType +local meterWidth = 230 + +local SortByDamage = function(a, b) +end + +dm.init = function() + dm:RegisterEvent('COMBAT_LOG_EVENT_UNFILTERED') + dm:RegisterEvent('ENCOUNTER_START') + dm.bars = dm.bars or {} + dm.headings = dm.headings or {} + + sortType = SortByDamage +end + +dm.ENCOUNTER_START = function() + dm.new() +end + +dm.variables = function() + KT.db.segments = KT.db.segments or {} + KT.db.currentSegment = KT.db.currentSegment or 0 + KT.db.actors = KT.db.actors or {} + actors = KT.db.actors + segments = KT.db.segments + viewPos = KT.db.currentSegment + + + dm.handler(viewType) + + -- resolve segment + if not segments[viewPos] then + viewPos = dm.new() + else + view = segments[viewPos] + print('Using segment #', viewPos) + end + KT.db.currentSegment = viewPos + + dm.ui() +end + +dm.handler = function (viewType) + handler = prototypes[viewType] + dm.header:SetText(handler.header) +end + +dm.new = function() + segmentUID = (KT.db.segUID or 0) + 1 + KT.db.segUID = segmentUID + view = {} + viewPos = #segments+1 + segments[viewPos] = view + KT.db.currentSegment = viewPos + print('Starting new segment #', viewPos) + return viewPos +end +local dummyColor = { + r = 0, + g = 0.5, + b = 0 +} +local dummyActor = { + name = 'Unknown', + flags = 0, + class = 'NA', + classFilename = '', + race = 'Unknown', + raceFilename = '', + sex = 1, + realm = '' +} + +dm.actor = function (guid, name, flags) + --if not actors[guid] then + local class, classFilename, race, raceFilename, sex, name, realm = GetPlayerInfoByGUID(guid) + + print('|cFFFFFF00guid|r =', name, flags, 'class', class, classFilename) + actors[guid] = { + name = name, + flags = flags, + class = class, + classFilename = classFilename, + race = race, + raceFilename = raceFilename, + sex = sex, + realm = realm + } + --end + return actors[guid] +end + + +prototypes.damageDone = { + header = 'Damage Done', +} + +dm.COMBAT_LOG_EVENT_UNFILTERED = function(self, event, timeStemp, subEvent, u1, ...) + local sourceGUID, sourceName, sourceFlags, _, destGUID, destName, destFlags = ... + + + local args = {...} + for key, prototype in pairs(prototypes) do + --print(subEvent) + if prototype[subEvent] then + prototype[subEvent](subEvent, ...) + print('|cFFFFFF00' .. key .. '|r.|cFF00FFFF'..subEvent, '|r', ...) + end + end + + dm.ui() + return true +end + +--- [name] +-- .COMBAT_EVENT = function(event, ...) +-- .init = function() +-- .calculate = function(bar, data, actor) +-- .refresh = function(bar, data, actor + +dm.showbar = function(bar) + bar:Show() + bar.icon:Show() + bar.header:Show() + bar.headerRight:Show() +end + +dm.hidebar = function(bar) + bar:Hide() + bar.icon:Hide() + bar.header:Hide() + bar.headerRight:Hide() +end + +dm.ui = function() + --table.sort(view, sortType) + + + table.wipe(ordered) + for k,v in pairs(view) do + if type(v) ~= 'table' then + view[k] = nil + else + tinsert(ordered, v) + end + end + table.sort(ordered, handler.sort) + + handler.init() + + for i = 1, 12 do + if ordered[i] then + if not dm.bars[i] then + dm.bars[i] = dm:CreateTexture('MeterBar'..i, 'BORDER') + dm.bars[i]:SetHeight(24) + dm.bars[i]:SetPoint('TOPLEFT', dm, 0, i * -24) + dm.bars[i].icon = dm:CreateTexture('MeterIcon' .. i, 'OVERLAY') + dm.bars[i].icon:SetSize(24,24) + dm.bars[i].icon:SetPoint('TOPLEFT', dm.bars[i], 'TOPLEFT', -12, 0) + + dm.bars[i].header = dm:CreateFontString('MeterHeader'..i, 'OVERLAY', 'MeterHeaderLeft') + dm.bars[i].header:SetPoint('LEFT', dm.bars[i], 'LEFT', 22, 0) + + dm.bars[i].headerRight = dm:CreateFontString('MeterHeaderRight'..i, 'OVERLAY', 'MeterHeaderRight') + dm.bars[i].headerRight:SetPoint('TOP', dm.bars[i], 'TOP', 0, -6) + end + handler.calculate(dm.bars[i], ordered[i], ordered[i].actor) + end + end + + for i, bar in ipairs(dm.bars) do + if ordered[i] then + handler.refresh(bar, ordered[i], ordered[i].actor) + dm.showbar(bar) + else + dm.hidebar(bar) + end + end + dm:SetHeight((#ordered + 1) * 24) + dm:SetWidth(meterWidth) +end +--------------------------------------------------------- +-- DAMAGE DONE +local dd = prototypes.damageDone +dd.SPELL_DAMAGE = function(subEvent, ...) + local sourceGUID, sourceName, sourceFlags, _, destGUID, destName, destFlags, _, spellID, spellName, spellSchool, amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing = ... + + view[sourceName] = view[sourceName] or {} + local p = view[sourceName] + + p.actor = dm.actor(sourceGUID, sourceName, sourceFlags) + dm.actor(destGUID, destName, destFlags) + + p.last = amount + p.damage = (view[sourceName].damage or 0) + amount + p.name = (sourceName or 'Unknown') + + p.child = p.child or {} + p.child[spellName] = p.child[spellName] or {} + p.child[spellName].hit = (p.child[spellName].hit or 0) + 1 +end +dd.SPELL_DAMAGE_PERIODIC = dd.SPELL_DAMAGE +dd.RANGE_DAMAGE = dd.SPELL_DAMAGE + +dd.SWING_DAMAGE = function(subEvent, ...) + local sourceGUID, sourceName, sourceFlags, _, destGUID, destName, destFlags, _, amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing = ... + local spellID, spellName, spellSchool = -1, 'Attack', 1 + dd.SPELL_DAMAGE(subEvent, sourceGUID, sourceName, sourceFlags, _, destGUID, destName, destFlags, _, spellID, spellName, spellSchool, amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing) +end + +dd.init = function() + dd.maxDamage = 0 +end + +dd.sort = function(a, b) + return a.damage > b.damage +end + +dd.calculate = function(bar, data, actor) + if dd.maxDamage < data.damage then + dd.maxDamage = data.damage + end + +end + +dd.refresh = function(bar, data, actor) + if actor.class and CLASS_ICON_TCOORDS[actor.classFilename] then + bar.icon:Show() + bar.icon:SetTexture("Interface\\TargetingFrame\\UI-Classes-Circles") + bar.icon:SetTexCoord(unpack(CLASS_ICON_TCOORDS[actor.classFilename])) + else + bar.icon:Hide() + end + bar.header:SetText(data.name) + bar.headerRight:SetText(data.damage .. ' ('..data.last..')') + + local color = dummyColor + if actor.class and RAID_CLASS_COLORS[actor.classFilename] then + color = RAID_CLASS_COLORS[actor.classFilename] + end + + bar:SetColorTexture(color.r, color.g, color.b, 1) + + bar:SetWidth(meterWidth * (data.damage / dd.maxDamage)) +end + + +--------------------------------------------------------- +-- HEALING DONE \ No newline at end of file