Mercurial > wow > skeletonkey
view SkeletonStats/DamageMeter.lua @ 1:cd7d06bcd98d
KeyBinds:
set hotkey text for blizzard action buttons
UnitFrame:
prototype templates for the majority of units
author | Nenue |
---|---|
date | Tue, 21 Jun 2016 04:47:52 -0400 |
parents | 69e828f4238a |
children | 07293831dd7b |
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 = LibKT.register(DamageMeter) local dm = DamageMeter local db 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('PLAYER_REGEN_DISABLED') dm:RegisterEvent('ENCOUNTER_START') dm.bars = dm.bars or {} dm.headings = dm.headings or {} end dm.ENCOUNTER_START = function() dm.new() end dm.variables = function() SkeletonStatsDB = SkeletonStatsDB or {} db = SkeletonStatsDB db.segments = db.segments or {} db.currentSegment = db.currentSegment or 0 db.actors = db.actors or {} db.viewType = db.viewType or 'damageDone' actors = db.actors segments = db.segments viewPos = db.currentSegment viewType = prototypes[viewType] and viewType or 'damageDone' dm.handler(viewType) -- resolve segment if not segments[viewPos] then viewPos = dm.new() else view = segments[viewPos] print('Using segment #', viewPos) end db.currentSegment = viewPos dm.ui() end dm.handler = function (viewType) handler = prototypes[viewType] dm.header:SetText(handler.header) end dm.new = function() segmentUID = (db.segUID or 0) + 1 db.segUID = segmentUID view = {} viewPos = #segments+1 segments[viewPos] = view 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.PLAYER_REGEN_DISABLED = function() dm.new() end 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