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