Mercurial > wow > skeletonkey
view 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 source
-------------------------------------------- -- 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