From 76ad09a2dc17e30487fd90e8286e6bbf8f04449b Mon Sep 17 00:00:00 2001 From: Tercio Date: Thu, 4 May 2017 11:52:03 -0300 Subject: [PATCH] - pkgmeta changes --- .pkgmeta | 4 +- boot.lua | 16 +- classes/classe_heal.lua | 237 ++++++++++++++++++++++++++++- classes/classe_heal_habilidade.lua | 19 ++- core/parser.lua | 124 ++++++++++++++- functions/attributes.lua | 11 +- images/atributos_icones_heal.blp | Bin 23331 -> 12148 bytes 7 files changed, 389 insertions(+), 22 deletions(-) diff --git a/.pkgmeta b/.pkgmeta index 516d06cc..e14c7db9 100644 --- a/.pkgmeta +++ b/.pkgmeta @@ -10,8 +10,8 @@ externals: Libs/LibGraph-2.0: https://repos.wowace.com/wow/libgraph-2-0/trunk/LibGraph-2.0 Libs/LibDBIcon-1.0: https://repos.wowace.com/wow/libdbicon-1-0/trunk/LibDBIcon-1.0 Libs/LibWindow-1.1: https://repos.wowace.com/wow/libwindow-1-1/trunk/LibWindow-1.1 - Libs/LibCompress: https://repos.wowace.com/wow/libcompress/trunk/LibCompress - Libs/LibDataBroker-1.1: https://repos.wowace.com/wow/libdatabroker-1-1/LibDataBroker-1.1 + Libs/LibCompress: https://repos.wowace.com/wow/libcompress/trunk/ + Libs/LibDataBroker-1.1: https://repos.wowace.com/wow/libdatabroker-1-1 Libs/LibGroupInSpecT-1.1: https://repos.wowace.com/wow/libgroupinspect/trunk/LibGroupInSpecT-1.1 Libs/LibItemUpgradeInfo-1.0: https://repos.wowace.com/wow/libitemupgradeinfo-1-0/LibItemUpgradeInfo-1.0 Libs/NickTag-1.0: https://repos.curseforge.com/wow/nicktag/NickTag-1.0 diff --git a/boot.lua b/boot.lua index 9acb80ec..4ce9a1f2 100644 --- a/boot.lua +++ b/boot.lua @@ -1,11 +1,11 @@ - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> global name declaration _ = nil _detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0") - _detalhes.build_counter = 3512 + _detalhes.build_counter = 3640 _detalhes.userversion = "v7.2.0." .. _detalhes.build_counter - _detalhes.realversion = 116 --core version + _detalhes.realversion = 117 --core version _detalhes.version = _detalhes.userversion .. " (core " .. _detalhes.realversion .. ")" Details = _detalhes @@ -21,15 +21,15 @@ do local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) --[[ -|cFFFFFF00v7.2.0.3512.116 (|cFFFFCC00April 27th, 2016|r|cFFFFFF00)|r:\n\n -|cFFFFFF00-|r Havoc Demon Hunter: your fury energy is being shown under Mana Restored (don't ask me why, the combat log is telling us it's mana).\n\n -|cFFFFFF00-|r Pets now are shown on damage tooltips. -|cFFFFFF00-|r Pets are now also shown on the comparison panel. +|cFFFFFF00v7.2.0.3640.116 (|cFFFFCC00May 04th, 2016|r|cFFFFFF00)|r:\n\n +|cFFFFFF00-|r Added Heal Absorbed display under Heal bracket.\n\n +Heal Absoorb are the heal denied by abilities such like DK's Necrotic Strike or raid boss Chromatic Anomaly's 'Time Release' ability. +The tooltip of this display shows which players got heal denied, which abilities absorbed the heal, which abilities tried to heal but got the heal denied. --]] -- - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v7.2.0.3512.116 (|cFFFFCC00April 27th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Havoc Demon Hunter: your fury energy is being shown under Mana Restored (don't ask me why, the combat log is telling us it's mana).\n\n|cFFFFFF00-|r Pets now are shown on damage tooltips.\n\n|cFFFFFF00-|r Pets are now also shown on the comparison panel.\n\n|cFFFFFF00v7.2.0.3474.116 (|cFFFFCC00April 20th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Plugin: Raid Check > added some food buffs which wasn't being tracked.\n\n|cFFFFFF00v7.2.0.3467.116 (|cFFFFCC00April 07th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for the custom display window where apply and cancel buttons where over the edit window.\n\n|cFFFFFF00-|r Fix for an issue on editing a bookmark.\n\n|cFFFFFF00v7.1.5.3459.116 (|cFFFFCC00Mar 21th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue on dynamic overall data where it wasn't showing DPS.\n\n|cFFFFFF00-|r Fixed an issue with Apply, Save and Cancel buttons when editing a custom display.\n\n|cFFFFFF00-|r Removed the Damage and Healing presets for custom displays, now is only possible create custom displays by scripting them.\n\n|cFFFFFF00v7.1.5.3431.116 (|cFFFFCC00Mar 15th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with bar orientation right to left where fixed bar color isn't working.\n\n|cFFFFFF00-|r The nickname field now use FrizQuadrataTT font and shall be compatible with Cyrillic.\n\n|cFFFFFF00v7.1.5.3418.116 (|cFFFFCC00Mar 1st, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #167 fix: Light of the Martyr self-damage now does reduce the healing done (following WCL method).\n\n|cFFFFFF00-|r Ticket #169 fix: Damage Prevented is now working for new segments.\n\n|cFFFFFF00-|r Fixed an issue where sometimes BeastMaster's Hati pet wasn't detected correctly.\n\n|cFFFFFF00v7.1.5.3369.116 (|cFFFFCC00Feb 07th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added custom display 'Dynamic Overall Damage' for mythic dungeons.\n\n|cFFFFFF00-|r Fix for Ticket #168: 'Auto Hide While [Not] Inside Instance is broken'.\n\n|cFFFFFF00-|r The bar truncate frame 'DetailsLeftTextAntiTruncate' is now created on Details! load instead on demand.\n\n|cFFFFFF00v7.1.5.3315.116 (|cFFFFCC00Jan 23th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #162: 'no Monochrome font' available, added an experimental slash command: /run _detalhes:UseOutline ('MONOCHROME').\n\n|cFFFFFF00-|r Ticket #158: 'no elapsed time shown on report to chat', added the elapsed time when reporting a segment.\n\n|cFFFFFF00-|r Ticket #164: 'error when browsing segments', an attempt to fix the problem has been made.\n\n|cFFFFFF00v7.1.5.3305.116 (|cFFFFCC00Jan 15th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Another fix for mythic dungeons overall data reset (thanks Tharai @ Curseforge).\n\n|cFFFFFF00-|r Fix for spec detection on PvP Arenas (thanks Pas06 @ Curseforge).\n\n|cFFFFFF00v7.1.0.3276.115 (|cFFFFCC00Jan 08th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed the overall data not reseting when starting a new mythic+ dungeon.\n\n|cFFFFFF00v7.1.0.3266.115 (|cFFFFCC00Dec 29th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with overall data not updating correctly at the end of the combat.\n\n|cFFFFFF00-|r Added a tutorial line on the window when the user access overall data.\n\n|cFFFFFF00v7.1.0.3236.115 (|cFFFFCC00Dec 19th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Integration with BigWigs should be working okay now.\n\n|cFFFFFF00v7.1.0.3231.115 (|cFFFFCC00Dec 15th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Disabled the link with BigWigs to avoid the 'RegisterMessage' error on every login.\n\n|cFFFFFF00v7.1.0.3229.115 (|cFFFFCC00Dec 09th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r When a window is locked, resize grips shouldn't be enabled messing with bar mouse over.\n\n|cFFFFFF00v7.0.3.3222.115 (|cFFFFCC00November 28th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Unstable Affliction to common spells with the same name.\n\n|cFFFFFF00-|r Fixed few issues with built-in plugins.\n\n|cFFFFFF00v7.0.3.3202.115 (|cFFFFCC00November 08th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Weakauras creator from the Encounter Details plugin and '/details forge' shall work correctly now with Trials of Valor.\n\n|cFFFFFF00-|r Raid history should now be recording your Trials of Valor kills.\n\n|cFFFFFF00-|r Added Trials of Valor raid info, good luck and have fun!.\n\n|cFFFFFF00v7.0.3.3201.115 (|cFFFFCC00November 04th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for Paladin holy icon.\n\n|cFFFFFF00-|r Fix for Rogue outlaw icon.\n\n|cFFFFFF00-|r Fixed misc displays with bar sorted by ascending order.\n\n|cFFFFFF00-|r Fix for '/details show' command while the window is on auto hide.\n\n|cFFFFFF00v7.0.3.3114.115 (|cFFFFCC00October 26th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Encounter Details (plugin): tooltip tutorial is now clamped to screen and its close button should be visible.\n\n|cFFFFFF00-|r Raid Check (plugin): now also works on dungeons.\n\n|cFFFFFF00-|r Added Potion of the Prolongued Power to the tracker.\n\n|cFFFFFF00v7.1.0.3097.115 (|cFFFFCC00October 25th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r renamed 'report history' to 'latest reports'.\n\n|cFFFFFF00-|r attempt to make all Details! users on the party or raid to track rogue's akaari's soul.\n\n|cFFFFFF00v7.0.3.2994 (|cFFFFCC00September 25th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r |cFF0088EE[Devilsaur Shock-Baton]|r added to custom spells, its effect should be displayed: 'Devilsaur Shock Leash (trinket)'.\n\n|cFFFFFF00-|r More fixes for dungeon trash being tag as a dungeon boss.\n\n|cFFFFFF00-|r Fixed the item level calculation when the player is using a main hand and offhand artifact.\n\n|cFFFFFF00-|r Added option to auto erase world segments (outdoors, e.g. doing world quests).\n\n|cFFFFFF00-|r Fixed the avoidance tab on the player detail window for Demon Hunters.\n\n|cFFFFFF00-|r Added the tag {target} on custom text for the interrupt announcer.\n\n|cFFFFFF00-|r Merging Demon Hunter 'Fury of the Illidari' spell when the consolidade option is enabled under Spell Customization.\n\n|cFFFFFF00v7.0.3.2961 (|cFFFFCC00September 17th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an option for consolidade spells with the same name (isn't working with all spells yet).\nThe option is under Spell Customization on options panel.\n\n|cFFFFFF00v7.0.3.2955 (|cFFFFCC00September 14th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Built-in custom displays has been updated to Legion.\n\n|cFFFFFF00-|r Raid Check (plugin) now checks for Legion food, rune and flash.\n\n|cFFFFFF00-|r removed the config button from the Player Details Window.\n\n|cFFFFFF00-|r the alert for this news window won't popup for each characters after the player opened it once for the update.\n\n|cFFFFFF00-|r added tooltip information for the two new arenas added in Legion.\n\n|cFFFFFF00v7.0.3.2941 (|cFFFFCC00September 13th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r fix for total bar where sometimes it desappears.\n\n|cFFFFFF00-|r fix for overall data reseting its elapsed time making dps and hps goes to millions.\n\n|cFFFFFF00-|r fix for overall not reseting when entering in a new dungeon.\n\n|cFFFFFF00-|r fix for trash cleanup on dungeons.\n\n|cFFFFFF00-|r fix for item level detection on dungeons.\n\n|cFFFFFF00-|r fix for artifact offhand always being counter as 750 item level.\n\n|cFFFFFF00-|r fix for segments menu sometimes not opening at all after a dungeon boss.\n\n|cFFFFFF00-|r fix for segments menu not showing the boss icon above the sub panel.\n\n|cFFFFFF00-|r fix for the top left corner of the window be ignoring the 'hide icon' setting at a /reload.\n\n|cFFFFFF00v7.0.3.2927 (|cFFFFCC00September 3rd, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Attempt to fix an issue with total bar hidding the latest bar shown.\n\n|cFFFFFF00v7.0.3.2899 (|cFFFFCC00August 26, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed a bug on tiny threat where it won't used the font set after a /reload.\n\n|cFFFFFF00-|r Bar spacing can now be set to -2 to 10 (from 0 to 10).\n\n|cFFFFFF00-|r Attempt to fix GBoM and Stormlash on dungeon boss fights.\n\n|cFFFFFF00v5.21 (|cFFFFCC00August 14, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for Monk's Soothing Mist on Streamer Plugin.\n\n|cFFFFFF00v5.20 (|cFFFFCC00August 13, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Warlock's Grimoire of Synergy buff uptime fix.\n\n|cFFFFFF00-|r Fix for the options panel background when using Classic panels.\n\n|cFFFFFF00-|r Tooltips are now slightly bigger.\n\n|cFFFFFF00-|r Fix for bookmark background where sometimes it has a light silver color.\n\n|cFFFFFF00-|r Fix for channel cast on Streamer Plugin.\n\n|cFFFFFF00-|r Legion followers fix.\n\n|cFFFFFF00-|r Boss detection for Legion dungeons.\n\n|cFFFFFF00-|r Priest spec detection review (thanks Yakumile-Azralon).\n\n|cFFFFFF00v5.15 (|cFFFFCC00August 5, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r fix for an error which happen sometimes during encounter start." + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v7.2.0.3640.116 (|cFFFFCC00May 04th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Heal Absorbed display under Heal bracket.\n\nHeal Absorbed are the heal denied by abilities such like DK's Necrotic Strike or raid boss Chromatic Anomaly's 'Time Release' ability.The tooltip of this display shows which players got heal denied, which abilities absorbed the heal, which abilities tried to heal but got the heal denied.\n\n|cFFFFFF00v7.2.0.3512.116 (|cFFFFCC00April 27th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Havoc Demon Hunter: your fury energy is being shown under Mana Restored (don't ask me why, the combat log is telling us it's mana).\n\n|cFFFFFF00-|r Pets now are shown on damage tooltips.\n\n|cFFFFFF00-|r Pets are now also shown on the comparison panel.\n\n|cFFFFFF00v7.2.0.3474.116 (|cFFFFCC00April 20th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Plugin: Raid Check > added some food buffs which wasn't being tracked.\n\n|cFFFFFF00v7.2.0.3467.116 (|cFFFFCC00April 07th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for the custom display window where apply and cancel buttons where over the edit window.\n\n|cFFFFFF00-|r Fix for an issue on editing a bookmark.\n\n|cFFFFFF00v7.1.5.3459.116 (|cFFFFCC00Mar 21th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue on dynamic overall data where it wasn't showing DPS.\n\n|cFFFFFF00-|r Fixed an issue with Apply, Save and Cancel buttons when editing a custom display.\n\n|cFFFFFF00-|r Removed the Damage and Healing presets for custom displays, now is only possible create custom displays by scripting them.\n\n|cFFFFFF00v7.1.5.3431.116 (|cFFFFCC00Mar 15th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with bar orientation right to left where fixed bar color isn't working.\n\n|cFFFFFF00-|r The nickname field now use FrizQuadrataTT font and shall be compatible with Cyrillic.\n\n|cFFFFFF00v7.1.5.3418.116 (|cFFFFCC00Mar 1st, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #167 fix: Light of the Martyr self-damage now does reduce the healing done (following WCL method).\n\n|cFFFFFF00-|r Ticket #169 fix: Damage Prevented is now working for new segments.\n\n|cFFFFFF00-|r Fixed an issue where sometimes BeastMaster's Hati pet wasn't detected correctly.\n\n|cFFFFFF00v7.1.5.3369.116 (|cFFFFCC00Feb 07th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added custom display 'Dynamic Overall Damage' for mythic dungeons.\n\n|cFFFFFF00-|r Fix for Ticket #168: 'Auto Hide While [Not] Inside Instance is broken'.\n\n|cFFFFFF00-|r The bar truncate frame 'DetailsLeftTextAntiTruncate' is now created on Details! load instead on demand.\n\n|cFFFFFF00v7.1.5.3315.116 (|cFFFFCC00Jan 23th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #162: 'no Monochrome font' available, added an experimental slash command: /run _detalhes:UseOutline ('MONOCHROME').\n\n|cFFFFFF00-|r Ticket #158: 'no elapsed time shown on report to chat', added the elapsed time when reporting a segment.\n\n|cFFFFFF00-|r Ticket #164: 'error when browsing segments', an attempt to fix the problem has been made.\n\n|cFFFFFF00v7.1.5.3305.116 (|cFFFFCC00Jan 15th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Another fix for mythic dungeons overall data reset (thanks Tharai @ Curseforge).\n\n|cFFFFFF00-|r Fix for spec detection on PvP Arenas (thanks Pas06 @ Curseforge).\n\n|cFFFFFF00v7.1.0.3276.115 (|cFFFFCC00Jan 08th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed the overall data not reseting when starting a new mythic+ dungeon.\n\n|cFFFFFF00v7.1.0.3266.115 (|cFFFFCC00Dec 29th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with overall data not updating correctly at the end of the combat.\n\n|cFFFFFF00-|r Added a tutorial line on the window when the user access overall data.\n\n|cFFFFFF00v7.1.0.3236.115 (|cFFFFCC00Dec 19th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Integration with BigWigs should be working okay now.\n\n|cFFFFFF00v7.1.0.3231.115 (|cFFFFCC00Dec 15th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Disabled the link with BigWigs to avoid the 'RegisterMessage' error on every login.\n\n|cFFFFFF00v7.1.0.3229.115 (|cFFFFCC00Dec 09th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r When a window is locked, resize grips shouldn't be enabled messing with bar mouse over.\n\n|cFFFFFF00v7.0.3.3222.115 (|cFFFFCC00November 28th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Unstable Affliction to common spells with the same name.\n\n|cFFFFFF00-|r Fixed few issues with built-in plugins.\n\n|cFFFFFF00v7.0.3.3202.115 (|cFFFFCC00November 08th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Weakauras creator from the Encounter Details plugin and '/details forge' shall work correctly now with Trials of Valor.\n\n|cFFFFFF00-|r Raid history should now be recording your Trials of Valor kills.\n\n|cFFFFFF00-|r Added Trials of Valor raid info, good luck and have fun!.\n\n|cFFFFFF00v7.0.3.3201.115 (|cFFFFCC00November 04th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for Paladin holy icon.\n\n|cFFFFFF00-|r Fix for Rogue outlaw icon.\n\n|cFFFFFF00-|r Fixed misc displays with bar sorted by ascending order.\n\n|cFFFFFF00-|r Fix for '/details show' command while the window is on auto hide.\n\n|cFFFFFF00v7.0.3.3114.115 (|cFFFFCC00October 26th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Encounter Details (plugin): tooltip tutorial is now clamped to screen and its close button should be visible.\n\n|cFFFFFF00-|r Raid Check (plugin): now also works on dungeons.\n\n|cFFFFFF00-|r Added Potion of the Prolongued Power to the tracker.\n\n|cFFFFFF00v7.1.0.3097.115 (|cFFFFCC00October 25th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r renamed 'report history' to 'latest reports'.\n\n|cFFFFFF00-|r attempt to make all Details! users on the party or raid to track rogue's akaari's soul." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails!:|r " diff --git a/classes/classe_heal.lua b/classes/classe_heal.lua index cd3a44b0..fb21d02f 100644 --- a/classes/classe_heal.lua +++ b/classes/classe_heal.lua @@ -79,6 +79,7 @@ function atributo_heal:NovaTabela (serial, nome, link) total = alphabetical, totalover = alphabetical, totalabsorb = alphabetical, + totaldenied = alphabetical, custom = 0, total_without_pet = alphabetical, @@ -230,6 +231,8 @@ function atributo_heal:RefreshWindow (instancia, tabela_do_combate, forcar, expo keyName = "heal_enemy_amt" elseif (sub_atributo == 6) then --> absorbs keyName = "totalabsorb" + elseif (sub_atributo == 7) then --> heal absorb + keyName = "totaldenied" end else keyName = exportar.key @@ -251,6 +254,8 @@ function atributo_heal:RefreshWindow (instancia, tabela_do_combate, forcar, expo keyName = "heal_enemy_amt" elseif (sub_atributo == 6) then --> absorbs keyName = "totalabsorb" + elseif (sub_atributo == 7) then --> heal absorb + keyName = "totaldenied" end end @@ -768,6 +773,28 @@ function atributo_heal:AtualizaBarra (instancia, barras_container, qual_barra, l esta_barra.texto_direita:SetText (formated_absorbs .. bars_brackets[1] .. porcentagem .. bars_brackets[2]) end esta_porcentagem = _math_floor ((self.totalabsorb/instancia.top) * 100) + + elseif (sub_atributo == 7) then --> mostrando cura negada + + local formated_absorbs = SelectedToKFunction (_, self.totaldenied) + + if (UsingCustomRightText) then + esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_absorbs, "", porcentagem, self, instancia.showing)) + else + + if (not bars_show_data [1]) then + formated_absorbs = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + + esta_barra.texto_direita:SetText (formated_absorbs .. bars_brackets[1] .. porcentagem .. bars_brackets[2]) + end + esta_porcentagem = _math_floor ((self.totaldenied/instancia.top) * 100) + end end @@ -920,7 +947,9 @@ function atributo_heal:ToolTip (instancia, numero, barra, keydown) elseif (instancia.sub_atributo == 6) then --> healing done, HPS or Overheal return self:ToolTip_HealingDone (instancia, numero, barra, keydown) elseif (instancia.sub_atributo == 4) then --> healing taken - return self:ToolTip_HealingTaken (instancia, numero, barra, keydown) + return self:ToolTip_HealingDenied (instancia, numero, barra, keydown) + elseif (instancia.sub_atributo == 7) then --> heal denied + return self:ToolTip_HealingDenied (instancia, numero, barra, keydown) end end end @@ -928,6 +957,161 @@ end local r, g, b local barAlha = .6 +---------> HEAL DENIED +function atributo_heal:ToolTip_HealingDenied (instancia, numero, barra, keydown) + + local owner = self.owner + if (owner and owner.classe) then + r, g, b = unpack (_detalhes.class_colors [owner.classe]) + else + r, g, b = unpack (_detalhes.class_colors [self.classe]) + end + + local container = instancia.showing [2] + local totalDenied = self.totaldenied + + local spellList = {} --spells the player used to deny heal + local targetList = {} --all players affected + local spellsDenied = {} --all spells which had heal denied + + local icon_size = _detalhes.tooltip.icon_size + local icon_border = _detalhes.tooltip.icon_border_texcoord + + for spellID, spell in _pairs (self.spells._ActorTable) do + if (spell.totaldenied > 0 and spell.heal_denied) then + --my spells which denied heal + tinsert (spellList, {spell, spell.totaldenied}) + + --players affected + for playerName, amount in _pairs (spell.targets) do + targetList [playerName] = (targetList [playerName] or 0) + amount + end + + --spells with heal denied + for spellID, amount in _pairs (spell.heal_denied) do + spellsDenied [spellID] = (spellsDenied [spellID] or 0) + amount + end + end + end + + --Spells + table.sort (spellList, _detalhes.sort2) + _detalhes:AddTooltipSpellHeaderText ("Spells", headerColor, #spellList, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875) + _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) + + local ismaximized = false + if (keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3) then + GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2) + _detalhes:AddTooltipHeaderStatusbar (r, g, b, 1) + ismaximized = true + else + GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1) + _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) + end + + local tooltip_max_abilities = _detalhes.tooltip.tooltip_max_abilities + if (ismaximized) then + tooltip_max_abilities = 99 + end + + for i = 1, _math_min (tooltip_max_abilities, #spellList) do + local spellObject, spellTotal = unpack (spellList [i]) + + if (spellTotal < 1) then + break + end + + local spellName, _, spellIcon = _GetSpellInfo (spellObject.id) + + GameCooltip:AddLine (spellName .. ": ", FormatTooltipNumber (_, spellTotal) .. " (" .. _cstr ("%.1f", spellTotal / totalDenied) .."%)") + + GameCooltip:AddIcon (spellIcon, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B) + _detalhes:AddTooltipBackgroundStatusbar() + end + + + --Target Players + local playerSorted = {} + for playerName, amount in _pairs (targetList) do + tinsert (playerSorted, {playerName, amount}) + end + table.sort (playerSorted, _detalhes.sort2) + _detalhes:AddTooltipSpellHeaderText ("Targets", headerColor, #playerSorted, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875) + _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) + + local ismaximized = false + if (keydown == "ctrl" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 4) then + GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2) + _detalhes:AddTooltipHeaderStatusbar (r, g, b, 1) + ismaximized = true + else + GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1) + _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) + end + + local tooltip_max_abilities2 = _detalhes.tooltip.tooltip_max_targets + if (ismaximized) then + tooltip_max_abilities2 = 99 + end + + for i = 1, _math_min (tooltip_max_abilities2, #playerSorted) do + + local playerName, amountDenied = unpack (playerSorted [i]) + + GameCooltip:AddLine (playerName .. ": ", FormatTooltipNumber (_, amountDenied) .." (" .. _cstr ("%.1f", amountDenied / totalDenied * 100) .. "%)") + _detalhes:AddTooltipBackgroundStatusbar() + + local targetActor = container:PegarCombatente (nil, playerName) or instancia.showing [1]:PegarCombatente (nil, playerName) + if (targetActor) then + local classe = targetActor.classe + if (not classe) then + classe = "UNKNOW" + end + if (classe == "UNKNOW") then + GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, 14, 14, .25, .5, 0, 1) + else + GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small", nil, nil, 14, 14, _unpack (_detalhes.class_coords [classe])) + end + end + + end + + -- Spells Affected + local spellsSorted = {} + for spellID, amount in _pairs (spellsDenied) do + tinsert (spellsSorted, {spellID, amount}) + end + table.sort (spellsSorted, _detalhes.sort2) + _detalhes:AddTooltipSpellHeaderText ("Spells Affected", headerColor, #spellsSorted, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875) + _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) + + local ismaximized = false + local tooltip_max_abilities3 = _detalhes.tooltip.tooltip_max_targets + if (keydown == "alt" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 5) then + tooltip_max_abilities3 = 99 + ismaximized = true + end + + for i = 1, _math_min (tooltip_max_abilities3, #spellsSorted) do + + local spellID, spellTotal = unpack (spellsSorted [i]) + + if (spellTotal < 1) then + break + end + + local spellName, _, spellIcon = _GetSpellInfo (spellID) + + GameCooltip:AddLine (spellName .. ": ", FormatTooltipNumber (_, spellTotal) .. " (" .. _cstr ("%.1f", spellTotal / totalDenied) .."%)") + + GameCooltip:AddIcon (spellIcon, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B) + _detalhes:AddTooltipBackgroundStatusbar() + + end + + return true +end + ---------> HEALING TAKEN function atributo_heal:ToolTip_HealingTaken (instancia, numero, barra, keydown) @@ -2157,6 +2341,18 @@ end habilidade_shadow.targets_absorbs [target_name] = 0 end end + + --> copia o container de heal negado se ele existir + if (habilidade.heal_denied) then + --> cria o container na shadow de ele não existir + habilidade_shadow.heal_denied = habilidade_shadow.heal_denied or {} + --> copia + for spellID, amount in _pairs (habilidade.heal_denied) do + if (not habilidade_shadow.heal_denied [spellID]) then + habilidade_shadow.heal_denied [spellID] = 0 + end + end + end end @@ -2207,6 +2403,8 @@ end shadow.totalabsorb = shadow.totalabsorb + actor.totalabsorb --> total de cura feita em inimigos (captura de dados) shadow.heal_enemy_amt = shadow.heal_enemy_amt + actor.heal_enemy_amt + --> total de heal negado + shadow.totaldenied = shadow.totaldenied + actor.totaldenied --> total sem pets (captura de dados) shadow.total_without_pet = shadow.total_without_pet + actor.total_without_pet shadow.totalover_without_pet = shadow.totalover_without_pet + actor.totalover_without_pet @@ -2260,6 +2458,16 @@ end habilidade_shadow.targets_absorbs [target_name] = (habilidade_shadow.targets_absorbs [target_name] or 0) + amount end + --> copia o container de heal negado se ele existir + if (habilidade.heal_denied) then + --> cria o container na shadow de ele não existir + habilidade_shadow.heal_denied = habilidade_shadow.heal_denied or {} + --> copia + for spellID, amount in _pairs (habilidade.heal_denied) do + habilidade_shadow.heal_denied [spellID] = (habilidade_shadow.heal_denied [spellID] or 0) + amount + end + end + --> soma todos os demais valores for key, value in _pairs (habilidade) do if (_type (value) == "number") then @@ -2307,6 +2515,9 @@ atributo_heal.__add = function (tabela1, tabela2) tabela1.totalabsorb = tabela1.totalabsorb + tabela2.totalabsorb --> total de cura feita em inimigos tabela1.heal_enemy_amt = tabela1.heal_enemy_amt + tabela2.heal_enemy_amt + --> total de cura negada + tabela1.totaldenied = tabela1.totaldenied + tabela2.totaldenied + --> total sem pets tabela1.total_without_pet = tabela1.total_without_pet + tabela2.total_without_pet tabela1.totalover_without_pet = tabela1.totalover_without_pet + tabela2.totalover_without_pet @@ -2352,6 +2563,17 @@ atributo_heal.__add = function (tabela1, tabela2) for target_name, amount in _pairs (habilidade.targets_absorbs) do habilidade_tabela1.targets_absorbs = (habilidade_tabela1.targets_absorbs [target_name] or 0) + amount end + + --> copia o container de heal negado se ele existir + if (habilidade.heal_denied) then + --> cria o container na shadow de ele não existir + habilidade_tabela1.heal_denied = habilidade_tabela1.heal_denied or {} + --> copia + for spellID, amount in _pairs (habilidade.heal_denied) do + habilidade_tabela1.heal_denied [spellID] = (habilidade_tabela1.heal_denied [spellID] or 0) + amount + end + end + --> soma os valores da habilidade for key, value in _pairs (habilidade) do if (_type (value) == "number") then @@ -2392,6 +2614,9 @@ atributo_heal.__sub = function (tabela1, tabela2) tabela1.totalabsorb = tabela1.totalabsorb - tabela2.totalabsorb --> total de cura feita em inimigos tabela1.heal_enemy_amt = tabela1.heal_enemy_amt - tabela2.heal_enemy_amt + --> total de cura negada + tabela1.totaldenied = tabela1.totaldenied - tabela2.totaldenied + --> total sem pets tabela1.total_without_pet = tabela1.total_without_pet - tabela2.total_without_pet tabela1.totalover_without_pet = tabela1.totalover_without_pet - tabela2.totalover_without_pet @@ -2445,6 +2670,16 @@ atributo_heal.__sub = function (tabela1, tabela2) end end + --> copia o container de heal negado se ele existir + if (habilidade.heal_denied) then + --> cria o container na shadow de ele não existir + habilidade_tabela1.heal_denied = habilidade_tabela1.heal_denied or {} + --> copia + for spellID, amount in _pairs (habilidade.heal_denied) do + habilidade_tabela1.heal_denied [spellID] = (habilidade_tabela1.heal_denied [spellID] or 0) - amount + end + end + --> soma os valores da habilidade for key, value in _pairs (habilidade) do if (_type (value) == "number") then diff --git a/classes/classe_heal_habilidade.lua b/classes/classe_heal_habilidade.lua index 86ff8e4e..428faa64 100644 --- a/classes/classe_heal_habilidade.lua +++ b/classes/classe_heal_habilidade.lua @@ -27,6 +27,7 @@ totalabsorb = 0, absorbed = 0, overheal = 0, + totaldenied = 0, --> multistrike m_amt = 0, @@ -54,21 +55,25 @@ return _newHealSpell end - function habilidade_cura:Add (serial, nome, flag, amount, who_nome, absorbed, critical, overhealing, is_shield) + function habilidade_cura:Add (serial, nome, flag, amount, extraSpellID, absorbed, critical, overhealing, is_shield) amount = amount or 0 - self.total = self.total + amount self.targets [nome] = (self.targets [nome] or 0) + amount - if (multistrike) then - self.m_amt = self.m_amt + 1 - self.m_healed = self.m_healed + amount + if (absorbed == "SPELL_HEAL_ABSORBED") then + self.counter = self.counter + 1 + self.totaldenied = self.totaldenied + amount - if (critical) then - self.m_crit = self.m_crit + 1 + --create the denied table spells, on the fly + if (not self.heal_denied) then + self.heal_denied = {} end + + self.heal_denied [extraSpellID] = (self.heal_denied [extraSpellID] or 0) + amount + else + self.total = self.total + amount self.counter = self.counter + 1 if (absorbed and absorbed > 0) then diff --git a/core/parser.lua b/core/parser.lua index d4564580..d268dcc1 100644 --- a/core/parser.lua +++ b/core/parser.lua @@ -991,6 +991,124 @@ [152118] = true, --Clarity of Will } + function parser:heal_denied (token, time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, alvo_flags2, spellidAbsorb, spellnameAbsorb, spellschoolAbsorb, serialHealer, nameHealer, flagsHealer, flags2Healer, spellidHeal, spellnameHeal, typeHeal, amountDenied) + + if (not _in_combat) then + return + end + + --> check invalid serial against pets + if (who_serial == "") then + if (who_flags and _bit_band (who_flags, OBJECT_TYPE_PETS) ~= 0) then --> é um pet + return + end + end + + --> no name, use spellname + if (not who_name) then + who_name = "[*] "..spellname + end + + --> no target, just ignore + if (not alvo_name) then + return + end + + --> if no spellid + if (not spellidAbsorb) then + spellidAbsorb = 1 + spellnameAbsorb = "unknown" + spellschoolAbsorb = 1 + end + + if (is_using_spellId_override) then + spellidAbsorb = override_spellId [spellidAbsorb] or spellidAbsorb + spellidHeal = override_spellId [spellidHeal] or spellidHeal + end + + ------------------------------------------------------------------------------------------------ + --> get actors + + local este_jogador, meu_dono = healing_cache [who_name] + if (not este_jogador) then --> pode ser um desconhecido ou um pet + este_jogador, meu_dono, who_name = _current_heal_container:PegarCombatente (who_serial, who_name, who_flags, true) + if (not meu_dono and who_flags) then --> se não for um pet, adicionar no cache + healing_cache [who_name] = este_jogador + end + end + + local jogador_alvo, alvo_dono = healing_cache [alvo_name] + if (not jogador_alvo) then + jogador_alvo, alvo_dono, alvo_name = _current_heal_container:PegarCombatente (alvo_serial, alvo_name, alvo_flags, true) + if (not alvo_dono and alvo_flags) then + healing_cache [alvo_name] = jogador_alvo + end + end + + este_jogador.last_event = _tempo + + ------------------------------------------------ + + este_jogador.totaldenied = este_jogador.totaldenied + amountDenied + + --> actor spells table + local spell = este_jogador.spells._ActorTable [spellidAbsorb] + if (not spell) then + spell = este_jogador.spells:PegaHabilidade (spellidAbsorb, true, token) + if (_current_combat.is_boss and who_flags and _bit_band (who_flags, OBJECT_TYPE_ENEMY) ~= 0) then + _detalhes.spell_school_cache [spellnameAbsorb] = spellschoolAbsorb or 1 + end + end + + --return spell:Add (alvo_serial, alvo_name, alvo_flags, cura_efetiva, who_name, absorbed, critical, overhealing) + return spell_heal_func (spell, alvo_serial, alvo_name, alvo_flags, amountDenied, spellidHeal, token, critical, overhealing) + + + --print ("|token:", token, "|time:", time, "|whoserial:", who_serial, "|whoname:", who_name, "|whoflags:", who_flags, "|alvoserial:", alvo_serial, "|alvoname:", alvo_name, "|alvoflags", alvo_flags, "|alvoflags2:", alvo_flags2, "|spellidAbsorb:", spellidAbsorb, "|spellnameABsorb", spellnameAbsorb, "|spellschoolAbsorb", spellschoolAbsorb, "|serialhealer:", serialHealer, "|nameHealer:", nameHealer, "|flagsHealer:", flagsHealer, "|flagsHealer2:", flags2Healer, "|spellidHeal:", spellidHeal, "|spellnameHeal:", spellnameHeal, "|typeHeal:", typeHeal, "|amountDenied:", amountDenied) + + + --[[ + 1 toekn SPELL_HEAL_ABSORBED + 2 time 1493837437.157 + 3 who serial Player-3209-0514A56A + 4 who name Bombadão + 5 who flags 1297 + 6 alvo serial Player-3209-0514A56A + 7 alvo name Bombadão + 8 alvo flags 1297 + 9 alvo flags2 0 + 10 spellid 116888 + 11 spellname Shroud of Purgatory + 12 school 12 + + 13 GUID - Player-3209-0514A56A + 14 PLAYERNAME - Bombadão + 15 FLAGS 1297 + 16 FLAGS2 0 + 17 SPELLID 116888 + 18 SPELLNAME Healing Potion + 19 ? 1 + 20 ? 2677 + primeiro actor é o quem comandou o absorb + o segundo é a vitima seguido da magia que o primeiro actor usou pra o absorb + o terceiro é a vitima com a magia que ela usou e foi absorvida + 5/3 11:54:58.346 SPELL_HEAL_ABSORBED, + Player-3209-051429E9,"Mephisstoo-Azralon",0x10548,0x0,Player-3209-05144527,"Keyspell-Azralon",0x511,0x0,223929,"Necrotic Wound",0x28,Player-3209-05144527,"Keyspell-Azralon",0x511,0x0,188016,"Ancient Healing Potion",0x1,254466 + + --heal pot spellID: 28495 - heal 2841 + + 1 SPELL_HEAL_ABSORBED 2 1493837944.856 3 Player-3209-0514A56A 4 Bombadão 5 1297 6 Player-3209-0514A56A 7 Bombadão 8 1297 9 0 10 116888 11 Shroud of Purgatory 12 32 13 Player-3209-0514A56A 14 Bombadão 15 1297 16 0 17 116888 18 Healing Potion 19 1 20 1860 21 nil 22 nil 23 nil 24 nil 25 nil 26 nil 27 nil + + 1 SPELL_HEAL_ABSORBED 2 1493839447.257 3 Player-3209-0514A56A 4 Bombadão 5 1297 6 Player-3209-0514A56A 7 Bombadão 8 1297 9 0 10 nil 11 nil 12 nil 13 Player-3209-05DE3E42 14 Yakumile 15 1298 16 0 17 116888 18 Holy Word: Serenity 19 2 20 2690 21 nil 22 nil + + 1 SPELL_HEAL_ABSORBED 2 1493840761.019 3 Player-3209-0514A56A 4 Bombadão 5 1297 6 Player-3209-0514A56A 7 Bombadão 8 1297 9 0 10 nil 11 nil 12 nil 13 Player-57-06AB4689 14 Yakumile 15 1298 16 0 17 116888 18 Circle of Healing 19 2 20 673 21 nil 22 nil 23 nil 24 nil 25 nil 26 nil 27 nil + +oken: SPELL_HEAL_ABSORBED ime: 1493841853.862 |whoserial: Player-3209-0514A56A |whoname: Bombadão |whoflags: 1297 |alvoserial: Player-3209-0514A56A |alvoname: Bombadão |alvoflags 1297 |alvoflags2: 0 |spellidAbsorb: 116888 |spellnameABsorb Shroud of Purgatory |spellschoolAbsorb 32 |serialhealer: Player-3209-0514A56A +ameHealer: Bombadão |flagsHealer: 1297 |flagsHealer2: 0 |spellidHeal: 116888 |spellnameHeal: Healing Potion ypeHeal: 1 |amountDenied: 870 + +--]] + end + function parser:heal_absorb (token, time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, alvo_flags2, spellid, spellname, spellschool, owner_serial, owner_name, owner_flags, owner_flags2, shieldid, shieldname, shieldtype, amount) --[[statistics]]-- _detalhes.statistics.absorbs_calls = _detalhes.statistics.absorbs_calls + 1 @@ -3174,6 +3292,7 @@ SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 18 elseif (capture_type == "heal") then token_list ["SPELL_HEAL"] = nil token_list ["SPELL_PERIODIC_HEAL"] = nil + token_list ["SPELL_HEAL_ABSORBED"] = nil token_list ["SPELL_ABSORBED"] = nil _recording_healing = false @@ -3239,6 +3358,7 @@ SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 18 elseif (capture_type == "heal") then token_list ["SPELL_HEAL"] = parser.heal token_list ["SPELL_PERIODIC_HEAL"] = parser.heal + token_list ["SPELL_HEAL_ABSORBED"] = parser.heal_denied token_list ["SPELL_ABSORBED"] = parser.heal_absorb _recording_healing = true @@ -3284,6 +3404,7 @@ SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 18 ["environment"] = parser.environment, ["heal"] = parser.heal, ["heal_absorb"] = parser.heal_absorb, + ["heal_denied"] = parser.heal_denied, ["buff"] = parser.buff, ["unbuff"] = parser.unbuff, ["buff_refresh"] = parser.buff_refresh, @@ -3327,7 +3448,8 @@ SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 18 ["ENVIRONMENTAL_DAMAGE"] = "environment", ["SPELL_HEAL"] = "heal", - ["SPELL_PERIODIC_HEAL"] = "heal", + ["SPELL_PERIODIC_HEAL"] = "heal", + ["SPELL_HEAL_ABSORBED"] = "heal_denied", ["SPELL_ABSORBED"] = "heal_absorb", ["SPELL_AURA_APPLIED"] = "buff", diff --git a/functions/attributes.lua b/functions/attributes.lua index eca1923d..50a571ff 100644 --- a/functions/attributes.lua +++ b/functions/attributes.lua @@ -24,6 +24,7 @@ do --[[global]] DETAILS_SUBATTRIBUTE_HEALTAKEN = 4 --[[global]] DETAILS_SUBATTRIBUTE_HEALENEMY = 5 --[[global]] DETAILS_SUBATTRIBUTE_HEALPREVENTED = 6 + --[[global]] DETAILS_SUBATTRIBUTE_HEALABSORBED = 7 --[[global]] DETAILS_ATTRIBUTE_ENERGY = 3 @@ -60,6 +61,7 @@ do "heal", --healing taken "heal", --enemy healed "heal", --damage prevented + "heal", --heal absorbed/denied "energy", --mana restored "energy", --rage gained @@ -89,7 +91,7 @@ do --[[ HEALING ]] cura = 2, --> identifier - [2] = 6, --> sub attributes + [2] = 7, --> sub attributes --[[ ENERGY ]] e_energy = 3,--> identifier @@ -157,6 +159,7 @@ do healing_tanken = 4, heal_enemy_amt = 5, totalabsorb = 6, + totaldenied = 7, lista = { --[[ String Names ]] Loc ["STRING_ATTRIBUTE_HEAL_DONE"], Loc ["STRING_ATTRIBUTE_HEAL_HPS"], @@ -164,6 +167,7 @@ do Loc ["STRING_ATTRIBUTE_HEAL_TAKEN"], Loc ["STRING_ATTRIBUTE_HEAL_ENEMY"], Loc ["STRING_ATTRIBUTE_HEAL_PREVENT"], + "Heal Absorbed (in testing)", }, icones = { @@ -172,9 +176,10 @@ do {"Interface\\AddOns\\Details\\images\\atributos_icones_heal", {.25, .375, 0, 1}}, {"Interface\\AddOns\\Details\\images\\atributos_icones_heal", {.375, .5, 0, 1}}, {"Interface\\AddOns\\Details\\images\\atributos_icones_heal", {.5, 0.625, 0, 1}}, - {"Interface\\AddOns\\Details\\images\\atributos_icones_heal", {0.625, 0.75, 0, 1}} + {"Interface\\AddOns\\Details\\images\\atributos_icones_heal", {0.625, 0.75, 0, 1}}, + {"Interface\\AddOns\\Details\\images\\atributos_icones_heal", {0.75, 0.75+.125, 0, 1}}, }, - internal = {"total", "last_hps", "totalover", "healing_taken", "heal_enemy_amt", "totalabsorb"} + internal = {"total", "last_hps", "totalover", "healing_taken", "heal_enemy_amt", "totalabsorb", "totaldenied"} }, { diff --git a/images/atributos_icones_heal.blp b/images/atributos_icones_heal.blp index 6aa5a4befcca59e845f1bc6fe9087974b9c0a280..156bb5efd6623d553bf1099cac66a3121eee4a86 100644 GIT binary patch literal 12148 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 Jm@{Jx{TIDNM@0Yt