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