From 9a93540a014b1458af31303a562a8f0ffd868cc3 Mon Sep 17 00:00:00 2001 From: "Johnny C. Lam" Date: Tue, 21 May 2013 05:11:15 +0000 Subject: [PATCH] New module OvaleDamageTaken that keeps track of damage recently taken. git-svn-id: svn://svn.curseforge.net/wow/ovale/mainline/trunk@922 d5049fe3-3747-40f7-a4b5-f36d6801af5f --- Ovale.toc | 16 +++---- OvaleDamageTaken.lua | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++ OvaleOptions.lua | 6 +++ 3 files changed, 131 insertions(+), 9 deletions(-) create mode 100644 OvaleDamageTaken.lua diff --git a/Ovale.toc b/Ovale.toc index 08aa0bf..92cccbd 100644 --- a/Ovale.toc +++ b/Ovale.toc @@ -40,8 +40,7 @@ OvalePool.lua OvaleRecount.lua OvaleSkada.lua OvaleStance.lua - -# First tier of modules with dependencies +# OvaleData.lua OvaleScripts.lua defaut\Chaman.lua @@ -57,22 +56,21 @@ defaut\Moine.lua defaut\Chevalier.lua OvaleSpellDamage.lua OvaleSwing.lua - -# Second tier of modules with dependencies +# OvaleAura.lua OvaleComboPoints.lua +# OvaleFuture.lua +# +OvaleDamageTaken.lua OvaleState.lua - -# Third tier of modules with dependencies +# OvaleCondition.lua OvaleOptions.lua - -# Fourth tier of modules with dependencies +# OvaleBestAction.lua OvaleCompile.lua OvaleIcone.lua OvaleIcone.xml -# Fifth tier of modules with dependencies OvaleFrame.lua diff --git a/OvaleDamageTaken.lua b/OvaleDamageTaken.lua new file mode 100644 index 0000000..b344318 --- /dev/null +++ b/OvaleDamageTaken.lua @@ -0,0 +1,118 @@ +--[[-------------------------------------------------------------------- + Ovale Spell Priority + Copyright (C) 2013 Johnny C. Lam + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License in the LICENSE + file accompanying this program. +----------------------------------------------------------------------]] + +-- This addon tracks the damage taken by the player from non-player sources. + +local _, Ovale = ... +local OvaleDamageTaken = Ovale:NewModule("OvaleDamageTaken", "AceEvent-3.0") +Ovale.OvaleDamageTaken = OvaleDamageTaken + +-- +local OvaleDeque = Ovale.OvaleDeque +local OvaleGUID = Ovale.OvaleGUID +local OvaleFuture = Ovale.OvaleFuture +local OvalePool = Ovale.OvalePool + +local select = select + +-- Player's GUID. +local self_player_guid = nil +-- Damage event pool. +local self_pool = OvalePool:NewPool("OvaleDamageTaken_pool") +-- Damage event queue: new events are inserted at the front of the queue. +local self_damageEvent = OvaleDeque:New("OvaleDamageTaken_damageEvent") +-- Time window (past number of seconds) for which damage events are stored. +local DAMAGE_TAKEN_WINDOW = 20 + +local OVALE_DAMAGE_TAKEN_DEBUG = "damage_taken" +-- + +-- +local function AddDamageTaken(timestamp, damage) + local self = OvaleDamageTaken + local event = self_pool:Get() + event.timestamp = timestamp + event.damage = damage + self_damageEvent:InsertFront(event) + self:RemoveExpiredEvents() +end +-- + +-- +function OvaleDamageTaken:OnEnable() + self_player_guid = OvaleGUID:GetGUID("player") + self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") + self:RegisterEvent("PLAYER_REGEN_ENABLED") +end + +function OvaleDamageTaken:OnDisable() + self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED") + self:UnregisterEvent("PLAYER_REGEN_ENABLED") +end + +function OvaleDamageTaken:COMBAT_LOG_EVENT_UNFILTERED(event, ...) + local timestamp, event, hideCaster, sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags = select(1, ...) + if destGUID == self_player_guid and event:find("_DAMAGE") then + if event:find("SWING_") == 1 then + local amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing = select(12, ...) + Ovale:DebugPrintf(OVALE_DAMAGE_TAKEN_DEBUG, "%s caused %d damage.", event, amount) + AddDamageTaken(Ovale.now, amount) + elseif event:find("RANGE_") == 1 or event:find("SPELL_") == 1 then + local spellId, spellName, spellSchool = select(12, ...) + local amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing = select(15, ...) + Ovale:DebugPrintf(OVALE_DAMAGE_TAKEN_DEBUG, "%s (%s) caused %d damage.", event, spellName, amount) + AddDamageTaken(Ovale.now, amount) + end + end +end + +function OvaleDamageTaken:PLAYER_REGEN_ENABLED(event) + self_pool:Drain() +end + +-- Return the total damage taken in the previous time interval (in seconds). +function OvaleDamageTaken:GetRecentDamage(interval, lagCorrection) + local lowerBound = Ovale.now - interval + if lagCorrection then + lowerBound = lowerBound - OvaleFuture.latency + end + self:RemoveExpiredEvents() + + local total = 0 + for i, event in self_damageEvent:FrontToBackIterator() do + if event.timestamp < lowerBound then + break + end + total = total + event.damage + end + return total +end + +function OvaleDamageTaken:RemoveExpiredEvents() + local now = Ovale.now + while true do + local event = self_damageEvent:Back() + if not event then break end + if event then + if now - event.timestamp < DAMAGE_TAKEN_WINDOW then + break + end + self_damageEvent:RemoveBack() + self_pool:Release(event) + end + end +end + +function OvaleDamageTaken:Debug() + self_damageEvent:Debug() + for i, event in self_damageEvent:BackToFrontIterator() do + Ovale:FormatPrint("%d: %d damage", event.timestamp, event.damage) + end +end +-- diff --git a/OvaleOptions.lua b/OvaleOptions.lua index b0c6179..dd71003 100644 --- a/OvaleOptions.lua +++ b/OvaleOptions.lua @@ -407,6 +407,12 @@ local self_options = desc = L["Debug compile"], type = "toggle", }, + damage_taken = + { + name = "Damage taken", + desc = L["Debug damage taken"], + type = "toggle", + }, enemy = { name = "Enemies", -- 1.7.9.5