From f99a5dabf61a173db529032c2e2de52a5643937c Mon Sep 17 00:00:00 2001 From: Tercio Date: Fri, 23 Jan 2015 19:04:09 -0200 Subject: [PATCH] - Added options to change the brackets and the separator for dps/percent block. - Added options for show (or hide) totals, dps and percent amount. --- boot.lua | 10 +- classes/classe_custom.lua | 28 ++-- classes/classe_damage.lua | 174 +++++++++++++++++++------ classes/classe_energy.lua | 60 ++++++--- classes/classe_heal.lua | 142 ++++++++++++++------ classes/classe_instancia_include.lua | 5 +- classes/classe_others.lua | 22 +++- gumps/janela_options.lua | 185 +++++++++++++++++++++++++-- gumps/janela_principal.lua | 52 ++++++++ images/spec_icons_normal_alpha.tga | Bin 474343 -> 477215 bytes 10 files changed, 556 insertions(+), 122 deletions(-) diff --git a/boot.lua b/boot.lua index 52ac1a04..9d928e86 100644 --- a/boot.lua +++ b/boot.lua @@ -1,10 +1,10 @@ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> 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 = 439 --it's 439 for release - _detalhes.userversion = "v3.8.6" + _detalhes.userversion = "v3.8.8" _detalhes.realversion = 58 --core version _detalhes.version = _detalhes.userversion .. " (core " .. _detalhes.realversion .. ")" @@ -20,7 +20,9 @@ do local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) --[[ -|cFFFFFF00v3.8.6 (|cFFFFCC00Jan 23, 2015|r|cFFFFFF00)|r:\n\n +|cFFFFFF00v3.8.8 (|cFFFFCC00Jan 23, 2015|r|cFFFFFF00)|r:\n\n +|cFFFFFF00-|r Added options to change the brackets and the separator for dps/percent block.\n\n +|cFFFFFF00-|r Added options for show (or hide) totals, dps and percent amount.\n\n |cFFFFFF00-|r Added Options Panel for Vanguard Plugin.\n\n |cFFFFFF00-|r Added Segments shortcut menu pressing Shift + Right click.\n\n |cFFFFFF00-|r Fixed avoidance panel on Player Details Window where sometimes was giving errors.\n\n @@ -32,7 +34,7 @@ do --]] -- - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v3.8.6 (|cFFFFCC00Jan 23, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Options Panel for Vanguard Plugin.\n\n|cFFFFFF00-|r Added Segments shortcut menu pressing Shift + Right click .\n\n|cFFFFFF00-|r Fixed avoidance panel on Player Details Window where sometimes was giving errors.\n\n|cFFFFFF00-|r Fixed priest shadow and holy detection.\n\n|cFFFFFF00-|r Fixed blood and unholy spec icons.\n\n|cFFFFFF00-|r Improved specialization detection in order to try detect spec changes.\n\n|cFFFFFF00-|r Fixed an issue with 'Always Show Me' feature where it was showing the player on Enemies display.\n\n|cFFFFFF00-|r Testing LibWindow-1.1.\n\n|cFFFFFF00v3.8.1 (|cFFFFCC00Jan 17, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Plugin Vanguard: got full rewrite and now it is more easy to use.\n\n|cFFFFFF00-|r Plugin TimeAttack: fixed problem where sometimes required a reload to start a new time.\n\n|cFFFFFF00-|r Plugin Damage the Game!: fixed a problem where sometimes the time didn't started after level 2.\n\n|cFFFFFF00-|r Added specialization icons.\n\n|cFFFFFF00-|r Fixed Auto-Hide where it wasn't hiding the wallpaper of the window.\n\n|cFFFFFF00-|r Added 'Editing Group' check box on option panel, when enabled, settings changed also are modified on all windows in the group.\n\n|cFFFFFF00-|r Changing window's skin, doesn't change any more settings not related with appearance, for example, Auto-Hide, Switches.\n\n|cFFFFFF00-|r Custom display 'Health Potion & Stone' now also track Healing Tonic.\n\n|cFFFFFF00-|r Custom display 'Damage Taken by Spell' now tracks more spells and also melee hits.\n\n|cFFFFFF00-|r Menus now uses 'Friz Quadrata TT' font as default, also added an option to change it on options panel -> miscellaneous.\n\n|cFFFFFF00-|r 'Switch to Current' feature now switches all windows which have this option enabled.\n\n|cFFFFFF00-|r The message telling to use '/details reinstall' now only shows if a problem happen during the addon load process.\n\n|cFFFFFF00-|r Segments Saved option now can be set to 25, up from 5.\n\n|cFFFFFF00-|r Attempt to fix the bug with the monk spell 'Storm, Earth, and Fire'.\n\n|cFFFFFF00-|r Fixed 'Icon Pick' panel.\n\n|cFFFFFF00-|r Fixed bug when reporting friendly fire through player detail window.\n\n|cFFFFFF00-|r Fixed bug with report window where sometimes it was reporting on a wrong channel.\n\n|cFFFFFF00v3.7.1 (|cFFFFCC00Jan 08, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Plugin 'Damage Rank': is now called 'Damage, the Game!' and had its levels adjusted for WoD.\n\n|cFFFFFF00-|r Plugin 'Tiny Threat': fixed player name where it was showing the realm name too.\n\n|cFFFFFF00-|r Plugin 'Vanguard': fixed frame details (clicking on a bar) shown behind the Vanguard panel.\n\n|cFFFFFF00-|r Plugin 'Vanguard': fixed a problem when clicking with right button wasn't opening the bookmark panel.\n\n|cFFFFFF00-|r Plugin 'Vanguard': incoming heals now count shield amount on the player too.\n\n|cFFFFFF00-|r Plugin 'Vanguard' Known Bug: incoming damage and melee vs avoidance seems to be inaccurate by now, we need more time to study and fix it.\n\n|cFFFFFF00-|r Added Twins Ogron's Charge as custom spells, one for the charge by him self and other for the copies (mythic only).\n\n|cFFFFFF00-|r Added option panel for Raid Check plugin.\n\n|cFFFFFF00-|r Added key bindings for open a window, close a window and select a bookmark.\n\n|cFFFFFF00-|r Added 'CTRL + RightClick' closes a window.\n\n|cFFFFFF00-|r Fixed wallpaper transparency after releasing the window from a stretch.|cFFFFFF00-|r Fixed few issues when using class text colors.\n\n|cFFFFFF00-|r Fixed characters name outside instances, now it replaces the realm name with a * and show the complete name on tooltip.\n\n|cFFFFFF00-|r Fixed damage mitigation on damage taken, this affects only specific classes like monk tank.\n\n|cFFFFFF00-|r Fixed auto erase poping up when the player enters on its garrison.\n\n|cFFFFFF00-|r Fixed combat on garrison training dummies which was being marked as Trash Segment.\n\n|cFFFFFF00-|r Fixed command /details disable, wasn't disabling the capture of cooldowns.\n\n|cFFFFFF00-|r Fixed a problem with fast dps/hps when the window is in a empty segment.\n\n|cFFFFFF00-|r Fixed an issue using bookmark panel where it wasn't changing the display when the window is in a plugin mode.\n\n|cFFFFFF00-|r Fixed a bug when bars isn't using class colors on Frags, Auras & Void Zones, Resources and Deaths.\n\n|cFFFFFF00-|r Fixed bar animations when 'Sort Direction' is set to bottom.\n\n|cFFFFFF00-|r Fixed the spam 'you are not in a guild' when checking for new versions.\n\n|cFFFFFF00-|r Fixed translations for Auto Hide Settings bracket under options panel.\n\n|cFFFFFF00-|r Fixed Auto Hide -> Mouse Interaction tool where wans't able to work okey during combat.\n\n|cFFFFFF00v3.6.14b (|cFFFFCC00Jan 01, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added custom display 'My Spells' which shows your spells in the window.\n\n|cFFFFFF00-|r Added new custom display: Health Potion & Stone.\n\n|cFFFFFF00-|r Added overkill on death's tooltip.\n\n|cFFFFFF00-|r Created custom spells for Twin Ogron's Pulverize. Now it has 3 spells one for each wave.\n\n|cFFFFFF00-|r Created custom spells for Ko'ragh Overflowing Energy. Now it has 2 spells one for when the ball is catched and other when it reaches the ground and explodes.\n\n|cFFFFFF00-|r Changed healing multistrike to use the same format as damage done.\n\n|cFFFFFF00-|r Few improvements on Tiny Threat plugin: color gradient green-red is fixed, texts and bar texture now correctly uses the window settings.\n\n|cFFFFFF00-|r Damage Taken by Spell won't show pets in its tooltip any more.\n\n|cFFFFFF00-|r Enemies display won't show any more mirror images and spirit link totems.\n\n|cFFFFFF00-|r Enemies's tooltip now only show players and show all players instead of only 6.\n\n|cFFFFFF00-|r Few cooldowns shown as raid wide now shows as personal cooldowns.\n\n|cFFFFFF00-|r Fixed dispell tagets on dispell's tooltip.\n\n|cFFFFFF00-|r Fixed 'First Hit' raid tool.\n\n|cFFFFFF00-|r Fixed 'Open Options Panel' from interface panel.\n\n|cFFFFFF00v3.6.8 (|cFFFFCC00Dec 24, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Fast (i mean, really fast) Dps/Hps update rate, its option is under Rows: Advanced -> Fast Updates.\n\n|cFFFFFF00-|r Created a custom spell for Mirror Image's Fireball and Frostbolt, with that Player Detail window distinguishes spells from the player and images.\n\n|cFFFFFF00-|r Added new skin: 'ElvUI Style II'.\n\n|cFFFFFF00-|r Added Observer mode for Raid Tools: report cooldown/interrupt/death of entire raid only to you in your chat window.\n\n|cFFFFFF00-|r Added new plugin 'Raid Check': tracks raid members checking food, flask and pre-potions usage.\n\n|cFFFFFF00-|r Changed DPS display, now it shows onyl the player's Dps and the Dps difference between him and the top ranked.\n\n|cFFFFFF00-|r Changed Overheal display, now its percentage shows the player's overheal percent.\n\n|cFFFFFF00-|r Player Detail Window now shows the amount of multistrike on normal and critical hits.\n\n|cFFFFFF00-|r Removed skin: 'ElvUI Frame Style BW'.\n\n|cFFFFFF00-|r The tooltip for Scale option under options panel, now shows the real value for the scale.\n\n|cFFFFFF00-|r Fixed Imperator Mar'gok's adds damage taken.\n\n|cFFFFFF00-|r Fixed a problem where multistrike was counting towards critical strike amount.\n\n|cFFFFFF00-|r Fixed death display's report where it was't showing any death.\n\n|cFFFFFF00-|r Fixed a small issue with Encounter Details plugin where sometimes gets a error right after a boss encounter.\n\n|cFFFFFF00-|r Fixed bugs on sending messages to chat for Raid Tools.\n\n\n\n|cFFFFFF00v3.5.1 (|cFFFFCC00Dec 16, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed few accuracy on miss spells.\n\n|cFFFFFF00v3.5.0 (|cFFFFCC00Dec 14, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed tooltip for Auras and Voidzones, now shows sorted by damage and time.\n\n|cFFFFFF00-|r More fixes for Korgath encounter on Highmaul.\n\n|cFFFFFF00-|r Added slash commands: 'reset' 'config'.\n\n|cFFFFFF00-|r Spell bars on Player Details Window now is painted with the spell spellschool color." + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v3.8.8 (|cFFFFCC00Jan 23, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added options to change the brackets and the separator for dps/percent block.\n\n|cFFFFFF00-|r Added options for show (or hide) totals, dps and percent amount.\n\n|cFFFFFF00-|r Added Options Panel for Vanguard Plugin.\n\n|cFFFFFF00-|r Added Segments shortcut menu pressing Shift + Right click .\n\n|cFFFFFF00-|r Fixed avoidance panel on Player Details Window where sometimes was giving errors.\n\n|cFFFFFF00-|r Fixed priest shadow and holy detection.\n\n|cFFFFFF00-|r Fixed blood and unholy spec icons.\n\n|cFFFFFF00-|r Improved specialization detection in order to try detect spec changes.\n\n|cFFFFFF00-|r Fixed an issue with 'Always Show Me' feature where it was showing the player on Enemies display.\n\n|cFFFFFF00-|r Testing LibWindow-1.1.\n\n|cFFFFFF00v3.8.1 (|cFFFFCC00Jan 17, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Plugin Vanguard: got full rewrite and now it is more easy to use.\n\n|cFFFFFF00-|r Plugin TimeAttack: fixed problem where sometimes required a reload to start a new time.\n\n|cFFFFFF00-|r Plugin Damage the Game!: fixed a problem where sometimes the time didn't started after level 2.\n\n|cFFFFFF00-|r Added specialization icons.\n\n|cFFFFFF00-|r Fixed Auto-Hide where it wasn't hiding the wallpaper of the window.\n\n|cFFFFFF00-|r Added 'Editing Group' check box on option panel, when enabled, settings changed also are modified on all windows in the group.\n\n|cFFFFFF00-|r Changing window's skin, doesn't change any more settings not related with appearance, for example, Auto-Hide, Switches.\n\n|cFFFFFF00-|r Custom display 'Health Potion & Stone' now also track Healing Tonic.\n\n|cFFFFFF00-|r Custom display 'Damage Taken by Spell' now tracks more spells and also melee hits.\n\n|cFFFFFF00-|r Menus now uses 'Friz Quadrata TT' font as default, also added an option to change it on options panel -> miscellaneous.\n\n|cFFFFFF00-|r 'Switch to Current' feature now switches all windows which have this option enabled.\n\n|cFFFFFF00-|r The message telling to use '/details reinstall' now only shows if a problem happen during the addon load process.\n\n|cFFFFFF00-|r Segments Saved option now can be set to 25, up from 5.\n\n|cFFFFFF00-|r Attempt to fix the bug with the monk spell 'Storm, Earth, and Fire'.\n\n|cFFFFFF00-|r Fixed 'Icon Pick' panel.\n\n|cFFFFFF00-|r Fixed bug when reporting friendly fire through player detail window.\n\n|cFFFFFF00-|r Fixed bug with report window where sometimes it was reporting on a wrong channel.\n\n|cFFFFFF00v3.7.1 (|cFFFFCC00Jan 08, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Plugin 'Damage Rank': is now called 'Damage, the Game!' and had its levels adjusted for WoD.\n\n|cFFFFFF00-|r Plugin 'Tiny Threat': fixed player name where it was showing the realm name too.\n\n|cFFFFFF00-|r Plugin 'Vanguard': fixed frame details (clicking on a bar) shown behind the Vanguard panel.\n\n|cFFFFFF00-|r Plugin 'Vanguard': fixed a problem when clicking with right button wasn't opening the bookmark panel.\n\n|cFFFFFF00-|r Plugin 'Vanguard': incoming heals now count shield amount on the player too.\n\n|cFFFFFF00-|r Plugin 'Vanguard' Known Bug: incoming damage and melee vs avoidance seems to be inaccurate by now, we need more time to study and fix it.\n\n|cFFFFFF00-|r Added Twins Ogron's Charge as custom spells, one for the charge by him self and other for the copies (mythic only).\n\n|cFFFFFF00-|r Added option panel for Raid Check plugin.\n\n|cFFFFFF00-|r Added key bindings for open a window, close a window and select a bookmark.\n\n|cFFFFFF00-|r Added 'CTRL + RightClick' closes a window.\n\n|cFFFFFF00-|r Fixed wallpaper transparency after releasing the window from a stretch.|cFFFFFF00-|r Fixed few issues when using class text colors.\n\n|cFFFFFF00-|r Fixed characters name outside instances, now it replaces the realm name with a * and show the complete name on tooltip.\n\n|cFFFFFF00-|r Fixed damage mitigation on damage taken, this affects only specific classes like monk tank.\n\n|cFFFFFF00-|r Fixed auto erase poping up when the player enters on its garrison.\n\n|cFFFFFF00-|r Fixed combat on garrison training dummies which was being marked as Trash Segment.\n\n|cFFFFFF00-|r Fixed command /details disable, wasn't disabling the capture of cooldowns.\n\n|cFFFFFF00-|r Fixed a problem with fast dps/hps when the window is in a empty segment.\n\n|cFFFFFF00-|r Fixed an issue using bookmark panel where it wasn't changing the display when the window is in a plugin mode.\n\n|cFFFFFF00-|r Fixed a bug when bars isn't using class colors on Frags, Auras & Void Zones, Resources and Deaths.\n\n|cFFFFFF00-|r Fixed bar animations when 'Sort Direction' is set to bottom.\n\n|cFFFFFF00-|r Fixed the spam 'you are not in a guild' when checking for new versions.\n\n|cFFFFFF00-|r Fixed translations for Auto Hide Settings bracket under options panel.\n\n|cFFFFFF00-|r Fixed Auto Hide -> Mouse Interaction tool where wans't able to work okey during combat.\n\n|cFFFFFF00v3.6.14b (|cFFFFCC00Jan 01, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added custom display 'My Spells' which shows your spells in the window.\n\n|cFFFFFF00-|r Added new custom display: Health Potion & Stone.\n\n|cFFFFFF00-|r Added overkill on death's tooltip.\n\n|cFFFFFF00-|r Created custom spells for Twin Ogron's Pulverize. Now it has 3 spells one for each wave.\n\n|cFFFFFF00-|r Created custom spells for Ko'ragh Overflowing Energy. Now it has 2 spells one for when the ball is catched and other when it reaches the ground and explodes.\n\n|cFFFFFF00-|r Changed healing multistrike to use the same format as damage done.\n\n|cFFFFFF00-|r Few improvements on Tiny Threat plugin: color gradient green-red is fixed, texts and bar texture now correctly uses the window settings.\n\n|cFFFFFF00-|r Damage Taken by Spell won't show pets in its tooltip any more.\n\n|cFFFFFF00-|r Enemies display won't show any more mirror images and spirit link totems.\n\n|cFFFFFF00-|r Enemies's tooltip now only show players and show all players instead of only 6.\n\n|cFFFFFF00-|r Few cooldowns shown as raid wide now shows as personal cooldowns.\n\n|cFFFFFF00-|r Fixed dispell tagets on dispell's tooltip.\n\n|cFFFFFF00-|r Fixed 'First Hit' raid tool.\n\n|cFFFFFF00-|r Fixed 'Open Options Panel' from interface panel.\n\n|cFFFFFF00v3.6.8 (|cFFFFCC00Dec 24, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Fast (i mean, really fast) Dps/Hps update rate, its option is under Rows: Advanced -> Fast Updates.\n\n|cFFFFFF00-|r Created a custom spell for Mirror Image's Fireball and Frostbolt, with that Player Detail window distinguishes spells from the player and images.\n\n|cFFFFFF00-|r Added new skin: 'ElvUI Style II'.\n\n|cFFFFFF00-|r Added Observer mode for Raid Tools: report cooldown/interrupt/death of entire raid only to you in your chat window.\n\n|cFFFFFF00-|r Added new plugin 'Raid Check': tracks raid members checking food, flask and pre-potions usage.\n\n|cFFFFFF00-|r Changed DPS display, now it shows onyl the player's Dps and the Dps difference between him and the top ranked.\n\n|cFFFFFF00-|r Changed Overheal display, now its percentage shows the player's overheal percent.\n\n|cFFFFFF00-|r Player Detail Window now shows the amount of multistrike on normal and critical hits.\n\n|cFFFFFF00-|r Removed skin: 'ElvUI Frame Style BW'.\n\n|cFFFFFF00-|r The tooltip for Scale option under options panel, now shows the real value for the scale.\n\n|cFFFFFF00-|r Fixed Imperator Mar'gok's adds damage taken.\n\n|cFFFFFF00-|r Fixed a problem where multistrike was counting towards critical strike amount.\n\n|cFFFFFF00-|r Fixed death display's report where it was't showing any death.\n\n|cFFFFFF00-|r Fixed a small issue with Encounter Details plugin where sometimes gets a error right after a boss encounter.\n\n|cFFFFFF00-|r Fixed bugs on sending messages to chat for Raid Tools.\n\n\n\n|cFFFFFF00v3.5.1 (|cFFFFCC00Dec 16, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed few accuracy on miss spells.\n\n|cFFFFFF00v3.5.0 (|cFFFFCC00Dec 14, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed tooltip for Auras and Voidzones, now shows sorted by damage and time.\n\n|cFFFFFF00-|r More fixes for Korgath encounter on Highmaul.\n\n|cFFFFFF00-|r Added slash commands: 'reset' 'config'.\n\n|cFFFFFF00-|r Spell bars on Player Details Window now is painted with the spell spellschool color." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails!:|r " diff --git a/classes/classe_custom.lua b/classes/classe_custom.lua index 6eed61bc..52d8c145 100644 --- a/classes/classe_custom.lua +++ b/classes/classe_custom.lua @@ -356,6 +356,10 @@ local percent_script = _detalhes.custom_function_cache [instance.customName .. "Percent"] local total_script = _detalhes.custom_function_cache [instance.customName .. "Total"] + + local bars_show_data = instance.row_info.textR_show_data + local bars_brackets = instance:GetBarBracket() + local bars_separator = instance:GetBarSeparator() if (instance.bars_sort_direction == 1) then --top to bottom @@ -382,13 +386,13 @@ gump:Fade (row1, "out") for i = instance.barraS[1], iter_last, 1 do - instance_container._ActorTable[i]:UpdateBar (barras_container, qual_barra, percentage_type, i, total, top, instance, force, percent_script, total_script, combat) + instance_container._ActorTable[i]:UpdateBar (barras_container, qual_barra, percentage_type, i, total, top, instance, force, percent_script, total_script, combat, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end else for i = instance.barraS[1], instance.barraS[2], 1 do - instance_container._ActorTable[i]:UpdateBar (barras_container, qual_barra, percentage_type, i, total, top, instance, force, percent_script, total_script, combat) + instance_container._ActorTable[i]:UpdateBar (barras_container, qual_barra, percentage_type, i, total, top, instance, force, percent_script, total_script, combat, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end end @@ -418,13 +422,13 @@ gump:Fade (row1, "out") for i = iter_last, instance.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - instance_container._ActorTable[i]:UpdateBar (barras_container, qual_barra, percentage_type, i, total, top, instance, force, percent_script, total_script, combat) + instance_container._ActorTable[i]:UpdateBar (barras_container, qual_barra, percentage_type, i, total, top, instance, force, percent_script, total_script, combat, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end else for i = instance.barraS[2], instance.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - instance_container._ActorTable[i]:UpdateBar (barras_container, qual_barra, percentage_type, i, total, top, instance, force, percent_script, total_script, combat) + instance_container._ActorTable[i]:UpdateBar (barras_container, qual_barra, percentage_type, i, total, top, instance, force, percent_script, total_script, combat, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end end @@ -445,7 +449,7 @@ local actor_class_color_r, actor_class_color_g, actor_class_color_b - function atributo_custom:UpdateBar (row_container, index, percentage_type, rank, total, top, instance, is_forced, percent_script, total_script, combat) + function atributo_custom:UpdateBar (row_container, index, percentage_type, rank, total, top, instance, is_forced, percent_script, total_script, combat, bars_show_data, bars_brackets, bars_separator) local row = row_container [index] @@ -466,20 +470,26 @@ percent = _cstr ("%.1f", self.value / top * 100) end end - + + if (not bars_show_data [3]) then + percent = "" + else + percent = percent .. "%" + end + if (total_script) then local value = total_script (self.value, top, total, combat, instance) if (type (value) == "number") then - row.texto_direita:SetText (SelectedToKFunction (_, value) .. " (" .. percent .. "%)") + row.texto_direita:SetText (SelectedToKFunction (_, value) .. bars_brackets[1] .. percent .. bars_brackets[2]) else - row.texto_direita:SetText (value .. " (" .. percent .. "%)") + row.texto_direita:SetText (value .. bars_brackets[1] .. percent .. bars_brackets[2]) end else local formated_value = SelectedToKFunction (_, self.value) if (UsingCustomRightText) then row.texto_direita:SetText (_string_replace (instance.row_info.textR_custom_text, formated_value, "", percent, self)) else - row.texto_direita:SetText (formated_value .. " (" .. percent .. "%)") + row.texto_direita:SetText (formated_value .. bars_brackets[1] .. percent .. bars_brackets[2]) end end diff --git a/classes/classe_damage.lua b/classes/classe_damage.lua index ac8cefdb..83b6b215 100644 --- a/classes/classe_damage.lua +++ b/classes/classe_damage.lua @@ -282,11 +282,11 @@ --[[exported]] function _detalhes:GetBarColor (actor) actor = actor or self - if (actor.owner) then - return _unpack (_detalhes.class_colors [actor.owner.classe]) - - elseif (actor.monster) then + if (actor.monster) then return _unpack (_detalhes.class_colors.ENEMY) + + elseif (actor.owner) then + return _unpack (_detalhes.class_colors [actor.owner.classe]) elseif (actor.arena_enemy) then return _unpack (_detalhes.class_colors.ARENA_ENEMY) @@ -518,7 +518,21 @@ end esta_barra.texto_esquerdo:SetText (colocacao .. ". " .. tabela [1]) - esta_barra.texto_direita:SetText (tabela [2] .. " (" .. porcentagem .. "%)") + + local bars_show_data = instancia.row_info.textR_show_data + local bars_brackets = instancia:GetBarBracket() + + local total_frags = tabela [2] + if (not bars_show_data [1]) then + total_frags = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + + esta_barra.texto_direita:SetText (total_frags .. bars_brackets[1] .. porcentagem .. bars_brackets[2]) esta_barra.texto_esquerdo:SetTextColor (1, 1, 1, 1) esta_barra.texto_direita:SetTextColor (1, 1, 1, 1) @@ -728,7 +742,25 @@ if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_damage, formated_dps, porcentagem, self)) else - esta_barra.texto_direita:SetText (formated_damage .. " (" .. formated_dps .. ", " .. porcentagem .. "%)") + + local bars_show_data = instancia.row_info.textR_show_data + local bars_brackets = instancia:GetBarBracket() + local bars_separator = instancia:GetBarSeparator() + + if (not bars_show_data [1]) then + formated_damage = "" + end + if (not bars_show_data [2]) then + formated_dps = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + + esta_barra.texto_direita:SetText (formated_damage .. bars_brackets[1] .. formated_dps .. bars_separator .. porcentagem .. bars_brackets[2]) + end esta_barra.texto_esquerdo:SetText (colocacao .. ". " .. self.nome) @@ -1124,14 +1156,15 @@ function atributo_damage:RefreshWindow (instancia, tabela_do_combate, forcar, ex return _detalhes:EndRefresh (instancia, total, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh end - --print ("AMOUT: " .. amount) instancia:AtualizarScrollBar (amount) local qual_barra = 1 - local barras_container = instancia.barras --> evita buscar N vezes a key .barras dentro da instância + local barras_container = instancia.barras local percentage_type = instancia.row_info.percent_type + local bars_show_data = instancia.row_info.textR_show_data + local bars_brackets = instancia:GetBarBracket() + local bars_separator = instancia:GetBarSeparator() local baseframe = instancia.baseframe - local use_animations = _detalhes.is_using_row_animations and (not baseframe.isStretching and not forcar and not baseframe.isResizing) if (total == 0) then @@ -1206,15 +1239,15 @@ function atributo_damage:RefreshWindow (instancia, tabela_do_combate, forcar, ex if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then for i = instancia.barraS[1], iter_last-1, 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end - conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 else for i = instancia.barraS[1], iter_last, 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end end @@ -1222,15 +1255,15 @@ function atributo_damage:RefreshWindow (instancia, tabela_do_combate, forcar, ex else if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then for i = instancia.barraS[1], instancia.barraS[2]-1, 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end - conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 else for i = instancia.barraS[1], instancia.barraS[2], 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end end @@ -1262,31 +1295,31 @@ function atributo_damage:RefreshWindow (instancia, tabela_do_combate, forcar, ex if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then for i = iter_last-1, instancia.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end - conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 else for i = iter_last, instancia.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end end else if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then for i = instancia.barraS[2]-1, instancia.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end - conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 else -- /run print (_detalhes:GetInstance(1).barraS[2]) -- vai do 5 ao 1 -- qual barra começa no 1 -- i = 5 até 1 -- player 5 atualiza na barra 1 / player 1 atualiza na barra 5 for i = instancia.barraS[2], instancia.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end end @@ -1320,7 +1353,7 @@ end local actor_class_color_r, actor_class_color_g, actor_class_color_b --self = esta classe de dano -function atributo_damage:AtualizaBarra (instancia, barras_container, qual_barra, lugar, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) +function atributo_damage:AtualizaBarra (instancia, barras_container, qual_barra, lugar, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) -- instância, container das barras, qual barra, colocação, total?, sub atributo, forçar refresh, key local esta_barra = barras_container [qual_barra] --> pega a referência da barra na janela @@ -1393,9 +1426,21 @@ function atributo_damage:AtualizaBarra (instancia, barras_container, qual_barra, if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_damage, formated_dps, porcentagem, self, instancia.showing)) else - esta_barra.texto_direita:SetText (formated_damage .. " (" .. formated_dps .. ", " .. porcentagem .. "%)") --seta o texto da direita + if (not bars_show_data [1]) then + formated_damage = "" + end + if (not bars_show_data [2]) then + formated_dps = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + esta_barra.texto_direita:SetText (formated_damage .. bars_brackets[1] .. formated_dps .. bars_separator .. porcentagem .. bars_brackets[2]) end - esta_porcentagem = _math_floor ((damage_total/instancia.top) * 100) --> determina qual o tamanho da barra + + esta_porcentagem = _math_floor ((damage_total/instancia.top) * 100) elseif (sub_atributo == 2) then --> mostrando dps @@ -1429,12 +1474,30 @@ function atributo_damage:AtualizaBarra (instancia, barras_container, qual_barra, rr, gg, bb = _detalhes:hex (_math_floor (rr*255)), _detalhes:hex (_math_floor (gg*255)), "28" local color_percent = "" .. rr .. gg .. bb .. "" - esta_barra.texto_direita:SetText (formated_dps .. " (|cFFFF4444-|r|cFF" .. color_percent .. SelectedToKFunction (_, _math_floor (diff_from_topdps)) .. "|r)") --seta o texto da direita + if (not bars_show_data [1]) then + formated_dps = "" + end + if (not bars_show_data [2]) then + color_percent = "" + else + color_percent = bars_brackets[1] .. "|cFFFF4444-|r|cFF" .. color_percent .. SelectedToKFunction (_, _math_floor (diff_from_topdps)) .. "|r" .. bars_brackets[2] + end + + esta_barra.texto_direita:SetText (formated_dps .. color_percent) else - esta_barra.texto_direita:SetText (formated_dps .. " |TInterface\\GROUPFRAME\\UI-Group-LeaderIcon:14:14:0:0:16:16:0:16:0:16|t ") --seta o texto da direita + + local icon = " |TInterface\\GROUPFRAME\\UI-Group-LeaderIcon:14:14:0:0:16:16:0:16:0:16|t " + if (not bars_show_data [1]) then + formated_dps = "" + end + if (not bars_show_data [2]) then + icon = "" + end + + esta_barra.texto_direita:SetText (formated_dps .. icon) end end - esta_porcentagem = _math_floor ((dps/instancia.top) * 100) --> determina qual o tamanho da barra + esta_porcentagem = _math_floor ((dps/instancia.top) * 100) elseif (sub_atributo == 3) then --> mostrando damage taken @@ -1447,9 +1510,21 @@ function atributo_damage:AtualizaBarra (instancia, barras_container, qual_barra, if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_damage_taken, formated_dtps, porcentagem, self, instancia.showing)) else - esta_barra.texto_direita:SetText (formated_damage_taken .." (" .. formated_dtps .. ", " .. porcentagem .. "%)") --seta o texto da direita -- + if (not bars_show_data [1]) then + formated_damage_taken = "" + end + if (not bars_show_data [2]) then + formated_dtps = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + esta_barra.texto_direita:SetText (formated_damage_taken .. bars_brackets[1] .. formated_dtps .. bars_separator .. porcentagem .. bars_brackets[2]) end - esta_porcentagem = _math_floor ((self.damage_taken/instancia.top) * 100) --> determina qual o tamanho da barra + + esta_porcentagem = _math_floor ((self.damage_taken/instancia.top) * 100) elseif (sub_atributo == 4) then --> mostrando friendly fire @@ -1457,10 +1532,20 @@ function atributo_damage:AtualizaBarra (instancia, barras_container, qual_barra, if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_friendly_fire, "", porcentagem, self, instancia.showing)) - else - esta_barra.texto_direita:SetText (formated_friendly_fire .. " (" .. porcentagem .. "%)") --seta o texto da direita -- + else + + if (not bars_show_data [1]) then + formated_friendly_fire = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + + esta_barra.texto_direita:SetText (formated_friendly_fire .. bars_brackets[1] .. porcentagem .. bars_brackets[2]) end - esta_porcentagem = _math_floor ((self.friendlyfire_total/instancia.top) * 100) --> determina qual o tamanho da barra + esta_porcentagem = _math_floor ((self.friendlyfire_total/instancia.top) * 100) elseif (sub_atributo == 6) then --> mostrando enemies @@ -1471,10 +1556,23 @@ function atributo_damage:AtualizaBarra (instancia, barras_container, qual_barra, if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_damage, formated_dps, porcentagem, self, instancia.showing)) - else - esta_barra.texto_direita:SetText (formated_damage .. " (" .. formated_dps .. ", " .. porcentagem .. "%)") --seta o texto da direita + else + + if (not bars_show_data [1]) then + formated_damage = "" + end + if (not bars_show_data [2]) then + formated_dps = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + esta_barra.texto_direita:SetText (formated_damage .. bars_brackets[1] .. formated_dps .. bars_separator .. porcentagem .. bars_brackets[2]) + end - esta_porcentagem = _math_floor ((damage_total/instancia.top) * 100) --> determina qual o tamanho da barra + esta_porcentagem = _math_floor ((damage_total/instancia.top) * 100) end @@ -1585,12 +1683,6 @@ end esta_barra.icone_classe:SetVertexColor (1, 1, 1) elseif (self.classe == "UNKNOW") then - --esta_barra.icone_classe:SetTexture ("Interface\\LFGFRAME\\LFGROLE") - --esta_barra.icone_classe:SetTexCoord (.25, .5, 0, 1) - - --esta_barra.icone_classe:SetTexture ([[Interface\TARGETINGFRAME\PetBadge-Undead]]) - --esta_barra.icone_classe:SetTexCoord (0.09375, 0.90625, 0.09375, 0.90625) - esta_barra.icone_classe:SetTexture ([[Interface\AddOns\Details\images\classes_plus]]) esta_barra.icone_classe:SetTexCoord (0.50390625, 0.62890625, 0, 0.125) diff --git a/classes/classe_energy.lua b/classes/classe_energy.lua index 44d627e7..a74ae67d 100644 --- a/classes/classe_energy.lua +++ b/classes/classe_energy.lua @@ -197,7 +197,6 @@ function atributo_energy:AtualizarResources (qual_barra, colocacao, instancia) local rps = _math_floor (self.resource / combat_time) local formated_resource = SelectedToKFunction (_, self.resource) - --local formated_rps = SelectedToKFunction (_, rps) local formated_rps = _cstr ("%.2f", self.resource / combat_time) local porcentagem @@ -211,7 +210,24 @@ function atributo_energy:AtualizarResources (qual_barra, colocacao, instancia) if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_resource, formated_rps, porcentagem, self)) else - esta_barra.texto_direita:SetText (formated_resource .. " (" .. formated_rps .. ", " .. porcentagem .. "%)") + + local bars_show_data = instancia.row_info.textR_show_data + local bars_brackets = instancia:GetBarBracket() + local bars_separator = instancia:GetBarSeparator() + + if (not bars_show_data [1]) then + formated_resource = "" + end + if (not bars_show_data [2]) then + formated_rps = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + + esta_barra.texto_direita:SetText (formated_resource .. bars_brackets[1] .. formated_rps .. bars_separator .. porcentagem .. bars_brackets[2]) end esta_barra.texto_esquerdo:SetText (colocacao .. ". " .. self.nome) @@ -438,6 +454,9 @@ function atributo_energy:RefreshWindow (instancia, tabela_do_combate, forcar, ex local qual_barra = 1 local barras_container = instancia.barras local percentage_type = instancia.row_info.percent_type + local bars_show_data = instancia.row_info.textR_show_data + local bars_brackets = instancia:GetBarBracket() + local bars_separator = instancia:GetBarSeparator() local baseframe = instancia.baseframe local use_animations = _detalhes.is_using_row_animations and (not baseframe.isStretching and not forcar and not baseframe.isResizing) @@ -502,15 +521,15 @@ function atributo_energy:RefreshWindow (instancia, tabela_do_combate, forcar, ex if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then for i = instancia.barraS[1], iter_last-1, 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) --> instância, index, total, valor da 1º barra qual_barra = qual_barra+1 end - conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) --> instância, index, total, valor da 1º barra qual_barra = qual_barra+1 else for i = instancia.barraS[1], iter_last, 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) --> instância, index, total, valor da 1º barra qual_barra = qual_barra+1 end end @@ -518,15 +537,15 @@ function atributo_energy:RefreshWindow (instancia, tabela_do_combate, forcar, ex else if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then for i = instancia.barraS[1], instancia.barraS[2]-1, 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) --> instância, index, total, valor da 1º barra qual_barra = qual_barra+1 end - conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) --> instância, index, total, valor da 1º barra qual_barra = qual_barra+1 else for i = instancia.barraS[1], instancia.barraS[2], 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) --> instância, index, total, valor da 1º barra qual_barra = qual_barra+1 end end @@ -558,30 +577,30 @@ function atributo_energy:RefreshWindow (instancia, tabela_do_combate, forcar, ex if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then for i = iter_last-1, instancia.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) --> instância, index, total, valor da 1º barra qual_barra = qual_barra+1 end - conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) --> instância, index, total, valor da 1º barra qual_barra = qual_barra+1 else for i = iter_last, instancia.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) --> instância, index, total, valor da 1º barra qual_barra = qual_barra+1 end end else if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then for i = instancia.barraS[2]-1, instancia.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) --> instância, index, total, valor da 1º barra qual_barra = qual_barra+1 end - conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) --> instância, index, total, valor da 1º barra qual_barra = qual_barra+1 else for i = instancia.barraS[2], instancia.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) --> instância, index, total, valor da 1º barra qual_barra = qual_barra+1 end end @@ -605,7 +624,7 @@ function atributo_energy:RefreshWindow (instancia, tabela_do_combate, forcar, ex end -function atributo_energy:AtualizaBarra (instancia, barras_container, qual_barra, lugar, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) +function atributo_energy:AtualizaBarra (instancia, barras_container, qual_barra, lugar, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) local esta_barra = instancia.barras[qual_barra] --> pega a referência da barra na janela @@ -639,7 +658,16 @@ function atributo_energy:AtualizaBarra (instancia, barras_container, qual_barra, if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_energy, "", porcentagem, self, instancia.showing)) else - esta_barra.texto_direita:SetText (formated_energy .. " (" .. porcentagem .. "%)") --seta o texto da direita + if (not bars_show_data [1]) then + formated_energy = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + + esta_barra.texto_direita:SetText (formated_energy .. bars_brackets[1] .. porcentagem .. bars_brackets[2]) end if (esta_barra.mouse_over and not instancia.baseframe.isMoving) then --> precisa atualizar o tooltip diff --git a/classes/classe_heal.lua b/classes/classe_heal.lua index 99a8bc5f..24971fe1 100644 --- a/classes/classe_heal.lua +++ b/classes/classe_heal.lua @@ -359,6 +359,9 @@ function atributo_heal:RefreshWindow (instancia, tabela_do_combate, forcar, expo local qual_barra = 1 local barras_container = instancia.barras --> evita buscar N vezes a key .barras dentro da instância local percentage_type = instancia.row_info.percent_type + local bars_show_data = instancia.row_info.textR_show_data + local bars_brackets = instancia:GetBarBracket() + local bars_separator = instancia:GetBarSeparator() local baseframe = instancia.baseframe local use_animations = _detalhes.is_using_row_animations and (not baseframe.isStretching and not forcar and not baseframe.isResizing) @@ -423,15 +426,15 @@ function atributo_heal:RefreshWindow (instancia, tabela_do_combate, forcar, expo if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then for i = instancia.barraS[1], iter_last-1, 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end - conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 else for i = instancia.barraS[1], iter_last, 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end end @@ -439,15 +442,15 @@ function atributo_heal:RefreshWindow (instancia, tabela_do_combate, forcar, expo else if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then for i = instancia.barraS[1], instancia.barraS[2]-1, 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end - conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 else for i = instancia.barraS[1], instancia.barraS[2], 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end end @@ -479,30 +482,30 @@ function atributo_heal:RefreshWindow (instancia, tabela_do_combate, forcar, expo if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then for i = iter_last-1, instancia.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end - conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 else for i = iter_last, instancia.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end end else if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then for i = instancia.barraS[2]-1, instancia.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end - conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[myPos]:AtualizaBarra (instancia, barras_container, qual_barra, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 else for i = instancia.barraS[2], instancia.barraS[1], -1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end end @@ -542,7 +545,7 @@ end local actor_class_color_r, actor_class_color_g, actor_class_color_b --function atributo_heal:AtualizaBarra (instancia, qual_barra, lugar, total, sub_atributo, forcar) -function atributo_heal:AtualizaBarra (instancia, barras_container, qual_barra, lugar, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations) +function atributo_heal:AtualizaBarra (instancia, barras_container, qual_barra, lugar, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) local esta_barra = instancia.barras[qual_barra] --> pega a referência da barra na janela @@ -603,8 +606,9 @@ function atributo_heal:AtualizaBarra (instancia, barras_container, qual_barra, l -- >>>>>>>>>>>>>>> texto da direita if (instancia.atributo == 5) then --> custom - esta_barra.texto_direita:SetText (_detalhes:ToK (self.custom) .. " (" .. porcentagem .. "%)") --seta o texto da direita - esta_porcentagem = _math_floor ((self.custom/instancia.top) * 100) --> determina qual o tamanho da barra + esta_barra.texto_direita:SetText (_detalhes:ToK (self.custom) .. " (" .. porcentagem .. "%)") + esta_porcentagem = _math_floor ((self.custom/instancia.top) * 100) + else if (sub_atributo == 1) then --> mostrando healing done @@ -616,9 +620,22 @@ function atributo_heal:AtualizaBarra (instancia, barras_container, qual_barra, l if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_heal, formated_hps, porcentagem, self, instancia.showing)) else - esta_barra.texto_direita:SetText (formated_heal .." (" .. formated_hps .. ", " .. porcentagem .. "%)") --seta o texto da direita + + if (not bars_show_data [1]) then + formated_heal = "" + end + if (not bars_show_data [2]) then + formated_hps = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + + esta_barra.texto_direita:SetText (formated_heal .. bars_brackets[1] .. formated_hps .. bars_separator .. porcentagem .. bars_brackets[2]) end - esta_porcentagem = _math_floor ((healing_total/instancia.top) * 100) --> determina qual o tamanho da barra + esta_porcentagem = _math_floor ((healing_total/instancia.top) * 100) elseif (sub_atributo == 2) then --> mostrando hps @@ -629,10 +646,23 @@ function atributo_heal:AtualizaBarra (instancia, barras_container, qual_barra, l if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_hps, formated_heal, porcentagem, self, instancia.showing)) - else - esta_barra.texto_direita:SetText (formated_hps .. " (" .. formated_heal .. ", " .. porcentagem .. "%)") --seta o texto da direita + else + + if (not bars_show_data [1]) then + formated_hps = "" + end + if (not bars_show_data [2]) then + formated_heal = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + + esta_barra.texto_direita:SetText (formated_hps .. bars_brackets[1] .. formated_heal .. bars_separator .. porcentagem .. bars_brackets[2]) end - esta_porcentagem = _math_floor ((hps/instancia.top) * 100) --> determina qual o tamanho da barra + esta_porcentagem = _math_floor ((hps/instancia.top) * 100) elseif (sub_atributo == 3) then --> mostrando overall @@ -648,20 +678,40 @@ function atributo_heal:AtualizaBarra (instancia, barras_container, qual_barra, l if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_overheal, "", overheal_percent, self, instancia.showing)) else - esta_barra.texto_direita:SetText (formated_overheal .." (" .. overheal_percent .. "%)") --seta o texto da direita --_cstr("%.1f", dps) .. " - ".. DPS do damage taken não será possivel correto? - end - esta_porcentagem = _math_floor ((self.totalover/instancia.top) * 100) --> determina qual o tamanho da barra - elseif (sub_atributo == 4) then --> mostrando healing take + if (not bars_show_data [1]) then + formated_overheal = "" + end + if (not bars_show_data [3]) then + overheal_percent = "" + else + overheal_percent = overheal_percent .. "%" + end + + esta_barra.texto_direita:SetText (formated_overheal .. bars_brackets[1] .. overheal_percent .. bars_brackets[2]) + end + esta_porcentagem = _math_floor ((self.totalover/instancia.top) * 100) + + elseif (sub_atributo == 4) then --> mostrando healing taken local formated_healtaken = SelectedToKFunction (_, self.healing_taken) if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_healtaken, "", porcentagem, self, instancia.showing)) - else - esta_barra.texto_direita:SetText (formated_healtaken .. " (" .. porcentagem .. "%)") --seta o texto da direita --_cstr("%.1f", dps) .. " - ".. DPS do damage taken não será possivel correto? + else + + if (not bars_show_data [1]) then + formated_healtaken = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + + esta_barra.texto_direita:SetText (formated_healtaken .. bars_brackets[1] .. porcentagem .. bars_brackets[2]) end - esta_porcentagem = _math_floor ((self.healing_taken/instancia.top) * 100) --> determina qual o tamanho da barra + esta_porcentagem = _math_floor ((self.healing_taken/instancia.top) * 100) elseif (sub_atributo == 5) then --> mostrando enemy heal @@ -670,9 +720,19 @@ function atributo_heal:AtualizaBarra (instancia, barras_container, qual_barra, l if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_enemyheal, "", porcentagem, self, instancia.showing)) else - esta_barra.texto_direita:SetText (formated_enemyheal .. " (" .. porcentagem .. "%)") --seta o texto da direita --_cstr("%.1f", dps) .. " - ".. DPS do damage taken não será possivel correto? + + if (not bars_show_data [1]) then + formated_enemyheal = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + + esta_barra.texto_direita:SetText (formated_enemyheal .. bars_brackets[1] .. porcentagem .. bars_brackets[2]) end - esta_porcentagem = _math_floor ((self.heal_enemy_amt/instancia.top) * 100) --> determina qual o tamanho da barra + esta_porcentagem = _math_floor ((self.heal_enemy_amt/instancia.top) * 100) elseif (sub_atributo == 6) then --> mostrando damage prevented @@ -681,9 +741,19 @@ function atributo_heal:AtualizaBarra (instancia, barras_container, qual_barra, l if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_absorbs, "", porcentagem, self, instancia.showing)) else - esta_barra.texto_direita:SetText (formated_absorbs .. " (" .. porcentagem .. "%)") --seta o texto da direita --_cstr("%.1f", dps) .. " - ".. DPS do damage taken não será possivel correto? + + 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.totalabsorb/instancia.top) * 100) --> determina qual o tamanho da barra + esta_porcentagem = _math_floor ((self.totalabsorb/instancia.top) * 100) end end @@ -1435,7 +1505,7 @@ function atributo_heal:MontaInfoOverHealing() end barra.texto_esquerdo:SetText (index..instancia.divisores.colocacao..tabela[4]) --seta o texto da esqueda - barra.texto_direita:SetText (_detalhes:comma_value (tabela[2]) .." ".. instancia.divisores.abre .. _cstr ("%.1f", tabela[3]) .."%".. instancia.divisores.fecha) --seta o texto da direita + barra.texto_direita:SetText (_detalhes:comma_value (tabela[2]) .." ".. instancia.divisores.abre .. _cstr ("%.1f", tabela[3]) .."%".. instancia.divisores.fecha) barra.icone:SetTexture (tabela[5]) @@ -1483,7 +1553,7 @@ function atributo_heal:MontaInfoOverHealing() end barra.texto_esquerdo:SetText (index..instancia.divisores.colocacao..tabela[1]) --seta o texto da esqueda - barra.texto_direita:SetText (_detalhes:comma_value (tabela[2]) .." ".. instancia.divisores.abre .. _cstr ("%.1f", tabela[3]) .. instancia.divisores.fecha) --seta o texto da direita + barra.texto_direita:SetText (_detalhes:comma_value (tabela[2]) .." ".. instancia.divisores.abre .. _cstr ("%.1f", tabela[3]) .. instancia.divisores.fecha) barra.texto_esquerdo:SetWidth (barra:GetWidth() - barra.texto_direita:GetStringWidth() - 30) -- icon @@ -1608,9 +1678,9 @@ function atributo_heal:MontaInfoHealingDone() barra.texto_esquerdo:SetText (index..instancia.divisores.colocacao..tabela[1]) --seta o texto da esqueda if (info.sub_atributo == 2) then - barra.texto_direita:SetText (_detalhes:comma_value (_math_floor (tabela[2]/meu_tempo)) .." ".. instancia.divisores.abre .. _cstr ("%.1f", tabela[3]) .. instancia.divisores.fecha) --seta o texto da direita + barra.texto_direita:SetText (_detalhes:comma_value (_math_floor (tabela[2]/meu_tempo)) .." ".. instancia.divisores.abre .. _cstr ("%.1f", tabela[3]) .. instancia.divisores.fecha) else - barra.texto_direita:SetText (_detalhes:comma_value (tabela[2]) .." ".. instancia.divisores.abre .. _cstr ("%.1f", tabela[3]) .. instancia.divisores.fecha) --seta o texto da direita + barra.texto_direita:SetText (_detalhes:comma_value (tabela[2]) .." ".. instancia.divisores.abre .. _cstr ("%.1f", tabela[3]) .. instancia.divisores.fecha) end barra.minha_tabela = self @@ -1769,7 +1839,7 @@ function atributo_heal:MontaDetalhesHealingTaken (nome, barra) end barra.texto_esquerdo:SetText (index..instancia.divisores.colocacao..tabela[4]) --seta o texto da esqueda - barra.texto_direita:SetText (_detalhes:comma_value (tabela[2]) .." ".. instancia.divisores.abre .._cstr("%.1f", tabela[3]) .."%".. instancia.divisores.fecha) --seta o texto da direita + barra.texto_direita:SetText (_detalhes:comma_value (tabela[2]) .." ".. instancia.divisores.abre .._cstr("%.1f", tabela[3]) .."%".. instancia.divisores.fecha) barra.icone:SetTexture (tabela[5]) diff --git a/classes/classe_instancia_include.lua b/classes/classe_instancia_include.lua index c4e8a55c..a3b6eba7 100644 --- a/classes/classe_instancia_include.lua +++ b/classes/classe_instancia_include.lua @@ -173,9 +173,12 @@ _detalhes.instance_defaults = { --right text customization textR_enable_custom_text = false, textR_custom_text = "{data1} ({data2}, {data3}%)", + --right text show which infos + textR_show_data = {true, true, true}, + textR_bracket = "(", + textR_separator = ",", --left text bar number textL_show_number = true, - --if text class color are false, this color will be used fixed_text_color = {1, 1, 1}, --left text outline effect diff --git a/classes/classe_others.lua b/classes/classe_others.lua index 7e4ea891..d69fa6af 100644 --- a/classes/classe_others.lua +++ b/classes/classe_others.lua @@ -691,6 +691,9 @@ function atributo_misc:RefreshWindow (instancia, tabela_do_combate, forcar, expo local qual_barra = 1 local barras_container = instancia.barras local percentage_type = instancia.row_info.percent_type + local bars_show_data = instancia.row_info.textR_show_data + local bars_brackets = instancia:GetBarBracket() + local bars_separator = instancia:GetBarSeparator() local use_animations = _detalhes.is_using_row_animations and (not instancia.baseframe.isStretching and not forcar) if (total == 0) then @@ -702,13 +705,13 @@ function atributo_misc:RefreshWindow (instancia, tabela_do_combate, forcar, expo if (instancia.bars_sort_direction == 1) then --top to bottom for i = instancia.barraS[1], instancia.barraS[2], 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, nil, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, nil, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end elseif (instancia.bars_sort_direction == 2) then --bottom to top for i = instancia.barraS[2], instancia.barraS[1], 1 do --> vai atualizar só o range que esta sendo mostrado - conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, nil, percentage_type, use_animations) --> instância, index, total, valor da 1º barra + conteudo[i]:AtualizaBarra (instancia, barras_container, qual_barra, i, total, sub_atributo, forcar, keyName, nil, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) qual_barra = qual_barra+1 end @@ -744,7 +747,7 @@ end local actor_class_color_r, actor_class_color_g, actor_class_color_b -function atributo_misc:AtualizaBarra (instancia, barras_container, qual_barra, lugar, total, sub_atributo, forcar, keyName, is_dead, percentage_type, use_animations) +function atributo_misc:AtualizaBarra (instancia, barras_container, qual_barra, lugar, total, sub_atributo, forcar, keyName, is_dead, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) local esta_barra = instancia.barras[qual_barra] --> pega a referência da barra na janela @@ -778,7 +781,18 @@ function atributo_misc:AtualizaBarra (instancia, barras_container, qual_barra, l if (UsingCustomRightText) then esta_barra.texto_direita:SetText (_string_replace (instancia.row_info.textR_custom_text, meu_total, "", porcentagem, self, instancia.showing)) else - esta_barra.texto_direita:SetText (meu_total .." (" .. porcentagem .. "%)") --seta o texto da direita + + if (not bars_show_data [1]) then + meu_total = "" + end + if (not bars_show_data [3]) then + porcentagem = "" + else + porcentagem = porcentagem .. "%" + end + + esta_barra.texto_direita:SetText (meu_total .. bars_brackets[1] .. porcentagem .. bars_brackets[2]) + end if (esta_barra.mouse_over and not instancia.baseframe.isMoving) then --> precisa atualizar o tooltip diff --git a/gumps/janela_options.lua b/gumps/janela_options.lua index 43ae9641..facacc32 100644 --- a/gumps/janela_options.lua +++ b/gumps/janela_options.lua @@ -6044,6 +6044,150 @@ function window:CreateFrame5() frame5.customLeftTextButton:GetNormalTexture():SetDesaturated (true) frame5.customLeftTextButton.tooltip = Loc ["STRING_OPTIONS_RESET_TO_DEFAULT"] + --> total dps percent bracket separator + + -- total + g:NewSwitch (frame5, _, "$parentRightTextShowTotalSlider", "RightTextShowTotalSlider", 60, 20, _, _, instance.row_info.textR_show_data [1]) + g:NewLabel (frame5, _, "$parentRightTextShowTotalLabel", "RightTextShowTotalLabel", Loc ["STRING_OPTIONS_TEXT_SHOW_TOTAL"], "GameFontHighlightLeft") + + frame5.RightTextShowTotalSlider:SetPoint ("left", frame5.RightTextShowTotalLabel, "right", 2) + frame5.RightTextShowTotalSlider.OnSwitch = function (self, instance, value) + instance:SetBarRightTextSettings (value) + + if (_detalhes.options_group_edit and not DetailsOptionsWindow.loading_settings) then + for _, this_instance in ipairs (instance:GetInstanceGroup()) do + if (this_instance ~= instance) then + instance:SetBarRightTextSettings (value) + end + end + end + + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + window:CreateLineBackground2 (frame5, "RightTextShowTotalSlider", "RightTextShowTotalLabel", Loc ["STRING_OPTIONS_TEXT_SHOW_TOTAL_DESC"]) + + -- ps + g:NewSwitch (frame5, _, "$parentRightTextShowPSSlider", "RightTextShowPSSlider", 60, 20, _, _, instance.row_info.textR_show_data [2]) + g:NewLabel (frame5, _, "$parentRightTextShowPSLabel", "RightTextShowPSLabel", Loc ["STRING_OPTIONS_TEXT_SHOW_PS"], "GameFontHighlightLeft") + + frame5.RightTextShowPSSlider:SetPoint ("left", frame5.RightTextShowPSLabel, "right", 2) + frame5.RightTextShowPSSlider.OnSwitch = function (self, instance, value) + instance:SetBarRightTextSettings (nil, value) + + if (_detalhes.options_group_edit and not DetailsOptionsWindow.loading_settings) then + for _, this_instance in ipairs (instance:GetInstanceGroup()) do + if (this_instance ~= instance) then + instance:SetBarRightTextSettings (nil, value) + end + end + end + + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + window:CreateLineBackground2 (frame5, "RightTextShowPSSlider", "RightTextShowPSLabel", Loc ["STRING_OPTIONS_TEXT_SHOW_PS_DESC"]) + + -- percent + + g:NewSwitch (frame5, _, "$parentRightTextShowPercentSlider", "RightTextShowPercentSlider", 60, 20, _, _, instance.row_info.textR_show_data [3]) + g:NewLabel (frame5, _, "$parentRightTextShowPercentLabel", "RightTextShowPercentLabel", Loc ["STRING_OPTIONS_TEXT_SHOW_PERCENT"], "GameFontHighlightLeft") + + frame5.RightTextShowPercentSlider:SetPoint ("left", frame5.RightTextShowPercentLabel, "right", 2) + frame5.RightTextShowPercentSlider.OnSwitch = function (self, instance, value) + instance:SetBarRightTextSettings (nil, nil, value) + + if (_detalhes.options_group_edit and not DetailsOptionsWindow.loading_settings) then + for _, this_instance in ipairs (instance:GetInstanceGroup()) do + if (this_instance ~= instance) then + instance:SetBarRightTextSettings (nil, nil, value) + end + end + end + + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + window:CreateLineBackground2 (frame5, "RightTextShowPercentSlider", "RightTextShowPercentLabel", Loc ["STRING_OPTIONS_TEXT_SHOW_PERCENT_DESC"]) + + --brackets + local onSelectBracket = function (_, instance, value) + instance:SetBarRightTextSettings (nil, nil, nil, value) + + if (_detalhes.options_group_edit and not DetailsOptionsWindow.loading_settings) then + for _, this_instance in ipairs (instance:GetInstanceGroup()) do + if (this_instance ~= instance) then + instance:SetBarRightTextSettings (nil, nil, nil, value) + end + end + end + + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + local BracketTable = { + {value = "(", label = "(", onclick = onSelectBracket, icon = ""}, + {value = "{", label = "{", onclick = onSelectBracket, icon = ""}, + {value = "[", label = "[", onclick = onSelectBracket, icon = ""}, + {value = "<", label = "<", onclick = onSelectBracket, icon = ""}, + {value = "NONE", label = "no bracket", onclick = onSelectBracket, icon = [[Interface\Glues\LOGIN\Glues-CheckBox-Check]]}, + } + local buildBracketMenu = function() + return BracketTable + end + + local d = g:NewDropDown (frame5, _, "$parentBracketDropdown", "BracketDropdown", 60, 20, buildBracketMenu, nil) + d.onenter_backdrop = dropdown_backdrop_onenter + d.onleave_backdrop = dropdown_backdrop_onleave + d:SetBackdrop (dropdown_backdrop) + d:SetBackdropColor (unpack (dropdown_backdrop_onleave)) + + g:NewLabel (frame5, _, "$parentBracketLabel", "BracketLabel", Loc ["STRING_OPTIONS_TEXT_SHOW_BRACKET"], "GameFontHighlightLeft") + frame5.BracketDropdown:SetPoint ("left", frame5.BracketLabel, "right", 2) + + window:CreateLineBackground2 (frame5, "BracketDropdown", "BracketLabel", Loc ["STRING_OPTIONS_TEXT_SHOW_BRACKET_DESC"]) + + --separators + local onSelectSeparator = function (_, instance, value) + instance:SetBarRightTextSettings (nil, nil, nil, nil, value) + + if (_detalhes.options_group_edit and not DetailsOptionsWindow.loading_settings) then + for _, this_instance in ipairs (instance:GetInstanceGroup()) do + if (this_instance ~= instance) then + instance:SetBarRightTextSettings (nil, nil, nil, nil, value) + end + end + end + + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + local SeparatorTable = { + {value = ",", label = ",", onclick = onSelectSeparator, icon = ""}, + {value = ".", label = ".", onclick = onSelectSeparator, icon = ""}, + {value = ";", label = ";", onclick = onSelectSeparator, icon = ""}, + {value = "-", label = "-", onclick = onSelectSeparator, icon = ""}, + {value = "|", label = "|", onclick = onSelectSeparator, icon = ""}, + {value = "/", label = "/", onclick = onSelectSeparator, icon = ""}, + {value = "\\", label = "\\", onclick = onSelectSeparator, icon = ""}, + {value = "~", label = "~", onclick = onSelectSeparator, icon = ""}, + {value = "NONE", label = "no separator", onclick = onSelectSeparator, icon = [[Interface\Glues\LOGIN\Glues-CheckBox-Check]]}, + } + local buildSeparatorMenu = function() + return SeparatorTable + end + + local d = g:NewDropDown (frame5, _, "$parentSeparatorDropdown", "SeparatorDropdown", 60, 20, buildSeparatorMenu, nil) + d.onenter_backdrop = dropdown_backdrop_onenter + d.onleave_backdrop = dropdown_backdrop_onleave + d:SetBackdrop (dropdown_backdrop) + d:SetBackdropColor (unpack (dropdown_backdrop_onleave)) + + g:NewLabel (frame5, _, "$parentSeparatorLabel", "SeparatorLabel", Loc ["STRING_OPTIONS_TEXT_SHOW_SEPARATOR"], "GameFontHighlightLeft") + frame5.SeparatorDropdown:SetPoint ("left", frame5.SeparatorLabel, "right", 2) + + window:CreateLineBackground2 (frame5, "SeparatorDropdown", "SeparatorLabel", Loc ["STRING_OPTIONS_TEXT_SHOW_SEPARATOR_DESC"]) + --> anchors --general anchor @@ -6064,24 +6208,31 @@ function window:CreateFrame5() {"textLeftOutlineLabel", 2}, {"classColorsLeftTextLabel", 3}, {"PositionNumberLabel", 4}, - {"cutomLeftTextLabel", 5}, + {"cutomLeftTextLabel", 5, true}, {"cutomLeftTextEntryLabel", 6}, - {"RightTextAnchorLabel", 7, true}, - {"textRightOutlineLabel", 8}, - {"classColorsRightTextLabel", 9}, - {"cutomRightTextLabel", 10}, - {"cutomRightTextEntryLabel", 11}, + {"RowGeneralAnchorLabel", 7, true}, + {frame5.fonsizeLabel, 8}, --text size + {frame5.fontLabel, 9},--text fontface + {frame5.fixedTextColorLabel, 10}, + {frame5.percentLabel, 11, true}, } window:arrange_menu (frame5, left_side, x, window.top_start_at) local right_side = { - {"RowGeneralAnchorLabel", 1, true}, - {frame5.fonsizeLabel, 2}, --text size - {frame5.fontLabel, 3},--text fontface - {frame5.fixedTextColorLabel, 4}, - {frame5.percentLabel, 5}, + {"RightTextAnchorLabel", 1, true}, + {"textRightOutlineLabel", 2}, + {"classColorsRightTextLabel", 3}, + + {"RightTextShowTotalLabel", 4, true}, + {"RightTextShowPSLabel", 5}, + {"RightTextShowPercentLabel", 6}, + {"SeparatorLabel", 7, true}, + {"BracketLabel", 8}, + + {"cutomRightTextLabel", 9, true}, + {"cutomRightTextEntryLabel", 10}, } window:arrange_menu (frame5, right_side, window.right_start_at, window.top_start_at) @@ -9683,7 +9834,19 @@ end --> if not window _G.DetailsOptionsWindow5PositionNumberSlider.MyObject:SetFixedParameter (editing_instance) _G.DetailsOptionsWindow5PositionNumberSlider.MyObject:SetValue (editing_instance.row_info.textL_show_number) + + _G.DetailsOptionsWindow5BracketDropdown.MyObject:SetFixedParameter (editing_instance) + _G.DetailsOptionsWindow5SeparatorDropdown.MyObject:SetFixedParameter (editing_instance) + _G.DetailsOptionsWindow5RightTextShowTotalSlider.MyObject:SetFixedParameter (editing_instance) + _G.DetailsOptionsWindow5RightTextShowPSSlider.MyObject:SetFixedParameter (editing_instance) + _G.DetailsOptionsWindow5RightTextShowPercentSlider.MyObject:SetFixedParameter (editing_instance) + _G.DetailsOptionsWindow5BracketDropdown.MyObject:Select (editing_instance.row_info.textR_bracket) + _G.DetailsOptionsWindow5SeparatorDropdown.MyObject:Select (editing_instance.row_info.textR_separator) + _G.DetailsOptionsWindow5RightTextShowTotalSlider.MyObject:SetValue (editing_instance.row_info.textR_show_data [1]) + _G.DetailsOptionsWindow5RightTextShowPSSlider.MyObject:SetValue (editing_instance.row_info.textR_show_data [2]) + _G.DetailsOptionsWindow5RightTextShowPercentSlider.MyObject:SetValue (editing_instance.row_info.textR_show_data [3]) + --> window 6 _G.DetailsOptionsWindow6BackdropDropdown.MyObject:SetFixedParameter (editing_instance) _G.DetailsOptionsWindow6BackdropDropdown.MyObject:Select (editing_instance.backdrop_texture) diff --git a/gumps/janela_principal.lua b/gumps/janela_principal.lua index fc5368f7..9e5abf05 100644 --- a/gumps/janela_principal.lua +++ b/gumps/janela_principal.lua @@ -3592,6 +3592,57 @@ function _detalhes:SetBarSettings (height, texture, colorclass, fixedcolor, back end +local brackets = { + ["("] = {" (", ")"}, + ["{"] = {" {", "}"}, + ["["] = {" [", "]"}, + ["<"] = {" <", ">"}, + ["NONE"] = {" ", ""}, +} + +local separators = { + [","] = ", ", + ["."] = ". ", + [";"] = "; ", + ["-"] = " - ", + ["|"] = " | ", + ["/"] = " / ", + ["\\"] = " \\ ", + ["~"] = " ~ ", + ["NONE"] = "", +} + +function _detalhes:GetBarBracket() + return brackets [self.row_info.textR_bracket] +end + +function _detalhes:GetBarSeparator() + return separators [self.row_info.textR_separator] +end + +function _detalhes:SetBarRightTextSettings (total, persecond, percent, bracket, separator) + + if (type (total) == "boolean") then + self.row_info.textR_show_data [1] = total + end + if (type (persecond) == "boolean") then + self.row_info.textR_show_data [2] = persecond + end + if (type (percent) == "boolean") then + self.row_info.textR_show_data [3] = percent + end + + if (bracket) then + self.row_info.textR_bracket = bracket + end + if (separator) then + self.row_info.textR_separator = separator + end + + self:InstanceReset() + +end + --/script _detalhes:InstanceRefreshRows (_detalhes.tabela_instancias[1]) --> on update function @@ -5472,6 +5523,7 @@ function _detalhes:ChangeSkin (skin_name) self:SetBarSettings (self.row_info.height) self:SetBarBackdropSettings() self:SetBarSpecIconSettings() + self:SetBarRightTextSettings() --> update toolbar self:ToolbarSide() diff --git a/images/spec_icons_normal_alpha.tga b/images/spec_icons_normal_alpha.tga index 97d0f37966bd52a61f1b2e520ecfbd54fe0c1b8a..4340b921665059d851ffa424b37a3d92bd3ef4a9 100644 GIT binary patch delta 43730 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

NPCKB+! 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%0D%Nejmn_T1IVtHyLxxQ_+u6Zk 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¬%>VZ@g$y=egGk z5N