From 9dd43d676d65faec518671b91042a647c5e330f4 Mon Sep 17 00:00:00 2001 From: tercio Date: Wed, 28 May 2014 18:04:24 -0300 Subject: [PATCH] 1.15.0 Test Version - Implemented a early support for Dungeons: the addon is now capable of distinguishing dungeon boss and trash mobs. not all bosses are implemented yet, atm is: *Mogu'Shan Palace *Temple of the Jade Serpent *Stormstout Brewery - Implemented Overall Data: Options for it are under combat tab. - Implemented spell targets on Player Details Window. Also, fixed lots of small issues like showing damage done where clicking on a Dps bar. --- .pkgmeta | 1 + boot.lua | 6 +- classes/classe_combate.lua | 98 ++--- classes/classe_damage.lua | 254 ++++++++--- classes/classe_damage_habilidade.lua | 86 ++-- classes/classe_energy.lua | 65 ++- classes/classe_energy_habilidade.lua | 3 - classes/classe_heal.lua | 165 +++++-- classes/classe_heal_habilidade.lua | 5 +- classes/classe_instancia.lua | 14 + classes/classe_others.lua | 214 +++++++++- classes/classe_others_habilidade.lua | 24 -- classes/container_combatentes.lua | 42 +- classes/container_historico.lua | 197 +++++++-- core/control.lua | 150 ++++--- core/meta.lua | 86 ++-- core/parser.lua | 404 +++++------------- core/plugins_statusbar.lua | 13 +- core/windows.lua | 2 +- functions/link.lua | 24 +- functions/loaddata.lua | 3 + functions/profiles.lua | 6 +- functions/savedata.lua | 3 + functions/slash.lua | 60 +++ gumps/janela_info.lua | 277 +++++++++--- gumps/janela_options.lua | 125 ++++++ gumps/janela_principal.lua | 53 ++- images/info_window_damagetaken.tga | Bin 126679 -> 143871 bytes images/info_window_friendlyfire.tga | Bin 102113 -> 0 bytes locales/Details-enUS.lua | 36 +- locales/Details-ptBR.lua | 2 +- .../Details_DungeonInfo-Pandaria.lua | 361 ++++++++++++++++ .../Details_DungeonInfo-Pandaria.toc | 6 + startup.lua | 12 +- 34 files changed, 1988 insertions(+), 809 deletions(-) delete mode 100644 images/info_window_friendlyfire.tga create mode 100644 plugins/Details_DungeonInfo-Pandaria/Details_DungeonInfo-Pandaria.lua create mode 100644 plugins/Details_DungeonInfo-Pandaria/Details_DungeonInfo-Pandaria.toc diff --git a/.pkgmeta b/.pkgmeta index db7b80eb..3a5d3bba 100644 --- a/.pkgmeta +++ b/.pkgmeta @@ -4,6 +4,7 @@ move-folders: Details/plugins/Details_EncounterDetails: Details_EncounterDetails Details/plugins/Details_RaidInfo-ThroneOfThunder: Details_RaidInfo-ThroneOfThunder Details/plugins/Details_RaidInfo-SiegeOfOrgrimmar: Details_RaidInfo-SiegeOfOrgrimmar + Details/plugins/Details_DungeonInfo-Pandaria: Details_DungeonInfo-Pandaria Details/plugins/Details_SaveData: Details_SaveData Details/plugins/Details_SpellDetails: Details_SpellDetails Details/plugins/Details_TimeAttack: Details_TimeAttack diff --git a/boot.lua b/boot.lua index e30d2c70..d2c2d8c8 100644 --- a/boot.lua +++ b/boot.lua @@ -8,9 +8,9 @@ _ = nil _detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0", "LibHotCorners") - _detalhes.userversion = "v1.14.6" - _detalhes.version = "Alpha 018" - _detalhes.realversion = 18 + _detalhes.userversion = "v1.15.0" + _detalhes.version = "Alpha 019" + _detalhes.realversion = 19 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> initialization stuff diff --git a/classes/classe_combate.lua b/classes/classe_combate.lua index 416229e6..f5d99b1e 100644 --- a/classes/classe_combate.lua +++ b/classes/classe_combate.lua @@ -27,6 +27,12 @@ local _table_remove = table.remove local _tempo = time() local _ +--constants + local class_type_dano = _detalhes.atributos.dano + local class_type_cura = _detalhes.atributos.cura + local class_type_e_energy = _detalhes.atributos.e_energy + local class_type_misc = _detalhes.atributos.misc + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --[[ __call function, get an actor from current combat. @@ -301,7 +307,7 @@ end combate.__sub = function (combate1, combate2) - if (combate1~= _detalhes.tabela_overall) then + if (combate1 ~= _detalhes.tabela_overall) then return end @@ -366,62 +372,42 @@ end combate.__add = function (combate1, combate2) - if (combate1 == _detalhes.tabela_overall or combate2 == _detalhes.tabela_overall) then - return - end - - --> add dano - for index, actor_T2 in _ipairs (combate2[1]._ActorTable) do - local actor_T1 = combate1[1]:PegarCombatente (actor_T2.serial, actor_T2.nome, actor_T2.flag_original, true) - actor_T1 = actor_T1 + actor_T2 - actor_T1:add_total (combate1) - actor_T1:add_total (_detalhes.tabela_overall) - end - combate1 [1].need_refresh = true - - --> add heal - for index, actor_T2 in _ipairs (combate2[2]._ActorTable) do - local actor_T1 = combate1[2]:PegarCombatente (actor_T2.serial, actor_T2.nome, actor_T2.flag_original, true) - actor_T1 = actor_T1 + actor_T2 - actor_T1:add_total (combate1) - actor_T1:add_total (_detalhes.tabela_overall) - end - combate1 [2].need_refresh = true - - --> add energy - for index, actor_T2 in _ipairs (combate2[3]._ActorTable) do - local actor_T1 = combate1[3]:PegarCombatente (actor_T2.serial, actor_T2.nome, actor_T2.flag_original, true) - actor_T1 = actor_T1 + actor_T2 - actor_T1:add_total (combate1) - actor_T1:add_total (_detalhes.tabela_overall) - end - combate1 [3].need_refresh = true - - --> add misc - for index, actor_T2 in _ipairs (combate2[4]._ActorTable) do - local actor_T1 = combate1[4]:PegarCombatente (actor_T2.serial, actor_T2.nome, actor_T2.flag_original, true) - actor_T1 = actor_T1 + actor_T2 - actor_T1:add_total (combate1) - actor_T1:add_total (_detalhes.tabela_overall) - end - combate1 [4].need_refresh = true - - --> aumenta o tempo - combate1.start_time = combate1.start_time - (combate2.end_time - combate2.start_time) - --> frags - for fragName, fragAmount in pairs (combate2.frags) do - if (fragAmount) then - if (combate1.frags [fragName]) then - combate1.frags [fragName] = combate1.frags [fragName] + fragAmount - else - combate1.frags [fragName] = fragAmount - end - end - end - combate1.frags_need_refresh = true - - return combate1 + local all_containers = {combate2 [class_type_dano]._ActorTable, combate2 [class_type_cura]._ActorTable, combate2 [class_type_e_energy]._ActorTable, combate2 [class_type_misc]._ActorTable} + --actor.boss_fight_component + --actor.fight_component + --combat.is_boss + --combat.instance_type -- party raid + + for class_type, actor_container in ipairs (all_containers) do + for _, actor in ipairs (actor_container) do + local shadow + + if (class_type == class_type_dano) then + shadow = _detalhes.atributo_damage:r_connect_shadow (actor, true) + elseif (class_type == class_type_cura) then + shadow = _detalhes.atributo_heal:r_connect_shadow (actor, true) + elseif (class_type == class_type_e_energy) then + shadow = _detalhes.atributo_energy:r_connect_shadow (actor, true) + elseif (class_type == class_type_misc) then + shadow = _detalhes.atributo_misc:r_connect_shadow (actor, true) + end + + shadow.boss_fight_component = actor.boss_fight_component + shadow.fight_component = actor.fight_component + shadow.grupo = actor.grupo + + --if (shadow:EstaoLinkados (actor)) then + -- shadow:FazLinkagem (actor) + --end + end + end + + --if (combate2.end_time and combate2.start_time) then + -- combate1.start_time = combate1.start_time - (combate1.end_time - combate1.start_time) + --end + + return combate1 end function _detalhes:UpdateCombat() diff --git a/classes/classe_damage.lua b/classes/classe_damage.lua index a4b3e274..93a34034 100644 --- a/classes/classe_damage.lua +++ b/classes/classe_damage.lua @@ -72,6 +72,8 @@ local CLASS_ICON_TCOORDS = _G.CLASS_ICON_TCOORDS local key_overlay = {1, 1, 1, .1} local key_overlay_press = {1, 1, 1, .2} +local headerColor = "yellow" + local info = _detalhes.janela_info local keyName @@ -268,9 +270,9 @@ function _detalhes:ToolTipFrags (instancia, frag, esta_barra, keydown) for aggressor, _ in _pairs (took_damage_from) do - local damager_actor = damage_container._ActorTable[damage_container._NameIndexTable [ aggressor ]] + local damager_actor = damage_container._ActorTable [damage_container._NameIndexTable [ aggressor ]] - if (damager_actor) then --> checagem por causa do total e do garbage collector que não limpa os names que deram dano + if (damager_actor and not damager_actor.owner) then --> checagem por causa do total e do garbage collector que não limpa os names que deram dano local targets = damager_actor.targets @@ -285,7 +287,7 @@ function _detalhes:ToolTipFrags (instancia, frag, esta_barra, keydown) _table_sort (damage_taken_table, _detalhes.Sort2) - GameCooltip:AddLine (Loc ["STRING_FROM"], nil, nil, headerColor, nil, 12) + GameCooltip:AddLine (Loc ["STRING_DAMAGE_FROM"], nil, nil, headerColor, nil, 12) GameCooltip:AddIcon ([[Interface\Addons\Details\images\icons]], 1, 1, 14, 14, 0.126953125, 0.1796875, 0, 0.0546875) local min = 6 @@ -322,7 +324,8 @@ function _detalhes:ToolTipFrags (instancia, frag, esta_barra, keydown) _detalhes:AddTooltipBackgroundStatusbar() end - GameCooltip:AddLine (Loc ["STRING_REPORT_LEFTCLICK"], nil, 1, "white") + GameCooltip:AddLine ("") + GameCooltip:AddLine (Loc ["STRING_REPORT_LEFTCLICK"], nil, 1, _unpack (self.click_to_report_color)) GameCooltip:AddIcon ([[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]], 1, 1, 12, 16, 0.015625, 0.13671875, 0.4375, 0.59765625) GameCooltip:ShowCooltip() @@ -475,6 +478,9 @@ function _detalhes:ToolTipVoidZones (instancia, actor, barra, keydown) local GameCooltip = GameCooltip + GameCooltip:AddLine (Loc ["STRING_VOIDZONE_TOOLTIP"], nil, nil, headerColor, nil, 12) + GameCooltip:AddIcon ([[Interface\Addons\Details\images\icons]], 1, 1, 14, 14, 0.126953125, 0.1796875, 0, 0.0546875) + for _, alvo in _ipairs (container) do local minutos, segundos = _math_floor (alvo.uptime / 60), _math_floor (alvo.uptime % 60) @@ -495,8 +501,10 @@ function _detalhes:ToolTipVoidZones (instancia, actor, barra, keydown) end - GameCooltip:AddLine (Loc ["STRING_REPORT_LEFTCLICK"], nil, 1, "white") + GameCooltip:AddLine ("") + GameCooltip:AddLine (Loc ["STRING_REPORT_LEFTCLICK"], nil, 1, _unpack (self.click_to_report_color)) GameCooltip:AddIcon ([[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]], 1, 1, 12, 16, 0.015625, 0.13671875, 0.4375, 0.59765625) + GameCooltip:ShowCooltip() end @@ -1307,6 +1315,8 @@ end if (from_resize) then if (self.owner) then actor_class_color_r, actor_class_color_g, actor_class_color_b = _unpack (_detalhes.class_colors [self.owner.classe]) + elseif (self.monster) then + actor_class_color_r, actor_class_color_g, actor_class_color_b = _unpack (_detalhes.class_colors.ENEMY) else actor_class_color_r, actor_class_color_g, actor_class_color_b = _unpack (_detalhes.class_colors [self.classe]) end @@ -1408,7 +1418,6 @@ function atributo_damage:ToolTip (instancia, numero, barra, keydown) end --> tooltip locals local r, g, b -local headerColor = "yellow" local barAlha = .6 --[[exported]] function _detalhes.Sort1 (table1, table2) @@ -1453,7 +1462,7 @@ function atributo_damage:ToolTip_DamageDone (instancia, numero, barra, keydown) if (_detalhes.time_type == 1 or not self.grupo) then meu_tempo = self:Tempo() elseif (_detalhes.time_type == 2) then - meu_tempo = self:GetCombatTime() + meu_tempo = instancia.showing:GetCombatTime() end --add and sort @@ -1843,6 +1852,9 @@ function atributo_damage:MontaDetalhes (spellid, barra) elseif (info.sub_atributo == 4) then return self:MontaDetalhesFriendlyFire (spellid, barra) elseif (info.sub_atributo == 6) then + if (_bit_band (self.serial, 0x00000400) ~= 0) then --é um jogador + return self:MontaDetalhesDamageDone (spellid, barra) + end return self:MontaDetalhesEnemy (spellid, barra) end end @@ -1921,15 +1933,21 @@ function atributo_damage:MontaInfoFriendlyFire() barra.textura:SetValue (tabela[2]/FirstPlaceDamage*100) end - barra.texto_esquerdo:SetText (index..instancia.divisores.colocacao..tabela[1]) --seta o texto da esqueda - barra.texto_direita:SetText (tabela[2] .." ".. instancia.divisores.abre .._cstr("%.1f", tabela[3]) .."%".. instancia.divisores.fecha) --seta o texto da direita + barra.texto_esquerdo:SetText (index .. instancia.divisores.colocacao .. tabela[1]) --seta o texto da esqueda + barra.texto_direita:SetText (_detalhes:comma_value (tabela[2]) .. " (" .. _cstr ("%.1f", tabela[3]) .."%)") --seta o texto da direita local classe = tabela[4] if (not classe) then classe = "monster" end - - barra.icone:SetTexture ("Interface\\AddOns\\Details\\images\\"..classe:lower().."_small") + + barra.icone:SetTexture (info.instancia.row_info.icon_file) + + if (CLASS_ICON_TCOORDS [classe]) then + barra.icone:SetTexCoord (_unpack (CLASS_ICON_TCOORDS [classe])) + else + barra.icone:SetTexture (nil) + end barra.minha_tabela = self barra.show = tabela[1] @@ -1972,7 +1990,7 @@ function atributo_damage:MontaInfoFriendlyFire() end barra.texto_esquerdo:SetText (index..instancia.divisores.colocacao..tabela[1]) --seta o texto da esqueda - barra.texto_direita:SetText (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]) .." (" .._cstr("%.1f", tabela[3]) .. ")") --seta o texto da direita barra.icone:SetTexture (tabela[4]) barra.minha_tabela = nil --> desativa o tooltip @@ -2032,46 +2050,23 @@ function atributo_damage:MontaInfoDamageTaken() texCoords = _detalhes.class_coords ["UNKNOW"] end - self:UpdadeInfoBar (barra, index, tabela[1], tabela[1], tabela[2], max_, tabela[3], "Interface\\AddOns\\Details\\images\\classes_small", true, texCoords) + self:UpdadeInfoBar (barra, index, tabela[1], tabela[1], tabela[2], _detalhes:comma_value (tabela[2]), max_, tabela[3], "Interface\\AddOns\\Details\\images\\classes_small", true, texCoords) end end ---[[ - --> TOP HABILIDADES - local ActorDamage = self.total_without_pet - local ActorSkillsContainer = self.spell_tables._ActorTable - local ActorSkillsSortTable = {} - for _spellid, _skill in _pairs (ActorSkillsContainer) do - ActorSkillsSortTable [#ActorSkillsSortTable+1] = {_spellid, _skill.total} - end - _table_sort (ActorSkillsSortTable, _detalhes.Sort2) - - --> TOP INIMIGOS - local ActorTargetsContainer = self.targets._ActorTable - local ActorTargetsSortTable = {} - for _, _target in _ipairs (ActorTargetsContainer) do - ActorTargetsSortTable [#ActorTargetsSortTable+1] = {_target.nome, _target.total} - end - _table_sort (ActorTargetsSortTable, _detalhes.Sort2) ---]] - ---[[exported]] function _detalhes:UpdadeInfoBar (row, index, spellid, name, value, max, percent, icon, detalhes, texCoords) +--[[exported]] function _detalhes:UpdadeInfoBar (row, index, spellid, name, value, value_formated, max, percent, icon, detalhes, texCoords) --> seta o tamanho da barra if (index == 1) then row.textura:SetValue (100) else row.textura:SetValue (value/max*100) end - - --> seta o texto da esqueda - --row.texto_esquerdo:SetText (index.."."..name) - --if (not) then --end row.texto_esquerdo:SetText (index.."."..name) --> seta o texto da direita - row.texto_direita:SetText (_detalhes:comma_value (value).." (".._cstr("%.1f", percent) .."%)") + row.texto_direita:SetText (value_formated .. " (" .. _cstr ("%.1f", percent) .."%)") --> seta o icone if (icon) then @@ -2093,8 +2088,9 @@ end row.show = spellid row:Show() --> mostra a barra - if (detalhes and self.detalhes and self.detalhes == spellid) then - self:MontaDetalhes (spellid, row) --> poderia deixar isso pro final e montar uma tail call?? + if (detalhes and self.detalhes and self.detalhes == spellid and info.showing == index) then + --self:MontaDetalhes (spellid, row) --> poderia deixar isso pro final e montar uma tail call?? + self:MontaDetalhes (row.show, row, info.instancia) --> poderia deixar isso pro final e montar uma tail call?? end end @@ -2128,7 +2124,15 @@ function atributo_damage:MontaInfoDamageDone() local ActorTotalDamage = self.total local ActorSkillsSortTable = {} local ActorSkillsContainer = self.spell_tables._ActorTable - + + --get time type + local meu_tempo + if (_detalhes.time_type == 1 or not self.grupo) then + meu_tempo = self:Tempo() + elseif (_detalhes.time_type == 2) then + meu_tempo = info.instancia.showing:GetCombatTime() + end + for _spellid, _skill in _pairs (ActorSkillsContainer) do --> da foreach em cada spellid do container local nome, _, icone = _GetSpellInfo (_spellid) _table_insert (ActorSkillsSortTable, {_spellid, _skill.total, _skill.total/ActorTotalDamage*100, nome, icone}) @@ -2144,11 +2148,7 @@ function atributo_damage:MontaInfoDamageDone() local PetSkillsContainer = PetActor.spell_tables._ActorTable for _spellid, _skill in _pairs (PetSkillsContainer) do --> da foreach em cada spellid do container local nome, _, icone = _GetSpellInfo (_spellid) - if (class_color) then - _table_insert (ActorSkillsSortTable, {_spellid, _skill.total, _skill.total/ActorTotalDamage*100, nome .. " (|c" .. class_color .. PetName:gsub ((" <.*"), "") .. "|r)", icone, PetActor}) - else - _table_insert (ActorSkillsSortTable, {_spellid, _skill.total, _skill.total/ActorTotalDamage*100, nome .. " (" .. PetName:gsub ((" <.*"), "") .. ")", icone, PetActor}) - end + _table_insert (ActorSkillsSortTable, {_spellid, _skill.total, _skill.total/ActorTotalDamage*100, nome .. " (|c" .. class_color .. PetName:gsub ((" <.*"), "") .. "|r)", icone, PetActor}) end --_table_insert (ActorSkillsSortTable, {PetName, PetActor.total, PetActor.total/ActorTotalDamage*100, PetName:gsub ((" <.*"), ""), "Interface\\AddOns\\Details\\images\\classes_small"}) end @@ -2169,8 +2169,14 @@ function atributo_damage:MontaInfoDamageDone() self:FocusLock (barra, tabela[1]) - self:UpdadeInfoBar (barra, index, tabela[1], tabela[4], tabela[2], max_, tabela[3], tabela[5], true) barra.other_actor = tabela [6] + + if (info.sub_atributo == 2) then + self:UpdadeInfoBar (barra, index, tabela[1], tabela[4], tabela[2], _detalhes:comma_value (_math_floor (tabela[2]/meu_tempo)), max_, tabela[3], tabela[5], true) + else + self:UpdadeInfoBar (barra, index, tabela[1], tabela[4], tabela[2], _detalhes:comma_value (tabela[2]), max_, tabela[3], tabela[5], true) + end + end --> TOP INIMIGOS @@ -2224,7 +2230,15 @@ function atributo_damage:MontaInfoDamageDone() 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.icone:SetTexture (tabela[4]) --CLASSE + barra.icone:SetTexture ([[Interface\AddOns\Details\images\classes_small]]) --CLASSE + + local texCoords = _detalhes.class_coords [tabela[4]] + if (not texCoords) then + texCoords = _detalhes.class_coords ["UNKNOW"] + end + barra.icone:SetTexCoord (_unpack (texCoords)) + + _detalhes:name_space_info (barra) if (barra.mouse_over) then --> atualizar o tooltip if (barra.isAlvo) then @@ -2283,7 +2297,11 @@ function atributo_damage:MontaInfoDamageDone() 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 + 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 + 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 + end if (barra.mouse_over) then --> atualizar o tooltip if (barra.isAlvo) then @@ -2360,7 +2378,8 @@ function atributo_damage:MontaDetalhesFriendlyFire (nome, barra) 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.icone:SetTexture (tabela[5]) - + barra.icone:SetTexCoord (0, 1, 0, 1) + barra:Show() --> mostra a barra if (index == 15) then @@ -2376,7 +2395,7 @@ function atributo_damage:MontaDetalhesEnemy (spellid, barra) for _, barra in _ipairs (info.barras3) do barra:Hide() end - + local container = info.instancia.showing[1] local barras = info.barras3 local instancia = info.instancia @@ -2393,6 +2412,7 @@ function atributo_damage:MontaDetalhesEnemy (spellid, barra) else classe = "UNKNOW" end + target_pool [#target_pool+1] = {target.nome, target.total, classe} end @@ -2457,7 +2477,7 @@ function atributo_damage:MontaDetalhesDamageTaken (nome, barra) local este_agressor = showing._ActorTable[showing._NameIndexTable[nome]] if (not este_agressor ) then - print ("EROO este agressor eh NIL") + --print ("EROO este agressor eh NIL") return end @@ -2511,6 +2531,7 @@ function atributo_damage:MontaDetalhesDamageTaken (nome, barra) 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.icone:SetTexture (tabela[5]) + barra.icone:SetTexCoord (0, 1, 0, 1) barra:Show() --> mostra a barra @@ -2587,7 +2608,6 @@ function atributo_damage:MontaDetalhesDamageDone (spellid, barra, instancia) return end - local esta_magia if (barra.other_actor) then @@ -2607,11 +2627,12 @@ function atributo_damage:MontaDetalhesDamageDone (spellid, barra, instancia) _detalhes.janela_info.spell_icone:SetTexture (infospell[3]) local total = self.total + local meu_tempo if (_detalhes.time_type == 1 or not self.grupo) then meu_tempo = self:Tempo() elseif (_detalhes.time_type == 2) then - meu_tempo = self:GetCombatTime() + meu_tempo = info.instancia.showing:GetCombatTime() end local total_hits = esta_magia.counter @@ -2620,6 +2641,8 @@ function atributo_damage:MontaDetalhesDamageDone (spellid, barra, instancia) local data = {} + --print (debugstack()) + --> GERAL local media = esta_magia.total/total_hits @@ -2806,17 +2829,40 @@ function atributo_damage:MontaTooltipAlvos (esta_barra, index, instancia) table.sort (habilidades, function (a, b) return a[2] > b[2] end) - GameTooltip:AddLine (index..". "..inimigo) - GameTooltip:AddLine (Loc ["STRING_DAMAGE_FROM"]..":") - GameTooltip:AddLine (" ") + --get time type + local meu_tempo + if (_detalhes.time_type == 1 or not self.grupo) then + meu_tempo = self:Tempo() + elseif (_detalhes.time_type == 2) then + meu_tempo = info.instancia.showing:GetCombatTime() + end + local is_dps = info.instancia.sub_atributo == 2 + + if (is_dps) then + GameTooltip:AddLine (index..". "..inimigo) + GameTooltip:AddLine (Loc ["STRING_DAMAGE_DPS_IN"] .. ":") + GameTooltip:AddLine (" ") + else + GameTooltip:AddLine (index..". "..inimigo) + GameTooltip:AddLine (Loc ["STRING_DAMAGE_FROM"] .. ":") + GameTooltip:AddLine (" ") + end + for index, tabela in _ipairs (habilidades) do if (index < 8) then - GameTooltip:AddDoubleLine (index..". |T"..tabela[3]..":0|t "..tabela[1], _detalhes:comma_value (tabela[2]).." (".._cstr("%.1f", tabela[2]/total*100).."%)", 1, 1, 1, 1, 1, 1) - --GameTooltip:AddTexture (icone) + if (is_dps) then + GameTooltip:AddDoubleLine (index..". |T"..tabela[3]..":0|t "..tabela[1], _detalhes:comma_value ( _math_floor (tabela[2] / meu_tempo) ).." (".._cstr("%.1f", tabela[2]/total*100).."%)", 1, 1, 1, 1, 1, 1) + else + GameTooltip:AddDoubleLine (index..". |T"..tabela[3]..":0|t "..tabela[1], _detalhes:comma_value (tabela[2]).." (".._cstr("%.1f", tabela[2]/total*100).."%)", 1, 1, 1, 1, 1, 1) + end else - GameTooltip:AddDoubleLine (index..". "..tabela[1], _detalhes:comma_value (tabela[2]).." (".._cstr("%.1f", tabela[2]/total*100).."%)", .65, .65, .65, .65, .65, .65) + if (is_dps) then + GameTooltip:AddDoubleLine (index..". "..tabela[1], _detalhes:comma_value ( _math_floor (tabela[2] / meu_tempo) ).." (".._cstr("%.1f", tabela[2]/total*100).."%)", .65, .65, .65, .65, .65, .65) + else + GameTooltip:AddDoubleLine (index..". "..tabela[1], _detalhes:comma_value (tabela[2]).." (".._cstr("%.1f", tabela[2]/total*100).."%)", .65, .65, .65, .65, .65, .65) + end end end @@ -2879,11 +2925,68 @@ end end --> restaura e liga o ator com a sua shadow durante a inicialização (startup function) - function atributo_damage:r_connect_shadow (actor) + function atributo_damage:r_onlyrefresh_shadow (actor) + --> criar uma shadow desse ator se ainda não tiver uma + local overall_dano = _detalhes.tabela_overall [1] + local shadow = overall_dano._ActorTable [overall_dano._NameIndexTable [actor.nome]] + + if (not shadow) then + shadow = overall_dano:PegarCombatente (actor.serial, actor.nome, actor.flag_original, true) + shadow.classe = actor.classe + shadow.grupo = actor.grupo + shadow.start_time = time() - 3 + shadow.end_time = time() + end + + --> restaura a meta e indexes ao ator + _detalhes.refresh:r_atributo_damage (actor, shadow) + + --> copia o container de alvos (captura de dados) + for index, alvo in _ipairs (actor.targets._ActorTable) do + --> cria e soma o valor do total + local alvo_shadow = shadow.targets:PegarCombatente (nil, alvo.nome, nil, true) + --> refresh no alvo + _detalhes.refresh:r_alvo_da_habilidade (alvo, shadow.targets) + end + + --> copia o container de habilidades (captura de dados) + for spellid, habilidade in _pairs (actor.spell_tables._ActorTable) do + --> cria e soma o valor + local habilidade_shadow = shadow.spell_tables:PegaHabilidade (spellid, true, nil, true) + --> refresh e soma os valores dos alvos + for index, alvo in _ipairs (habilidade.targets._ActorTable) do + --> cria e soma o valor do total + local alvo_shadow = habilidade_shadow.targets:PegarCombatente (nil, alvo.nome, nil, true) + --> refresh no alvo da habilidade + _detalhes.refresh:r_alvo_da_habilidade (alvo, habilidade_shadow.targets) + end + + --> refresh na habilidade + _detalhes.refresh:r_habilidade_dano (habilidade, shadow.spell_tables) + end + + --> copia o container de friendly fire (captura de dados) + for index, friendlyFire in _ipairs (actor.friendlyfire._ActorTable) do + --> cria ou pega a shadow + local friendlyFire_shadow = shadow.friendlyfire:PegarCombatente (nil, friendlyFire.nome, nil, true) + --> refresh na tabela e no container de habilidades + _setmetatable (friendlyFire, _detalhes) + friendlyFire.shadow = friendlyFire_shadow + + for spellid, habilidade in _pairs (friendlyFire.spell_tables._ActorTable) do + --> cria ou pega a habilidade no container de habilidade + local habilidade_shadow = friendlyFire_shadow.spell_tables:PegaHabilidade (spellid, true, nil, true) + --> refresh na habilidade + _detalhes.refresh:r_habilidade_dano (habilidade, friendlyFire_shadow.spell_tables) + end + --> refresh na meta e indexes + _detalhes.refresh:r_container_habilidades (friendlyFire.spell_tables, friendlyFire_shadow.spell_tables) + end + + return shadow + end - if (not actor) then - actor = self - end + function atributo_damage:r_connect_shadow (actor, no_refresh) --> criar uma shadow desse ator se ainda não tiver uma local overall_dano = _detalhes.tabela_overall [1] @@ -2898,8 +3001,9 @@ end end --> restaura a meta e indexes ao ator + if (not no_refresh) then _detalhes.refresh:r_atributo_damage (actor, shadow) - + end --> tempo decorrido (captura de dados) if (actor.end_time) then local tempo = (actor.end_time or time()) - actor.start_time @@ -2932,7 +3036,9 @@ end local alvo_shadow = shadow.targets:PegarCombatente (nil, alvo.nome, nil, true) alvo_shadow.total = alvo_shadow.total + alvo.total --> refresh no alvo - _detalhes.refresh:r_alvo_da_habilidade (alvo, shadow.targets) + if (not no_refresh) then + _detalhes.refresh:r_alvo_da_habilidade (alvo, shadow.targets) + end end --> copia o container de habilidades (captura de dados) @@ -2945,7 +3051,9 @@ end local alvo_shadow = habilidade_shadow.targets:PegarCombatente (nil, alvo.nome, nil, true) alvo_shadow.total = alvo_shadow.total + alvo.total --> refresh no alvo da habilidade - _detalhes.refresh:r_alvo_da_habilidade (alvo, habilidade_shadow.targets) + if (not no_refresh) then + _detalhes.refresh:r_alvo_da_habilidade (alvo, habilidade_shadow.targets) + end end --> soma todos os demais valores for key, value in _pairs (habilidade) do @@ -2960,7 +3068,9 @@ end end --> refresh na habilidade - _detalhes.refresh:r_habilidade_dano (habilidade, shadow.spell_tables) + if (not no_refresh) then + _detalhes.refresh:r_habilidade_dano (habilidade, shadow.spell_tables) + end end --> copia o container de friendly fire (captura de dados) @@ -2980,10 +3090,14 @@ end habilidade_shadow.counter = habilidade_shadow.counter + habilidade.counter habilidade_shadow.total = habilidade_shadow.total + habilidade.total --> refresh na habilidade - _detalhes.refresh:r_habilidade_dano (habilidade, friendlyFire_shadow.spell_tables) + if (not no_refresh) then + _detalhes.refresh:r_habilidade_dano (habilidade, friendlyFire_shadow.spell_tables) + end end --> refresh na meta e indexes - _detalhes.refresh:r_container_habilidades (friendlyFire.spell_tables, friendlyFire_shadow.spell_tables) + if (not no_refresh) then + _detalhes.refresh:r_container_habilidades (friendlyFire.spell_tables, friendlyFire_shadow.spell_tables) + end end return shadow diff --git a/classes/classe_damage_habilidade.lua b/classes/classe_damage_habilidade.lua index 94c2f32a..53b24b92 100644 --- a/classes/classe_damage_habilidade.lua +++ b/classes/classe_damage_habilidade.lua @@ -98,9 +98,6 @@ end function habilidade_dano:AddFF (amount) self.counter = self.counter + 1 self.total = self.total + amount - if (self.shadow) then - return self.shadow:AddFF (amount) - end end function habilidade_dano:Add (serial, nome, flag, amount, who_nome, resisted, blocked, absorbed, critical, glacing, token) @@ -157,61 +154,56 @@ function habilidade_dano:Add (serial, nome, flag, amount, who_nome, resisted, bl end --end - if (self.shadow) then - - if (_recording_ability_with_buffs) then - if (who_nome == _detalhes.playername) then --aqui ele vai detalhar tudo sobre a magia usada + if (_recording_ability_with_buffs) then + if (who_nome == _detalhes.playername) then --aqui ele vai detalhar tudo sobre a magia usada + + local buffsNames = _detalhes.SoloTables.BuffsTableNameCache - local buffsNames = _detalhes.SoloTables.BuffsTableNameCache - - local SpellBuffDetails = self.BuffTable - if (not SpellBuffDetails) then - self.BuffTable = {} - SpellBuffDetails = self.BuffTable - end - - if (token == "SPELL_PERIODIC_DAMAGE") then - --> precisa ver se ele tinha na hora que aplicou - local SoloDebuffPower = _detalhes.tabela_vigente.SoloDebuffPower - if (SoloDebuffPower) then - local ThisDebuff = SoloDebuffPower [self.id] - if (ThisDebuff) then - local ThisDebuffOnTarget = ThisDebuff [serial] - if (ThisDebuffOnTarget) then - for index, buff_name in _ipairs (ThisDebuffOnTarget.buffs) do - local buff_info = SpellBuffDetails [buff_name] or {["counter"] = 0, ["total"] = 0, ["critico"] = 0, ["critico_dano"] = 0} - buff_info.counter = buff_info.counter+1 - buff_info.total = buff_info.total+amount - if (critical ~= nil) then - buff_info.critico = buff_info.critico+1 - buff_info.critico_dano = buff_info.critico_dano+amount - end - SpellBuffDetails [buff_name] = buff_info + local SpellBuffDetails = self.BuffTable + if (not SpellBuffDetails) then + self.BuffTable = {} + SpellBuffDetails = self.BuffTable + end + + if (token == "SPELL_PERIODIC_DAMAGE") then + --> precisa ver se ele tinha na hora que aplicou + local SoloDebuffPower = _detalhes.tabela_vigente.SoloDebuffPower + if (SoloDebuffPower) then + local ThisDebuff = SoloDebuffPower [self.id] + if (ThisDebuff) then + local ThisDebuffOnTarget = ThisDebuff [serial] + if (ThisDebuffOnTarget) then + for index, buff_name in _ipairs (ThisDebuffOnTarget.buffs) do + local buff_info = SpellBuffDetails [buff_name] or {["counter"] = 0, ["total"] = 0, ["critico"] = 0, ["critico_dano"] = 0} + buff_info.counter = buff_info.counter+1 + buff_info.total = buff_info.total+amount + if (critical ~= nil) then + buff_info.critico = buff_info.critico+1 + buff_info.critico_dano = buff_info.critico_dano+amount end + SpellBuffDetails [buff_name] = buff_info end end end - - else + end + + else - for BuffName, _ in _pairs (_detalhes.Buffs.BuffsTable) do - local name = _UnitAura ("player", BuffName) - if (name ~= nil) then - local buff_info = SpellBuffDetails [name] or {["counter"] = 0, ["total"] = 0, ["critico"] = 0, ["critico_dano"] = 0} - buff_info.counter = buff_info.counter+1 - buff_info.total = buff_info.total+amount - if (critical ~= nil) then - buff_info.critico = buff_info.critico+1 - buff_info.critico_dano = buff_info.critico_dano+amount - end - SpellBuffDetails [name] = buff_info + for BuffName, _ in _pairs (_detalhes.Buffs.BuffsTable) do + local name = _UnitAura ("player", BuffName) + if (name ~= nil) then + local buff_info = SpellBuffDetails [name] or {["counter"] = 0, ["total"] = 0, ["critico"] = 0, ["critico_dano"] = 0} + buff_info.counter = buff_info.counter+1 + buff_info.total = buff_info.total+amount + if (critical ~= nil) then + buff_info.critico = buff_info.critico+1 + buff_info.critico_dano = buff_info.critico_dano+amount end + SpellBuffDetails [name] = buff_info end end end end - - return self.shadow:Add (serial, nome, flag, amount, who_nome, resisted, blocked, absorbed, critical, glacing, token) end end diff --git a/classes/classe_energy.lua b/classes/classe_energy.lua index 32deda2a..35aab44e 100644 --- a/classes/classe_energy.lua +++ b/classes/classe_energy.lua @@ -856,7 +856,7 @@ function atributo_energy:MontaInfoRegenRecebido() end self:FocusLock (barra, tabela[1]) - self:UpdadeInfoBar (barra, index, tabela[1], tabela[4], tabela[2], max_, tabela[3], tabela[5], true) + self:UpdadeInfoBar (barra, index, tabela[1], tabela[4], tabela[2], _detalhes:comma_value (tabela[2]), max_, tabela[3], tabela[5], true) barra.minha_tabela = self barra.show = tabela[1] @@ -1036,11 +1036,8 @@ end end --> restaura e liga o ator com a sua shadow durante a inicialização - function atributo_energy:r_connect_shadow (actor) - - if (not actor) then - actor = self - end + + function atributo_energy:r_onlyrefresh_shadow (actor) --> criar uma shadow desse ator se ainda não tiver uma local overall_energy = _detalhes.tabela_overall [3] @@ -1055,6 +1052,50 @@ end --> restaura a meta e indexes ao ator _detalhes.refresh:r_atributo_energy (actor, shadow) + --> copia o container de alvos (captura de dados) + for index, alvo in _ipairs (actor.targets._ActorTable) do + --> cria e soma o valor do total + local alvo_shadow = shadow.targets:PegarCombatente (nil, alvo.nome, nil, true) + --> refresh no alvo + _detalhes.refresh:r_alvo_da_habilidade (alvo, shadow.targets) + end + + --> copia o container de habilidades (captura de dados) + for spellid, habilidade in _pairs (actor.spell_tables._ActorTable) do + --> cria e soma o valor + local habilidade_shadow = shadow.spell_tables:PegaHabilidade (spellid, true, nil, true) + --> refresh e soma os valores dos alvos + for index, alvo in _ipairs (habilidade.targets._ActorTable) do + --> cria e soma o valor do total + local alvo_shadow = habilidade_shadow.targets:PegarCombatente (nil, alvo.nome, nil, true) + --> refresh no alvo da habilidade + _detalhes.refresh:r_alvo_da_habilidade (alvo, habilidade_shadow.targets) + end + + --> refresh na meta e indexes + _detalhes.refresh:r_habilidade_e_energy (habilidade, shadow.spell_tables) + end + + return shadow + end + + function atributo_energy:r_connect_shadow (actor, no_refresh) + + --> criar uma shadow desse ator se ainda não tiver uma + local overall_energy = _detalhes.tabela_overall [3] + local shadow = overall_energy._ActorTable [overall_energy._NameIndexTable [actor.nome]] + + if (not shadow) then + shadow = overall_energy:PegarCombatente (actor.serial, actor.nome, actor.flag_original, true) + shadow.classe = actor.classe + shadow.grupo = actor.grupo + end + + --> restaura a meta e indexes ao ator + if (not no_refresh) then + _detalhes.refresh:r_atributo_energy (actor, shadow) + end + --> total das energias (captura de dados) shadow.mana = shadow.mana + actor.mana shadow.e_rage = shadow.e_rage + actor.e_rage @@ -1089,7 +1130,9 @@ end local alvo_shadow = shadow.targets:PegarCombatente (nil, alvo.nome, nil, true) alvo_shadow.total = alvo_shadow.total + alvo.total --> refresh no alvo - _detalhes.refresh:r_alvo_da_habilidade (alvo, shadow.targets) + if (not no_refresh) then + _detalhes.refresh:r_alvo_da_habilidade (alvo, shadow.targets) + end end --> copia o container de habilidades (captura de dados) @@ -1102,7 +1145,9 @@ end local alvo_shadow = habilidade_shadow.targets:PegarCombatente (nil, alvo.nome, nil, true) alvo_shadow.total = alvo_shadow.total + alvo.total --> refresh no alvo da habilidade - _detalhes.refresh:r_alvo_da_habilidade (alvo, habilidade_shadow.targets) + if (not no_refresh) then + _detalhes.refresh:r_alvo_da_habilidade (alvo, habilidade_shadow.targets) + end end --> soma todos os demais valores for key, value in _pairs (habilidade) do @@ -1116,7 +1161,9 @@ end end end --> refresh na meta e indexes - _detalhes.refresh:r_habilidade_e_energy (habilidade, shadow.spell_tables) + if (not no_refresh) then + _detalhes.refresh:r_habilidade_e_energy (habilidade, shadow.spell_tables) + end end return shadow diff --git a/classes/classe_energy_habilidade.lua b/classes/classe_energy_habilidade.lua index 1f39f8cf..37302d11 100644 --- a/classes/classe_energy_habilidade.lua +++ b/classes/classe_energy_habilidade.lua @@ -67,9 +67,6 @@ function habilidade_energy:Add (serial, nome, flag, amount, who_nome, powertype) alvo.runepower = alvo.runepower + amount end - if (self.shadow) then - return self.shadow:Add (serial, nome, flag, amount, who_nome, powertype) - end end function _detalhes.refresh:r_habilidade_e_energy (habilidade, shadow) --recebeu o container shadow diff --git a/classes/classe_heal.lua b/classes/classe_heal.lua index d23705a2..eac9b3f0 100644 --- a/classes/classe_heal.lua +++ b/classes/classe_heal.lua @@ -928,7 +928,7 @@ function atributo_heal:ToolTip_HealingDone (instancia, numero, barra, keydown) if (_detalhes.time_type == 1 or not self.grupo) then meu_tempo = self:Tempo() elseif (_detalhes.time_type == 2) then - meu_tempo = self:GetCombatTime() + meu_tempo = instancia.showing:GetCombatTime() end local ActorTotal = self [actor_key] @@ -991,8 +991,10 @@ function atributo_heal:ToolTip_HealingDone (instancia, numero, barra, keydown) end if (instancia.sub_atributo == 6) then - GameCooltip:AddLine (Loc ["STRING_REPORT_LEFTCLICK"], nil, 1, "white") + GameCooltip:AddLine ("") + GameCooltip:AddLine (Loc ["STRING_REPORT_LEFTCLICK"], nil, 1, _unpack (self.click_to_report_color)) GameCooltip:AddIcon ([[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]], 1, 1, 12, 16, 0.015625, 0.13671875, 0.4375, 0.59765625) + GameCooltip:ShowCooltip() end @@ -1072,7 +1074,7 @@ function atributo_heal:ToolTip_HealingDone (instancia, numero, barra, keydown) if (_detalhes.time_type == 1 or not self.grupo) then meu_tempo = my_self:Tempo() elseif (_detalhes.time_type == 2) then - meu_tempo = my_self:GetCombatTime() + meu_tempo = instancia.showing:GetCombatTime() end totais [#totais+1] = {nome, my_self.total_without_pet, my_self.total_without_pet/meu_tempo} @@ -1246,7 +1248,7 @@ function atributo_heal:MontaInfoHealTaken() texCoords = _detalhes.class_coords ["UNKNOW"] end - self:UpdadeInfoBar (barra, index, tabela[1], tabela[1], tabela[2], max_, tabela[3], "Interface\\AddOns\\Details\\images\\classes_small", true, texCoords) + self:UpdadeInfoBar (barra, index, tabela[1], tabela[1], tabela[2], _detalhes:comma_value (tabela[2]), max_, tabela[3], "Interface\\AddOns\\Details\\images\\classes_small", true, texCoords) end --[[ @@ -1377,19 +1379,25 @@ function atributo_heal:MontaInfoOverHealing() end --> TOP OVERHEALED - local meus_inimigos = {} + local jogadores_overhealed = {} tabela = self.targets._ActorTable + local heal_container = instancia.showing[2] for _, tabela in _ipairs (tabela) do - _table_insert (meus_inimigos, {tabela.nome, tabela.overheal, tabela.overheal/total*100}) + local classe = "UNKNOW" + local actor_object = heal_container._ActorTable [heal_container._NameIndexTable [tabela.nome]] + if (actor_object) then + classe = actor_object.classe + end + _table_insert (jogadores_overhealed, {tabela.nome, tabela.overheal, tabela.overheal/total*100, classe}) end - _table_sort (meus_inimigos, function(a, b) return a[2] > b[2] end ) + _table_sort (jogadores_overhealed, function(a, b) return a[2] > b[2] end ) - local amt_alvos = #meus_inimigos + local amt_alvos = #jogadores_overhealed gump:JI_AtualizaContainerAlvos (amt_alvos) - local max_inimigos = meus_inimigos[1] and meus_inimigos[1][2] or 0 + local max_inimigos = jogadores_overhealed[1] and jogadores_overhealed[1][2] or 0 - for index, tabela in _ipairs (meus_inimigos) do + for index, tabela in _ipairs (jogadores_overhealed) do local barra = info.barras2 [index] @@ -1401,15 +1409,21 @@ function atributo_heal:MontaInfoOverHealing() if (index == 1) then barra.textura:SetValue (100) else - barra.textura:SetValue (tabela[2]/max_*100) --> muito mais rapido... + barra.textura:SetValue (tabela[2]/max_*100) 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_esquerdo:SetWidth (barra:GetWidth() - barra.texto_direita:GetStringWidth() - 30) - -- o que mostrar no local do ícone? - --barra.icone:SetTexture (tabela[4][3]) + -- icon + barra.icone:SetTexture ([[Interface\AddOns\Details\images\classes_small]]) + + local texCoords = _detalhes.class_coords [tabela[4]] + if (not texCoords) then + texCoords = _detalhes.class_coords ["UNKNOW"] + end + barra.icone:SetTexCoord (_unpack (texCoords)) barra.minha_tabela = self barra.nome_inimigo = tabela [1] @@ -1434,6 +1448,14 @@ function atributo_heal:MontaInfoHealingDone() local minhas_curas = {} local barras = info.barras1 + --get time type + local meu_tempo + if (_detalhes.time_type == 1 or not self.grupo) then + meu_tempo = self:Tempo() + elseif (_detalhes.time_type == 2) then + meu_tempo = info.instancia.showing:GetCombatTime() + end + for spellid, tabela in _pairs (tabela) do local nome, rank, icone = _GetSpellInfo (spellid) _table_insert (minhas_curas, {spellid, tabela.total, tabela.total/total*100, nome, icone}) @@ -1458,7 +1480,11 @@ function atributo_heal:MontaInfoHealingDone() self:FocusLock (barra, tabela[1]) - self:UpdadeInfoBar (barra, index, tabela[1], tabela[4], tabela[2], max_, tabela[3], tabela[5], true) + if (info.sub_atributo == 2) then + self:UpdadeInfoBar (barra, index, tabela[1], tabela[4], tabela[2], _detalhes:comma_value (_math_floor (tabela[2]/meu_tempo)), max_, tabela[3], tabela[5], true) + else + self:UpdadeInfoBar (barra, index, tabela[1], tabela[4], tabela[2], _detalhes:comma_value (tabela[2]), max_, tabela[3], tabela[5], true) + end barra.minha_tabela = self barra.show = tabela[1] @@ -1499,7 +1525,12 @@ function atributo_heal:MontaInfoHealingDone() 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 + + 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 + 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 + end -- o que mostrar no local do ícone? --barra.icone:SetTexture (tabela[4][3]) @@ -1540,11 +1571,10 @@ function atributo_heal:MontaTooltipAlvos (esta_barra, index) end end else + for spellid, tabela in _pairs (container) do - --> tabela = classe_damage_habilidade local alvos = tabela.targets._ActorTable for _, tabela in _ipairs (alvos) do - --> tabela = classe_target if (tabela.nome == inimigo) then habilidades [#habilidades+1] = {spellid, tabela.total} end @@ -1555,17 +1585,40 @@ function atributo_heal:MontaTooltipAlvos (esta_barra, index) _table_sort (habilidades, function (a, b) return a[2] > b[2] end) - GameTooltip:AddLine (index..". "..inimigo) - GameTooltip:AddLine (Loc ["STRING_HEALING_FROM"]..":") --> localize-me - GameTooltip:AddLine (" ") + --get time type + local meu_tempo + if (_detalhes.time_type == 1 or not self.grupo) then + meu_tempo = self:Tempo() + elseif (_detalhes.time_type == 2) then + meu_tempo = info.instancia.showing:GetCombatTime() + end + + local is_hps = info.instancia.sub_atributo == 2 + + if (is_hps) then + GameTooltip:AddLine (index..". "..inimigo) + GameTooltip:AddLine (Loc ["STRING_HEALING_HPS_FROM"] .. ":") + GameTooltip:AddLine (" ") + else + GameTooltip:AddLine (index..". "..inimigo) + GameTooltip:AddLine (Loc ["STRING_HEALING_FROM"] .. ":") + GameTooltip:AddLine (" ") + end for index, tabela in _ipairs (habilidades) do local nome, rank, icone = _GetSpellInfo (tabela[1]) if (index < 8) then - GameTooltip:AddDoubleLine (index..". |T"..icone..":0|t "..nome, _detalhes:comma_value (tabela[2]).." (".. _cstr ("%.1f", tabela[2]/total*100).."%)", 1, 1, 1, 1, 1, 1) - --GameTooltip:AddTexture (icone) + if (is_hps) then + GameTooltip:AddDoubleLine (index..". |T"..icone..":0|t "..nome, _detalhes:comma_value (_math_floor (tabela[2]/meu_tempo)).." (".. _cstr ("%.1f", tabela[2]/total*100).."%)", 1, 1, 1, 1, 1, 1) + else + GameTooltip:AddDoubleLine (index..". |T"..icone..":0|t "..nome, _detalhes:comma_value (tabela[2]).." (".. _cstr ("%.1f", tabela[2]/total*100).."%)", 1, 1, 1, 1, 1, 1) + end else - GameTooltip:AddDoubleLine (index..". "..nome, _detalhes:comma_value (tabela[2]).." (".. _cstr ("%.1f", tabela[2]/total*100).."%)", .65, .65, .65, .65, .65, .65) + if (is_hps) then + GameTooltip:AddDoubleLine (index..". "..nome, _detalhes:comma_value (_math_floor (tabela[2]/meu_tempo)).." (".. _cstr ("%.1f", tabela[2]/total*100).."%)", .65, .65, .65, .65, .65, .65) + else + GameTooltip:AddDoubleLine (index..". "..nome, _detalhes:comma_value (tabela[2]).." (".. _cstr ("%.1f", tabela[2]/total*100).."%)", .65, .65, .65, .65, .65, .65) + end end end @@ -1676,7 +1729,7 @@ function atributo_heal:MontaDetalhesHealingDone (spellid, barra) if (_detalhes.time_type == 1 or not self.grupo) then meu_tempo = self:Tempo() elseif (_detalhes.time_type == 2) then - meu_tempo = self:GetCombatTime() + meu_tempo = info.instancia.showing:GetCombatTime() end --local total_hits = esta_magia.counter @@ -1863,11 +1916,7 @@ end end --> restaura e liga o ator com a sua shadow durante a inicialização - function atributo_heal:r_connect_shadow (actor) - - if (not actor) then - actor = self - end + function atributo_heal:r_onlyrefresh_shadow (actor) --> criar uma shadow desse ator se ainda não tiver uma local overall_cura = _detalhes.tabela_overall [2] @@ -1883,6 +1932,52 @@ end --> restaura a meta e indexes ao ator _detalhes.refresh:r_atributo_heal (actor, shadow) + + --> copia o container de alvos (captura de dados) + for index, alvo in _ipairs (actor.targets._ActorTable) do + --> cria e soma o valor do total + local alvo_shadow = shadow.targets:PegarCombatente (nil, alvo.nome, nil, true) + --> refresh no alvo + _detalhes.refresh:r_alvo_da_habilidade (alvo, shadow.targets) + end + + --> copia o container de habilidades (captura de dados) + for spellid, habilidade in _pairs (actor.spell_tables._ActorTable) do + --> cria e soma o valor + local habilidade_shadow = shadow.spell_tables:PegaHabilidade (spellid, true, nil, true) + --> refresh e soma os valores dos alvos + for index, alvo in _ipairs (habilidade.targets._ActorTable) do + --> cria e soma o valor do total + local alvo_shadow = habilidade_shadow.targets:PegarCombatente (nil, alvo.nome, nil, true) + --> refresh no alvo da habilidade + _detalhes.refresh:r_alvo_da_habilidade (alvo, habilidade_shadow.targets) + end + + --> refresh na habilidade + _detalhes.refresh:r_habilidade_cura (habilidade, shadow.spell_tables) + end + + return shadow + end + + function atributo_heal:r_connect_shadow (actor, no_refresh) + + --> criar uma shadow desse ator se ainda não tiver uma + local overall_cura = _detalhes.tabela_overall [2] + local shadow = overall_cura._ActorTable [overall_cura._NameIndexTable [actor.nome]] + + if (not shadow) then + shadow = overall_cura:PegarCombatente (actor.serial, actor.nome, actor.flag_original, true) + shadow.classe = actor.classe + shadow.grupo = actor.grupo + shadow.start_time = time() - 3 + shadow.end_time = time() + end + + --> restaura a meta e indexes ao ator + if (not no_refresh) then + _detalhes.refresh:r_atributo_heal (actor, shadow) + end --> tempo decorrido (captura de dados) if (actor.end_time) then @@ -1932,7 +2027,9 @@ end alvo_shadow.overheal = alvo_shadow.overheal + alvo.overheal alvo_shadow.absorbed = alvo_shadow.absorbed + alvo.absorbed --> refresh no alvo - _detalhes.refresh:r_alvo_da_habilidade (alvo, shadow.targets) + if (not no_refresh) then + _detalhes.refresh:r_alvo_da_habilidade (alvo, shadow.targets) + end end --> copia o container de habilidades (captura de dados) @@ -1947,7 +2044,9 @@ end alvo_shadow.overheal = alvo_shadow.overheal + alvo.overheal alvo_shadow.absorbed = alvo_shadow.absorbed + alvo.absorbed --> refresh no alvo da habilidade - _detalhes.refresh:r_alvo_da_habilidade (alvo, habilidade_shadow.targets) + if (not no_refresh) then + _detalhes.refresh:r_alvo_da_habilidade (alvo, habilidade_shadow.targets) + end end --> soma todos os demais valores for key, value in _pairs (habilidade) do @@ -1962,7 +2061,9 @@ end end --> refresh na habilidade - _detalhes.refresh:r_habilidade_cura (habilidade, shadow.spell_tables) + if (not no_refresh) then + _detalhes.refresh:r_habilidade_cura (habilidade, shadow.spell_tables) + end end return shadow diff --git a/classes/classe_heal_habilidade.lua b/classes/classe_heal_habilidade.lua index 4f38e106..21778142 100644 --- a/classes/classe_heal_habilidade.lua +++ b/classes/classe_heal_habilidade.lua @@ -109,10 +109,7 @@ function habilidade_cura:Add (serial, nome, flag, amount, who_nome, absorbed, cr else alvo:AddQuantidade (0) end - - if (self.shadow) then - return self.shadow:Add (serial, nome, flag, amount, who_nome, absorbed, critical, overhealing) - end + end function _detalhes.refresh:r_habilidade_cura (habilidade, shadow) diff --git a/classes/classe_instancia.lua b/classes/classe_instancia.lua index 9197d1ac..3293920a 100644 --- a/classes/classe_instancia.lua +++ b/classes/classe_instancia.lua @@ -1633,6 +1633,20 @@ function _detalhes:TrocaTabela (instancia, segmento, atributo, sub_atributo, ini _detalhes:SendEvent ("DETAILS_INSTANCE_CHANGEATTRIBUTE", nil, instancia, atributo, sub_atributo) end + if (_detalhes.janela_info:IsShown() and instancia == _detalhes.janela_info.instancia) then + if (not instancia.showing) then + _detalhes:FechaJanelaInfo() + else + local actor = instancia.showing (instancia.atributo, _detalhes.janela_info.jogador.nome) + if (actor) then + instancia:AbreJanelaInfo (actor, true) + else + _detalhes:FechaJanelaInfo() + end + end + --_detalhes:FechaJanelaInfo() + end + if (not instancia.showing) then if (not iniciando_instancia) then instancia:Freeze() diff --git a/classes/classe_others.lua b/classes/classe_others.lua index b15661af..7ebf34f3 100644 --- a/classes/classe_others.lua +++ b/classes/classe_others.lua @@ -1895,11 +1895,8 @@ end end --> restaura e liga o ator com a sua shadow durante a inicialização - function atributo_misc:r_connect_shadow (actor) - - if (not actor) then - actor = self - end + + function atributo_misc:r_onlyrefresh_shadow (actor) --> criar uma shadow desse ator se ainda não tiver uma local overall_misc = _detalhes.tabela_overall [4] @@ -1918,6 +1915,133 @@ end --> aplica a meta e indexes _detalhes.refresh:r_atributo_misc (actor, shadow) + --> somar os alvos do ator + local somar_alvos = function (container) + for index, alvo in _ipairs (actor [container]._ActorTable) do + --> cria e soma o valor do total + local alvo_shadow = shadow [container]:PegarCombatente (nil, alvo.nome, nil, true) + --> refresh no alvo + _detalhes.refresh:r_alvo_da_habilidade (alvo, shadow [container]) + end + end + --> somar as habilidades do ator + local somar_habilidades = function (container, shadow) + for spellid, habilidade in _pairs (actor [container]._ActorTable) do + --> cria e soma o valor + local habilidade_shadow = shadow [container]:PegaHabilidade (spellid, true, nil, true) + --> refresh e soma os valores dos alvos + for index, alvo in _ipairs (habilidade.targets._ActorTable) do + --> cria e soma o valor do total + local alvo_shadow = habilidade_shadow.targets:PegarCombatente (nil, alvo.nome, nil, true) + --> refresh no alvo da habilidade + _detalhes.refresh:r_alvo_da_habilidade (alvo, habilidade_shadow.targets) + end + --> refresh na habilidade + _detalhes.refresh:r_habilidade_misc (habilidade, shadow [container]) + end + end + + --> cooldowns + if (actor.cooldowns_defensive) then + --> copia o container de alvos (captura de dados) + somar_alvos ("cooldowns_defensive_targets", shadow) + --> copia o container de habilidades (captura de dados) + somar_habilidades ("cooldowns_defensive_spell_tables", shadow) + end + + --> buff uptime + if (actor.buff_uptime) then + --> copia o container de alvos (captura de dados) + somar_alvos ("buff_uptime_targets", shadow) + --> copia o container de habilidades (captura de dados) + somar_habilidades ("buff_uptime_spell_tables", shadow) + end + + --> debuff uptime + if (actor.debuff_uptime) then + --> copia o container de alvos (captura de dados) + somar_alvos ("debuff_uptime_targets", shadow) + --> copia o container de habilidades (captura de dados) + somar_habilidades ("debuff_uptime_spell_tables", shadow) + end + + --> interrupt + if (actor.interrupt) then + --> copia o container de alvos (captura de dados) + somar_alvos ("interrupt_targets", shadow) + --> copia o container de habilidades (captura de dados) + somar_habilidades ("interrupt_spell_tables", shadow) + --> copia o que cada habilidade interrompeu + for spellid, habilidade in _pairs (actor.interrupt_spell_tables._ActorTable) do + --> pega o actor da shadow + local habilidade_shadow = shadow.interrupt_spell_tables:PegaHabilidade (spellid, true, nil, true) + --> copia as habilidades interrompidas + habilidade_shadow.interrompeu_oque = habilidade_shadow.interrompeu_oque or {} + end + end + + --> ress + if (actor.ress) then + --> copia o container de alvos (captura de dados) + somar_alvos ("ress_targets", shadow) + --> copia o container de habilidades (captura de dados) + somar_habilidades ("ress_spell_tables", shadow) + end + + --> dispell + if (actor.dispell) then + --> copia o container de alvos (captura de dados) + somar_alvos ("dispell_targets", shadow) + --> copia o container de habilidades (captura de dados) + somar_habilidades ("dispell_spell_tables", shadow) + --> copia o que cada habilidade dispelou + for spellid, habilidade in _pairs (actor.dispell_spell_tables._ActorTable) do + --> pega o actor da shadow + local habilidade_shadow = shadow.dispell_spell_tables:PegaHabilidade (spellid, true, nil, true) + --> copia as habilidades dispeladas + habilidade_shadow.dispell_oque = habilidade_shadow.dispell_oque or {} + end + end + --> cc break + if (actor.cc_break) then + --> copia o container de alvos (captura de dados) + somar_alvos ("cc_break_targets", shadow) + --> copia o container de habilidades (captura de dados) + somar_habilidades ("cc_break_spell_tables", shadow) + --> copia o que cada habilidade quebrou + for spellid, habilidade in _pairs (actor.cc_break_spell_tables._ActorTable) do + --> pega o actor da shadow + local habilidade_shadow = shadow.cc_break_spell_tables:PegaHabilidade (spellid, true, nil, true) + --> copia as habilidades quebradas + habilidade_shadow.cc_break_oque = habilidade_shadow.cc_break_oque or {} + end + end + + return shadow + + end + + function atributo_misc:r_connect_shadow (actor, no_refresh) + + --> criar uma shadow desse ator se ainda não tiver uma + local overall_misc = _detalhes.tabela_overall [4] + local shadow = overall_misc._ActorTable [overall_misc._NameIndexTable [actor.nome]] + + if (not actor.nome) then + actor.nome = "unknown" + end + + if (not shadow) then + shadow = overall_misc:PegarCombatente (actor.serial, actor.nome, actor.flag_original, true) + shadow.classe = actor.classe + shadow.grupo = actor.grupo + end + + --> aplica a meta e indexes + if (not no_refresh) then + _detalhes.refresh:r_atributo_misc (actor, shadow) + end + --> somar as keys das habilidades local somar_keys = function (habilidade, habilidade_shadow) for key, value in _pairs (habilidade) do @@ -1944,7 +2068,9 @@ end end --end --> refresh no alvo - _detalhes.refresh:r_alvo_da_habilidade (alvo, shadow [container]) + if (not no_refresh) then + _detalhes.refresh:r_alvo_da_habilidade (alvo, shadow [container]) + end end end @@ -1959,17 +2085,29 @@ end local alvo_shadow = habilidade_shadow.targets:PegarCombatente (nil, alvo.nome, nil, true) alvo_shadow.total = alvo_shadow.total + alvo.total --> refresh no alvo da habilidade - _detalhes.refresh:r_alvo_da_habilidade (alvo, habilidade_shadow.targets) + if (not no_refresh) then + _detalhes.refresh:r_alvo_da_habilidade (alvo, habilidade_shadow.targets) + end end --> soma todos os demais valores somar_keys (habilidade, habilidade_shadow) --> refresh na habilidade - _detalhes.refresh:r_habilidade_misc (habilidade, shadow [container]) + if (not no_refresh) then + _detalhes.refresh:r_habilidade_misc (habilidade, shadow [container]) + end end end --> cooldowns if (actor.cooldowns_defensive) then + + --> verifica se tem o container + if (not shadow.cooldowns_defensive_targets) then + shadow.cooldowns_defensive = 0 + shadow.cooldowns_defensive_targets = container_combatentes:NovoContainer (container_damage_target) + shadow.cooldowns_defensive_spell_tables = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) + end + --> soma o total (captura de dados) shadow.cooldowns_defensive = shadow.cooldowns_defensive + actor.cooldowns_defensive --> total no combate overall (captura de dados) @@ -1985,6 +2123,14 @@ end --> buff uptime if (actor.buff_uptime) then + + --> verifica se tem o container + if (not shadow.buff_uptime_spell_targets) then + shadow.buff_uptime = 0 + shadow.buff_uptime_spell_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total + shadow.buff_uptime_spell_tables = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) --> cria o container das habilidades usadas para interromper + end + --> soma o total (captura de dados) shadow.buff_uptime = shadow.buff_uptime + actor.buff_uptime --> copia o container de alvos (captura de dados) @@ -1995,6 +2141,23 @@ end --> debuff uptime if (actor.debuff_uptime) then + + --> verifica se tem o container + if (not shadow.debuff_uptime_targets) then + shadow.debuff_uptime = 0 + if (actor.boss_debuff) then + shadow.debuff_uptime_targets = container_combatentes:NovoContainer (_detalhes.container_type.CONTAINER_ENEMYDEBUFFTARGET_CLASS) + shadow.boss_debuff = true + shadow.damage_twin = actor.damage_twin + shadow.spellschool = actor.spellschool + shadow.damage_spellid = actor.damage_spellid + shadow.debuff_uptime = 0 + else + shadow.debuff_uptime_targets = container_combatentes:NovoContainer (container_damage_target) + end + shadow.debuff_uptime_spell_tables = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) + end + --> soma o total (captura de dados) shadow.debuff_uptime = shadow.debuff_uptime + actor.debuff_uptime --> copia o container de alvos (captura de dados) @@ -2005,6 +2168,15 @@ end --> interrupt if (actor.interrupt) then + + --verifica se tem o container + if (not shadow.interrupt_targets) then + shadow.interrupt = 0 + shadow.interrupt_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total + shadow.interrupt_spell_tables = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) --> cria o container das habilidades usadas para interromper + shadow.interrompeu_oque = {} + end + --> soma o total (captura de dados) shadow.interrupt = shadow.interrupt + actor.interrupt --> total no combate overall (captura de dados) @@ -2041,6 +2213,14 @@ end --> ress if (actor.ress) then + + --> verifica se tem o container + if (not shadow.ress_targets) then + shadow.ress = 0 + shadow.ress_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total + shadow.ress_spell_tables = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) --> cria o container das habilidades usadas para interromper + end + --> soma o total (captura de dados) shadow.ress = shadow.ress + actor.ress --> total no combate overall (captura de dados) @@ -2056,6 +2236,15 @@ end --> dispell if (actor.dispell) then + + --> verifica se tem o container + if (not shadow.dispell_targets) then + shadow.dispell = 0 + shadow.dispell_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total + shadow.dispell_spell_tables = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) --> cria o container das habilidades usadas para interromper + shadow.dispell_oque = {} + end + --> soma o total (captura de dados) shadow.dispell = shadow.dispell + actor.dispell --> total no combate overall (captura de dados) @@ -2092,6 +2281,15 @@ end end --> cc break if (actor.cc_break) then + + --> verifica se tem o container + if (not shadow.cc_break) then + shadow.cc_break = 0 + shadow.cc_break_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total + shadow.cc_break_spell_tables = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) --> cria o container das habilidades usadas para interromper + shadow.cc_break_oque = {} + end + --> soma o total (captura de dados) shadow.cc_break = shadow.cc_break + actor.cc_break --> total no combate overall (captura de dados) diff --git a/classes/classe_others_habilidade.lua b/classes/classe_others_habilidade.lua index 25113572..a9437922 100644 --- a/classes/classe_others_habilidade.lua +++ b/classes/classe_others_habilidade.lua @@ -70,10 +70,6 @@ function habilidade_misc:Add (serial, nome, flag, who_nome, token, spellID, spel self.actived_at = _detalhes._tempo self.actived = true - if (self.shadow) then - return self.shadow:Add (serial, nome, flag, who_nome, token.shadow, spellID, spellName) - end - elseif (spellName == "BUFF_UPTIME_OUT") then if (self.actived_at and self.actived) then self.uptime = self.uptime + _detalhes._tempo - self.actived_at @@ -82,10 +78,6 @@ function habilidade_misc:Add (serial, nome, flag, who_nome, token, spellID, spel self.actived = false self.actived_at = nil - if (self.shadow) then - return self.shadow:Add (serial, nome, flag, who_nome, token.shadow, spellID, spellName) - end - elseif (spellName == "BUFF_UPTIME_IN" or spellName == "DEBUFF_UPTIME_IN") then self.actived = true self.activedamt = self.activedamt + 1 @@ -98,10 +90,6 @@ function habilidade_misc:Add (serial, nome, flag, who_nome, token, spellID, spel self.actived_at = _detalhes._tempo - if (self.shadow) then - return self.shadow:Add (serial, nome, flag, who_nome, token.shadow, spellID, spellName) - end - elseif (spellName == "DEBUFF_UPTIME_REFRESH") then if (self.actived_at and self.actived) then self.uptime = self.uptime + _detalhes._tempo - self.actived_at @@ -109,10 +97,6 @@ function habilidade_misc:Add (serial, nome, flag, who_nome, token, spellID, spel end self.actived_at = _detalhes._tempo self.actived = true - - if (self.shadow) then - return self.shadow:Add (serial, nome, flag, who_nome, token.shadow, spellID, spellName) - end elseif (spellName == "DEBUFF_UPTIME_OUT") then if (self.actived_at and self.actived) then @@ -128,10 +112,6 @@ function habilidade_misc:Add (serial, nome, flag, who_nome, token, spellID, spel else self.actived_at = _detalhes._tempo end - - if (self.shadow) then - return self.shadow:Add (serial, nome, flag, who_nome, token.shadow, spellID, spellName) - end end @@ -217,10 +197,6 @@ function habilidade_misc:Add (serial, nome, flag, who_nome, token, spellID, spel alvo.total = alvo.total + 1 end - if (self.shadow) then - return self.shadow:Add (serial, nome, flag, who_nome, token, spellID, spellName) - end - end --> habilidade atual e o container de habilidades da shadow diff --git a/classes/container_combatentes.lua b/classes/container_combatentes.lua index de88d416..3ca12af3 100644 --- a/classes/container_combatentes.lua +++ b/classes/container_combatentes.lua @@ -44,6 +44,7 @@ local OBJECT_TYPE_PET = 0x00001000 local OBJECT_TYPE_NPC = 0x00000800 local OBJECT_TYPE_PLAYER = 0x00000400 local OBJECT_TYPE_PETS = OBJECT_TYPE_PET + OBJECT_TYPE_GUARDIAN +local EM_GRUPO = 0x00000007 local REACTION_HOSTILE = COMBATLOG_OBJECT_REACTION_HOSTILE or 0x00000040 @@ -66,8 +67,7 @@ function container_combatentes:NovoContainer (tipo_do_container, combatTable, co return _newContainer end -local function get_class_ (novo_objeto, nome, flag) - +local function get_actor_class (novo_objeto, nome, flag) local _, engClass = _UnitClass (nome) if (engClass) then @@ -75,14 +75,11 @@ local function get_class_ (novo_objeto, nome, flag) return else if (flag) then - --print ("tem flag: " .. flag) --> conferir se o jogador é um player if (_bit_band (flag, OBJECT_TYPE_PLAYER) ~= 0) then - --print ("eh um player sem grupo: "..novo_objeto.nome) novo_objeto.classe = "UNGROUPPLAYER" return elseif (_bit_band (flag, OBJECT_TYPE_PETGUARDIAN) ~= 0) then - --print ("eh um pet: "..novo_objeto.nome) novo_objeto.classe = "PET" return end @@ -92,21 +89,6 @@ local function get_class_ (novo_objeto, nome, flag) end end -local EM_GRUPO = 0x00000007 - -function container_combatentes:Dupe (who) - local novo_objeto = {} - if (_getmetatable (who)) then - _setmetatable (novo_objeto, _getmetatable (who)) - end - - for cprop, value in _pairs (who) do - novo_objeto[cprop] = value - end - - return novo_objeto -end - function container_combatentes:GetAmount (actorName, key) key = key or "total" local index = self._NameIndexTable [actorName] @@ -117,7 +99,7 @@ function container_combatentes:GetAmount (actorName, key) end end -local read_flag_ = function (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) +local read_actor_flag = function (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) -- converte a flag do wow em flag do details ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ @@ -261,8 +243,8 @@ function container_combatentes:PegarCombatente (serial, nome, flag, criar, isOwn if (self.tipo == container_damage) then --> CONTAINER DAMAGE - get_class_ (novo_objeto, nome, flag) - read_flag_ (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) + get_actor_class (novo_objeto, nome, flag) + read_actor_flag (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) if (dono_do_pet) then dono_do_pet.pets [#dono_do_pet.pets+1] = nome @@ -294,8 +276,8 @@ function container_combatentes:PegarCombatente (serial, nome, flag, criar, isOwn elseif (self.tipo == container_heal) then --> CONTAINER HEALING - get_class_ (novo_objeto, nome, flag) - read_flag_ (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) + get_actor_class (novo_objeto, nome, flag) + read_actor_flag (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) if (dono_do_pet) then dono_do_pet.pets [#dono_do_pet.pets+1] = nome @@ -324,8 +306,8 @@ function container_combatentes:PegarCombatente (serial, nome, flag, criar, isOwn elseif (self.tipo == container_energy) then --> CONTAINER ENERGY - get_class_ (novo_objeto, nome, flag) - read_flag_ (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) + get_actor_class (novo_objeto, nome, flag) + read_actor_flag (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) if (dono_do_pet) then dono_do_pet.pets [#dono_do_pet.pets+1] = nome @@ -350,8 +332,8 @@ function container_combatentes:PegarCombatente (serial, nome, flag, criar, isOwn elseif (self.tipo == container_misc) then --> CONTAINER MISC - get_class_ (novo_objeto, nome, flag) - read_flag_ (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) + get_actor_class (novo_objeto, nome, flag) + read_actor_flag (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) --local teste_classe = @@ -420,7 +402,7 @@ function container_combatentes:PegarCombatente (serial, nome, flag, criar, isOwn elseif (self.tipo == container_friendlyfire) then --> CONTAINER FRIENDLY FIRE - get_class_ (novo_objeto, nome) + get_actor_class (novo_objeto, nome) if (shadow_objeto) then novo_objeto.shadow = shadow_objeto diff --git a/classes/container_historico.lua b/classes/container_historico.lua index ca56f00f..b5d70166 100644 --- a/classes/container_historico.lua +++ b/classes/container_historico.lua @@ -1,3 +1,5 @@ +local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) + --lua api local _table_remove = table.remove local _table_insert = table.insert @@ -19,6 +21,29 @@ function historico:NovoHistorico() return esta_tabela end +function historico:adicionar_overall (tabela) + if (_detalhes.overall_clear_newboss) then + if (tabela.instance_type == "raid" and tabela.is_boss) then + if (_detalhes.last_encounter ~= _detalhes.last_encounter2) then + for index, combat in ipairs (_detalhes.tabela_historico.tabelas) do + combat.overall_added = false + end + historico:resetar_overall() + end + end + end + + _detalhes.tabela_overall = _detalhes.tabela_overall + tabela + tabela.overall_added = true + + if (_detalhes.tabela_overall.start_time == 0) then + _detalhes.tabela_overall.start_time = tabela.start_time + _detalhes.tabela_overall.end_time = tabela.end_time + end + + _detalhes:ClockPluginTickOnSegment() +end + --> sai do combate, chamou adicionar a tabela ao histórico function historico:adicionar (tabela) @@ -37,12 +62,60 @@ function historico:adicionar (tabela) --> adiciona no index #1 _table_insert (self.tabelas, 1, tabela) + local overall_added = false + + if (not overall_added and bit.band (_detalhes.overall_flag, 0x1) ~= 0) then --> raid boss - flag 0x1 + if (tabela.is_boss and tabela.instance_type == "raid" and not tabela.is_pvp) then + overall_added = true + end + --print ("0x1") + end + + if (not overall_added and bit.band (_detalhes.overall_flag, 0x2) ~= 0) then --> raid trash - flag 0x2 + if (tabela.is_trash and tabela.instance_type == "raid") then --check if the player is in a raid + overall_added = true + end + --print ("0x2") + end + + if (not overall_added and bit.band (_detalhes.overall_flag, 0x4) ~= 0) then --> dungeon boss - flag 0x4 + if (tabela.is_boss and tabela.instance_type == "party" and not tabela.is_pvp) then --check if this is a dungeon boss + overall_added = true + end + --print ("0x4") + end + + if (not overall_added and bit.band (_detalhes.overall_flag, 0x8) ~= 0) then --> dungeon trash - flag 0x8 + if (tabela.is_trash and tabela.instance_type == "party") then --check if the player is in a raid + overall_added = true + end + --print ("0x8") + end + + if (not overall_added and bit.band (_detalhes.overall_flag, 0x10) ~= 0) then --> any combat + overall_added = true + --print ("0x10") + end + + if (overall_added) then + if (_detalhes.debug) then + _detalhes:Msg ("(debug) overall data flag match with the current combat.") + end + if (InCombatLockdown()) then + _detalhes.schedule_add_to_overall = true + if (_detalhes.debug) then + _detalhes:Msg ("(debug) player is in combat, scheduling overall addition.") + end + else + historico:adicionar_overall (tabela) + end + end + if (self.tabelas[2]) then --> fazer limpeza na tabela local _segundo_combate = self.tabelas[2] - local _terceiro_combate = self.tabelas[3] local container_damage = _segundo_combate [1] local container_heal = _segundo_combate [2] @@ -65,9 +138,16 @@ function historico:adicionar (tabela) end if (_detalhes.trash_auto_remove) then + + local _terceiro_combate = self.tabelas[3] + if (_terceiro_combate) then + if (_terceiro_combate.is_trash and not _terceiro_combate.is_boss) then - _detalhes.tabela_overall = _detalhes.tabela_overall - _terceiro_combate + --if (_terceiro_combate.overall_added) then + -- _detalhes.tabela_overall = _detalhes.tabela_overall - _terceiro_combate + -- print ("removendo combate 1") + --end --> verificar novamente a time machine for _, jogador in ipairs (_terceiro_combate [1]._ActorTable) do --> damage if (jogador.timeMachine) then @@ -83,53 +163,23 @@ function historico:adicionar (tabela) _table_remove (self.tabelas, 3) _detalhes:SendEvent ("DETAILS_DATA_SEGMENTREMOVED", nil, nil) end + end - - elseif (_detalhes.trash_concatenate) then - - if (_terceiro_combate) then - if (_terceiro_combate.is_trash and _segundo_combate.is_trash and not _terceiro_combate.is_boss and not _segundo_combate.is_boss) then - --> tabela 2 deve ser deletada e somada a tabela 1 - if (_detalhes.debug) then - detalhes:Msg ("(debug) concatenating two trash segments.") - end - - _segundo_combate = _segundo_combate + _terceiro_combate - _detalhes.tabela_overall = _detalhes.tabela_overall - _terceiro_combate - - _segundo_combate.is_trash = true - --> verificar novamente a time machine - for _, jogador in ipairs (_terceiro_combate [1]._ActorTable) do --> damage - if (jogador.timeMachine) then - jogador:DesregistrarNaTimeMachine() - end - end - for _, jogador in ipairs (_terceiro_combate [2]._ActorTable) do --> heal - if (jogador.timeMachine) then - jogador:DesregistrarNaTimeMachine() - end - end - --> remover - _table_remove (self.tabelas, 3) - _detalhes:SendEvent ("DETAILS_DATA_SEGMENTREMOVED", nil, nil) - end - end end end - --> chama a função que irá atualizar as instâncias com segmentos no histórico - _detalhes:InstanciaCallFunction (_detalhes.AtualizaSegmentos_AfterCombat, self) - --> verifica se precisa apagar a última tabela do histórico if (#self.tabelas > _detalhes.segments_amount) then local combat_removed = self.tabelas [#self.tabelas] --> diminuir quantidades no overall - _detalhes.tabela_overall = _detalhes.tabela_overall - combat_removed - --_detalhes.tabela_overall.start_time = _detalhes.tabela_overall.start_time + (combat_removed.end_time-combat_removed.start_time) + --if (combat_removed.overall_added) then + -- _detalhes.tabela_overall = _detalhes.tabela_overall - combat_removed + -- print ("removendo combate 2") + --end --> verificar novamente a time machine for _, jogador in ipairs (combat_removed [1]._ActorTable) do --> damage @@ -149,6 +199,9 @@ function historico:adicionar (tabela) end + --> chama a função que irá atualizar as instâncias com segmentos no histórico + _detalhes:InstanciaCallFunction (_detalhes.AtualizaSegmentos_AfterCombat, self) + _detalhes:InstanciaCallFunction (_detalhes.AtualizarJanela) end @@ -162,6 +215,39 @@ function _detalhes:CheckFreeze (instancia, index_liberado, tabela) end end +function _detalhes:OverallOptions (reset_new_boss, reset_new_challenge) + if (reset_new_boss == nil) then + reset_new_boss = _detalhes.overall_clear_newboss + end + if (reset_new_challenge == nil) then + reset_new_challenge = _detalhes.overall_clear_newchallenge + end + + _detalhes.overall_clear_newboss = reset_new_boss + _detalhes.overall_clear_newchallenge = reset_new_challenge +end + +function historico:resetar_overall() + if (InCombatLockdown()) then + _detalhes:Msg (Loc ["STRING_ERASE_IN_COMBAT"]) + _detalhes.schedule_remove_overall = true + else + --> fecha a janela de informações do jogador + _detalhes:FechaJanelaInfo() + + _detalhes.tabela_overall = combate:NovaTabela() + + for index, instancia in ipairs (_detalhes.tabela_instancias) do + if (instancia.ativa and instancia.segmento == -1) then + instancia:InstanceReset() + instancia:ReajustaGump() + end + end + end + + _detalhes:ClockPluginTickOnSegment() +end + function historico:resetar() if (_detalhes.bosswindow) then @@ -228,3 +314,40 @@ function _detalhes.refresh:r_historico (este_historico) _setmetatable (este_historico, historico) --este_historico.__index = historico end + +--[[ + elseif (_detalhes.trash_concatenate) then + + if (true) then + return + end + + if (_terceiro_combate) then + if (_terceiro_combate.is_trash and _segundo_combate.is_trash and not _terceiro_combate.is_boss and not _segundo_combate.is_boss) then + --> tabela 2 deve ser deletada e somada a tabela 1 + if (_detalhes.debug) then + detalhes:Msg ("(debug) concatenating two trash segments.") + end + + _segundo_combate = _segundo_combate + _terceiro_combate + _detalhes.tabela_overall = _detalhes.tabela_overall - _terceiro_combate + + _segundo_combate.is_trash = true + + --> verificar novamente a time machine + for _, jogador in ipairs (_terceiro_combate [1]._ActorTable) do --> damage + if (jogador.timeMachine) then + jogador:DesregistrarNaTimeMachine() + end + end + for _, jogador in ipairs (_terceiro_combate [2]._ActorTable) do --> heal + if (jogador.timeMachine) then + jogador:DesregistrarNaTimeMachine() + end + end + --> remover + _table_remove (self.tabelas, 3) + _detalhes:SendEvent ("DETAILS_DATA_SEGMENTREMOVED", nil, nil) + end + end +--]] \ No newline at end of file diff --git a/core/control.lua b/core/control.lua index 532ecd25..3268e78f 100644 --- a/core/control.lua +++ b/core/control.lua @@ -49,6 +49,12 @@ --> try to find the opponent of last fight, can be called during a fight as well function _detalhes:FindEnemy() + local ZoneName, InstanceType, DifficultyID, _, _, _, _, ZoneMapID = _GetInstanceInfo() + if (InstanceType == "party" or InstanceType == "raid") then + _detalhes.tabela_vigente.is_trash = true + return Loc ["STRING_SEGMENT_TRASH"] + end + local trash_list if (_detalhes.in_group and _detalhes.last_instance) then trash_list = _detalhes:GetInstanceTrashInfo (_detalhes.last_instance) @@ -97,6 +103,25 @@ end -- try get the current encounter name during the encounter + + local boss_found = function (index, name, zone, mapid, diff) + local boss_table = { + index = index, + name = name, + encounter = name, + zone = zone, + mapid = mapid, + diff = diff, + ej_instance_id = EJ_GetCurrentInstance(), + } + + _detalhes.tabela_vigente.is_boss = boss_table + + _detalhes:SendEvent ("COMBAT_BOSS_FOUND", nil, index, name) + + return boss_table + end + function _detalhes:ReadBossFrames() if (_detalhes.tabela_vigente.is_boss) then @@ -104,16 +129,8 @@ end if (_detalhes.encounter_table.name) then - _detalhes.tabela_vigente.is_boss = { - index = _detalhes.encounter_table.index, - name = _detalhes.encounter_table.name, - zone = _detalhes.encounter_table.zone, - mapid = _detalhes.encounter_table.mapid, - encounter = _detalhes.encounter_table.name, - diff = _detalhes.encounter_table.diff - } - _detalhes:SendEvent ("COMBAT_BOSS_FOUND", nil, _detalhes.tabela_vigente.is_boss.index, _detalhes.tabela_vigente.is_boss.name) - return _detalhes.tabela_vigente.is_boss + local encounter_table = _detalhes.encounter_table + return boss_found (encounter_table.index, encounter_table.name, encounter_table.zone, encounter_table.mapid, encounter_table.diff) end for index = 1, 5, 1 do @@ -176,17 +193,9 @@ end end end - - _detalhes.tabela_vigente.is_boss = { - index = BossIndex, - name = _detalhes:GetBossName (ZoneMapID, BossIndex), - zone = ZoneName, - mapid = ZoneMapID, - encounter = _detalhes:GetBossName (ZoneMapID, BossIndex), - diff = DifficultyID - } - _detalhes:SendEvent ("COMBAT_BOSS_FOUND", nil, _detalhes.tabela_vigente.is_boss.index, _detalhes.tabela_vigente.is_boss.name) - return _detalhes.tabela_vigente.is_boss + + return boss_found (BossIndex, _detalhes:GetBossName (ZoneMapID, BossIndex), ZoneName, ZoneMapID, DifficultyID) + end end end @@ -199,17 +208,11 @@ function _detalhes:FindBoss() if (_detalhes.encounter_table.name) then - return { - index = _detalhes.encounter_table.index, - name = _detalhes.encounter_table.name, - zone = _detalhes.encounter_table.zone, - mapid = _detalhes.encounter_table.mapid, - encounter = _detalhes.encounter_table.name, - diff = _detalhes.encounter_table.diff - } + local encounter_table = _detalhes.encounter_table + return boss_found (encounter_table.index, encounter_table.name, encounter_table.zone, encounter_table.mapid, encounter_table.diff) end - local ZoneName, _, DifficultyID, _, _, _, _, ZoneMapID = _GetInstanceInfo() + local ZoneName, InstanceType, DifficultyID, _, _, _, _, ZoneMapID = _GetInstanceInfo() local BossIds = _detalhes:GetBossIds (ZoneMapID) if (BossIds) then @@ -219,20 +222,13 @@ if (ActorsContainer) then for index, Actor in _ipairs (ActorsContainer) do if (not Actor.grupo) then - local serial = tonumber (Actor.serial:sub(6, 10), 16) + local serial = tonumber (Actor.serial:sub (6, 10), 16) if (serial) then BossIndex = BossIds [serial] if (BossIndex) then Actor.boss = true Actor.shadow.boss = true - return { - index = BossIndex, - name =_detalhes:GetBossName (ZoneMapID, BossIndex), - zone = ZoneName, - mapid = ZoneMapID, - encounter = _detalhes:GetBossName (ZoneMapID, BossIndex), - diff = DifficultyID - } + return boss_found (BossIndex, _detalhes:GetBossName (ZoneMapID, BossIndex), ZoneName, ZoneMapID, DifficultyID) end end end @@ -378,36 +374,31 @@ if (_detalhes.debug) then _detalhes:Msg ("(debug) ended a combat.") end + + if (_detalhes.schedule_remove_overall and not from_encounter_end and not InCombatLockdown()) then + if (_detalhes.debug) then + _detalhes:Msg ("(debug) found schedule overall data deletion.") + end + _detalhes.schedule_remove_overall = false + _detalhes.tabela_historico:resetar_overall() + end _detalhes:CatchRaidBuffUptime ("BUFF_UPTIME_OUT") _detalhes:CatchRaidDebuffUptime ("DEBUFF_UPTIME_OUT") _detalhes:CloseEnemyDebuffsUptime() - + --> pega a zona do jogador e vê se foi uma luta contra um Boss -- identifica se a luta foi com um boss if (not _detalhes.tabela_vigente.is_boss) then - --> function which runs after a boss encounter to try recognize a encounter - _detalhes.tabela_vigente.is_boss = _detalhes:FindBoss() + _detalhes:FindBoss() if (not _detalhes.tabela_vigente.is_boss) then - local ZoneName, _, DifficultyID, _, _, _, _, ZoneMapID = _GetInstanceInfo() - local findboss = _detalhes:GetRaidBossFindFunction (ZoneMapID) if (findboss) then local BossIndex = findboss() if (BossIndex) then - _detalhes.tabela_vigente.is_boss = { - index = BossIndex, - name = _detalhes:GetBossName (ZoneMapID, BossIndex), - zone = ZoneName, - mapid = ZoneMapID, - encounter = _detalhes:GetBossName (ZoneMapID, BossIndex), - diff = DifficultyID - } - --print ("boss found using findboss function.") - else - --print ("boss not found") + boss_found (BossIndex, _detalhes:GetBossName (ZoneMapID, BossIndex), ZoneName, ZoneMapID, DifficultyID) end end end @@ -433,6 +424,10 @@ _detalhes.tabela_vigente:seta_tempo_decorrido() --> salva o end_time _detalhes.tabela_overall:seta_tempo_decorrido() --seta o end_time + --> flag instance type + local _, InstanceType = _GetInstanceInfo() + _detalhes.tabela_vigente.instance_type = InstanceType + if (not _detalhes.tabela_vigente.is_boss) then local inimigo = _detalhes:FindEnemy() @@ -456,21 +451,28 @@ else - _detalhes:FlagActorsOnBossFight() - + if (not InCombatLockdown() and not UnitAffectingCombat ("player")) then + _detalhes:FlagActorsOnBossFight() + else + _detalhes.schedule_flag_boss_components = true + end + if (_detalhes:GetBossDetails (_detalhes.tabela_vigente.is_boss.mapid, _detalhes.tabela_vigente.is_boss.index)) then _detalhes.tabela_vigente.enemy = _detalhes.tabela_vigente.is_boss.encounter + if (_detalhes.tabela_vigente.instance_type == "raid") then + _detalhes.last_encounter2 = _detalhes.last_encounter + _detalhes.last_encounter = _detalhes.tabela_vigente.is_boss.name + end + if (bossKilled) then _detalhes.tabela_vigente.is_boss.killed = true end if (from_encounter_end) then - --_detalhes.tabela_vigente.start_time = _detalhes.encounter_table ["start"] _detalhes.tabela_vigente.end_time = _detalhes.encounter_table ["end"] - end --> encounter boss function @@ -495,7 +497,7 @@ end --> schedule clean up - _detalhes:ScheduleTimer ("IniciarColetaDeLixo", 15, true) + --_detalhes:ScheduleTimer ("IniciarColetaDeLixo", 15, true) else if (_detalhes.debug) then @@ -517,14 +519,6 @@ else --> this is a little bit complicated, need a specific function for combat cancellation - if (_detalhes.tabela_overall.end_time) then --> no inicio do combate o tempo do overall vai pra NIL o.0 - _detalhes.tabela_overall.start_time = _detalhes.tabela_overall.start_time + tempo_do_combate --> assim ele descarta o tempo de combate na tabela do everall - else - _detalhes.tabela_overall.start_time = 0 --> tempo inicio igual a zero pois se o end_time é NIL significa que é a primeira vez que ocorre o combate na tabela overall - end - - _detalhes.tabela_overall = _detalhes.tabela_overall - _detalhes.tabela_vigente --> isso aqui é novo, ele vai subtrair da overall qualquer dado adicionado na tabela descardata - --_table_wipe (_detalhes.tabela_vigente) --> descarta ela, não será mais usada _detalhes.tabela_vigente = _detalhes.tabela_historico.tabelas[1] --> pega a tabela do ultimo combate @@ -794,9 +788,8 @@ for class_type, container in _ipairs (_detalhes.tabela_vigente) do for _, actor in _ipairs (container._ActorTable) do actor.boss_fight_component = true - local shadow = _detalhes.tabela_overall (class_type, actor.nome) - if (shadow) then - shadow.boss_fight_component = true + if (actor.shadow) then + actor.shadow.boss_fight_component = true end end end @@ -806,10 +799,16 @@ local on_energy = energy_container._ActorTable [energy_container._NameIndexTable [name]] if (on_energy) then on_energy.fight_component = true + if (on_energy.shadow) then + on_energy.shadow.fight_component = true + end end local on_misc = misc_container._ActorTable [misc_container._NameIndexTable [name]] if (on_misc) then on_misc.fight_component = true + if (on_misc.shadow) then + on_misc.shadow.fight_component = true + end end end @@ -829,6 +828,9 @@ local target_object = container._ActorTable [container._NameIndexTable [target_actor.nome]] if (target_object) then target_object.fight_component = true + if (target_object.shadow) then + target_object.shadow.fight_component = true + end fight_component (energy_container, misc_container, target_actor.nome) end end @@ -837,6 +839,9 @@ local target_object = container._ActorTable [container._NameIndexTable [damager_actor]] if (target_object) then target_object.fight_component = true + if (target_object.shadow) then + target_object.shadow.fight_component = true + end fight_component (energy_container, misc_container, damager_actor) end end @@ -845,6 +850,9 @@ local target_object = container._ActorTable [container._NameIndexTable [healer_actor]] if (target_object) then target_object.fight_component = true + if (target_object.shadow) then + target_object.shadow.fight_component = true + end fight_component (energy_container, misc_container, healer_actor) end end diff --git a/core/meta.lua b/core/meta.lua index 608c44f5..d5d24800 100644 --- a/core/meta.lua +++ b/core/meta.lua @@ -117,20 +117,35 @@ local shadow if (class_type == class_type_dano) then - shadow = atributo_damage:r_connect_shadow (esta_classe) + if (combate.overall_added) then + shadow = atributo_damage:r_connect_shadow (esta_classe) + else + shadow = atributo_damage:r_onlyrefresh_shadow (esta_classe) + end elseif (class_type == class_type_cura) then - shadow = atributo_heal:r_connect_shadow (esta_classe) + if (combate.overall_added) then + shadow = atributo_heal:r_connect_shadow (esta_classe) + else + shadow = atributo_heal:r_onlyrefresh_shadow (esta_classe) + end elseif (class_type == class_type_e_energy) then - shadow = atributo_energy:r_connect_shadow (esta_classe) + if (combate.overall_added) then + shadow = atributo_energy:r_connect_shadow (esta_classe) + else + shadow = atributo_energy:r_onlyrefresh_shadow (esta_classe) + end elseif (class_type == class_type_misc) then - shadow = atributo_misc:r_connect_shadow (esta_classe) - + if (combate.overall_added) then + shadow = atributo_misc:r_connect_shadow (esta_classe) + else + shadow = atributo_misc:r_onlyrefresh_shadow (esta_classe) + end end - shadow:FazLinkagem (esta_classe) + --shadow:FazLinkagem (esta_classe) end end @@ -578,7 +593,7 @@ function _detalhes:CheckMemoryAfterCombat() if (_detalhes.next_memory_check < time()) then if (_detalhes.debug) then - _detalhes:Msg ("checking memory after combat.") + _detalhes:Msg ("(debug) checking memory after combat.") end _detalhes.next_memory_check = time()+_detalhes.intervalo_memoria UpdateAddOnMemoryUsage() @@ -594,11 +609,11 @@ UpdateAddOnMemoryUsage() local memory = GetAddOnMemoryUsage ("Details") if (_detalhes.debug) then - _detalhes:Msg ("checking memory periodically. Using: ",math.floor (memory), "of", _detalhes.memory_ram) + _detalhes:Msg ("(debug) checking memory periodically. Using: ",math.floor (memory), "of", _detalhes.memory_ram * 1000) end - if (memory > _detalhes.memory_ram) then + if (memory > _detalhes.memory_ram * 1000) then if (_detalhes.debug) then - _detalhes:Msg ("Memory is too high, starting garbage collector") + _detalhes:Msg ("(debug) Memory is too high, starting garbage collector") end _detalhes:IniciarColetaDeLixo (1, 60) --> sending 1 only check for combat and ignore garbage collect cooldown end @@ -612,7 +627,7 @@ return elseif (_detalhes.in_combat or _InCombatLockdown() or _detalhes:IsInInstance()) then if (_detalhes.debug) then - _detalhes:Msg ("garbage collect queued due combatlockdown (forced false)") + _detalhes:Msg ("(debug) garbage collect queued due combatlockdown (forced false)") end _detalhes:ScheduleTimer ("IniciarColetaDeLixo", 5) return @@ -622,7 +637,7 @@ if (forcar == 1) then if (_detalhes.in_combat or _InCombatLockdown()) then if (_detalhes.debug) then - _detalhes:Msg ("garbage collect queued due combatlockdown (forced 1)") + _detalhes:Msg ("(debug) garbage collect queued due combatlockdown (forced 1)") end _detalhes:ScheduleTimer ("IniciarColetaDeLixo", 5, forcar) return @@ -633,9 +648,9 @@ if (_detalhes.debug) then if (forcar) then - _detalhes:Msg ("collecting garbage with forced state: ", forcar) + _detalhes:Msg ("(debug) collecting garbage with forced state: ", forcar) else - _detalhes:Msg ("collecting garbage.") + _detalhes:Msg ("(debug) collecting garbage.") end end @@ -672,7 +687,7 @@ --> print cache states if (_detalhes.debug) then - _detalhes:Msg ("removed: damage "..damage.." heal "..heal.." energy "..energy.." misc "..misc) + _detalhes:Msg ("(debug) removed: damage "..damage.." heal "..heal.." energy "..energy.." misc "..misc) end --> elimina pets antigos @@ -687,12 +702,11 @@ collectgarbage() UpdateAddOnMemoryUsage() local memory2 = GetAddOnMemoryUsage ("Details") - _detalhes:Msg ("memory antes: "..memory.." memory depois: "..memory2) + _detalhes:Msg ("(debug) memory before: "..memory.." memory after: "..memory2) end end - --> combates Normais local function FazColeta (_combate, tipo, intervalo_overwrite) @@ -700,7 +714,7 @@ local _iter = {index = 1, data = conteudo[1], cleaned = 0} local _tempo = _time() - local links_removed = 0 + --local links_removed = 0 while (_iter.data) do @@ -714,7 +728,7 @@ t = _actor.last_event + _detalhes.intervalo_coleta end - if (not _actor.grupo and not _actor.boss and not _actor.fight_component and not _actor.boss_fight_component and t < _tempo) then + if (t < _tempo and not _actor.grupo and not _actor.boss and not _actor.fight_component and not _actor.boss_fight_component) then local owner = _actor.owner if (owner) then local owner_actor = _combate (tipo, owner.nome) @@ -732,6 +746,7 @@ end --> fix para a weak table + --[[ local shadow = _actor.shadow local _it = {index = 1, link = shadow.links [1]} while (_it.link) do @@ -743,7 +758,8 @@ _it.link = shadow.links [_it.index] end end - + --]] + _iter.cleaned = _iter.cleaned+1 if (_actor.tipo == 1 or _actor.tipo == 2) then @@ -774,6 +790,8 @@ --> Combate overall function _detalhes:ColetarLixo (tipo, lastevent) + --print ("fazendo coleta...") + local _tempo = _time() local limpados = 0 @@ -791,7 +809,7 @@ limpados = limpados + FazColeta (_combate, tipo, lastevent) end - --> limpa a tabela overall + --> limpa a tabela overall para o atributo atual (limpa para os 4, um de cada vez através do ipairs) local _overall_combat = _detalhes.tabela_overall local conteudo = _overall_combat [tipo]._ActorTable local _iter = {index = 1, data = conteudo[1], cleaned = 0} --> ._ActorTable[1] para pegar o primeiro index @@ -800,6 +818,7 @@ local _actor = _iter.data + --[[ local meus_links = _rawget (_actor, "links") local can_garbage = true local new_weak_table = _setmetatable ({}, _detalhes.weaktable) --> precisa da nova weak table para remover os NILS da tabela antiga @@ -813,8 +832,17 @@ end _table_wipe (meus_links) end - - if (can_garbage or not meus_links) then --> não há referências a este objeto + --]] + + local can_garbage = false + if (not _actor.grupo and not _actor.owner and not _actor.boss_fight_component and not _actor.fight_component) then + can_garbage = true + end + + --if (can_garbage or not meus_links) then --> não há referências a este objeto + if (can_garbage) then --> não há referências a este objeto + + --print ("garbaged:", _actor.nome) if (not _actor.owner) then --> pet _actor:subtract_total (_overall_combat) @@ -823,11 +851,11 @@ --> apaga a referência deste jogador na tabela overall _iter.cleaned = _iter.cleaned+1 - if (_detalhes.debug) then - if (#_actor.links > 0) then - _detalhes:Msg (_actor.nome, " has been garbaged but have links: ", #_actor.links) - end - end + --if (_detalhes.debug) then + -- if (#_actor.links > 0) then + -- _detalhes:Msg ("(debug) " .. _actor.nome, " has been garbaged but have links: ", #_actor.links) + -- end + --end if (_actor.tipo == 1 or _actor.tipo == 2) then _actor:DesregistrarNaTimeMachine() @@ -836,7 +864,7 @@ _iter.data = conteudo [_iter.index] else - _actor.links = new_weak_table + --_actor.links = new_weak_table _iter.index = _iter.index + 1 _iter.data = conteudo [_iter.index] end diff --git a/core/parser.lua b/core/parser.lua index 5229e6c2..73e44efc 100644 --- a/core/parser.lua +++ b/core/parser.lua @@ -51,21 +51,14 @@ --> current combat and overall pointers local _current_combat = _detalhes.tabela_vigente or {} --> placeholder table - local _overall_combat = _detalhes.tabela_overall or {} --> placeholder table --> total container pointers local _current_total = _current_combat.totals local _current_gtotal = _current_combat.totals_grupo - local _overall_total = _overall_combat.totals - local _overall_gtotal = _overall_combat.totals_grupo --> actors container pointers local _current_damage_container = _current_combat [1] - local _overall_damage_container = _overall_combat [1] local _current_heal_container = _current_combat [2] - local _overall_heal_container = _overall_combat [2] local _current_energy_container = _current_combat [3] - local _overall_energy_container = _overall_combat [3] local _current_misc_container = _current_combat [4] - local _overall_misc_container = _overall_combat [4] ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> cache @@ -171,7 +164,6 @@ end _current_damage_container.need_refresh = true - _overall_damage_container.need_refresh = true ------------------------------------------------------------------------------------------------ --> get actors @@ -220,14 +212,6 @@ end - --if (who_name == "Guardian of Ancient Kings") then --remover - -- print ("MELEE GAK 1", meu_dono) - --end - - --> damager shadow - local shadow = este_jogador.shadow - local shadow_of_target = jogador_alvo.shadow - --> last event este_jogador.last_event = _tempo @@ -236,7 +220,6 @@ if (este_jogador.grupo) then _current_gtotal [1] = _current_gtotal [1]+amount - _overall_gtotal [1] = _overall_gtotal [1]+amount elseif (jogador_alvo.grupo) then @@ -312,12 +295,6 @@ jogador_alvo.damage_from [who_name] = true end - --> his shadow - shadow_of_target.damage_taken = shadow_of_target.damage_taken + amount --> adiciona o dano tomado - if (not shadow_of_target.damage_from [who_name]) then --> adiciona a pool de dano tomado de quem - shadow_of_target.damage_from [who_name] = true - end - ------------------------------------------------------------------------------------------------ --> time start @@ -329,7 +306,6 @@ meu_dono:Iniciar (true) if (meu_dono.end_time) then meu_dono.end_time = nil - meu_dono.shadow.end_time = nil else meu_dono:IniciarTempo (_tempo-3.0, meu_dono.shadow) end @@ -337,9 +313,8 @@ if (este_jogador.end_time) then este_jogador.end_time = nil - shadow.end_time = nil else - este_jogador:IniciarTempo (_tempo-3.0, shadow) + este_jogador:IniciarTempo (_tempo-3.0, este_jogador.shadow) end if (este_jogador.nome == _detalhes.playername and token ~= "SPELL_PERIODIC_DAMAGE") then --> iniciando o dps do "PLAYER" @@ -361,7 +336,6 @@ if (raid_members_cache [who_serial] and raid_members_cache [alvo_serial]) then este_jogador.friendlyfire_total = este_jogador.friendlyfire_total + amount - shadow.friendlyfire_total = shadow.friendlyfire_total + amount local amigo = este_jogador.friendlyfire._NameIndexTable [alvo_name] if (not amigo) then @@ -371,7 +345,6 @@ end amigo.total = amigo.total + amount - amigo.shadow.total = amigo.shadow.total + amount local spell = amigo.spell_tables._ActorTable [spellid] if (not spell) then @@ -381,7 +354,6 @@ return spell:AddFF (amount) --adiciona a classe da habilidade, a classe da habilidade se encarrega de adicionar aos alvos dela else _current_total [1] = _current_total [1]+amount - _overall_total [1] = _overall_total [1]+amount end @@ -391,7 +363,6 @@ --> actor owner (if any) if (meu_dono) then --> se for dano de um Pet meu_dono.total = meu_dono.total + amount --> e adiciona o dano ao pet - meu_dono.shadow.total = meu_dono.shadow.total + amount --> e adiciona o dano ao pet --> add owner targets local owner_target = meu_dono.targets._NameIndexTable [alvo_name] @@ -407,11 +378,9 @@ --> actor este_jogador.total = este_jogador.total + amount - shadow.total = shadow.total + amount --> actor without pets este_jogador.total_without_pet = este_jogador.total_without_pet + amount - shadow.total_without_pet = shadow.total_without_pet + amount --> actor targets local este_alvo = este_jogador.targets._NameIndexTable [alvo_name] @@ -421,7 +390,6 @@ este_alvo = este_jogador.targets._ActorTable [este_alvo] end este_alvo.total = este_alvo.total + amount - este_alvo.shadow.total = este_alvo.shadow.total + amount --> actor spells table local spell = este_jogador.spell_tables._ActorTable [spellid] @@ -515,10 +483,6 @@ ----------------------------------------------------------------------------------------------------------------------------------------- function parser:summon (token, time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, spellid, spellName) - --if (alvo_name == "Guardian of Ancient Kings") then --remover - -- print ("Summon GAK 1", who_name) - --end - --> pet summon another pet local sou_pet = _detalhes.tabela_pets.pets [who_serial] if (sou_pet) then --> okey, ja é um pet @@ -575,7 +539,6 @@ end _current_heal_container.need_refresh = true - _overall_heal_container.need_refresh = true ------------------------------------------------------------------------------------------------ --> get actors @@ -595,9 +558,6 @@ healing_cache [alvo_name] = jogador_alvo end end - - local shadow = este_jogador.shadow - local shadow_of_target = jogador_alvo.shadow este_jogador.last_event = _tempo @@ -611,14 +571,7 @@ este_jogador.heal_enemy [spellid] = este_jogador.heal_enemy [spellid] + cura_efetiva end - if (not este_jogador.shadow.heal_enemy [spellid]) then - shadow.heal_enemy [spellid] = cura_efetiva - else - shadow.heal_enemy [spellid] = shadow.heal_enemy [spellid] + cura_efetiva - end - este_jogador.heal_enemy_amt = este_jogador.heal_enemy_amt + cura_efetiva - shadow.heal_enemy_amt = shadow.heal_enemy_amt + cura_efetiva return end @@ -628,7 +581,6 @@ if (este_jogador.grupo) then _current_combat.totals_grupo[2] = _current_combat.totals_grupo[2] + cura_efetiva - _overall_combat.totals_grupo[2] = _overall_combat.totals_grupo[2] + cura_efetiva end if (jogador_alvo.grupo) then @@ -659,9 +611,9 @@ este_jogador:Iniciar (true) --inicia o dps do jogador if (este_jogador.end_time) then --> o combate terminou, reabrir o tempo este_jogador.end_time = nil - shadow.end_time = nil --> não tenho certeza se isso aqui não pode dar merda + este_jogador.shadow.end_time = nil --> não tenho certeza se isso aqui não pode dar merda else - este_jogador:IniciarTempo (_tempo-3.0, shadow) + este_jogador:IniciarTempo (_tempo-3.0, este_jogador.shadow) end end @@ -680,7 +632,6 @@ --> combat total _current_total [2] = _current_total [2] + cura_efetiva - _overall_total [2] = _overall_total [2] + cura_efetiva --> healing taken jogador_alvo.healing_taken = jogador_alvo.healing_taken + cura_efetiva --> adiciona o dano tomado @@ -688,28 +639,18 @@ jogador_alvo.healing_from [who_name] = true end - --> healing taken shadow - shadow_of_target.healing_taken = shadow_of_target.healing_taken+cura_efetiva --> adiciona o dano tomado - if (not shadow_of_target.healing_from [who_name]) then --> adiciona a pool de dano tomado de quem - shadow_of_target.healing_from [who_name] = true - end - --> actor healing amount este_jogador.total = este_jogador.total + cura_efetiva - shadow.total = shadow.total + cura_efetiva if (is_shield) then este_jogador.totalabsorb = este_jogador.totalabsorb + cura_efetiva - shadow.totalabsorb = shadow.totalabsorb + cura_efetiva end este_jogador.total_without_pet = este_jogador.total_without_pet + cura_efetiva - shadow.total_without_pet = shadow.total_without_pet + cura_efetiva --> pet if (meu_dono) then meu_dono.total = meu_dono.total + cura_efetiva --> heal do pet - meu_dono.shadow.total = meu_dono.shadow.total + cura_efetiva --> heal do pet na shadow local owner_target = meu_dono.targets._NameIndexTable [alvo_name] if (not owner_target) then @@ -718,21 +659,17 @@ owner_target = meu_dono.targets._ActorTable [owner_target] end owner_target.total = owner_target.total + amount - end --> target amount este_alvo.total = este_alvo.total + cura_efetiva - este_alvo.shadow.total = este_alvo.shadow.total + cura_efetiva end if (overhealing > 0) then este_jogador.totalover = este_jogador.totalover + overhealing - shadow.totalover = shadow.totalover + overhealing este_alvo.overheal = este_alvo.overheal + overhealing if (meu_dono) then meu_dono.totalover = meu_dono.totalover + overhealing - meu_dono.shadow.totalover = meu_dono.shadow.totalover + overhealing end end @@ -1162,7 +1099,6 @@ este_jogador = _current_misc_container:PegarCombatente (who_serial, spellname, who_flags, true) misc_cache [spellname] = este_jogador end - local shadow = este_jogador.shadow ------------------------------------------------------------------------------------------------ --> build containers on the fly @@ -1176,18 +1112,19 @@ este_jogador.debuff_uptime_spell_tables = container_habilidades:NovoContainer (container_misc) este_jogador.debuff_uptime_targets = container_combatentes:NovoContainer (container_enemydebufftarget_target) - if (not shadow.debuff_uptime_targets) then - shadow.boss_debuff = true - shadow.damage_twin = who_name - shadow.spellschool = spellschool - shadow.damage_spellid = spellid - shadow.debuff_uptime = 0 - shadow.debuff_uptime_spell_tables = container_habilidades:NovoContainer (container_misc) - shadow.debuff_uptime_targets = container_combatentes:NovoContainer (container_enemydebufftarget_target) + if (not este_jogador.shadow.debuff_uptime_targets) then + este_jogador.shadow.boss_debuff = true + este_jogador.shadow.damage_twin = who_name + este_jogador.shadow.spellschool = spellschool + este_jogador.shadow.damage_spellid = spellid + este_jogador.shadow.debuff_uptime = 0 + este_jogador.shadow.debuff_uptime_spell_tables = container_habilidades:NovoContainer (container_misc) + este_jogador.shadow.debuff_uptime_targets = container_combatentes:NovoContainer (container_enemydebufftarget_target) end - este_jogador.debuff_uptime_targets.shadow = shadow.debuff_uptime_targets - este_jogador.debuff_uptime_spell_tables.shadow = shadow.debuff_uptime_spell_tables + este_jogador.debuff_uptime_targets.shadow = este_jogador.shadow.debuff_uptime_targets + este_jogador.debuff_uptime_spell_tables.shadow = este_jogador.shadow.debuff_uptime_spell_tables + end ------------------------------------------------------------------------------------------------ @@ -1213,18 +1150,6 @@ end este_alvo.actived_at = _tempo - --> shadows - este_alvo = este_alvo.shadow - este_jogador = este_jogador.shadow - - este_alvo.actived = true - este_alvo.activedamt = este_alvo.activedamt + 1 - if (este_alvo.actived_at and este_alvo.actived) then - este_alvo.uptime = este_alvo.uptime + _tempo - este_alvo.actived_at - este_jogador.debuff_uptime = este_jogador.debuff_uptime + _tempo - este_alvo.actived_at - end - este_alvo.actived_at = _tempo - elseif (in_out == "DEBUFF_UPTIME_REFRESH") then if (este_alvo.actived_at and este_alvo.actived) then este_alvo.uptime = este_alvo.uptime + _tempo - este_alvo.actived_at @@ -1233,17 +1158,6 @@ este_alvo.actived_at = _tempo este_alvo.actived = true - --> shadows - este_alvo = este_alvo.shadow - este_jogador = este_jogador.shadow - - if (este_alvo.actived_at and este_alvo.actived) then - este_alvo.uptime = este_alvo.uptime + _tempo - este_alvo.actived_at - este_jogador.debuff_uptime = este_jogador.debuff_uptime + _tempo - este_alvo.actived_at - end - este_alvo.actived_at = _tempo - este_alvo.actived = true - elseif (in_out == "DEBUFF_UPTIME_OUT") then if (este_alvo.actived_at and este_alvo.actived) then este_alvo.uptime = este_alvo.uptime + _detalhes._tempo - este_alvo.actived_at @@ -1258,25 +1172,6 @@ else este_alvo.actived_at = _tempo end - - --> shadows - este_alvo = este_alvo.shadow - este_jogador = este_jogador.shadow - - if (este_alvo.actived_at and este_alvo.actived) then - este_alvo.uptime = este_alvo.uptime + _detalhes._tempo - este_alvo.actived_at - este_jogador.debuff_uptime = este_jogador.debuff_uptime + _tempo - este_alvo.actived_at --> token = actor misc object - end - - este_alvo.activedamt = este_alvo.activedamt - 1 - - if (este_alvo.activedamt == 0) then - este_alvo.actived = false - este_alvo.actived_at = nil - else - este_alvo.actived_at = _tempo - end - end end @@ -1285,7 +1180,6 @@ --> early checks and fixes _current_misc_container.need_refresh = true - _overall_misc_container.need_refresh = true ------------------------------------------------------------------------------------------------ --> get actors @@ -1294,7 +1188,6 @@ este_jogador = _current_misc_container:PegarCombatente (who_serial, who_name, who_flags, true) misc_cache [who_name] = este_jogador end - local shadow = este_jogador.shadow ------------------------------------------------------------------------------------------------ --> build containers on the fly @@ -1304,14 +1197,14 @@ este_jogador.debuff_uptime_spell_tables = container_habilidades:NovoContainer (container_misc) este_jogador.debuff_uptime_targets = container_combatentes:NovoContainer (container_damage_target) - if (not shadow.debuff_uptime_targets) then - shadow.debuff_uptime = 0 - shadow.debuff_uptime_spell_tables = container_habilidades:NovoContainer (container_misc) - shadow.debuff_uptime_targets = container_combatentes:NovoContainer (container_damage_target) + if (not este_jogador.shadow.debuff_uptime_targets) then + este_jogador.shadow.debuff_uptime = 0 + este_jogador.shadow.debuff_uptime_spell_tables = container_habilidades:NovoContainer (container_misc) + este_jogador.shadow.debuff_uptime_targets = container_combatentes:NovoContainer (container_damage_target) end - este_jogador.debuff_uptime_targets.shadow = shadow.debuff_uptime_targets - este_jogador.debuff_uptime_spell_tables.shadow = shadow.debuff_uptime_spell_tables + este_jogador.debuff_uptime_targets.shadow = este_jogador.shadow.debuff_uptime_targets + este_jogador.debuff_uptime_spell_tables.shadow = este_jogador.shadow.debuff_uptime_spell_tables end ------------------------------------------------------------------------------------------------ @@ -1335,7 +1228,6 @@ --> early checks and fixes _current_misc_container.need_refresh = true - _overall_misc_container.need_refresh = true ------------------------------------------------------------------------------------------------ --> get actors @@ -1344,7 +1236,6 @@ este_jogador = _current_misc_container:PegarCombatente (who_serial, who_name, who_flags, true) misc_cache [who_name] = este_jogador end - local shadow = este_jogador.shadow ------------------------------------------------------------------------------------------------ --> build containers on the fly @@ -1354,14 +1245,14 @@ este_jogador.buff_uptime_spell_tables = container_habilidades:NovoContainer (container_misc) este_jogador.buff_uptime_targets = container_combatentes:NovoContainer (container_damage_target) - if (not shadow.buff_uptime_targets) then - shadow.buff_uptime = 0 - shadow.buff_uptime_spell_tables = container_habilidades:NovoContainer (container_misc) - shadow.buff_uptime_targets = container_combatentes:NovoContainer (container_damage_target) + if (not este_jogador.shadow.buff_uptime_targets) then + este_jogador.shadow.buff_uptime = 0 + este_jogador.shadow.buff_uptime_spell_tables = container_habilidades:NovoContainer (container_misc) + este_jogador.shadow.buff_uptime_targets = container_combatentes:NovoContainer (container_damage_target) end - este_jogador.buff_uptime_targets.shadow = shadow.buff_uptime_targets - este_jogador.buff_uptime_spell_tables.shadow = shadow.buff_uptime_spell_tables + este_jogador.buff_uptime_targets.shadow = este_jogador.shadow.buff_uptime_targets + este_jogador.buff_uptime_spell_tables.shadow = este_jogador.shadow.buff_uptime_spell_tables end ------------------------------------------------------------------------------------------------ @@ -1433,7 +1324,6 @@ end _current_energy_container.need_refresh = true - _overall_energy_container.need_refresh = true ------------------------------------------------------------------------------------------------ --> get actors @@ -1464,9 +1354,6 @@ este_alvo = este_jogador.targets._ActorTable [este_alvo] end - local shadow = este_jogador.shadow - local shadow_of_target = jogador_alvo.shadow - este_jogador.last_event = _tempo ------------------------------------------------------------------------------------------------ @@ -1474,34 +1361,26 @@ --> combat total _current_total [3] [key_regenType] = _current_total [3] [key_regenType] + amount - _overall_total [3] [key_regenType] = _overall_total [3] [key_regenType] + amount if (este_jogador.grupo) then _current_gtotal [3] [key_regenType] = _current_gtotal [3] [key_regenType] + amount - _overall_gtotal [3] [key_regenType] = _overall_gtotal [3] [key_regenType] + amount end --> regen produced amount este_jogador [key_regenType] = este_jogador [key_regenType] + amount - shadow [key_regenType] = shadow [key_regenType] + amount este_alvo [key_regenType] = este_alvo [key_regenType] + amount --> target regenerated amount jogador_alvo [key_regenDone] = jogador_alvo [key_regenDone] + amount - shadow_of_target [key_regenDone] = shadow_of_target [key_regenDone] + amount --> regen from if (not jogador_alvo [key_regenFrom] [who_name]) then jogador_alvo [key_regenFrom] [who_name] = true end - if (not shadow_of_target [key_regenFrom] [who_name]) then - shadow_of_target [key_regenFrom] [who_name] = true - end --> owner if (meu_dono) then meu_dono [key_regenType] = meu_dono [key_regenType] + amount --> e adiciona o dano ao pet - meu_dono.shadow [key_regenType] = meu_dono.shadow [key_regenType] + amount --> e adiciona o dano ao pet end --> actor spells table @@ -1526,7 +1405,6 @@ --> early checks and fixes _current_misc_container.need_refresh = true - _overall_misc_container.need_refresh = true ------------------------------------------------------------------------------------------------ --> get actors @@ -1539,7 +1417,6 @@ misc_cache [who_name] = este_jogador end end - local shadow = este_jogador.shadow ------------------------------------------------------------------------------------------------ --> build containers on the fly @@ -1548,15 +1425,15 @@ este_jogador.cooldowns_defensive = 0 este_jogador.cooldowns_defensive_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total este_jogador.cooldowns_defensive_spell_tables = container_habilidades:NovoContainer (container_misc) --> cria o container das habilidades - - if (not shadow.cooldowns_defensive_targets) then - shadow.cooldowns_defensive = 0 - shadow.cooldowns_defensive_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total - shadow.cooldowns_defensive_spell_tables = container_habilidades:NovoContainer (container_misc) --> cria o container das habilidades usadas + + if (not este_jogador.shadow.cooldowns_defensive_targets) then + este_jogador.shadow.cooldowns_defensive = 0 + este_jogador.shadow.cooldowns_defensive_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total + este_jogador.shadow.cooldowns_defensive_spell_tables = container_habilidades:NovoContainer (container_misc) --> cria o container das habilidades usadas end - este_jogador.cooldowns_defensive_targets.shadow = shadow.cooldowns_defensive_targets - este_jogador.cooldowns_defensive_spell_tables.shadow = shadow.cooldowns_defensive_spell_tables + este_jogador.cooldowns_defensive_targets.shadow = este_jogador.shadow.cooldowns_defensive_targets + este_jogador.cooldowns_defensive_spell_tables.shadow = este_jogador.shadow.cooldowns_defensive_spell_tables end ------------------------------------------------------------------------------------------------ @@ -1564,15 +1441,12 @@ --> actor cooldowns used este_jogador.cooldowns_defensive = este_jogador.cooldowns_defensive + 1 - shadow.cooldowns_defensive = shadow.cooldowns_defensive + 1 --> combat totals _current_total [4].cooldowns_defensive = _current_total [4].cooldowns_defensive + 1 - _overall_total [4].cooldowns_defensive = _overall_total [4].cooldowns_defensive + 1 if (este_jogador.grupo) then _current_gtotal [4].cooldowns_defensive = _current_gtotal [4].cooldowns_defensive + 1 - _overall_gtotal [4].cooldowns_defensive = _overall_gtotal [4].cooldowns_defensive + 1 if (who_name == alvo_name) then @@ -1651,7 +1525,6 @@ end _current_misc_container.need_refresh = true - _overall_misc_container.need_refresh = true ------------------------------------------------------------------------------------------------ --> get actors @@ -1664,7 +1537,6 @@ misc_cache [who_name] = este_jogador end end - local shadow = este_jogador.shadow ------------------------------------------------------------------------------------------------ --> build containers on the fly @@ -1674,16 +1546,17 @@ este_jogador.interrupt_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total este_jogador.interrupt_spell_tables = container_habilidades:NovoContainer (container_misc) --> cria o container das habilidades usadas para interromper este_jogador.interrompeu_oque = {} - - if (not shadow.interrupt_targets) then - shadow.interrupt = 0 - shadow.interrupt_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total - shadow.interrupt_spell_tables = container_habilidades:NovoContainer (container_misc) --> cria o container das habilidades usadas para interromper - shadow.interrompeu_oque = {} + + if (not este_jogador.shadow.interrupt_targets) then + este_jogador.shadow.interrupt = 0 + este_jogador.shadow.interrupt_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total + este_jogador.shadow.interrupt_spell_tables = container_habilidades:NovoContainer (container_misc) --> cria o container das habilidades usadas para interromper + este_jogador.shadow.interrompeu_oque = {} end - este_jogador.interrupt_targets.shadow = shadow.interrupt_targets - este_jogador.interrupt_spell_tables.shadow = shadow.interrupt_spell_tables + este_jogador.interrupt_targets.shadow = este_jogador.shadow.interrupt_targets + este_jogador.interrupt_spell_tables.shadow = este_jogador.shadow.interrupt_spell_tables + end ------------------------------------------------------------------------------------------------ @@ -1691,15 +1564,12 @@ --> actor interrupt amount este_jogador.interrupt = este_jogador.interrupt + 1 - shadow.interrupt = shadow.interrupt + 1 --> combat totals _current_total [4].interrupt = _current_total [4].interrupt + 1 - _overall_total [4].interrupt = _overall_total [4].interrupt + 1 if (este_jogador.grupo) then _current_gtotal [4].interrupt = _current_gtotal [4].interrupt + 1 - _overall_gtotal [4].interrupt = _overall_gtotal [4].interrupt + 1 end --> update last event @@ -1713,12 +1583,6 @@ este_jogador.interrompeu_oque [extraSpellID] = este_jogador.interrompeu_oque [extraSpellID] + 1 end - if (not shadow.interrompeu_oque [extraSpellID]) then - shadow.interrompeu_oque [extraSpellID] = 1 - else - shadow.interrompeu_oque [extraSpellID] = shadow.interrompeu_oque [extraSpellID] + 1 - end - --> actor targets local este_alvo = este_jogador.interrupt_targets._NameIndexTable [alvo_name] if (not este_alvo) then @@ -1780,6 +1644,8 @@ return end + + -- para aqui -- ------------------------------------------------------------------------------------------------ --> record how many times the spell has been casted successfully @@ -1792,7 +1658,6 @@ end _current_misc_container.need_refresh = true - _overall_misc_container.need_refresh = true ------------------------------------------------------------------------------------------------ --> get actors @@ -1816,13 +1681,13 @@ este_jogador.spellcast = 0 este_jogador.spellcast_spell_tables = container_habilidades:NovoContainer (container_misc) - if (not shadow.spellcast_targets) then - shadow.spellcast = 0 - shadow.spellcast_spell_tables = container_habilidades:NovoContainer (container_misc) + if (not este_jogador.shadow.spellcast_targets) then + este_jogador.shadow.spellcast = 0 + este_jogador.shadow.spellcast_spell_tables = container_habilidades:NovoContainer (container_misc) end - este_jogador.spellcast_targets.shadow = shadow.spellcast_targets - este_jogador.spellcast_spell_tables.shadow = shadow.spellcast_spell_tables + este_jogador.spellcast_targets.shadow = este_jogador.shadow.spellcast_targets + este_jogador.spellcast_spell_tables.shadow = este_jogador.shadow.spellcast_spell_tables end ------------------------------------------------------------------------------------------------ @@ -1860,7 +1725,6 @@ end _current_misc_container.need_refresh = true - _overall_misc_container.need_refresh = true ------------------------------------------------------------------------------------------------ --> get actors @@ -1879,7 +1743,6 @@ end end --]] - local shadow = este_jogador.shadow ------------------------------------------------------------------------------------------------ --> build containers on the fly @@ -1890,16 +1753,16 @@ este_jogador.dispell_targets = container_combatentes:NovoContainer (container_damage_target) este_jogador.dispell_spell_tables = container_habilidades:NovoContainer (container_misc) este_jogador.dispell_oque = {} - - if (not shadow.dispell_targets) then - shadow.dispell = 0 - shadow.dispell_targets = container_combatentes:NovoContainer (container_damage_target) - shadow.dispell_spell_tables = container_habilidades:NovoContainer (container_misc) - shadow.dispell_oque = {} + + if (not este_jogador.shadow.dispell_targets) then + este_jogador.shadow.dispell = 0 + este_jogador.shadow.dispell_targets = container_combatentes:NovoContainer (container_damage_target) + este_jogador.shadow.dispell_spell_tables = container_habilidades:NovoContainer (container_misc) + este_jogador.shadow.dispell_oque = {} end - este_jogador.dispell_targets.shadow = shadow.dispell_targets - este_jogador.dispell_spell_tables.shadow = shadow.dispell_spell_tables + este_jogador.dispell_targets.shadow = este_jogador.shadow.dispell_targets + este_jogador.dispell_spell_tables.shadow = este_jogador.shadow.dispell_spell_tables end ------------------------------------------------------------------------------------------------ @@ -1911,16 +1774,13 @@ --> total dispells in combat _current_total [4].dispell = _current_total [4].dispell + 1 - _overall_total [4].dispell = _overall_total [4].dispell + 1 if (este_jogador.grupo) then _current_gtotal [4].dispell = _current_gtotal [4].dispell + 1 - _overall_gtotal [4].dispell = _overall_gtotal [4].dispell + 1 end --> actor dispell amount este_jogador.dispell = este_jogador.dispell + 1 - shadow.dispell = shadow.dispell + 1 --> dispell what if (extraSpellID) then @@ -1929,12 +1789,6 @@ else este_jogador.dispell_oque [extraSpellID] = este_jogador.dispell_oque [extraSpellID] + 1 end - - if (not shadow.dispell_oque [extraSpellID]) then - shadow.dispell_oque [extraSpellID] = 1 - else - shadow.dispell_oque [extraSpellID] = shadow.dispell_oque [extraSpellID] + 1 - end end --> actor targets @@ -1965,7 +1819,6 @@ end _current_misc_container.need_refresh = true - _overall_misc_container.need_refresh = true ------------------------------------------------------------------------------------------------ --> get actors @@ -1978,8 +1831,6 @@ misc_cache [who_name] = este_jogador end end - - local shadow = este_jogador.shadow ------------------------------------------------------------------------------------------------ --> build containers on the fly @@ -1989,15 +1840,15 @@ este_jogador.ress = 0 este_jogador.ress_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total este_jogador.ress_spell_tables = container_habilidades:NovoContainer (container_misc) --> cria o container das habilidades usadas para interromper - - if (not shadow.ress_targets) then - shadow.ress = 0 - shadow.ress_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total - shadow.ress_spell_tables = container_habilidades:NovoContainer (container_misc) --> cria o container das habilidades usadas para interromper + + if (not este_jogador.shadow.ress_targets) then + este_jogador.shadow.ress = 0 + este_jogador.shadow.ress_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total + este_jogador.shadow.ress_spell_tables = container_habilidades:NovoContainer (container_misc) --> cria o container das habilidades usadas para interromper end - este_jogador.ress_targets.shadow = shadow.ress_targets - este_jogador.ress_spell_tables.shadow = shadow.ress_spell_tables + este_jogador.ress_targets.shadow = este_jogador.shadow.ress_targets + este_jogador.ress_spell_tables.shadow = este_jogador.shadow.ress_spell_tables end ------------------------------------------------------------------------------------------------ @@ -2009,16 +1860,13 @@ --> combat ress total _current_total [4].ress = _current_total [4].ress + 1 - _overall_total [4].ress = _overall_total [4].ress + 1 if (este_jogador.grupo) then _current_combat.totals_grupo[4].ress = _current_combat.totals_grupo[4].ress+1 - _overall_combat.totals_grupo[4].ress = _overall_combat.totals_grupo[4].ress+1 end --> add ress amount este_jogador.ress = este_jogador.ress + 1 - shadow.ress = shadow.ress + 1 --> add battle ress if (_UnitAffectingCombat (who_name)) then @@ -2087,7 +1935,6 @@ end _current_misc_container.need_refresh = true - _overall_misc_container.need_refresh = true ------------------------------------------------------------------------------------------------ --> get actors @@ -2106,7 +1953,6 @@ end end --]] - local shadow = este_jogador.shadow ------------------------------------------------------------------------------------------------ --> build containers on the fly @@ -2118,15 +1964,15 @@ este_jogador.cc_break_spell_tables = container_habilidades:NovoContainer (container_misc) --> cria o container das habilidades usadas para interromper este_jogador.cc_break_oque = {} - if (not shadow.cc_break) then - shadow.cc_break = 0 - shadow.cc_break_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total - shadow.cc_break_spell_tables = container_habilidades:NovoContainer (container_misc) --> cria o container das habilidades usadas para interromper - shadow.cc_break_oque = {} + if (not este_jogador.shadow.cc_break) then + este_jogador.shadow.cc_break = 0 + este_jogador.shadow.cc_break_targets = container_combatentes:NovoContainer (container_damage_target) --> pode ser um container de alvo de dano, pois irá usar apenas o .total + este_jogador.shadow.cc_break_spell_tables = container_habilidades:NovoContainer (container_misc) --> cria o container das habilidades usadas para interromper + este_jogador.shadow.cc_break_oque = {} end - este_jogador.cc_break_targets.shadow = shadow.cc_break_targets - este_jogador.cc_break_spell_tables.shadow = shadow.cc_break_spell_tables + este_jogador.cc_break_targets.shadow = este_jogador.shadow.cc_break_targets + este_jogador.cc_break_spell_tables.shadow = este_jogador.shadow.cc_break_spell_tables end ------------------------------------------------------------------------------------------------ @@ -2138,16 +1984,13 @@ --> combat cc break total _current_total [4].cc_break = _current_total [4].cc_break + 1 - _overall_total [4].cc_break = _overall_total [4].cc_break + 1 if (este_jogador.grupo) then _current_combat.totals_grupo[4].cc_break = _current_combat.totals_grupo[4].cc_break+1 - _overall_combat.totals_grupo[4].cc_break = _overall_combat.totals_grupo[4].cc_break+1 end --> add amount este_jogador.cc_break = este_jogador.cc_break + 1 - shadow.cc_break = shadow.cc_break + 1 --> broke what if (not este_jogador.cc_break_oque [spellid]) then @@ -2156,12 +1999,6 @@ este_jogador.cc_break_oque [spellid] = este_jogador.cc_break_oque [spellid] + 1 end - if (not shadow.cc_break_oque [spellid]) then - shadow.cc_break_oque [spellid] = 1 - else - shadow.cc_break_oque [spellid] = shadow.cc_break_oque [spellid] + 1 - end - --> actor targets local este_alvo = este_jogador.cc_break_targets._NameIndexTable [alvo_name] if (not este_alvo) then @@ -2212,58 +2049,8 @@ _current_combat.frags [alvo_name] = _current_combat.frags [alvo_name] + 1 end - if (not _overall_combat.frags [alvo_name]) then - _overall_combat.frags [alvo_name] = 1 - else - _overall_combat.frags [alvo_name] = _overall_combat.frags [alvo_name] + 1 - end - _current_combat.frags_need_refresh = true - _overall_combat.frags_need_refresh = true - --> encounter end --[[REMOVED]] it's deprecated since encounter end and start replace this - --[[ - local encounter_type = _detalhes.encounter.type - if (encounter_type) then - if (encounter_type == 1 or encounter_type == 2) then - - local npcTable = _detalhes.encounter.data - local serial = tonumber (alvo_serial:sub (6, 10), 16) - - --vardump (npcTable) - - if (npcTable [serial] ~= nil) then --> ~= default false - - _detalhes.encounter.data [serial] = true - - --> check if it's done - local its_done = true - for npcID, killed in pairs (_detalhes.encounter.data) do - if (not killed) then - its_done = false - --print ("npc",npcID,"NAO esta morto","quem morreu:",alvo_name) - break - else - --print ("npc",npcID,"esta morto","quem morreu:",alvo_name) - end - end - - --> combat finished - if (its_done) then - if (_detalhes.debug) then - _detalhes:Msg ("(debug) combat finished: encounter objective is completed") - end - - --print ("saindo do combate") - - _detalhes:SairDoCombate (true) - end - end - - end - end - --]] - --> player death elseif (not _UnitIsFeignDeath (alvo_name)) then if ( @@ -2280,13 +2067,10 @@ --_detalhes:ScheduleTimer ("TrueDead", 1, {time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags}) _current_misc_container.need_refresh = true - _overall_misc_container.need_refresh = true --> combat totals _current_total [4].dead = _current_total [4].dead + 1 - _overall_total [4].dead = _overall_total [4].dead + 1 _current_gtotal [4].dead = _current_gtotal [4].dead + 1 - _overall_gtotal [4].dead = _overall_gtotal [4].dead + 1 --> main actor no container de misc que irá armazenar a morte local este_jogador, meu_dono = misc_cache [alvo_name] @@ -2375,7 +2159,6 @@ --print ("A morte teve "..#esta_morte.." eventos") _table_insert (_current_combat.last_events_tables, #_current_combat.last_events_tables+1, t) - _table_insert (_overall_combat.last_events_tables, #_current_combat.last_events_tables+1, t) --> reseta a pool dano.last_events_table = _detalhes:CreateActorLastEventTable() @@ -2612,6 +2395,8 @@ local encounterID, encounterName, difficultyID, raidSize = _select (1, ...) local zoneName, _, _, _, _, _, _, zoneMapID = _GetInstanceInfo() + --print (encounterID, encounterName, difficultyID, raidSize) + _detalhes.encounter_table ["start"] = time() _detalhes.encounter_table ["end"] = nil @@ -2729,6 +2514,29 @@ _detalhes.SoloTables.Plugins [_detalhes.SoloTables.Mode].Stop() end end + + if (_detalhes.schedule_flag_boss_components) then + _detalhes.schedule_flag_boss_components = false + _detalhes:FlagActorsOnBossFight() + end + + if (_detalhes.schedule_remove_overall) then + if (_detalhes.debug) then + _detalhes:Msg ("(debug) found schedule overall data deletion.") + end + _detalhes.schedule_remove_overall = false + _detalhes.tabela_historico:resetar_overall() + end + + if (_detalhes.schedule_add_to_overall) then + if (_detalhes.debug) then + _detalhes:Msg ("(debug) found schedule overall data addition.") + end + _detalhes.schedule_add_to_overall = false + + _detalhes.historico:adicionar_overall (_detalhes.tabela_vigente) + end + return elseif (evento == "GROUP_ROSTER_UPDATE") then @@ -2773,7 +2581,17 @@ elseif (evento == "INSTANCE_ENCOUNTER_ENGAGE_UNIT") then --> Nothing to do here return - + + elseif (evento == "START_TIMER") then + + if (C_Scenario.IsChallengeMode() and _detalhes.overall_clear_newchallenge) then + _detalhes.historico:resetar_overall() + end + + elseif (evento == "WORLD_STATE_TIMER_START") then + --> Nothing to do here + return + elseif (evento == "PLAYER_LOGOUT") then --> close info window @@ -2984,23 +2802,17 @@ --> refresh combat tables _current_combat = _detalhes.tabela_vigente - _overall_combat = _detalhes.tabela_overall --> refresh total containers _current_total = _current_combat.totals _current_gtotal = _current_combat.totals_grupo - _overall_total = _overall_combat.totals - _overall_gtotal = _overall_combat.totals_grupo --> refresh actors containers _current_damage_container = _current_combat [1] - _overall_damage_container = _overall_combat [1] + _current_heal_container = _current_combat [2] - _overall_heal_container = _overall_combat [2] _current_energy_container = _current_combat [3] - _overall_energy_container = _overall_combat [3] _current_misc_container = _current_combat [4] - _overall_misc_container = _overall_combat [4] --> refresh data capture options _recording_self_buffs = _detalhes.RecordPlayerSelfBuffs diff --git a/core/plugins_statusbar.lua b/core/plugins_statusbar.lua index d717f0a8..deeb6df7 100644 --- a/core/plugins_statusbar.lua +++ b/core/plugins_statusbar.lua @@ -835,7 +835,7 @@ do function PSegment:CreateChildObject (instance) local myframe = _detalhes.StatusBar:CreateChildFrame (instance, "DetailsPSegmentInstance" .. instance:GetInstanceId(), DEFAULT_CHILD_WIDTH, DEFAULT_CHILD_HEIGHT) local new_child = _detalhes.StatusBar:CreateChildTable (instance, PSegment, myframe) - new_child.options.segmentType = new_child.options.segmentType or 1 + new_child.options.segmentType = new_child.options.segmentType or 2 return new_child end @@ -919,12 +919,17 @@ do _detalhes:CancelTimer (Clock.tick) end + function _detalhes:ClockPluginTickOnSegment() + _detalhes:ClockPluginTick (true) + end + --1 sec tick - function _detalhes:ClockPluginTick() + function _detalhes:ClockPluginTick (force) + for index, child in _ipairs (Clock.childs) do local instance = child.instance if (child.enabled and instance:IsEnabled()) then - if (instance.showing) then + if (instance.showing and ( (instance.segmento ~= -1) or (instance.segmento == -1 and not _detalhes.in_combat) or force) ) then local timeType = child.options.timeType if (timeType == 1) then @@ -1050,7 +1055,7 @@ do --> Register needed events _detalhes:RegisterEvent (Clock, "COMBAT_PLAYER_ENTER", Clock.PlayerEnterCombat) _detalhes:RegisterEvent (Clock, "COMBAT_PLAYER_LEAVE", Clock.PlayerLeaveCombat) - _detalhes:RegisterEvent (Clock, "DETAILS_INSTANCE_CHANGESEGMENT", _detalhes.ClockPluginTick) + _detalhes:RegisterEvent (Clock, "DETAILS_INSTANCE_CHANGESEGMENT", _detalhes.ClockPluginTickOnSegment) _detalhes:RegisterEvent (Clock, "DETAILS_DATA_SEGMENTREMOVED", _detalhes.ClockPluginTick) _detalhes:RegisterEvent (Clock, "DETAILS_DATA_RESET", Clock.DataReset) diff --git a/core/windows.lua b/core/windows.lua index 7a83ba43..9c75d8fa 100644 --- a/core/windows.lua +++ b/core/windows.lua @@ -775,7 +775,7 @@ end -- _detalhes.times_of_tutorial = 0 - _detalhes:ScheduleTimer ("delay_tutorial", 20) + _detalhes:ScheduleTimer ("delay_tutorial", 5) end end diff --git a/functions/link.lua b/functions/link.lua index b3211b00..bab24abc 100644 --- a/functions/link.lua +++ b/functions/link.lua @@ -5,7 +5,8 @@ do local _rawget = rawget local _setmetatable = setmetatable - + local _ipairs = ipairs + --> default weaktable _detalhes.weaktable = {__mode = "v"} @@ -18,12 +19,27 @@ do end meus_links [#meus_links+1] = objeto end + + --> check if there is a link between tables + function _detalhes:EstaoLinkados (objeto) + local meus_links = _rawget (self, "links") + if (not meus_links) then + return false + end + for index, actor in _ipairs (meus_links) do + if (actor == objeto) then + return true + end + end + + return false + end --> create the link function _detalhes:CriaLink (link) --> se tiver a tabela no overall - if (link) then - link:FazLinkagem (self) - end + --if (link) then + -- link:FazLinkagem (self) + --end end end \ No newline at end of file diff --git a/functions/loaddata.lua b/functions/loaddata.lua index ba18f2fc..01677221 100644 --- a/functions/loaddata.lua +++ b/functions/loaddata.lua @@ -271,6 +271,9 @@ function _detalhes:LoadConfig() _detalhes.switch.slots = _detalhes_database.switchSaved.slots _detalhes.switch.table = _detalhes_database.switchSaved.table + --> last boss + _detalhes.last_encounter = _detalhes_database.last_encounter + --> buffs _detalhes.savedbuffs = _detalhes_database.savedbuffs _detalhes.Buffs:BuildTables() diff --git a/functions/profiles.lua b/functions/profiles.lua index b9fc084b..b25d6657 100644 --- a/functions/profiles.lua +++ b/functions/profiles.lua @@ -564,8 +564,12 @@ local default_profile = { --> cloud capture cloud_capture = true, - --> combat time mim + + --> combat minimum_combat_time = 5, + overall_flag = 0xD, + overall_clear_newboss = true, + overall_clear_newchallenge = true, --> skins standard_skin = false, --? diff --git a/functions/savedata.lua b/functions/savedata.lua index 10c2f2a4..e8ffc154 100644 --- a/functions/savedata.lua +++ b/functions/savedata.lua @@ -482,6 +482,9 @@ function _detalhes:SaveConfig() _detalhes_database.switchSaved.slots = _detalhes.switch.slots _detalhes_database.switchSaved.table = _detalhes.switch.table + --> last boss + _detalhes_database.last_encounter = _detalhes.last_encounter + --> last versions _detalhes_database.last_realversion = _detalhes.realversion --> core number _detalhes_database.last_version = _detalhes.userversion --> version diff --git a/functions/slash.lua b/functions/slash.lua index 497b30c2..5fac75e6 100644 --- a/functions/slash.lua +++ b/functions/slash.lua @@ -92,6 +92,66 @@ function SlashCmdList.DETAILS (msg, editbox) -------- debug --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + elseif (msg == "addcombat") then + + local combat = _detalhes.combate:NovaTabela (true, _detalhes.tabela_overall, 1) + local self = combat[1]:PegarCombatente (UnitGUID ("player"), UnitName ("player"), 1297, true) + self.total = 100000 + self.total_without_pet = 100000 + + if (not _detalhes.um___) then + _detalhes.um___ = 0 + _detalhes.next_um = 3 + end + + local cima = true + + _detalhes.um___ = _detalhes.um___ + 1 + + if (_detalhes.um___ == _detalhes.next_um) then + _detalhes.next_um = _detalhes.next_um + 3 + cima = false + end + + if (cima) then + local frostbolt = self.spell_tables:PegaHabilidade (116, true, "SPELL_DAMAGE") + local frostfirebolt = self.spell_tables:PegaHabilidade (44614, true, "SPELL_DAMAGE") + local icelance = self.spell_tables:PegaHabilidade (30455, true, "SPELL_DAMAGE") + + self.spell_tables._ActorTable [116].total = 50000 + self.spell_tables._ActorTable [44614].total = 25000 + self.spell_tables._ActorTable [30455].total = 25000 + else + local frostbolt = self.spell_tables:PegaHabilidade (84721, true, "SPELL_DAMAGE") + local frostfirebolt = self.spell_tables:PegaHabilidade (113092, true, "SPELL_DAMAGE") + local icelance = self.spell_tables:PegaHabilidade (122, true, "SPELL_DAMAGE") + + self.spell_tables._ActorTable [84721].total = 50000 + self.spell_tables._ActorTable [113092].total = 25000 + self.spell_tables._ActorTable [122].total = 25000 + end + + combat.start_time = time()-30 + combat.end_time = time() + + combat.totals_grupo [1] = 100000 + combat.totals [1] = 100000 + + --combat.instance_type = "raid" + --combat.is_trash = true + + _detalhes.tabela_vigente = combat + + _detalhes.tabela_historico:adicionar (combat) + + _detalhes:InstanciaCallFunction (_detalhes.gump.Fade, "in", nil, "barras") + _detalhes:InstanciaCallFunction (_detalhes.AtualizaSegmentos) -- atualiza o instancia.showing para as novas tabelas criadas + _detalhes:InstanciaCallFunction (_detalhes.AtualizaSoloMode_AfertReset) -- verifica se precisa zerar as tabela da janela solo mode + _detalhes:InstanciaCallFunction (_detalhes.ResetaGump) --_detalhes:ResetaGump ("de todas as instancias") + _detalhes:AtualizaGumpPrincipal (-1, true) --atualiza todas as instancias + + + elseif (msg == "pets") then local f = _detalhes:CreateListPanel() diff --git a/gumps/janela_info.lua b/gumps/janela_info.lua index b34a4bbe..5cd046a6 100644 --- a/gumps/janela_info.lua +++ b/gumps/janela_info.lua @@ -26,34 +26,58 @@ local classe_icones = _G.CLASS_ICON_TCOORDS --self = instancia --jogador = classe_damage ou classe_heal -function _detalhes:AbreJanelaInfo (jogador) +function _detalhes:AbreJanelaInfo (jogador, from_att_change) if (not _detalhes.row_singleclick_overwrite [self.atributo] or not _detalhes.row_singleclick_overwrite [self.atributo][self.sub_atributo]) then + _detalhes:FechaJanelaInfo() return elseif (_type (_detalhes.row_singleclick_overwrite [self.atributo][self.sub_atributo]) == "function") then + if (from_att_change) then + _detalhes:FechaJanelaInfo() + return + end return _detalhes.row_singleclick_overwrite [self.atributo][self.sub_atributo] (_, jogador, self) end if (self.modo == _detalhes._detalhes_props["MODO_RAID"]) then + _detalhes:FechaJanelaInfo() return end --> _detalhes.info_jogador armazena o jogador que esta sendo mostrado na janela de detalhes - if (info.jogador and info.jogador == jogador) then + if (info.jogador and info.jogador == jogador and self and info.atributo and self.atributo == info.atributo and self.sub_atributo == info.sub_atributo) then _detalhes:FechaJanelaInfo() --> se clicou na mesma barra então fecha a janela de detalhes return elseif (not jogador) then + _detalhes:FechaJanelaInfo() return end + if (info.barras1) then + for index, barra in ipairs (info.barras1) do + barra.other_actor = nil + end + end + + if (info.barras2) then + for index, barra in ipairs (info.barras2) do + barra.icone:SetTexture (nil) + barra.icone:SetTexCoord (0, 1, 0, 1) + end + end + --> vamos passar os parâmetros para dentro da tabela da janela... info.ativo = true --> sinaliza o addon que a janela esta aberta info.atributo = self.atributo --> instancia.atributo -> grava o atributo (damage, heal, etc) info.sub_atributo = self.sub_atributo --> instancia.sub_atributo -> grava o sub atributo (damage done, dps, damage taken, etc) - info.jogador = jogador --> de qual jogador (objeto classe_damage) info.instancia = self --> salva a referência da instância que pediu o info + + info.target_text = Loc ["STRING_TARGETS"] .. ":" + info.target_member = "total" + info.target_persecond = false + info.mostrando = nil local nome = info.jogador.nome --> nome do jogador @@ -71,7 +95,11 @@ function _detalhes:AbreJanelaInfo (jogador) info.nome:SetText (nome) info.atributo_nome:SetText (atributo_nome) - local avatar = NickTag:GetNicknameTable (jogador.serial) + local serial = jogador.serial + local avatar + if (serial ~= "") then + avatar = NickTag:GetNicknameTable (serial) + end if (avatar and avatar [1]) then info.nome:SetText (avatar [1] or nome) @@ -113,6 +141,8 @@ function _detalhes:AbreJanelaInfo (jogador) info.atributo_nome:SetPoint ("CENTER", info.nome, "CENTER", 0, 14) + info.no_targets:Hide() + info.no_targets.text:Hide() gump:TrocaBackgroundInfo (info) gump:HidaAllBarrasInfo() @@ -177,88 +207,98 @@ end -- for beta todo: info background need a major rewrite function gump:TrocaBackgroundInfo() + if (info.atributo == 1) then --> DANO + if (info.sub_atributo == 1 or info.sub_atributo == 2) then --> damage done / dps if (info.tipo ~= 1) then --> janela com as divisorias - info.bg1:SetTexture ([[Interface\AddOns\Details\images\info_window_background]]) info.bg1_sec_texture:SetTexture (nil) - info.targets:SetText (Loc ["STRING_TARGETS"] .. ":") info.tipo = 1 end + + if (info.sub_atributo == 2) then + info.targets:SetText (Loc ["STRING_TARGETS"] .. " " .. Loc ["STRING_ATTRIBUTE_DAMAGE_DPS"] .. ":") + info.target_persecond = true + else + info.targets:SetText (Loc ["STRING_TARGETS"] .. ":") + end + elseif (info.sub_atributo == 3) then --> damage taken if (info.tipo ~= 2) then --> janela com fundo diferente info.bg1:SetTexture ([[Interface\AddOns\Details\images\info_window_background]]) info.bg1_sec_texture:SetTexture ([[Interface\AddOns\Details\images\info_window_damagetaken]]) - info.targets:SetText (Loc ["STRING_TARGETS"] .. ":") info.tipo = 2 end + + info.targets:SetText (Loc ["STRING_TARGETS"] .. ":") + info.no_targets:Show() + info.no_targets.text:Show() + elseif (info.sub_atributo == 4) then --> friendly fire if (info.tipo ~= 3) then --> janela com fundo diferente info.bg1:SetTexture ([[Interface\AddOns\Details\images\info_window_background]]) - info.bg1_sec_texture:SetTexture ([[Interface\AddOns\Details\images\info_window_friendlyfire]]) - info.targets:SetText (Loc ["STRING_SPELLS"] .. ":") + info.bg1_sec_texture:SetTexture ([[Interface\AddOns\Details\images\info_window_damagetaken]]) info.tipo = 3 end + info.targets:SetText (Loc ["STRING_SPELLS"] .. ":") + elseif (info.sub_atributo == 6) then --> enemies if (info.tipo ~= 3) then --> janela com fundo diferente info.bg1:SetTexture ([[Interface\AddOns\Details\images\info_window_background]]) info.bg1_sec_texture:SetTexture ([[Interface\AddOns\Details\images\info_window_damagetaken]]) - info.targets:SetText (Loc ["STRING_DAMAGE_TAKEN_FROM"]) info.tipo = 3 end + info.targets:SetText (Loc ["STRING_DAMAGE_TAKEN_FROM"]) end + elseif (info.atributo == 2) then --> HEALING if (info.sub_atributo == 1 or info.sub_atributo == 2 or info.sub_atributo == 3) then --> damage done / dps if (info.tipo ~= 1) then --> janela com as divisorias - --info.bg1:SetTexture ("Interface\\AddOns\\Details\\images\\info_bg_part1") --> top left - --info.bg3:SetTexture ("Interface\\AddOns\\Details\\images\\info_bg_part3") --> bottom left - --info.bg2:SetTexture ("Interface\\AddOns\\Details\\images\\info_bg_part2") --> top right - --info.bg4:SetTexture ("Interface\\AddOns\\Details\\images\\info_bg_part4") --> bottom right - info.bg1:SetTexture ([[Interface\AddOns\Details\images\info_window_background]]) info.bg1_sec_texture:SetTexture (nil) - info.targets:SetText (Loc ["STRING_TARGETS"] .. ":") info.tipo = 1 end + + if (info.sub_atributo == 3) then + info.targets:SetText (Loc ["STRING_OVERHEALED"] .. ":") + info.target_member = "overheal" + info.target_text = Loc ["STRING_OVERHEALED"] .. ":" + elseif (info.sub_atributo == 2) then + info.targets:SetText (Loc ["STRING_TARGETS"] .. " " .. Loc ["STRING_ATTRIBUTE_HEAL_HPS"] .. ":") + info.target_persecond = true + else + info.targets:SetText (Loc ["STRING_TARGETS"] .. ":") + end + elseif (info.sub_atributo == 4) then --> Healing taken - if (info.tipo ~= 2) then --> janela com fundo diferente - --info.bg1:SetTexture ("Interface\\AddOns\\Details\\images\\bg_part1_sr") --> top left - --info.bg3:SetTexture ("Interface\\AddOns\\Details\\images\\bg_part3_sr") --> bottom left - --info.bg2:SetTexture ("Interface\\AddOns\\Details\\images\\bg_part2_sr") --> top right - --info.bg4:SetTexture ("Interface\\AddOns\\Details\\images\\bg_part4_sr") --> bottom right - + if (info.tipo ~= 2) then --> janela com fundo diferente info.bg1:SetTexture ([[Interface\AddOns\Details\images\info_window_background]]) info.bg1_sec_texture:SetTexture ([[Interface\AddOns\Details\images\info_window_damagetaken]]) - info.targets:SetText (Loc ["STRING_TARGETS"] .. ":") info.tipo = 2 end + + info.targets:SetText (Loc ["STRING_TARGETS"] .. ":") + info.no_targets:Show() + info.no_targets.text:Show() end + elseif (info.atributo == 3) then --> REGEN if (info.tipo ~= 2) then --> janela com fundo diferente - --info.bg1:SetTexture ("Interface\\AddOns\\Details\\images\\bg_part1_sr") --> top left - --info.bg3:SetTexture ("Interface\\AddOns\\Details\\images\\bg_part3_sr") --> bottom left - --info.bg2:SetTexture ("Interface\\AddOns\\Details\\images\\bg_part2_sr") --> top right - --info.bg4:SetTexture ("Interface\\AddOns\\Details\\images\\bg_part4_sr") --> bottom right - info.bg1:SetTexture ([[Interface\AddOns\Details\images\info_window_background]]) info.bg1_sec_texture:SetTexture (nil) - info.targets:SetText ("Vindo de:") info.tipo = 2 end + info.targets:SetText ("Vindo de:") elseif (info.atributo == 4) then --> MISC if (info.tipo ~= 2) then --> janela com fundo diferente - --info.bg1:SetTexture ("Interface\\AddOns\\Details\\images\\bg_part1_sr") --> top left - --info.bg3:SetTexture ("Interface\\AddOns\\Details\\images\\bg_part3_sr") --> bottom left - --info.bg2:SetTexture ("Interface\\AddOns\\Details\\images\\bg_part2_sr") --> top right - --info.bg4:SetTexture ("Interface\\AddOns\\Details\\images\\bg_part4_sr") --> bottom right - info.bg1:SetTexture ([[Interface\AddOns\Details\images\info_window_background]]) info.bg1_sec_texture:SetTexture (nil) - info.targets:SetText (Loc ["STRING_TARGETS"] .. ":") info.tipo = 2 end + info.targets:SetText (Loc ["STRING_TARGETS"] .. ":") + end end @@ -710,10 +750,10 @@ local function cria_container_alvos (este_gump) insets = {left = 1, right = 1, top = 0, bottom = 1},}) container_alvos_window:SetBackdropBorderColor (0,0,0,0) - container_alvos:SetBackdrop({ - bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16, - insets = {left = 1, right = 1, top = 0, bottom = 1},}) - container_alvos:SetBackdropColor (50/255, 50/255, 50/255, 0.6) + --container_alvos:SetBackdrop({ + -- bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16, + -- insets = {left = 1, right = 1, top = 0, bottom = 1},}) + --container_alvos:SetBackdropColor (50/255, 50/255, 50/255, 0.6) container_alvos:SetAllPoints (container_alvos_window) container_alvos:SetWidth (300) @@ -789,9 +829,10 @@ function gump:CriaJanelaInfo() este_gump.bg1_sec_texture = este_gump:CreateTexture (nil, "BORDER") este_gump.bg1_sec_texture:SetDrawLayer ("BORDER", 2) - este_gump.bg1_sec_texture:SetPoint ("topleft", este_gump.bg1, "topleft", 356, -86) + --este_gump.bg1_sec_texture:SetPoint ("topleft", este_gump.bg1, "topleft", 356, -86) + este_gump.bg1_sec_texture:SetPoint ("topleft", este_gump.bg1, "topleft", 348, -86) este_gump.bg1_sec_texture:SetHeight (262) - este_gump.bg1_sec_texture:SetWidth (258) + este_gump.bg1_sec_texture:SetWidth (264) --> bottom left este_gump.bg3 = este_gump:CreateTexture (nil, "BORDER") @@ -828,6 +869,19 @@ function gump:CriaJanelaInfo() este_gump.fechar:SetText ("X") este_gump.fechar:SetFrameLevel (este_gump:GetFrameLevel()+2) + este_gump.no_targets = este_gump:CreateTexture (nil, "overlay") + este_gump.no_targets:SetPoint ("BOTTOMLEFT", este_gump, "BOTTOMLEFT", 20, 6) + este_gump.no_targets:SetSize (301, 100) + este_gump.no_targets:SetTexture ([[Interface\QUESTFRAME\UI-QUESTLOG-EMPTY-TOPLEFT]]) + este_gump.no_targets:SetTexCoord (0.015625, 1, 0.01171875, 0.390625) + este_gump.no_targets:SetDesaturated (true) + este_gump.no_targets:SetAlpha (.7) + este_gump.no_targets.text = este_gump:CreateFontString (nil, "overlay", "GameFontNormal") + este_gump.no_targets.text:SetPoint ("center", este_gump.no_targets, "center") + este_gump.no_targets.text:SetText (Loc ["STRING_NO_TARGET_BOX"]) + este_gump.no_targets.text:SetTextColor (1, 1, 1, .4) + este_gump.no_targets:Hide() + function este_gump:ToFront() if (_detalhes.bosswindow) then if (_detalhes.bosswindow:GetFrameLevel() > este_gump:GetFrameLevel()) then @@ -1561,8 +1615,12 @@ function gump:CriaJanelaInfo() end if (amt_positive < 2) then - _detalhes.player_details_tabs[1]:Hide() + --_detalhes.player_details_tabs[1]:Hide() + _detalhes.player_details_tabs[1]:SetPoint ("BOTTOMLEFT", info.container_barras, "TOPLEFT", 390 - (67 * (2-1)), 1) end + + _detalhes.player_details_tabs[1]:Click() + end este_gump:SetScript ("OnHide", function (self) @@ -1638,12 +1696,32 @@ function _detalhes:CreatePlayerDetailsTab (tabname, condition, fillfunction, onc newtab:SetScript ("OnClick", function() for _, tab in _ipairs (_detalhes.player_details_tabs) do tab.frame:Hide() + tab.leftSelectedTexture:SetVertexColor (1, 1, 1, 1) + tab.middleSelectedTexture:SetVertexColor (1, 1, 1, 1) + tab.rightSelectedTexture:SetVertexColor (1, 1, 1, 1) end + + newtab.leftSelectedTexture:SetVertexColor (1, .7, 0, 1) + newtab.middleSelectedTexture:SetVertexColor (1, .7, 0, 1) + newtab.rightSelectedTexture:SetVertexColor (1, .7, 0, 1) newtab.frame:Show() end) else --> custom - newtab:SetScript ("OnClick", onclick) + newtab:SetScript ("OnClick", function() + for _, tab in _ipairs (_detalhes.player_details_tabs) do + tab.frame:Hide() + tab.leftSelectedTexture:SetVertexColor (1, 1, 1, 1) + tab.middleSelectedTexture:SetVertexColor (1, 1, 1, 1) + tab.rightSelectedTexture:SetVertexColor (1, 1, 1, 1) + end + + newtab.leftSelectedTexture:SetVertexColor (1, .7, 0, 1) + newtab.middleSelectedTexture:SetVertexColor (1, .7, 0, 1) + newtab.rightSelectedTexture:SetVertexColor (1, .7, 0, 1) + + onclick() + end) end --> remove os scripts padroes @@ -2030,8 +2108,13 @@ local function CriaTexturaBarra (instancia, barra) barra.textura:SetAllPoints (barra) --barra.textura:SetStatusBarTexture (instancia.row_info.texture_file) barra.textura:SetStatusBarTexture (_detalhes.default_texture) - barra.textura:SetStatusBarColor(.5, .5, .5, 0) - barra.textura:SetMinMaxValues(0,100) + barra.textura:SetStatusBarColor (.5, .5, .5, 0) + barra.textura:SetMinMaxValues (0,100) + + if (barra.targets) then + barra.targets:SetParent (barra.textura) + barra.targets:SetFrameLevel (barra.textura:GetFrameLevel()+2) + end barra.texto_esquerdo = barra.textura:CreateFontString (nil, "OVERLAY", "GameFontHighlightSmall") barra.texto_esquerdo:SetPoint ("LEFT", barra.textura, "LEFT", 22, 0) @@ -2042,7 +2125,11 @@ local function CriaTexturaBarra (instancia, barra) barra.texto_esquerdo:SetWordWrap (false) barra.texto_direita = barra.textura:CreateFontString (nil, "OVERLAY", "GameFontHighlightSmall") - barra.texto_direita:SetPoint ("RIGHT", barra.textura, "RIGHT", -2) + if (barra.targets) then + barra.texto_direita:SetPoint ("RIGHT", barra.targets, "LEFT", -2, 0) + else + barra.texto_direita:SetPoint ("RIGHT", barra, "RIGHT", -2, 0) + end barra.texto_direita:SetJustifyH ("RIGHT") barra.texto_direita:SetTextColor (1,1,1,1) @@ -2059,9 +2146,7 @@ local miniframe_func_on_enter = function (self) GameTooltip:Show() end end - barra:GetScript("OnEnter")(barra) - end local miniframe_func_on_leave = function (self) @@ -2069,6 +2154,87 @@ local miniframe_func_on_leave = function (self) self:GetParent():GetScript("OnLeave")(self:GetParent()) end +local target_on_enter = function (self) + + local barra = self:GetParent():GetParent() + + if (barra.show and type (barra.show) == "number") then + local actor = barra.other_actor or info.jogador + local spell = actor.spell_tables:PegaHabilidade (barra.show) + if (spell) then + local ActorTargetsContainer = spell.targets._ActorTable + local ActorTargetsSortTable = {} + --add and sort + for _, _target in _ipairs (ActorTargetsContainer) do + ActorTargetsSortTable [#ActorTargetsSortTable+1] = {_target.nome, _target [info.target_member] or _target.total or 0} + end + table.sort (ActorTargetsSortTable, _detalhes.Sort2) + + local spellname = _GetSpellInfo (barra.show) + + GameTooltip:SetOwner (self, "ANCHOR_TOPRIGHT") + GameTooltip:AddLine (barra.index .. ". " .. spellname) + GameTooltip:AddLine (info.target_text) + GameTooltip:AddLine (" ") + + --get time type + local meu_tempo + if (_detalhes.time_type == 1 or not actor.grupo) then + meu_tempo = actor:Tempo() + elseif (_detalhes.time_type == 2) then + meu_tempo = info.instancia.showing:GetCombatTime() + end + + for index, target in ipairs (ActorTargetsSortTable) do + if (target [2] > 0) then + local class = _detalhes:GetClass (target [1]) + if (class and _detalhes.class_coords [class]) then + local cords = _detalhes.class_coords [class] + if (info.target_persecond) then + GameTooltip:AddDoubleLine (index .. ". |TInterface\\AddOns\\Details\\images\\classes_small_alpha:14:14:0:0:128:128:"..cords[1]*128 ..":"..cords[2]*128 ..":"..cords[3]*128 ..":"..cords[4]*128 .."|t " .. target [1], _detalhes:comma_value ( _math_floor (target [2] / meu_tempo) ), 1, 1, 1, 1, 1, 1) + else + GameTooltip:AddDoubleLine (index .. ". |TInterface\\AddOns\\Details\\images\\classes_small_alpha:14:14:0:0:128:128:"..cords[1]*128 ..":"..cords[2]*128 ..":"..cords[3]*128 ..":"..cords[4]*128 .."|t " .. target [1], _detalhes:comma_value (target [2]), 1, 1, 1, 1, 1, 1) + end + else + if (info.target_persecond) then + GameTooltip:AddDoubleLine (index .. ". " .. target [1], _detalhes:comma_value ( _math_floor (target [2] / meu_tempo)), 1, 1, 1, 1, 1, 1) + else + GameTooltip:AddDoubleLine (index .. ". " .. target [1], _detalhes:comma_value (target [2]), 1, 1, 1, 1, 1, 1) + end + end + end + end + + GameTooltip:Show() + else + GameTooltip:SetOwner (self, "ANCHOR_TOPRIGHT") + GameTooltip:AddLine (barra.index .. ". " .. barra.show) + GameTooltip:AddLine (info.target_text) + GameTooltip:AddLine (Loc ["STRING_NO_TARGET"], 1, 1, 1) + GameTooltip:AddLine (Loc ["STRING_MORE_INFO"], 1, 1, 1) + GameTooltip:Show() + end + else + GameTooltip:SetOwner (self, "ANCHOR_TOPRIGHT") + GameTooltip:AddLine (barra.index .. ". " .. barra.show) + GameTooltip:AddLine (info.target_text) + GameTooltip:AddLine (Loc ["STRING_NO_TARGET"], 1, 1, 1) + GameTooltip:AddLine (Loc ["STRING_MORE_INFO"], 1, 1, 1) + GameTooltip:Show() + end + + self.texture:SetAlpha (1) + self:SetAlpha (1) + barra:GetScript("OnEnter")(barra) +end + +local target_on_leave = function (self) + GameTooltip:Hide() + self:GetParent():GetParent():GetScript("OnLeave")(self:GetParent():GetParent()) + self.texture:SetAlpha (.7) + self:SetAlpha (.7) +end + function gump:CriaNovaBarraInfo1 (instancia, index) if (_detalhes.janela_info.barras1 [index]) then @@ -2081,6 +2247,7 @@ function gump:CriaNovaBarraInfo1 (instancia, index) local esta_barra = _CreateFrame ("Button", "Details_infobox1_bar_"..index, info.container_barras.gump) esta_barra:SetWidth (300) --> tamanho da barra de acordo com o tamanho da janela esta_barra:SetHeight (16) --> altura determinada pela instância + esta_barra.index = index local y = (index-1)*17 --> 17 é a altura da barra y = y*-1 --> baixo @@ -2093,8 +2260,20 @@ function gump:CriaNovaBarraInfo1 (instancia, index) esta_barra:EnableMouse (true) esta_barra:RegisterForClicks ("LeftButtonDown","RightButtonUp") + esta_barra.targets = CreateFrame ("frame", "Details_infobox1_bar_"..index.."Targets", esta_barra) + esta_barra.targets:SetPoint ("right", esta_barra, "right") + esta_barra.targets:SetSize (15, 15) + esta_barra.targets.texture = esta_barra.targets:CreateTexture (nil, overlay) + esta_barra.targets.texture:SetTexture ([[Interface\MINIMAP\TRACKING\Target]]) + esta_barra.targets.texture:SetAllPoints() + esta_barra.targets.texture:SetDesaturated (true) + esta_barra.targets:SetAlpha (.7) + esta_barra.targets.texture:SetAlpha (.7) + esta_barra.targets:SetScript ("OnEnter", target_on_enter) + esta_barra.targets:SetScript ("OnLeave", target_on_leave) + CriaTexturaBarra (instancia, esta_barra) - + --> icone esta_barra.miniframe = CreateFrame ("frame", nil, esta_barra) esta_barra.miniframe:SetSize (14, 14) diff --git a/gumps/janela_options.lua b/gumps/janela_options.lua index b6825b2d..9a642d0c 100644 --- a/gumps/janela_options.lua +++ b/gumps/janela_options.lua @@ -2783,6 +2783,113 @@ function window:CreateFrame2() window:CreateLineBackground2 (frame2, "timetypeDropdown", "timetypeLabel", Loc ["STRING_OPTIONS_TIMEMEASURE_DESC"]) + --> Overall Data + g:NewLabel (frame2, _, "$parentOverallDataAnchor", "OverallDataLabel", Loc ["STRING_OPTIONS_OVERALL_ANCHOR"], "GameFontNormal") + + --raid boss + g:NewLabel (frame2, _, "$parentOverallDataRaidBossLabel", "OverallDataRaidBossLabel", Loc ["STRING_OPTIONS_OVERALL_RAIDBOSS"], "GameFontHighlightLeft") + -- + g:NewSwitch (frame2, _, "$parentOverallDataRaidBossSlider", "OverallDataRaidBossSlider", 60, 20, _, _, false) + frame2.OverallDataRaidBossSlider:SetPoint ("left", frame2.OverallDataRaidBossLabel, "right", 2, 0) + -- + frame2.OverallDataRaidBossSlider.OnSwitch = function (self, _, value) + if (value) then + _detalhes.overall_flag = _detalhes.overall_flag + 0x1 + else + _detalhes.overall_flag = _detalhes.overall_flag - 0x1 + end + end + -- + window:CreateLineBackground2 (frame2, "OverallDataRaidBossSlider", "OverallDataRaidBossLabel", Loc ["STRING_OPTIONS_OVERALL_RAIDBOSS_DESC"]) + + --raid cleanup + g:NewLabel (frame2, _, "$parentOverallDataRaidCleaupLabel", "OverallDataRaidCleaupLabel", Loc ["STRING_OPTIONS_OVERALL_RAIDCLEAN"], "GameFontHighlightLeft") + -- + g:NewSwitch (frame2, _, "$parentOverallDataRaidCleaupSlider", "OverallDataRaidCleaupSlider", 60, 20, _, _, false) + frame2.OverallDataRaidCleaupSlider:SetPoint ("left", frame2.OverallDataRaidCleaupLabel, "right", 2, 0) + -- + frame2.OverallDataRaidCleaupSlider.OnSwitch = function (self, _, value) + if (value) then + _detalhes.overall_flag = _detalhes.overall_flag + 0x2 + else + _detalhes.overall_flag = _detalhes.overall_flag - 0x2 + end + end + -- + window:CreateLineBackground2 (frame2, "OverallDataRaidCleaupSlider", "OverallDataRaidCleaupLabel", Loc ["STRING_OPTIONS_OVERALL_RAIDCLEAN_DESC"]) + + --dungeon boss + g:NewLabel (frame2, _, "$parentOverallDataDungeonBossLabel", "OverallDataDungeonBossLabel", Loc ["STRING_OPTIONS_OVERALL_DUNGEONBOSS"], "GameFontHighlightLeft") + -- + g:NewSwitch (frame2, _, "$parentOverallDataDungeonBossSlider", "OverallDataDungeonBossSlider", 60, 20, _, _, false) + frame2.OverallDataDungeonBossSlider:SetPoint ("left", frame2.OverallDataDungeonBossLabel, "right", 2, 0) + -- + frame2.OverallDataDungeonBossSlider.OnSwitch = function (self, _, value) + if (value) then + _detalhes.overall_flag = _detalhes.overall_flag + 0x4 + else + _detalhes.overall_flag = _detalhes.overall_flag - 0x4 + end + end + -- + window:CreateLineBackground2 (frame2, "OverallDataDungeonBossSlider", "OverallDataDungeonBossLabel", Loc ["STRING_OPTIONS_OVERALL_DUNGEONBOSS_DESC"]) + + --dungeon cleanup + g:NewLabel (frame2, _, "$parentOverallDataDungeonCleaupLabel", "OverallDataDungeonCleaupLabel", Loc ["STRING_OPTIONS_OVERALL_DUNGEONCLEAN"], "GameFontHighlightLeft") + -- + g:NewSwitch (frame2, _, "$parentOverallDataDungeonCleaupSlider", "OverallDataDungeonCleaupSlider", 60, 20, _, _, false) + frame2.OverallDataDungeonCleaupSlider:SetPoint ("left", frame2.OverallDataDungeonCleaupLabel, "right", 2, 0) + -- + frame2.OverallDataDungeonCleaupSlider.OnSwitch = function (self, _, value) + if (value) then + _detalhes.overall_flag = _detalhes.overall_flag + 0x8 + else + _detalhes.overall_flag = _detalhes.overall_flag - 0x8 + end + end + -- + window:CreateLineBackground2 (frame2, "OverallDataDungeonCleaupSlider", "OverallDataDungeonCleaupLabel", Loc ["STRING_OPTIONS_OVERALL_DUNGEONCLEAN_DESC"]) + + --everything + g:NewLabel (frame2, _, "$parentOverallDataAllLabel", "OverallDataAllLabel", Loc ["STRING_OPTIONS_OVERALL_ALL"], "GameFontHighlightLeft") + -- + g:NewSwitch (frame2, _, "$parentOverallDataAllSlider", "OverallDataAllSlider", 60, 20, _, _, false) + frame2.OverallDataAllSlider:SetPoint ("left", frame2.OverallDataAllLabel, "right", 2, 0) + -- + frame2.OverallDataAllSlider.OnSwitch = function (self, _, value) + if (value) then + _detalhes.overall_flag = _detalhes.overall_flag + 0x10 + else + _detalhes.overall_flag = _detalhes.overall_flag - 0x10 + end + end + -- + window:CreateLineBackground2 (frame2, "OverallDataAllSlider", "OverallDataAllLabel", Loc ["STRING_OPTIONS_OVERALL_ALL_DESC"]) + + --erase on new boss + g:NewLabel (frame2, _, "$parentOverallNewBossLabel", "OverallNewBossLabel", Loc ["STRING_OPTIONS_OVERALL_NEWBOSS"], "GameFontHighlightLeft") + -- + g:NewSwitch (frame2, _, "$parentOverallNewBossSlider", "OverallNewBossSlider", 60, 20, _, _, false) + frame2.OverallNewBossSlider:SetPoint ("left", frame2.OverallNewBossLabel, "right", 2, 0) + -- + frame2.OverallNewBossSlider.OnSwitch = function (self, _, value) + _detalhes:OverallOptions (value) + end + -- + window:CreateLineBackground2 (frame2, "OverallNewBossSlider", "OverallNewBossLabel", Loc ["STRING_OPTIONS_OVERALL_NEWBOSS_DESC"]) + + --erase on challenge mode + g:NewLabel (frame2, _, "$parentOverallNewChallengeLabel", "OverallNewChallengeLabel", Loc ["STRING_OPTIONS_OVERALL_CHALLENGE"], "GameFontHighlightLeft") + -- + g:NewSwitch (frame2, _, "$parentOverallNewChallengeSlider", "OverallNewChallengeSlider", 60, 20, _, _, false) + frame2.OverallNewChallengeSlider:SetPoint ("left", frame2.OverallNewChallengeLabel, "right", 2, 0) + -- + frame2.OverallNewChallengeSlider.OnSwitch = function (self, _, value) + _detalhes:OverallOptions (nil, value) + end + -- + window:CreateLineBackground2 (frame2, "OverallNewChallengeSlider", "OverallNewChallengeLabel", Loc ["STRING_OPTIONS_OVERALL_CHALLENGE_DESC"]) + --> anchors --general anchor g:NewLabel (frame2, _, "$parentGeneralAnchor", "GeneralAnchorLabel", Loc ["STRING_OPTIONS_GENERAL_ANCHOR"], "GameFontNormal") @@ -2796,6 +2903,15 @@ function window:CreateFrame2() {"GeneralAnchorLabel", 1, true}, {"fragsPvpLabel", 2}, {"timetypeLabel", 3}, + + {"OverallDataLabel", 4, true}, + {"OverallDataRaidBossLabel", 5}, + {"OverallDataRaidCleaupLabel", 6}, + {"OverallDataDungeonBossLabel", 7}, + {"OverallDataDungeonCleaupLabel", 8}, + {"OverallDataAllLabel", 9}, + {"OverallNewBossLabel", 10}, + {"OverallNewChallengeLabel", 11}, } window:arrange_menu (frame2, left_side, x, window.top_start_at) @@ -5768,6 +5884,15 @@ function window:update_all (editing_instance) _G.DetailsOptionsWindow2FragsPvpSlider.MyObject:SetValue (_detalhes.only_pvp_frags) _G.DetailsOptionsWindow2TTDropdown.MyObject:Select (_detalhes.time_type) + _G.DetailsOptionsWindow2OverallDataRaidBossSlider.MyObject:SetValue (bit.band (_detalhes.overall_flag, 0x1) ~= 0) + _G.DetailsOptionsWindow2OverallDataRaidCleaupSlider.MyObject:SetValue (bit.band (_detalhes.overall_flag, 0x2) ~= 0) + _G.DetailsOptionsWindow2OverallDataDungeonBossSlider.MyObject:SetValue (bit.band (_detalhes.overall_flag, 0x4) ~= 0) + _G.DetailsOptionsWindow2OverallDataDungeonCleaupSlider.MyObject:SetValue (bit.band (_detalhes.overall_flag, 0x8) ~= 0) + _G.DetailsOptionsWindow2OverallDataAllSlider.MyObject:SetValue (bit.band (_detalhes.overall_flag, 0x10) ~= 0) + + _G.DetailsOptionsWindow2OverallNewBossSlider.MyObject:SetValue (_detalhes.overall_clear_newboss) + _G.DetailsOptionsWindow2OverallNewChallengeSlider.MyObject:SetValue (_detalhes.overall_clear_newchallenge) + --> window 3 _G.DetailsOptionsWindow3SkinDropdown.MyObject:SetFixedParameter (editing_instance) _G.DetailsOptionsWindow3SkinDropdown.MyObject:Select (editing_instance.skin) diff --git a/gumps/janela_principal.lua b/gumps/janela_principal.lua index bb44b36b..f242b5e9 100644 --- a/gumps/janela_principal.lua +++ b/gumps/janela_principal.lua @@ -3788,7 +3788,9 @@ local build_segment_list = function (self, elapsed) if (thisCombat.is_boss and thisCombat.is_boss.name) then - if (thisCombat.is_boss.killed) then + if (thisCombat.instance_type == "party") then + CoolTip:AddLine (thisCombat.is_boss.name .." (#"..i..")", _, 1, {170/255, 167/255, 255/255, 1}) + elseif (thisCombat.is_boss.killed) then CoolTip:AddLine (thisCombat.is_boss.name .." (#"..i..")", _, 1, "lime") else CoolTip:AddLine (thisCombat.is_boss.name .." (#"..i..")", _, 1, "red") @@ -3803,6 +3805,14 @@ local build_segment_list = function (self, elapsed) local background = _detalhes:GetRaidIcon (thisCombat.is_boss.mapid) if (background) then CoolTip:SetWallpaper (2, background, nil, {1, 1, 1, 0.5}) + elseif (thisCombat.instance_type == "party") then + local ej_id = thisCombat.is_boss.ej_instance_id + if (ej_id) then + local name, description, bgImage, buttonImage, loreImage, dungeonAreaMapID, link = EJ_GetInstanceInfo (ej_id) + if (bgImage) then + CoolTip:SetWallpaper (2, bgImage, {0.09, 0.698125, 0, 0.833984375}, {1, 1, 1, 0.5}) + end + end end else @@ -3869,7 +3879,17 @@ local build_segment_list = function (self, elapsed) end local background = _detalhes:GetRaidIcon (_detalhes.tabela_vigente.is_boss.mapid) - CoolTip:SetWallpaper (2, background, nil, {1, 1, 1, 0.5}) + if (background) then + CoolTip:SetWallpaper (2, background, nil, {1, 1, 1, 0.5}) + elseif (_detalhes.tabela_vigente.instance_type == "party") then + local ej_id = _detalhes.tabela_vigente.is_boss.ej_instance_id + if (ej_id) then + local name, description, bgImage, buttonImage, loreImage, dungeonAreaMapID, link = EJ_GetInstanceInfo (ej_id) + if (bgImage) then + CoolTip:SetWallpaper (2, bgImage, {0.09, 0.698125, 0, 0.833984375}, {1, 1, 1, 0.5}) + end + end + end else CoolTip:SetWallpaper (2, [[Interface\ACHIEVEMENTFRAME\UI-Achievement-StatsBackground]], {0.5078125, 0.1171875, 0.017578125, 0.1953125}, {1, 1, 1, .5}) end @@ -5124,11 +5144,16 @@ end GameCooltip:SetOption ("TextHeightMod", 0) GameCooltip:SetOption ("IgnoreButtonAutoHeight", false) - GameCooltip:AddLine (Loc ["STRING_ERASE_DATA"], nil, 1, "white", nil, 10, SharedMedia:Fetch ("font", "Friz Quadrata TT")) - --GameCooltip:AddIcon ([[Interface\Buttons\UI-MinusButton-Up]], 1, 1) - GameCooltip:AddIcon ([[Interface\PetBattles\DeadPetIcon]], 1, 1) + local font = SharedMedia:Fetch ("font", "Friz Quadrata TT") + + GameCooltip:AddLine (Loc ["STRING_ERASE_DATA"], nil, 1, "white", nil, 10, font) + GameCooltip:AddIcon ([[Interface\Buttons\UI-StopButton]], 1, 1, 14, 14, 0, 1, 0, 1, "red") GameCooltip:AddMenu (1, _detalhes.tabela_historico.resetar) + GameCooltip:AddLine (Loc ["STRING_ERASE_DATA_OVERALL"], nil, 1, "white", nil, 10, font) + GameCooltip:AddIcon ([[Interface\Buttons\UI-StopButton]], 1, 1, 14, 14, 0, 1, 0, 1, "orange") + GameCooltip:AddMenu (1, _detalhes.tabela_historico.resetar_overall) + GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0, 0.64453125}, {1, 1, 1, 0.1}, true) show_anti_overlap (self.instance, self, "top") @@ -5761,24 +5786,6 @@ function gump:CriaCabecalho (baseframe, instancia) baseframe.cabecalho.reset:SetHighlightTexture ([[Interface\Addons\Details\Images\reset_button]]) baseframe.cabecalho.reset:SetPushedTexture ([[Interface\Addons\Details\Images\reset_button]]) ---[[ - if (_G.GameCooltip.active) then - local passou = 0 - self:SetScript ("OnUpdate", function (self, elapsed) - passou = passou+elapsed - if (passou > 0.3) then - if (not _G.GameCooltip.mouse_over and not _G.GameCooltip.button_over) then - _G.GameCooltip:ShowMe (false) - end - self:SetScript ("OnUpdate", nil) - end - end) - else - self:SetScript ("OnUpdate", nil) - end - end) ---]] - --> fim botão reset --> Botão de Ajuda ---------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/images/info_window_damagetaken.tga b/images/info_window_damagetaken.tga index ef9e3774b2721a6ce1f096af4239603b0f51305b..5fc43c32523ce001d056da918968194e1825eb5c 100644 GIT binary patch delta 37479 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 delta 19771 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%0DB0lpW;H;jQCaHEnaTlfZWZ{VsafvXptV&cWdz0L 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�u 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 diff --git a/locales/Details-enUS.lua b/locales/Details-enUS.lua index f617bf2e..302e5595 100644 --- a/locales/Details-enUS.lua +++ b/locales/Details-enUS.lua @@ -2,8 +2,7 @@ local Loc = LibStub("AceLocale-3.0"):NewLocale("Details", "enUS", true) if not Loc then return end -------------------------------------------------------------------------------------------------------------------------------------------- - - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v1.14.5 - 1.14.6\n\n|cFFFFFF00-|r Added option for lock segments display, so, when a segment is chosen, the other windows also change it.\n\n|cFFFFFF00-|r Added option for show the total amount of spells, targets and pets in tooltips.\n\n|cFFFFFF00-|r Finished another revamp on options panel.\n\n|cFFFFFF00-|r Now its possible open more then 1 Raid Plugins at once on diferent windows.\n\n|cFFFFFF00-|r Added a large text editor for make changes on custom texts.\n\n|cFFFFFF00-|r Added new option for enable borders on the bars.\n\n|cFFFFFF00-|r Added Death Barrier as a absorb spell.\n\n|cFFFFFF00-|r Fixed a bug on overheal tooltip where was showing the Hps instead of overheal.\n\n|cFFFFFF00v1.14.0 - v1.14.0b\n\n|cFFFFFF00-|r Added a new tab on options panel for tooltip configuration.\n\n|cFFFFFF00-|r Added a new tab on options panel for broker config.\n\n|cFFFFFF00-|r Added new abbreviation method called comma.\n\n|cFFFFFF00-|r All instances now have a delete button.\n\n|cFFFFFF00-|r Full re-write on the instance, delete and close buttons.\n\n|cFFFFFF00-|r HotCorners now sort icons according with most used.\n\n|cFFFFFF00-|r Few changes on all skins in order to fit on the new right menu buttons.\n\n|cFFFFFF00-|r Added Horde avatars.\n\n|cFFFFFF00-|r Fixed issue where shortcut panel shows below thw windows when its in Dialog strata.\n\n|cFFFFFF00v1.13.8 - v1.13.8a\n\n|cFFFFFF00-|r Fixed issue with Vanguard where it wasn't showing debuffs stacks on the tanks if you are a healer os dps.\n\n|cFFFFFF00-|r Added option for put stretch button on the fullscreen strata which makes it always on top of others frames.\n\n|cFFFFFF00-|r Added background and dialog stratas.\n\n|cFFFFFF00-|r Added option for percentage: follow the combat totals or the first player total.\n\n|cFFFFFF00-|r Added option for show or hide the left buttons on menu bar.\n\n|cFFFFFF00-|r Added option for change the left buttons size in the menu bar.\n\n|cFFFFFF00-|r Added option for delete a instance.\n\n|cFFFFFF00-|r Instance Segment Mini display now is more accuracy about telling the enemy in the segment.\n\n|cFFFFFF00-|r Player Details Window now show all pet abilities instead of just the total pet damage.\n\n|cFFFFFF00-|r Rework done on report texts, now the title is more shorter and also format Dps and Hps numbers.\n\n|cFFFFFF00-|r Simple Gray and again ElvUI skins got some rework.\n\n|cFFFFFF00-|r Lib HotCorner now is data broker based and shows up all broker plugins in the bar.\n\n|cFFFFFF00v1.13.5 / v1.13.5a|r\n\n|cFFFFFF00-|r Added keybinds to reset segments and scroll up/down.\n\n|cFFFFFF00-|r Added Spell Customization options where icon and the name of a spell can be changed.\n\n|cFFFFFF00-|r Added option to change the micro displays side, now it can be shown on the window top side.\n\n|cFFFFFF00-|r Micro Displays, also, should now give less problems and be more dynamic.\n\n|cFFFFFF00-|r Added options to change the transparency when out of combat and out of a group.\n\n|cFFFFFF00-|r Added and Still under development the panel for create data captures for charts.\n\n|cFFFFFF00-|r Fixed a issue with flat skin where the close button was just too big.\n\n|cFFFFFF00v1.13.0|r\n\n|cFFFFFF00-|r Added four more abbreviation types.\n\n|cFFFFFF00-|r Fixed issue where the instance menu wasnt respecting the amount limit of instances.\n\n|cFFFFFF00-|r Added options for cutomize the right text of a row.\n\n|cFFFFFF00-|r Added a option to be able to chance the framestrata of an window.\n\n|cFFFFFF00-|r Added shift, ctrl, alt interaction for rows which shows all spells, targets or pets when pressed.\n\n|cFFFFFF00-|r Fixed a issue where changing the alpha of a window makes it disappear on the next logon.\n\n|cFFFFFF00-|r Added a option for auto transparency to ignore rows.\n\n|cFFFFFF00-|r Added option to be able to set shadow on the attribute text.\n\n|cFFFFFF00-|r Fixed a issue with window snap where disabled statusbar makes a gap between the windows.\n\n|cFFFFFF00-|r Added a hidden menu on the top left corner (experimental).\n\n|cFFFFFF00v1.12.3|r\n\n|cFFFFFF00-|r - Fixed 'Healing Per Second' which wasn't working at all.\n\n|cFFFFFF00-|r - Fixed the percent amount for target of damage done where sometimes it pass 100%.\n\n|cFFFFFF00-|r - Changes on Skins: 'Minimalistic' and 'Elm UI Frame Style'. It's necessary re-apply.\n\n|cFFFFFF00-|r - Added more cooldowns and spells for Monk tank over avoidance panel.\n\n|cFFFFFF00-|r - Player avatar now is also shown on the Player Details window.\n\n|cFFFFFF00-|r - Leaving empty the the icon file box, make details use no icons on bars.\n\n|cFFFFFF00-|r - Added new feature: Auto Transparency, hide or show menus, statusbar and borders when mouse enter or leaves the window.\n\n|cFFFFFF00-|r - Added new feature: Attribute Text, shows on the toolbar or statusbar the current attribute shown.\n\n|cFFFFFF00-|r - Added new fueature: Auto Hide Menu, which hide or show the menus when mouse enter or leaves the window.\n\n|cFFFFFF00-|r - Image Editor now can Flip the image without messing with the crop.\n\n|cFFFFFF00v1.12.0|r\n\n|cFFFFFF00-|r Added support to Profiles, now you can share the same config between two or more characters.\n\n|cFFFFFF00-|r - Options window now can be opened while in combat without triggering 'script ran too long' error.\n\n|cFFFFFF00-|r Added support for BattleTag friends over report window.\n\n|cFFFFFF00-|r Added pet threat to Tiny Threat plugin when out of a party or raid group.\n\n|cFFFFFF00-|r Fixed a issue with close button where it disappear without close the window when toolbar is in bottom side.\n\n|cFFFFFF00-|r Also fixed a issue where swapping toolbar positioning was sometimes making close button disappear.\n\n|cFFFFFF00-|r Fixed a problem opening options panel through minimap when there is no window opened.\n\n|cFFFFFF00v1.11.10|r\n\n|cFFFFFF00-|r Accuracy with warcraftlogs.com now is very high and okey with worldoflogs.com. Make sure the option |cFFFFDD00Time Measure|r under General Settings -> Combat is set to |cFFFFDD00Effective Time|r.\n\n|cFFFFFF00-|r Options Window has been revamped, again." + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v1.15.0: (test version) Dungeons e Overall data.\n\n|cFFFFFF00-|r Implemented a early support for Dungeons.\n\n|cFFFFFF00-|r Implemented Overall Data. Options for it are under combat tab.\n\n|cFFFFFF00-|r Implemented spell targets on Player Details Window.\n\n|cFFFFFF00v1.14.5 - 1.14.6\n\n|cFFFFFF00-|r Added option for lock segments display, so, when a segment is chosen, the other windows also change it.\n\n|cFFFFFF00-|r Added option for show the total amount of spells, targets and pets in tooltips.\n\n|cFFFFFF00-|r Finished another revamp on options panel.\n\n|cFFFFFF00-|r Now its possible open more then 1 Raid Plugins at once on diferent windows.\n\n|cFFFFFF00-|r Added a large text editor for make changes on custom texts.\n\n|cFFFFFF00-|r Added new option for enable borders on the bars.\n\n|cFFFFFF00-|r Added Death Barrier as a absorb spell.\n\n|cFFFFFF00-|r Fixed a bug on overheal tooltip where was showing the Hps instead of overheal.\n\n|cFFFFFF00v1.14.0 - v1.14.0b\n\n|cFFFFFF00-|r Added a new tab on options panel for tooltip configuration.\n\n|cFFFFFF00-|r Added a new tab on options panel for broker config.\n\n|cFFFFFF00-|r Added new abbreviation method called comma.\n\n|cFFFFFF00-|r All instances now have a delete button.\n\n|cFFFFFF00-|r Full re-write on the instance, delete and close buttons.\n\n|cFFFFFF00-|r HotCorners now sort icons according with most used.\n\n|cFFFFFF00-|r Few changes on all skins in order to fit on the new right menu buttons.\n\n|cFFFFFF00-|r Added Horde avatars.\n\n|cFFFFFF00-|r Fixed issue where shortcut panel shows below thw windows when its in Dialog strata.\n\n|cFFFFFF00v1.13.8 - v1.13.8a\n\n|cFFFFFF00-|r Fixed issue with Vanguard where it wasn't showing debuffs stacks on the tanks if you are a healer os dps.\n\n|cFFFFFF00-|r Added option for put stretch button on the fullscreen strata which makes it always on top of others frames.\n\n|cFFFFFF00-|r Added background and dialog stratas.\n\n|cFFFFFF00-|r Added option for percentage: follow the combat totals or the first player total.\n\n|cFFFFFF00-|r Added option for show or hide the left buttons on menu bar.\n\n|cFFFFFF00-|r Added option for change the left buttons size in the menu bar.\n\n|cFFFFFF00-|r Added option for delete a instance.\n\n|cFFFFFF00-|r Instance Segment Mini display now is more accuracy about telling the enemy in the segment.\n\n|cFFFFFF00-|r Player Details Window now show all pet abilities instead of just the total pet damage.\n\n|cFFFFFF00-|r Rework done on report texts, now the title is more shorter and also format Dps and Hps numbers.\n\n|cFFFFFF00-|r Simple Gray and again ElvUI skins got some rework.\n\n|cFFFFFF00-|r Lib HotCorner now is data broker based and shows up all broker plugins in the bar.\n\n|cFFFFFF00v1.13.5 / v1.13.5a|r\n\n|cFFFFFF00-|r Added keybinds to reset segments and scroll up/down.\n\n|cFFFFFF00-|r Added Spell Customization options where icon and the name of a spell can be changed.\n\n|cFFFFFF00-|r Added option to change the micro displays side, now it can be shown on the window top side.\n\n|cFFFFFF00-|r Micro Displays, also, should now give less problems and be more dynamic.\n\n|cFFFFFF00-|r Added options to change the transparency when out of combat and out of a group.\n\n|cFFFFFF00-|r Added and Still under development the panel for create data captures for charts.\n\n|cFFFFFF00-|r Fixed a issue with flat skin where the close button was just too big.\n\n|cFFFFFF00v1.13.0|r\n\n|cFFFFFF00-|r Added four more abbreviation types.\n\n|cFFFFFF00-|r Fixed issue where the instance menu wasnt respecting the amount limit of instances.\n\n|cFFFFFF00-|r Added options for cutomize the right text of a row.\n\n|cFFFFFF00-|r Added a option to be able to chance the framestrata of an window.\n\n|cFFFFFF00-|r Added shift, ctrl, alt interaction for rows which shows all spells, targets or pets when pressed.\n\n|cFFFFFF00-|r Fixed a issue where changing the alpha of a window makes it disappear on the next logon.\n\n|cFFFFFF00-|r Added a option for auto transparency to ignore rows.\n\n|cFFFFFF00-|r Added option to be able to set shadow on the attribute text.\n\n|cFFFFFF00-|r Fixed a issue with window snap where disabled statusbar makes a gap between the windows.\n\n|cFFFFFF00-|r Added a hidden menu on the top left corner (experimental).\n\n|cFFFFFF00v1.12.3|r\n\n|cFFFFFF00-|r - Fixed 'Healing Per Second' which wasn't working at all.\n\n|cFFFFFF00-|r - Fixed the percent amount for target of damage done where sometimes it pass 100%.\n\n|cFFFFFF00-|r - Changes on Skins: 'Minimalistic' and 'Elm UI Frame Style'. It's necessary re-apply.\n\n|cFFFFFF00-|r - Added more cooldowns and spells for Monk tank over avoidance panel.\n\n|cFFFFFF00-|r - Player avatar now is also shown on the Player Details window.\n\n|cFFFFFF00-|r - Leaving empty the the icon file box, make details use no icons on bars.\n\n|cFFFFFF00-|r - Added new feature: Auto Transparency, hide or show menus, statusbar and borders when mouse enter or leaves the window.\n\n|cFFFFFF00-|r - Added new feature: Attribute Text, shows on the toolbar or statusbar the current attribute shown.\n\n|cFFFFFF00-|r - Added new fueature: Auto Hide Menu, which hide or show the menus when mouse enter or leaves the window.\n\n|cFFFFFF00-|r - Image Editor now can Flip the image without messing with the crop.\n\n|cFFFFFF00v1.12.0|r\n\n|cFFFFFF00-|r Added support to Profiles, now you can share the same config between two or more characters.\n\n|cFFFFFF00-|r - Options window now can be opened while in combat without triggering 'script ran too long' error.\n\n|cFFFFFF00-|r Added support for BattleTag friends over report window.\n\n|cFFFFFF00-|r Added pet threat to Tiny Threat plugin when out of a party or raid group.\n\n|cFFFFFF00-|r Fixed a issue with close button where it disappear without close the window when toolbar is in bottom side.\n\n|cFFFFFF00-|r Also fixed a issue where swapping toolbar positioning was sometimes making close button disappear.\n\n|cFFFFFF00-|r Fixed a problem opening options panel through minimap when there is no window opened.\n\n|cFFFFFF00v1.11.10|r\n\n|cFFFFFF00-|r Accuracy with warcraftlogs.com now is very high and okey with worldoflogs.com. Make sure the option |cFFFFDD00Time Measure|r under General Settings -> Combat is set to |cFFFFDD00Effective Time|r.\n\n|cFFFFFF00-|r Options Window has been revamped, again." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails:|r " --> color and details name @@ -246,13 +245,22 @@ if not Loc then return end Loc ["STRING_DODGE"] = "Dodge" Loc ["STRING_DAMAGE_FROM"] = "Took damage from" Loc ["STRING_HEALING_FROM"] = "Healing received from" + Loc ["STRING_HEALING_HPS_FROM"] = "HPS received from" + Loc ["STRING_DAMAGE_DPS_IN"] = "DPS received from" Loc ["STRING_PLAYERS"] = "Players" + Loc ["STRING_NO_TARGET_BOX"] = "No Targets Avaliable" + Loc ["STRING_NO_TARGET"] = "No target found." + Loc ["STRING_MORE_INFO"] = "See right box for more info." + + Loc ["STRING_VOIDZONE_TOOLTIP"] = "Damage and Time:" + Loc ["STRING_HPS"] = "Hps" Loc ["STRING_HEAL"] = "Heal" Loc ["STRING_HEAL_CRIT"] = "Heal Critical" Loc ["STRING_HEAL_ABSORBED"] = "Heal absorbed" Loc ["STRING_OVERHEAL"] = "Overheal" + Loc ["STRING_OVERHEALED"] = "Overhealed" Loc ["STRING_"] = "" ---------------- @@ -359,10 +367,13 @@ if not Loc then return end --> Main Window + Loc ["STRING_ERASE_IN_COMBAT"] = "Schedule overall wipe after this combat." + Loc ["STRING_LOCK_WINDOW"] = "lock" Loc ["STRING_UNLOCK_WINDOW"] = "unlock" Loc ["STRING_ERASE"] = "delete" - Loc ["STRING_ERASE_DATA"] = "Reset Data" + Loc ["STRING_ERASE_DATA"] = "Reset All Data" + Loc ["STRING_ERASE_DATA_OVERALL"] = "Reset Overall Data" Loc ["STRING_UNLOCK"] = "Spread out instances\n in this button" Loc ["STRING_PLUGIN_NAMEALREADYTAKEN"] = "Details! can't install plugin because his name already has been taken" Loc ["STRING_RESIZE_COMMON"] = "Resize\n" @@ -571,6 +582,25 @@ if not Loc then return end Loc ["STRING_OPTIONS_TIMEMEASURE"] = "Time Measure" Loc ["STRING_OPTIONS_TIMEMEASURE_DESC"] = "|cFFFFFF00Activity|r: the timer of each raid member is put on hold if his activity is ceased and back again to count when is resumed, common way of measure Dps and Hps.\n\n|cFFFFFF00Effective|r: used on rankings, this method uses the elapsed combat time for measure the Dps and Hps of all raid members." + Loc ["STRING_OPTIONS_OVERALL_ANCHOR"] = "Overall Data:" + + Loc ["STRING_OPTIONS_OVERALL_RAIDBOSS"] = "Raid Bosses" + Loc ["STRING_OPTIONS_OVERALL_RAIDBOSS_DESC"] = "Raid encounters are added to overall data." + Loc ["STRING_OPTIONS_OVERALL_RAIDCLEAN"] = "Raid Cleanups" + Loc ["STRING_OPTIONS_OVERALL_RAIDCLEAN_DESC"] = "Raid cleanups are added to overall data." + Loc ["STRING_OPTIONS_OVERALL_DUNGEONBOSS"] = "Dungeon Bosses" + Loc ["STRING_OPTIONS_OVERALL_DUNGEONBOSS_DESC"] = "Dungeon encounters are added to overall data." + Loc ["STRING_OPTIONS_OVERALL_DUNGEONCLEAN"] = "Dungeon Cleanups" + Loc ["STRING_OPTIONS_OVERALL_DUNGEONCLEAN_DESC"] = "Dungeon cleanups are added to overall data." + Loc ["STRING_OPTIONS_OVERALL_ALL"] = "Everything" + Loc ["STRING_OPTIONS_OVERALL_ALL_DESC"] = "All segments are added to overall data." + + Loc ["STRING_OPTIONS_OVERALL_NEWBOSS"] = "Clear On New Boss" + Loc ["STRING_OPTIONS_OVERALL_NEWBOSS_DESC"] = "When enabled, overall data is automatically wiped when facing a different raid boss." + + Loc ["STRING_OPTIONS_OVERALL_CHALLENGE"] = "Clear On Challenge Mode" + Loc ["STRING_OPTIONS_OVERALL_CHALLENGE_DESC"] = "When enabled, overall data is automatically wiped when a new challenge mode run begins." + -- options window Row General Settings ~4 Loc ["STRING_OPTIONS_BARS"] = "Bar General Settings" diff --git a/locales/Details-ptBR.lua b/locales/Details-ptBR.lua index a2bf319b..fbeec514 100644 --- a/locales/Details-ptBR.lua +++ b/locales/Details-ptBR.lua @@ -3,7 +3,7 @@ if not Loc then return end -------------------------------------------------------------------------------------------------------------------------------------------- - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v1.14.5 - 1.14.6\n\n|cFFFFFF00-|r Added option for lock segments display, so, when a segment is chosen, the other windows also change it.\n\n|cFFFFFF00-|r Added option for show the total amount of spells, targets and pets in tooltips.\n\n|cFFFFFF00-|r Finished another revamp on options panel.\n\n|cFFFFFF00-|r Now its possible open more then 1 Raid Plugins at once on diferent windows.\n\n|cFFFFFF00-|r Added a large text editor for make changes on custom texts.\n\n|cFFFFFF00-|r Added new option for enable borders on the bars.\n\n|cFFFFFF00-|r Added Death Barrier as a absorb spell.\n\n|cFFFFFF00-|r Fixed a bug on overheal tooltip where was showing the Hps instead of overheal.\n\n|cFFFFFF00v1.14.0 - v1.14.0b - v1.14.1\n\n|cFFFFFF00-|r Emergencial fix for crash after creating test bars and logoff.\n\n|cFFFFFF00-|r Fixed the default background alpha on default skin.\n\n|cFFFFFF00-|r Added spacing option under row settings for control the gap between bars.\n\n|cFFFFFF00-|r Added a new tab on options panel for tooltip configuration.\n\n|cFFFFFF00-|r Added a new tab on options panel for broker config.\n\n|cFFFFFF00-|r Added new abbreviation method called comma.\n\n|cFFFFFF00-|r All instances now have a delete button.\n\n|cFFFFFF00-|r Full re-write on the instance, delete and close buttons.\n\n|cFFFFFF00-|r HotCorners now sort icons according with most used.\n\n|cFFFFFF00-|r Few changes on all skins in order to fit on the new right menu buttons.\n\n|cFFFFFF00-|r Added Horde avatars.\n\n|cFFFFFF00-|r Fixed issue where shortcut panel shows below thw windows when its in Dialog strata.\n\n|cFFFFFF00v1.13.8 - v1.13.8a\n\n|cFFFFFF00-|r Fixed issue with Vanguard where it wasn't showing debuffs stacks on the tanks if you are a healer os dps.\n\n|cFFFFFF00-|r Added option for put stretch button on the fullscreen strata which makes it always on top of others frames.\n\n|cFFFFFF00-|r Added background and dialog stratas.\n\n|cFFFFFF00-|r Added option for percentage: follow the combat totals or the first player total.\n\n|cFFFFFF00-|r Added option for show or hide the left buttons on menu bar.\n\n|cFFFFFF00-|r Added option for change the left buttons size in the menu bar.\n\n|cFFFFFF00-|r Added option for delete a instance.\n\n|cFFFFFF00-|r Instance Segment Mini display now is more accuracy about telling the enemy in the segment.\n\n|cFFFFFF00-|r Player Details Window now show all pet abilities instead of just the total pet damage.\n\n|cFFFFFF00-|r Rework done on report texts, now the title is more shorter and also format Dps and Hps numbers.\n\n|cFFFFFF00-|r Simple Gray and again ElvUI skins got some rework.\n\n|cFFFFFF00-|r Lib HotCorner now is data broker based and shows up all broker plugins in the bar.\n\n|cFFFFFF00v1.13.5 / v1.13.5a|r\n\n|cFFFFFF00-|r Added keybinds to reset segments and scroll up/down.\n\n|cFFFFFF00-|r Added Spell Customization options where icon and the name of a spell can be changed.\n\n|cFFFFFF00-|r Added option to change the micro displays side, now it can be shown on the window top side.\n\n|cFFFFFF00-|r Micro Displays, also, should now give less problems and be more dynamic.\n\n|cFFFFFF00-|r Added Spell Customization options where icon and the name of a spell can be changed.\n\n|cFFFFFF00-|r Added option to change the micro displays side, now it can be shown on the window top side.\n\n|cFFFFFF00-|r Added options to change the transparency when out of combat and out of a group.\n\n|cFFFFFF00-|r Added and Still under development the panel for create data captures for charts.\n\n|cFFFFFF00-|r Fixed a issue with flat skin where the close button was just too big.\n\n|cFFFFFF00v1.13.0|r\n\n|cFFFFFF00-|r Added four more abbreviation types.\n\n|cFFFFFF00-|r Fixed issue where the instance menu wasnt respecting the amount limit of instances.\n\n|cFFFFFF00-|r Added options for cutomize the right text of a row.\n\n|cFFFFFF00-|r Added a option to be able to chance the framestrata of an window.\n\n|cFFFFFF00-|r Added shift, ctrl, alt interaction for rows which shows all spells, targets or pets when pressed.\n\n|cFFFFFF00-|r Fixed a issue where changing the alpha of a window makes it disappear on the next logon.\n\n|cFFFFFF00-|r Added a option for auto transparency to ignore rows.\n\n|cFFFFFF00-|r Added option to be able to set shadow on the attribute text.\n\n|cFFFFFF00-|r Fixed a issue with window snap where disabled statusbar makes a gap between the windows.\n\n|cFFFFFF00-|r Added a hidden menu on the top left corner (experimental).\n\n|cFFFFFF00v1.12.3|r\n\n|cFFFFFF00-|r - Fixed 'Healing Per Second' which wasn't working at all.\n\n|cFFFFFF00-|r - Fixed the percent amount for target of damage done where sometimes it pass 100%.\n\n|cFFFFFF00-|r - Changes on Skins: Minimalistic and Elm UI Frame Style. Its necessary re-apply.\n\n|cFFFFFF00-|r - Added more cooldowns and spells for Monk tank over avoidance panel.\n\n|cFFFFFF00-|r - Player avatar now is also shown on the Player Details window.\n\n|cFFFFFF00-|r - Leaving empty the the icon file box, make details use no icons on bars.\n\n|cFFFFFF00-|r - Added new feature: Auto Transparency, hide or show menus, statusbar and borders when mouse enter or leaves the window.\n\n|cFFFFFF00-|r - Added new feature: Attribute Text, shows on the toolbar or statusbar the current attribute shown.\n\n|cFFFFFF00-|r - Added new fueature: Auto Hide Menu, which hide or show the menus when mouse enter or leaves the window.\n\n|cFFFFFF00-|r - Image Editor now can Flip the image without messing with the crop.\n\n|cFFFFFF00v1.12.0|r\n\n|cFFFFFF00-|r Added support to Profiles, now you can share the same config between two or more characters.\n\n|cFFFFFF00-|r - Options window now can be opened while in combat without triggering 'script ran too long' error.\n\n|cFFFFFF00-|r Added support for BattleTag friends over report window.\n\n|cFFFFFF00-|r Added pet threat to Tiny Threat plugin when out of a party or raid group.\n\n|cFFFFFF00-|r Fixed a issue with close button where it disappear without close the window when toolbar is in bottom side.\n\n|cFFFFFF00-|r Also fixed a issue where swapping toolbar positioning was sometimes making close button disappear.\n\n|cFFFFFF00-|r Fixed a problem opening options panel through minimap when there is no window opened.\n\n|cFFFFFF00v1.11.10|r\n\n|cFFFFFF00-|r Accuracy with warcraftlogs.com now is very high and okey with worldoflogs.com. Make sure the option |cFFFFDD00Time Measure|r under General Settings -> Combat is set to |cFFFFDD00Effective Time|r.\n\n|cFFFFFF00-|r Options Window has been revamped, again.\n\n|cFFFFFF00-|r Added a option for change the class icons.\n\n|cFFFFFF00-|r Added options for show Total Bar and configure it.\n\n|cFFFFFF00-|r Added a option for save a Standard Skin, new windows opened use this skin.\n\n|cFFFFFF00-|r Added a new skin: ElvUI Frame Style." + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v1.15.0: (test version) Dungeons e Overall data.\n\n|cFFFFFF00-|r Implemented a early support for Dungeons.\n\n|cFFFFFF00-|r Implemented Overall Data. Options for it are under combat tab.\n\n|cFFFFFF00-|r Implemented spell targets on Player Details Window.\n\n|cFFFFFF00v1.14.5 - 1.14.6\n\n|cFFFFFF00-|r Added option for lock segments display, so, when a segment is chosen, the other windows also change it.\n\n|cFFFFFF00-|r Added option for show the total amount of spells, targets and pets in tooltips.\n\n|cFFFFFF00-|r Finished another revamp on options panel.\n\n|cFFFFFF00-|r Now its possible open more then 1 Raid Plugins at once on diferent windows.\n\n|cFFFFFF00-|r Added a large text editor for make changes on custom texts.\n\n|cFFFFFF00-|r Added new option for enable borders on the bars.\n\n|cFFFFFF00-|r Added Death Barrier as a absorb spell.\n\n|cFFFFFF00-|r Fixed a bug on overheal tooltip where was showing the Hps instead of overheal.\n\n|cFFFFFF00v1.14.0 - v1.14.0b - v1.14.1\n\n|cFFFFFF00-|r Emergencial fix for crash after creating test bars and logoff.\n\n|cFFFFFF00-|r Fixed the default background alpha on default skin.\n\n|cFFFFFF00-|r Added spacing option under row settings for control the gap between bars.\n\n|cFFFFFF00-|r Added a new tab on options panel for tooltip configuration.\n\n|cFFFFFF00-|r Added a new tab on options panel for broker config.\n\n|cFFFFFF00-|r Added new abbreviation method called comma.\n\n|cFFFFFF00-|r All instances now have a delete button.\n\n|cFFFFFF00-|r Full re-write on the instance, delete and close buttons.\n\n|cFFFFFF00-|r HotCorners now sort icons according with most used.\n\n|cFFFFFF00-|r Few changes on all skins in order to fit on the new right menu buttons.\n\n|cFFFFFF00-|r Added Horde avatars.\n\n|cFFFFFF00-|r Fixed issue where shortcut panel shows below thw windows when its in Dialog strata.\n\n|cFFFFFF00v1.13.8 - v1.13.8a\n\n|cFFFFFF00-|r Fixed issue with Vanguard where it wasn't showing debuffs stacks on the tanks if you are a healer os dps.\n\n|cFFFFFF00-|r Added option for put stretch button on the fullscreen strata which makes it always on top of others frames.\n\n|cFFFFFF00-|r Added background and dialog stratas.\n\n|cFFFFFF00-|r Added option for percentage: follow the combat totals or the first player total.\n\n|cFFFFFF00-|r Added option for show or hide the left buttons on menu bar.\n\n|cFFFFFF00-|r Added option for change the left buttons size in the menu bar.\n\n|cFFFFFF00-|r Added option for delete a instance.\n\n|cFFFFFF00-|r Instance Segment Mini display now is more accuracy about telling the enemy in the segment.\n\n|cFFFFFF00-|r Player Details Window now show all pet abilities instead of just the total pet damage.\n\n|cFFFFFF00-|r Rework done on report texts, now the title is more shorter and also format Dps and Hps numbers.\n\n|cFFFFFF00-|r Simple Gray and again ElvUI skins got some rework.\n\n|cFFFFFF00-|r Lib HotCorner now is data broker based and shows up all broker plugins in the bar.\n\n|cFFFFFF00v1.13.5 / v1.13.5a|r\n\n|cFFFFFF00-|r Added keybinds to reset segments and scroll up/down.\n\n|cFFFFFF00-|r Added Spell Customization options where icon and the name of a spell can be changed.\n\n|cFFFFFF00-|r Added option to change the micro displays side, now it can be shown on the window top side.\n\n|cFFFFFF00-|r Micro Displays, also, should now give less problems and be more dynamic.\n\n|cFFFFFF00-|r Added Spell Customization options where icon and the name of a spell can be changed.\n\n|cFFFFFF00-|r Added option to change the micro displays side, now it can be shown on the window top side.\n\n|cFFFFFF00-|r Added options to change the transparency when out of combat and out of a group.\n\n|cFFFFFF00-|r Added and Still under development the panel for create data captures for charts.\n\n|cFFFFFF00-|r Fixed a issue with flat skin where the close button was just too big.\n\n|cFFFFFF00v1.13.0|r\n\n|cFFFFFF00-|r Added four more abbreviation types.\n\n|cFFFFFF00-|r Fixed issue where the instance menu wasnt respecting the amount limit of instances.\n\n|cFFFFFF00-|r Added options for cutomize the right text of a row.\n\n|cFFFFFF00-|r Added a option to be able to chance the framestrata of an window.\n\n|cFFFFFF00-|r Added shift, ctrl, alt interaction for rows which shows all spells, targets or pets when pressed.\n\n|cFFFFFF00-|r Fixed a issue where changing the alpha of a window makes it disappear on the next logon.\n\n|cFFFFFF00-|r Added a option for auto transparency to ignore rows.\n\n|cFFFFFF00-|r Added option to be able to set shadow on the attribute text.\n\n|cFFFFFF00-|r Fixed a issue with window snap where disabled statusbar makes a gap between the windows.\n\n|cFFFFFF00-|r Added a hidden menu on the top left corner (experimental).\n\n|cFFFFFF00v1.12.3|r\n\n|cFFFFFF00-|r - Fixed 'Healing Per Second' which wasn't working at all.\n\n|cFFFFFF00-|r - Fixed the percent amount for target of damage done where sometimes it pass 100%.\n\n|cFFFFFF00-|r - Changes on Skins: Minimalistic and Elm UI Frame Style. Its necessary re-apply.\n\n|cFFFFFF00-|r - Added more cooldowns and spells for Monk tank over avoidance panel.\n\n|cFFFFFF00-|r - Player avatar now is also shown on the Player Details window.\n\n|cFFFFFF00-|r - Leaving empty the the icon file box, make details use no icons on bars.\n\n|cFFFFFF00-|r - Added new feature: Auto Transparency, hide or show menus, statusbar and borders when mouse enter or leaves the window.\n\n|cFFFFFF00-|r - Added new feature: Attribute Text, shows on the toolbar or statusbar the current attribute shown.\n\n|cFFFFFF00-|r - Added new fueature: Auto Hide Menu, which hide or show the menus when mouse enter or leaves the window.\n\n|cFFFFFF00-|r - Image Editor now can Flip the image without messing with the crop.\n\n|cFFFFFF00v1.12.0|r\n\n|cFFFFFF00-|r Added support to Profiles, now you can share the same config between two or more characters.\n\n|cFFFFFF00-|r - Options window now can be opened while in combat without triggering 'script ran too long' error.\n\n|cFFFFFF00-|r Added support for BattleTag friends over report window.\n\n|cFFFFFF00-|r Added pet threat to Tiny Threat plugin when out of a party or raid group.\n\n|cFFFFFF00-|r Fixed a issue with close button where it disappear without close the window when toolbar is in bottom side.\n\n|cFFFFFF00-|r Also fixed a issue where swapping toolbar positioning was sometimes making close button disappear.\n\n|cFFFFFF00-|r Fixed a problem opening options panel through minimap when there is no window opened.\n\n|cFFFFFF00v1.11.10|r\n\n|cFFFFFF00-|r Accuracy with warcraftlogs.com now is very high and okey with worldoflogs.com. Make sure the option |cFFFFDD00Time Measure|r under General Settings -> Combat is set to |cFFFFDD00Effective Time|r.\n\n|cFFFFFF00-|r Options Window has been revamped, again.\n\n|cFFFFFF00-|r Added a option for change the class icons.\n\n|cFFFFFF00-|r Added options for show Total Bar and configure it.\n\n|cFFFFFF00-|r Added a option for save a Standard Skin, new windows opened use this skin.\n\n|cFFFFFF00-|r Added a new skin: ElvUI Frame Style." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetalhes:|r " --> color and details name diff --git a/plugins/Details_DungeonInfo-Pandaria/Details_DungeonInfo-Pandaria.lua b/plugins/Details_DungeonInfo-Pandaria/Details_DungeonInfo-Pandaria.lua new file mode 100644 index 00000000..ef08097b --- /dev/null +++ b/plugins/Details_DungeonInfo-Pandaria/Details_DungeonInfo-Pandaria.lua @@ -0,0 +1,361 @@ + +local MoguShanPalace = { + + id = 994, + ej_id = 321, + + name = "Mogu'Shan Palace", + + boss_names = { + "Trial of the King", + "Gekkan", + "Xin the Weaponmaster", + }, + + boss_ids = { + + --debug + --[61945] = 2, + + [61445] = 1, --haiayn + [61442] = 1, --kuai + [61453] = 1, --mushiba + [61444] = 1, --ming + --[61337] = 2, --ironhide + --[61340] = 2, --hexxer + --[61339] = 2, --oracle + [61243] = 2, --gekkan + --[61338] = 2, --skulker + [61398] = 3, --xin + }, + + encounters = { + [1] = { + boss = "Trial of the King", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Ming the Cunning]], + }, + [2] = { + boss = "Gekkan", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Gekkan]], + }, + [3] = { + boss = "Xin the Weaponmaster", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Xin the Weaponmaster]], + }, + }, + +} +_detalhes:InstallEncounter (MoguShanPalace) + +local TempleOfJadeSerpent = { + + id = 960, + ej_id = 313, + + name = "Temple of the Jade Serpent", + + boss_names = { + "Wise Mari", + "Lorewalker Stonestep", + "Liu Flameheart", + "Sha of Doubt", + }, + + boss_ids = { + [56448] = 1, --wise mary + [56843] = 2, --lorewalker stonestep + [59051] = 2, --strife + [59726] = 2, --peril + [56872] = 2, --osong + [56732] = 3, --liu framehearth + [56762] = 3, --yulon + [56439] = 4, --sha of doubt + [56792] = 4, --add + }, + + encounters = { + [1] = { + boss = "Wise Mari", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Wise Mari]], + }, + [2] = { + boss = "Lorewalker Stonestep", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Lorewalker Stonestep]], + }, + [3] = { + boss = "Liu Flameheart", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Liu Flameheart]], + }, + [4] = { + boss = "Sha of Doubt", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Sha of Doubt]], + }, + }, +} + +_detalhes:InstallEncounter (TempleOfJadeSerpent) + +local StormsStoutBrewery = { + + id = 961, + ej_id = 302, + + name = "Stormstout Brewery", + boss_names = { + "Ook-Ook", + "Hoptallus", + "Yan-Zhu the Uncasked", + }, + + boss_ids = { + [56637] = 1, --ook-ook + [56717] = 2, --hoptallus + [59479] = 3, --yan-zhu + }, + + encounters = { + [1] = { + boss = "Ook-Ook", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Ook Ook]], + }, + [2] = { + boss = "Hoptallus", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Hoptallus]], + }, + [3] = { + boss = "Yan-Zhu the Uncasked", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Yan Zhu the Uncasked]], + }, + }, +} + +_detalhes:InstallEncounter (StormsStoutBrewery) + +local ScarletHalls = { + + id = 1001, + name = "Scarlet Halls", + boss_names = { + "Houndmaster Braun", + "Armsmaster Harlan", + "Flameweaver Koegler", + }, + + boss_ids = { + [0] = 1, -- + [0] = 2, -- + [0] = 3, -- + }, + + encounters = { + [1] = { + boss = "Houndmaster Braun", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Houndmaster Braun]], + }, + [2] = { + boss = "Armsmaster Harlan", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Armsmaster Harlan]], + }, + [3] = { + boss = "Flameweaver Koegler", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Flameweaver Koegler]], + }, + }, +} + +_detalhes:InstallEncounter (ScarletHalls) + +local ShadoPanMonastery = { + + id = 959, + name = "Shado-Pan Monastery", + boss_names = { + "Gu Cloudstrike", + "Master Snowdrift", + "Sha of Violence", + "Taran Zhu", + }, + + boss_ids = { + [0] = 1, -- + [0] = 2, -- + [0] = 3, -- + }, + + encounters = { + [1] = { + boss = "Gu Cloudstrike", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Gu Cloudstrike]], + }, + [2] = { + boss = "Master Snowdrift", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Master Snowdrift]], + }, + [3] = { + boss = "Sha of Violence", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Sha of Violence]], + }, + [4] = { + boss = "Taran Zhu", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Taran Zhu]], + }, + }, +} + +_detalhes:InstallEncounter (ShadoPanMonastery) + +local ScarletMonastery = { + + id = 1004, + name = "Scarlet Monastery", + boss_names = { + "Thalnos the Soulrender", + "Brother Korloff", + "High Inquisitor Whitemane", + }, + + boss_ids = { + [0] = 1, -- + [0] = 2, -- + [0] = 3, -- + }, + + encounters = { + [1] = { + boss = "Thalnos the Soulrender", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Thalnos the Soulrender]], + }, + [2] = { + boss = "Brother Korloff", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Brother Korloff]], + }, + [3] = { + boss = "High Inquisitor Whitemane", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-High Inquisitor Whitemane]], + }, + }, +} + +_detalhes:InstallEncounter (ScarletMonastery) + +local SiegeOfNiuzaoTemple = { + + id = 1011, + name = "Siege of Niuzao Temple", + boss_names = { + "Vizier Jin'bak", + "Commander Vo'jak", + "General Pa'valak", + "Wing Leader Ner'onok", + }, + + boss_ids = { + [0] = 1, -- + [0] = 2, -- + [0] = 3, -- + }, + + encounters = { + [1] = { + boss = "Vizier Jin'bak", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Vizier Jinbak]], + }, + [2] = { + boss = "Commander Vo'jak", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Commander Vojak]], + }, + [3] = { + boss = "General Pa'valak", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-General Pavalak]], + }, + [4] = { + boss = "Wing Leader Ner'onok", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Wing Leader Neronok]], + }, + }, +} + +_detalhes:InstallEncounter (SiegeOfNiuzaoTemple) + +local GateOfSettingSun = { + + id = 962, + name = "Gate of the Setting Sun", + boss_names = { + "Saboteur Kip'tilak", + "Striker Ga'dok", + "Commander Ri'mok", + "Raigonn", + }, + + boss_ids = { + [0] = 1, -- + [0] = 2, -- + [0] = 3, -- + }, + + encounters = { + [1] = { + boss = "Saboteur Kip'tilak", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Saboteur Kiptilak]], + }, + [2] = { + boss = "Striker Ga'dok", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Striker Gadok]], + }, + [3] = { + boss = "Commander Ri'mok", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Commander Rimok]], + }, + [4] = { + boss = "Raigonn", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Raigonn]], + }, + }, +} + +_detalhes:InstallEncounter (GateOfSettingSun) + +local Scholomance = { + + id = 1007, + name = "Scholomance", + boss_names = { + "Instructor Chillheart", + "Jandice Barov", + "Rattlegore", + "Lilian Voss", + "Darkmaster Gandling", + }, + + boss_ids = { + [0] = 1, -- + [0] = 2, -- + [0] = 3, -- + }, + + encounters = { + [1] = { + boss = "Instructor Chillheart", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Instructor Chillheart]], + }, + [2] = { + boss = "Jandice Barov", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Jandice Barov]], + }, + [3] = { + boss = "Rattlegore", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Rattlegore]], + }, + [4] = { + boss = "Lilian Voss", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Lillian Voss]], + }, + [5] = { + boss = "Darkmaster Gandling", + portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Darkmaster Gandling]], + }, + }, +} + +_detalhes:InstallEncounter (Scholomance) diff --git a/plugins/Details_DungeonInfo-Pandaria/Details_DungeonInfo-Pandaria.toc b/plugins/Details_DungeonInfo-Pandaria/Details_DungeonInfo-Pandaria.toc new file mode 100644 index 00000000..a549a3ac --- /dev/null +++ b/plugins/Details_DungeonInfo-Pandaria/Details_DungeonInfo-Pandaria.toc @@ -0,0 +1,6 @@ +## Interface: 50400 +## Title: Details: Mists of Pandaria Dungeons +## Notes: Plugin for Details +## RequiredDeps: Details + +Details_DungeonInfo-Pandaria.lua \ No newline at end of file diff --git a/startup.lua b/startup.lua index c0656a02..2fee69d0 100644 --- a/startup.lua +++ b/startup.lua @@ -63,6 +63,8 @@ function _G._detalhes:Start() --cc breaks, ress, interrupts, dispells, deaths self.row_singleclick_overwrite [4] = {true, true, true, true, self.atributo_misc.ReportSingleDeadLine, self.atributo_misc.ReportSingleCooldownLine, self.atributo_misc.ReportSingleBuffUptimeLine, self.atributo_misc.ReportSingleDebuffUptimeLine} + self.click_to_report_color = {1, 0.8, 0, 1} + --self.click_to_report_color = {0, 1, 0, 1} ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> initialize @@ -187,7 +189,9 @@ function _G._detalhes:Start() --> start garbage collector self.ultima_coleta = 0 self.intervalo_coleta = 720 + --self.intervalo_coleta = 10 self.intervalo_memoria = 180 + --self.intervalo_memoria = 20 self.garbagecollect = self:ScheduleRepeatingTimer ("IniciarColetaDeLixo", self.intervalo_coleta) self.memorycleanup = self:ScheduleRepeatingTimer ("CheckMemoryPeriodically", self.intervalo_memoria) self.next_memory_check = time()+self.intervalo_memoria @@ -342,11 +346,11 @@ function _G._detalhes:Start() end - --_detalhes:OpenWelcomeWindow() + -- _detalhes:OpenWelcomeWindow() - --desligado por preocaução - if (self.tutorial.logons < 2) then - --self:StartTutorial() + --desligado por precaução + if (self.tutorial.logons < 2 and self.is_first_run) then + self:StartTutorial() end --> feedback trhead