diff --git a/boot.lua b/boot.lua index b9bea979..3fec9c3e 100644 --- a/boot.lua +++ b/boot.lua @@ -8,7 +8,7 @@ _ = nil _detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0", "LibHotCorners") - _detalhes.userversion = "v1.15.3a" --tirar guardian of ancient kingss + _detalhes.userversion = "v1.15.3b" --tirar guardian of ancient kingss _detalhes.version = "Alpha 019" _detalhes.realversion = 19 @@ -40,8 +40,6 @@ do _detalhes.refresh = {} --> armazena as funções para limpar e guardas os dados - Metatable functions _detalhes.clear = {} - --> armazena as fontstring usadas no addon - Store labels (fontstrings) - _detalhes.font_pool = {} --> armazena a config do painel de fast switch _detalhes.switch = {} --> armazena os estilos salvos @@ -127,6 +125,7 @@ do all = 3, --> Everything raid = 4 --> Raid } + --[[ _detalhes.flags = { --> Player and Pet player = 0x00000001,--> player character @@ -141,7 +140,7 @@ do neutral = 0x00000020,--> neutral enemy = 0x00000040--> enemy } - + --]] _detalhes.divisores = { abre = "(", --> open fecha = ")", --> close diff --git a/classes/classe_combate.lua b/classes/classe_combate.lua index f5d99b1e..608adfe6 100644 --- a/classes/classe_combate.lua +++ b/classes/classe_combate.lua @@ -1,415 +1,380 @@ ---[[ --------Details! Addon --------Class Combat - -------This file control combat class. A combat is a object wich hold combat attributes. - -------The numeric part of table is compost by 4 indexes: [1] damage, [2] heal, [3] energies and [4] misc -]] +-- combat class object -local _detalhes = _G._detalhes - ---shortcuts -local combate = _detalhes.combate -local container_combatentes = _detalhes.container_combatentes - ---flags -local REACTION_HOSTILE = 0x00000040 -local CONTROL_PLAYER = 0x00000100 - ---locals -local _setmetatable = setmetatable --> lua api -local _ipairs = ipairs --> lua api -local _pairs = pairs --> lua api -local _bit_band = bit.band --> lua api -local _date = date --> lua api -local _table_remove = table.remove - ---time hold -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. - combatTable ( index, actorName ) - index: container number [1] damage, [2] heal, [3] energies and [4] misc - actorName: name of an actor (player, npc, pet, etc) --]] - -_detalhes.call_combate = function (self, class_type, name) - local container = self[class_type] - local index_mapa = container._NameIndexTable [name] - local actor = container._ActorTable [index_mapa] - return actor -end - -combate.__call = _detalhes.call_combate - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - ---[[ Class Constructor ]] -function combate:NovaTabela (iniciada, _tabela_overall, combatId, ...) - - local esta_tabela = {true, true, true, true, true} - - esta_tabela [1] = container_combatentes:NovoContainer (_detalhes.container_type.CONTAINER_DAMAGE_CLASS, esta_tabela, combatId) --> Damage - esta_tabela [2] = container_combatentes:NovoContainer (_detalhes.container_type.CONTAINER_HEAL_CLASS, esta_tabela, combatId) --> Healing - esta_tabela [3] = container_combatentes:NovoContainer (_detalhes.container_type.CONTAINER_ENERGY_CLASS, esta_tabela, combatId) --> Energies - esta_tabela [4] = container_combatentes:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS, esta_tabela, combatId) --> Misc - esta_tabela [5] = container_combatentes:NovoContainer (_detalhes.container_type.CONTAINER_DAMAGE_CLASS, esta_tabela, combatId) --> place holder for customs - - _setmetatable (esta_tabela, combate) - - --> try discover if is a pvp combat - local who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags = ... - if (who_serial) then --> aqui irá identificar o boss ou o oponente - if (alvo_name and _bit_band (alvo_flags, REACTION_HOSTILE) ~= 0) then --> tentando pegar o inimigo pelo alvo - esta_tabela.contra = alvo_name - if (_bit_band (alvo_flags, CONTROL_PLAYER) ~= 0) then - esta_tabela.pvp = true --> o alvo é da facção oposta ou foi dado mind control - end - elseif (who_name and _bit_band (who_flags, REACTION_HOSTILE) ~= 0) then --> tentando pegar o inimigo pelo who caso o mob é quem deu o primeiro hit - esta_tabela.contra = who_name - if (_bit_band (who_flags, CONTROL_PLAYER) ~= 0) then - esta_tabela.pvp = true --> o who é da facção oposta ou foi dado mind control - end - else - esta_tabela.pvp = true --> se ambos são friendly, seria isso um PVP entre jogadores da mesma facções? - end - end - - --> start/end time (duration) - esta_tabela.data_fim = 0 - esta_tabela.data_inicio = 0 - - --> record last event before dead - esta_tabela.last_events_tables = {} - - --> frags - esta_tabela.frags = {} - esta_tabela.frags_need_refresh = false - - --> time data container - esta_tabela.TimeData = _detalhes:TimeDataCreateCombatTables() - - --> Skill cache (not used) - esta_tabela.CombatSkillCache = {} - - -- a tabela sem o tempo de inicio é a tabela descartavel do inicio do addon - if (iniciada) then - esta_tabela.start_time = _tempo - esta_tabela.end_time = nil - else - esta_tabela.start_time = 0 - esta_tabela.end_time = nil - end - - -- o container irá armazenar as classes de dano -- cria um novo container de indexes de seriais de jogadores --parâmetro 1 classe armazenada no container, parâmetro 2 = flag da classe - esta_tabela[1].need_refresh = true - esta_tabela[2].need_refresh = true - esta_tabela[3].need_refresh = true - esta_tabela[4].need_refresh = true - esta_tabela[5].need_refresh = true - - if (_tabela_overall) then --> link é a tabela de combate do overall - esta_tabela[1].shadow = _tabela_overall[1] --> diz ao objeto qual a shadow dele na tabela overall - esta_tabela[2].shadow = _tabela_overall[2] --> diz ao objeto qual a shadow dele na tabela overall - esta_tabela[3].shadow = _tabela_overall[3] --> diz ao objeto qual a shadow dele na tabela overall - esta_tabela[4].shadow = _tabela_overall[4] --> diz ao objeto qual a shadow dele na tabela overall - end - - -- abriga a tabela contendo o total de cada atributo - -- esta_tabela.barra_total = barra_total:NovaBarra() - --> barra total movido para um simples membro do combate: - esta_tabela.totals = { - 0, --> dano - 0, --> cura - {--> e_energy - mana = 0, --> mana - e_rage = 0, --> rage - e_energy = 0, --> energy (rogues cat) - runepower = 0 --> runepower (dk) - }, - {--> misc - cc_break = 0, --> armazena quantas quebras de CC - ress = 0, --> armazena quantos pessoas ele reviveu - interrupt = 0, --> armazena quantos interrupt a pessoa deu - dispell = 0, --> armazena quantos dispell esta pessoa recebeu - dead = 0, --> armazena quantas vezes essa pessia morreu - cooldowns_defensive = 0, --> armazena quantos cooldowns a raid usou - buff_uptime = 0, --> armazena quantos cooldowns a raid usou - debuff_uptime = 0 --> armazena quantos cooldowns a raid usou - } - } - - esta_tabela.totals_grupo = { - 0, --> dano - 0, --> cura - {--> e_energy - mana = 0, --> mana - e_rage = 0, --> rage - e_energy = 0, --> energy (rogues cat) - runepower = 0 --> runepower (dk) - }, - {--> misc - cc_break = 0, --> armazena quantas quebras de CC - ress = 0, --> armazena quantos pessoas ele reviveu - interrupt = 0, --> armazena quantos interrupt a pessoa deu - dispell = 0, --> armazena quantos dispell esta pessoa recebeu - dead = 0, --> armazena quantas vezes essa oessia morreu - cooldowns_defensive = 0, --> armazena quantos cooldowns a raid usou - buff_uptime = 0, - debuff_uptime = 0 - } - } - - return esta_tabela -end - -function combate:GetTimeData (name) - - return self.TimeData [name] - -end - -function combate:TravarTempos() - --é necessário travar o tempo em todos os atributos do combate. - - if (self [1]) then - for _, jogador in _ipairs (self [1]._ActorTable) do --> damage - if (jogador:Iniciar()) then -- retorna se ele esta com o dps ativo - jogador:TerminarTempo() - jogador:Iniciar (false) --trava o dps do jogador - --jogador.last_events_table = _detalhes:CreateActorLastEventTable() - end - end - else - --print ("combat [1] doesn't exist.") - end - if (self [2]) then - for _, jogador in _ipairs (self [2]._ActorTable) do --> healing - if (jogador:Iniciar()) then -- retorna se ele esta com o dps ativo - jogador:TerminarTempo() - jogador:Iniciar (false) --trava o dps do jogador - --print ("travando o tempo de",jogador.nome, jogador.end_time) - --jogador.last_events_table = _detalhes:CreateActorLastEventTable() - end - end - else - --print ("combat [2] doesn't exist.") - end -end - -function combate:UltimaAcao (tempo) - if (tempo) then - self.last_event = tempo - else - return self.last_event - end -end - -function combate:GetDate() - return self.data_inicio, self.data_fim -end - -function combate:seta_data (tipo) - if (tipo == _detalhes._detalhes_props.DATA_TYPE_START) then - self.data_inicio = _date ("%H:%M:%S") - elseif (tipo == _detalhes._detalhes_props.DATA_TYPE_END) then - self.data_fim = _date ("%H:%M:%S") - end -end - -function combate:GetCombatName (try_find) - if (self.is_pvp) then - return self.is_pvp.name - - elseif (self.is_boss) then - return self.is_boss.encounter - - elseif (self.is_tras) then - return Loc ["STRING_SEGMENT_TRASH"] - - else - if (self.enemy) then - return self.enemy - end - - if (try_find) then - return _detalhes:FindEnemy() - end - - end - - return Loc ["STRING_UNKNOW"] -end - -function combate:GetActorList (container) - return self [container]._ActorTable -end - -function combate:GetCombatTime() - if (self.end_time) then - --print ("tem end time") - return self.end_time - self.start_time - elseif (self.start_time and _detalhes.in_combat) then - --print ("tem start time e esta em combate") - return _tempo - self.start_time - else - --print ("retornando zero") - return 0 - end -end + local _detalhes = _G._detalhes + local _ --[[global]] DETAILS_TOTALS_ONLYGROUP = true -function combate:GetTotal (attribute, subAttribute, onlyGroup) - if (attribute == 1 or attribute == 2) then - if (onlyGroup) then - return self.totals_grupo [attribute] - else - return self.totals [attribute] - end - - elseif (attribute == 3 or attribute == 4) then - local subName = _detalhes:GetInternalSubAttributeName (attribute, subAttribute) - if (onlyGroup) then - return self.totals_grupo [attribute] [subName] - else - return self.totals [attribute] [subName] - end +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> local pointers + + local _setmetatable = setmetatable -- lua local + local _ipairs = ipairs -- lua local + local _pairs = pairs -- lua local + local _bit_band = bit.band -- lua local + local _date = date -- lua local + local _table_remove = table.remove -- lua local + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> constants + + local combate = _detalhes.combate + local container_combatentes = _detalhes.container_combatentes + 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 + + local REACTION_HOSTILE = 0x00000040 + local CONTROL_PLAYER = 0x00000100 + + local _tempo = time() + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> api functions + + --combat (container type, actor name) + _detalhes.call_combate = function (self, class_type, name) + local container = self[class_type] + local index_mapa = container._NameIndexTable [name] + local actor = container._ActorTable [index_mapa] + return actor end - return 0 -end + combate.__call = _detalhes.call_combate -function combate:seta_tempo_decorrido() - self.end_time = _tempo -end - -function _detalhes.refresh:r_combate (tabela_combate, shadow) - _setmetatable (tabela_combate, _detalhes.combate) - tabela_combate.__index = _detalhes.combate - tabela_combate.shadow = shadow -end - -function _detalhes.clear:c_combate (tabela_combate) - --tabela_combate.__index = {} - tabela_combate.__index = nil - tabela_combate.__call = {} - tabela_combate._combat_table = nil - tabela_combate.shadow = nil -end - -combate.__sub = function (combate1, combate2) - - if (combate1 ~= _detalhes.tabela_overall) then - return + --get the start date and end date + function combate:GetDate() + return self.data_inicio, self.data_fim end - - --> sub 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_T2:subtract_total (combate1) - end - combate1 [1].need_refresh = true - - --> sub 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_T2:subtract_total (combate1) - end - combate1 [2].need_refresh = true - - --> sub 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_T2:subtract_total (combate1) - end - combate1 [3].need_refresh = true - - --> sub 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_T2:subtract_total (combate1) - end - combate1 [4].need_refresh = true - - --> reduz o tempo - combate1.start_time = combate1.start_time + (combate2.end_time - combate2.start_time) - - --> apaga as mortes da luta diminuida - local amt_mortes = #combate2.last_events_tables --> quantas mortes teve nessa luta - if (amt_mortes > 0) then - for i = #combate1.last_events_tables, #combate1.last_events_tables-amt_mortes, -1 do - _table_remove (combate1.last_events_tables, #combate1.last_events_tables) + + --return data for charts + function combate:GetTimeData (name) + return self.TimeData [name] + end + + --return the name of the encounter or enemy + function combate:GetCombatName (try_find) + if (self.is_pvp) then + return self.is_pvp.name + elseif (self.is_boss) then + return self.is_boss.encounter + elseif (self.is_tras) then + return Loc ["STRING_SEGMENT_TRASH"] + else + if (self.enemy) then + return self.enemy + end + if (try_find) then + return _detalhes:FindEnemy() end end + return Loc ["STRING_UNKNOW"] + end + + --return a numeric table with all actors on the specific containter + function combate:GetActorList (container) + return self [container]._ActorTable + end + + --return the combat time in seconds + function combate:GetCombatTime() + if (self.end_time) then + return self.end_time - self.start_time + elseif (self.start_time and _detalhes.in_combat) then + return _tempo - self.start_time + else + return 0 + end + end + + --return the total of a specific attribute + function combate:GetTotal (attribute, subAttribute, onlyGroup) + if (attribute == 1 or attribute == 2) then + if (onlyGroup) then + return self.totals_grupo [attribute] + else + return self.totals [attribute] + end + + elseif (attribute == 3 or attribute == 4) then + local subName = _detalhes:GetInternalSubAttributeName (attribute, subAttribute) + if (onlyGroup) then + return self.totals_grupo [attribute] [subName] + else + return self.totals [attribute] [subName] + end + end + return 0 + end + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> internals + + --class constructor + function combate:NovaTabela (iniciada, _tabela_overall, combatId, ...) + + local esta_tabela = {true, true, true, true, true} - --> 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 + esta_tabela [1] = container_combatentes:NovoContainer (_detalhes.container_type.CONTAINER_DAMAGE_CLASS, esta_tabela, combatId) --> Damage + esta_tabela [2] = container_combatentes:NovoContainer (_detalhes.container_type.CONTAINER_HEAL_CLASS, esta_tabela, combatId) --> Healing + esta_tabela [3] = container_combatentes:NovoContainer (_detalhes.container_type.CONTAINER_ENERGY_CLASS, esta_tabela, combatId) --> Energies + esta_tabela [4] = container_combatentes:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS, esta_tabela, combatId) --> Misc + esta_tabela [5] = container_combatentes:NovoContainer (_detalhes.container_type.CONTAINER_DAMAGE_CLASS, esta_tabela, combatId) --> place holder for customs + + _setmetatable (esta_tabela, combate) + + --> try discover if is a pvp combat + local who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags = ... + if (who_serial) then --> aqui irá identificar o boss ou o oponente + if (alvo_name and _bit_band (alvo_flags, REACTION_HOSTILE) ~= 0) then --> tentando pegar o inimigo pelo alvo + esta_tabela.contra = alvo_name + if (_bit_band (alvo_flags, CONTROL_PLAYER) ~= 0) then + esta_tabela.pvp = true --> o alvo é da facção oposta ou foi dado mind control + end + elseif (who_name and _bit_band (who_flags, REACTION_HOSTILE) ~= 0) then --> tentando pegar o inimigo pelo who caso o mob é quem deu o primeiro hit + esta_tabela.contra = who_name + if (_bit_band (who_flags, CONTROL_PLAYER) ~= 0) then + esta_tabela.pvp = true --> o who é da facção oposta ou foi dado mind control + end + else + esta_tabela.pvp = true --> se ambos são friendly, seria isso um PVP entre jogadores da mesma facções? + end + end + + --> start/end time (duration) + esta_tabela.data_fim = 0 + esta_tabela.data_inicio = 0 + + --> record last event before dead + esta_tabela.last_events_tables = {} + + --> frags + esta_tabela.frags = {} + esta_tabela.frags_need_refresh = false + + --> time data container + esta_tabela.TimeData = _detalhes:TimeDataCreateCombatTables() + + --> Skill cache (not used) + esta_tabela.CombatSkillCache = {} + + -- a tabela sem o tempo de inicio é a tabela descartavel do inicio do addon + if (iniciada) then + esta_tabela.start_time = _tempo + esta_tabela.end_time = nil + else + esta_tabela.start_time = 0 + esta_tabela.end_time = nil + end + + -- o container irá armazenar as classes de dano -- cria um novo container de indexes de seriais de jogadores --parâmetro 1 classe armazenada no container, parâmetro 2 = flag da classe + esta_tabela[1].need_refresh = true + esta_tabela[2].need_refresh = true + esta_tabela[3].need_refresh = true + esta_tabela[4].need_refresh = true + esta_tabela[5].need_refresh = true + + if (_tabela_overall) then --> link é a tabela de combate do overall + esta_tabela[1].shadow = _tabela_overall[1] --> diz ao objeto qual a shadow dele na tabela overall + esta_tabela[2].shadow = _tabela_overall[2] --> diz ao objeto qual a shadow dele na tabela overall + esta_tabela[3].shadow = _tabela_overall[3] --> diz ao objeto qual a shadow dele na tabela overall + esta_tabela[4].shadow = _tabela_overall[4] --> diz ao objeto qual a shadow dele na tabela overall + end + + esta_tabela.totals = { + 0, --> dano + 0, --> cura + {--> e_energy + mana = 0, --> mana + e_rage = 0, --> rage + e_energy = 0, --> energy (rogues cat) + runepower = 0 --> runepower (dk) + }, + {--> misc + cc_break = 0, --> armazena quantas quebras de CC + ress = 0, --> armazena quantos pessoas ele reviveu + interrupt = 0, --> armazena quantos interrupt a pessoa deu + dispell = 0, --> armazena quantos dispell esta pessoa recebeu + dead = 0, --> armazena quantas vezes essa pessia morreu + cooldowns_defensive = 0, --> armazena quantos cooldowns a raid usou + buff_uptime = 0, --> armazena quantos cooldowns a raid usou + debuff_uptime = 0 --> armazena quantos cooldowns a raid usou + } + } + + esta_tabela.totals_grupo = { + 0, --> dano + 0, --> cura + {--> e_energy + mana = 0, --> mana + e_rage = 0, --> rage + e_energy = 0, --> energy (rogues cat) + runepower = 0 --> runepower (dk) + }, + {--> misc + cc_break = 0, --> armazena quantas quebras de CC + ress = 0, --> armazena quantos pessoas ele reviveu + interrupt = 0, --> armazena quantos interrupt a pessoa deu + dispell = 0, --> armazena quantos dispell esta pessoa recebeu + dead = 0, --> armazena quantas vezes essa oessia morreu + cooldowns_defensive = 0, --> armazena quantos cooldowns a raid usou + buff_uptime = 0, + debuff_uptime = 0 + } + } + + return esta_tabela + end + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> core + + --trava o tempo dos jogadores após o término do combate. + function combate:TravarTempos() + if (self [1]) then + for _, jogador in _ipairs (self [1]._ActorTable) do --> damage + if (jogador:Iniciar()) then -- retorna se ele esta com o dps ativo + jogador:TerminarTempo() + jogador:Iniciar (false) --trava o dps do jogador end end end - combate1.frags_need_refresh = true - - return combate1 - -end - -combate.__add = function (combate1, combate2) - - 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) + if (self [2]) then + for _, jogador in _ipairs (self [2]._ActorTable) do --> healing + if (jogador:Iniciar()) then -- retorna se ele esta com o dps ativo + jogador:TerminarTempo() + jogador:Iniciar (false) --trava o dps do jogador + end 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() - _tempo = _detalhes._tempo -end + function combate:UltimaAcao (tempo) + if (tempo) then + self.last_event = tempo + else + return self.last_event + end + end + + function combate:seta_data (tipo) + if (tipo == _detalhes._detalhes_props.DATA_TYPE_START) then + self.data_inicio = _date ("%H:%M:%S") + elseif (tipo == _detalhes._detalhes_props.DATA_TYPE_END) then + self.data_fim = _date ("%H:%M:%S") + end + end + + function combate:seta_tempo_decorrido() + self.end_time = _tempo + end + + function _detalhes.refresh:r_combate (tabela_combate, shadow) + _setmetatable (tabela_combate, _detalhes.combate) + tabela_combate.__index = _detalhes.combate + tabela_combate.shadow = shadow + end + + function _detalhes.clear:c_combate (tabela_combate) + --tabela_combate.__index = {} + tabela_combate.__index = nil + tabela_combate.__call = {} + tabela_combate._combat_table = nil + tabela_combate.shadow = nil + end + + combate.__sub = function (combate1, combate2) + + if (combate1 ~= _detalhes.tabela_overall) then + return + end + + --> sub 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_T2:subtract_total (combate1) + end + combate1 [1].need_refresh = true + + --> sub 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_T2:subtract_total (combate1) + end + combate1 [2].need_refresh = true + + --> sub 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_T2:subtract_total (combate1) + end + combate1 [3].need_refresh = true + + --> sub 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_T2:subtract_total (combate1) + end + combate1 [4].need_refresh = true + + --> reduz o tempo + combate1.start_time = combate1.start_time + (combate2.end_time - combate2.start_time) + + --> apaga as mortes da luta diminuida + local amt_mortes = #combate2.last_events_tables --> quantas mortes teve nessa luta + if (amt_mortes > 0) then + for i = #combate1.last_events_tables, #combate1.last_events_tables-amt_mortes, -1 do + _table_remove (combate1.last_events_tables, #combate1.last_events_tables) + end + end + + --> 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 + + end + + combate.__add = function (combate1, combate2) + + local all_containers = {combate2 [class_type_dano]._ActorTable, combate2 [class_type_cura]._ActorTable, combate2 [class_type_e_energy]._ActorTable, combate2 [class_type_misc]._ActorTable} + + 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 + end + end + + return combate1 + end + + function _detalhes:UpdateCombat() + _tempo = _detalhes._tempo + end diff --git a/classes/classe_damage.lua b/classes/classe_damage.lua index 5ec7fe33..2d8586f1 100644 --- a/classes/classe_damage.lua +++ b/classes/classe_damage.lua @@ -1,132 +1,73 @@ ---why do a cleanup on classes today if i can do tomorrow? +-- damage object ---lua locals -local _cstr = string.format -local _math_floor = math.floor -local _table_sort = table.sort -local _table_insert = table.insert -local _table_size = table.getn -local _setmetatable = setmetatable -local _getmetatable = getmetatable -local _ipairs = ipairs -local _pairs = pairs -local _rawget= rawget -local _math_min = math.min -local _math_max = math.max -local _bit_band = bit.band -local _unpack = unpack -local _type = type ---api locals -local _GetSpellInfo = _detalhes.getspellinfo -local GameTooltip = GameTooltip -local _IsInRaid = IsInRaid -local _IsInGroup = IsInGroup + local _detalhes = _G._detalhes + local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) + local gump = _detalhes.gump + local _ -local _detalhes = _G._detalhes -local AceLocale = LibStub ("AceLocale-3.0") -local Loc = AceLocale:GetLocale ( "Details" ) +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> local pointers ---constants -local gump = _detalhes.gump -local _ + local _cstr = string.format --lua local + local _math_floor = math.floor --lua local + local _table_sort = table.sort --lua local + local _table_insert = table.insert --lua local + local _table_size = table.getn --lua local + local _setmetatable = setmetatable --lua local + local _getmetatable = getmetatable --lua local + local _ipairs = ipairs --lua local + local _pairs = pairs --lua local + local _rawget= rawget --lua local + local _math_min = math.min --lua local + local _math_max = math.max --lua local + local _bit_band = bit.band --lua local + local _unpack = unpack --lua local + local _type = type --lua local + local GameTooltip = GameTooltip --api local + local _IsInRaid = IsInRaid --api local + local _IsInGroup = IsInGroup --api local + local _GetSpellInfo = _detalhes.getspellinfo --details api -local alvo_da_habilidade = _detalhes.alvo_da_habilidade -local container_habilidades = _detalhes.container_habilidades -local container_combatentes = _detalhes.container_combatentes -local container_pets = _detalhes.container_pets -local atributo_damage = _detalhes.atributo_damage -local atributo_misc = _detalhes.atributo_misc -local habilidade_dano = _detalhes.habilidade_dano -local container_damage_target = _detalhes.container_type.CONTAINER_DAMAGETARGET_CLASS +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> constants -local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC -local container_damage = _detalhes.container_type.CONTAINER_DAMAGE_CLASS -local container_friendlyfire = _detalhes.container_type.CONTAINER_FRIENDLYFIRE + local alvo_da_habilidade = _detalhes.alvo_da_habilidade + local container_habilidades = _detalhes.container_habilidades + local container_combatentes = _detalhes.container_combatentes + local atributo_damage = _detalhes.atributo_damage + local atributo_misc = _detalhes.atributo_misc + local habilidade_dano = _detalhes.habilidade_dano + local container_damage_target = _detalhes.container_type.CONTAINER_DAMAGETARGET_CLASS + local container_damage = _detalhes.container_type.CONTAINER_DAMAGE_CLASS + local container_friendlyfire = _detalhes.container_type.CONTAINER_FRIENDLYFIRE -local modo_ALONE = _detalhes.modos.alone -local modo_GROUP = _detalhes.modos.group -local modo_ALL = _detalhes.modos.all + local modo_GROUP = _detalhes.modos.group + local modo_ALL = _detalhes.modos.all -local class_type = _detalhes.atributos.dano + local class_type = _detalhes.atributos.dano -local DATA_TYPE_START = _detalhes._detalhes_props.DATA_TYPE_START -local DATA_TYPE_END = _detalhes._detalhes_props.DATA_TYPE_END + local ToKFunctions = _detalhes.ToKFunctions + local SelectedToKFunction = ToKFunctions [1] + local UsingCustomRightText = false + local FormatTooltipNumber = ToKFunctions [8] + local TooltipMaximizedMethod = 1 -local DFLAG_player = _detalhes.flags.player -local DFLAG_group = _detalhes.flags.in_group -local DFLAG_player_group = _detalhes.flags.player_in_group + local CLASS_ICON_TCOORDS = _G.CLASS_ICON_TCOORDS -local div_abre = _detalhes.divisores.abre -local div_fecha = _detalhes.divisores.fecha -local div_lugar = _detalhes.divisores.colocacao + local key_overlay = {1, 1, 1, .1} + local key_overlay_press = {1, 1, 1, .2} + local headerColor = "yellow" -local ToKFunctions = _detalhes.ToKFunctions -local SelectedToKFunction = ToKFunctions [1] -local UsingCustomRightText = false + local info = _detalhes.janela_info + local keyName -local FormatTooltipNumber = ToKFunctions [8] -local TooltipMaximizedMethod = 1 - -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 - -function atributo_damage:NovaTabela (serial, nome, link) - - --> constructor - local _new_damageActor = { - - --> dps do objeto inicia sempre desligado - tipo = class_type, --> atributo 1 = dano - - total = 0, - total_without_pet = 0, - custom = 0, - - damage_taken = 0, --> total de dano que este jogador levou - damage_from = {}, --> armazena os nomes que deram dano neste jogador - - dps_started = false, - last_event = 0, - on_hold = false, - delay = 0, - last_value = nil, --> ultimo valor que este jogador teve, salvo quando a barra dele é atualizada - last_dps = 0, - - end_time = nil, - start_time = 0, - - pets = {}, --> armazena os nomes dos pets já com a tag do dono: pet name - - friendlyfire_total = 0, - friendlyfire = container_combatentes:NovoContainer (container_friendlyfire), - - --container armazenará os seriais dos alvos que o player aplicou dano - targets = container_combatentes:NovoContainer (container_damage_target), - - --container armazenará os IDs das habilidades usadas por este jogador - spell_tables = container_habilidades:NovoContainer (container_damage) - } + local OBJECT_TYPE_PLAYER = 0x00000400 - _setmetatable (_new_damageActor, atributo_damage) - - if (link) then --> se não for a shadow - _new_damageActor.last_events_table = _detalhes:CreateActorLastEventTable() - _new_damageActor.last_events_table.original = true - - _new_damageActor.targets.shadow = link.targets - _new_damageActor.spell_tables.shadow = link.spell_tables - _new_damageActor.friendlyfire.shadow = link.friendlyfire - end - - return _new_damageActor -end + local ntable = {} --temp + local vtable = {} --temp + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> exported functions --[[exported]] function _detalhes:CreateActorLastEventTable() local t = { {}, {}, {}, {}, {}, {}, {}, {} } @@ -187,29 +128,14 @@ end end --[[ exported]] function _detalhes:IsPlayer() - if (self.flags) then - if (_bit_band (self.flag, 0x00000001) ~= 0) then + if (self.flag_original) then + if (_bit_band (self.flag_original, OBJECT_TYPE_PLAYER) ~= 0) then return true end end return false end -local sortEnemies = function (t1, t2) - local a = _bit_band (t1.flag_original, 0x00000060) - local b = _bit_band (t2.flag_original, 0x00000060) - - if (a ~= 0 and b ~= 0) then - return t1.total > t2.total - elseif (a ~= 0 and b == 0) then - return true - elseif (a == 0 and b ~= 0) then - return false - end - - return false -end - --[[exported]] function _detalhes:ContainerSortEnemies (container, amount, keyName2) keyName = keyName2 @@ -230,338 +156,428 @@ end return amount, total end -function atributo_damage:ContainerRefreshDps (container, combat_time) +--[[Exported]] function _detalhes:TooltipForCustom (barra) + GameCooltip:AddLine (Loc ["STRING_LEFT_CLICK_SHARE"]) + return true + end - if (_detalhes.time_type == 2 or not _detalhes:CaptureGet ("damage")) then - for _, actor in _ipairs (container) do - if (actor.grupo) then - actor.last_dps = actor.total / combat_time - else +--[[exported]] function _detalhes.Sort1 (table1, table2) + return table1 [1] > table2 [1] + end + +--[[exported]] function _detalhes.Sort2 (table1, table2) + return table1 [2] > table2 [2] + end + +--[[exported]] function _detalhes.Sort3 (table1, table2) + return table1 [3] > table2 [3] + end + +--[[exported]] function _detalhes.Sort4 (table1, table2) + return table1 [4] > table2 [4] + end + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> internals + + function atributo_damage:NovaTabela (serial, nome, link) + + --> constructor + local _new_damageActor = { + + tipo = class_type, + + total = 0, + total_without_pet = 0, + custom = 0, + + damage_taken = 0, + damage_from = {}, + + dps_started = false, + last_event = 0, + on_hold = false, + delay = 0, + last_value = nil, + last_dps = 0, + + end_time = nil, + start_time = 0, + + pets = {}, + + friendlyfire_total = 0, + friendlyfire = container_combatentes:NovoContainer (container_friendlyfire), + + targets = container_combatentes:NovoContainer (container_damage_target), + spell_tables = container_habilidades:NovoContainer (container_damage) + } + + _setmetatable (_new_damageActor, atributo_damage) + + if (link) then + _new_damageActor.last_events_table = _detalhes:CreateActorLastEventTable() + _new_damageActor.last_events_table.original = true + + _new_damageActor.targets.shadow = link.targets + _new_damageActor.spell_tables.shadow = link.spell_tables + _new_damageActor.friendlyfire.shadow = link.friendlyfire + end + + return _new_damageActor + end + + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> special cases + + -- enemies (sort function) + local sortEnemies = function (t1, t2) + local a = _bit_band (t1.flag_original, 0x00000060) + local b = _bit_band (t2.flag_original, 0x00000060) + + if (a ~= 0 and b ~= 0) then + return t1.total > t2.total + elseif (a ~= 0 and b == 0) then + return true + elseif (a == 0 and b ~= 0) then + return false + end + + return false + end + + -- dps (calculate dps for actors) + function atributo_damage:ContainerRefreshDps (container, combat_time) + if (_detalhes.time_type == 2 or not _detalhes:CaptureGet ("damage")) then + for _, actor in _ipairs (container) do + if (actor.grupo) then + actor.last_dps = actor.total / combat_time + else + actor.last_dps = actor.total / actor:Tempo() + end + end + else + for _, actor in _ipairs (container) do actor.last_dps = actor.total / actor:Tempo() end end - else - for _, actor in _ipairs (container) do - actor.last_dps = actor.total / actor:Tempo() - end end - -end -function _detalhes:ToolTipFrags (instancia, frag, esta_barra, keydown) +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> frags - --vardump (frag) - - local name = frag [1] - local GameCooltip = GameCooltip - - --> mantendo a função o mais low level possível - local damage_container = instancia.showing [1] - - local frag_actor = damage_container._ActorTable [damage_container._NameIndexTable [ name ]] + function _detalhes:ToolTipFrags (instancia, frag, esta_barra, keydown) - if (frag_actor) then + local name = frag [1] + local GameCooltip = GameCooltip - local damage_taken_table = {} - - local took_damage_from = frag_actor.damage_from - local total_damage_taken = frag_actor.damage_taken - - for aggressor, _ in _pairs (took_damage_from) do + --> mantendo a função o mais low level possível + local damage_container = instancia.showing [1] - local damager_actor = damage_container._ActorTable [damage_container._NameIndexTable [ aggressor ]] + local frag_actor = damage_container._ActorTable [damage_container._NameIndexTable [ name ]] + + if (frag_actor) then - 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 damage_taken_table = {} + + local took_damage_from = frag_actor.damage_from + local total_damage_taken = frag_actor.damage_taken + + for aggressor, _ in _pairs (took_damage_from) do - local targets = damager_actor.targets + local damager_actor = damage_container._ActorTable [damage_container._NameIndexTable [ aggressor ]] - local specific_target = targets._ActorTable [targets._NameIndexTable [ name ]] --> é ele mesmo - if (specific_target) then - damage_taken_table [#damage_taken_table+1] = {aggressor, specific_target.total, damager_actor.classe} + 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 + + local specific_target = targets._ActorTable [targets._NameIndexTable [ name ]] --> é ele mesmo + if (specific_target) then + damage_taken_table [#damage_taken_table+1] = {aggressor, specific_target.total, damager_actor.classe} + end end end - end - if (#damage_taken_table > 0) then + if (#damage_taken_table > 0) then + + _table_sort (damage_taken_table, _detalhes.Sort2) + + 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) - _table_sort (damage_taken_table, _detalhes.Sort2) - - 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 - local ismaximized = false - if (keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3) then - min = 99 - ismaximized = true - end - - if (ismaximized) then - --highlight shift key - GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, 24, 12, 0, 1, 0, 0.640625, key_overlay_press) - GameCooltip:AddStatusBar (100, 1, .1, .1, .1, 1) - else - GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, 24, 12, 0, 1, 0, 0.640625, key_overlay) - GameCooltip:AddStatusBar (100, 1, .1, .1, .1, .3) - end - - for i = 1, math.min (min, #damage_taken_table) do - - local t = damage_taken_table [i] - - GameCooltip:AddLine (t [1], FormatTooltipNumber (_, t [2])) - local classe = t [3] - if (not classe) then - classe = "UNKNOW" + local min = 6 + local ismaximized = false + if (keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3) then + min = 99 + ismaximized = true end - if (classe == "UNKNOW") then - GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, 14, 14, .25, .5, 0, 1) + if (ismaximized) then + --highlight shift key + GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, 24, 12, 0, 1, 0, 0.640625, key_overlay_press) + GameCooltip:AddStatusBar (100, 1, .1, .1, .1, 1) else - GameCooltip:AddIcon (instancia.row_info.icon_file, nil, nil, 14, 14, _unpack (_detalhes.class_coords [classe])) + GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, 24, 12, 0, 1, 0, 0.640625, key_overlay) + GameCooltip:AddStatusBar (100, 1, .1, .1, .1, .3) end - _detalhes:AddTooltipBackgroundStatusbar() + + for i = 1, math.min (min, #damage_taken_table) do + + local t = damage_taken_table [i] + + GameCooltip:AddLine (t [1], FormatTooltipNumber (_, t [2])) + local classe = t [3] + if (not classe) then + classe = "UNKNOW" + end + + if (classe == "UNKNOW") then + GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, 14, 14, .25, .5, 0, 1) + else + GameCooltip:AddIcon (instancia.row_info.icon_file, nil, nil, 14, 14, _unpack (_detalhes.class_coords [classe])) + end + _detalhes:AddTooltipBackgroundStatusbar() + end + + 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() + + else + GameCooltip:AddLine (Loc ["STRING_NO_DATA"], nil, 1, "white") + GameCooltip:AddIcon (instancia.row_info.icon_file, nil, nil, 14, 14, _unpack (_detalhes.class_coords ["UNKNOW"])) + GameCooltip:ShowCooltip() end - 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() - else GameCooltip:AddLine (Loc ["STRING_NO_DATA"], nil, 1, "white") GameCooltip:AddIcon (instancia.row_info.icon_file, nil, nil, 14, 14, _unpack (_detalhes.class_coords ["UNKNOW"])) GameCooltip:ShowCooltip() end - else - GameCooltip:AddLine (Loc ["STRING_NO_DATA"], nil, 1, "white") - GameCooltip:AddIcon (instancia.row_info.icon_file, nil, nil, 14, 14, _unpack (_detalhes.class_coords ["UNKNOW"])) - GameCooltip:ShowCooltip() end - -end -local function RefreshBarraFrags (tabela, barra, instancia) - atributo_damage:AtualizarFrags (tabela, tabela.minha_barra, barra.colocacao, instancia) -end + local function RefreshBarraFrags (tabela, barra, instancia) + atributo_damage:AtualizarFrags (tabela, tabela.minha_barra, barra.colocacao, instancia) + end -function atributo_damage:ReportSingleFragsLine (frag, instancia) - local barra = instancia.barras [frag.minha_barra] + function atributo_damage:ReportSingleFragsLine (frag, instancia) + local barra = instancia.barras [frag.minha_barra] - local reportar = {"Details! " .. Loc ["STRING_ATTRIBUTE_DAMAGE_TAKEN"].. ": " .. frag [1]} --> localize-me - for i = 1, GameCooltip:GetNumLines() do - local texto_left, texto_right = GameCooltip:GetText (i) - if (texto_left and texto_right) then - texto_left = texto_left:gsub (("|T(.*)|t "), "") - reportar [#reportar+1] = ""..texto_left.." "..texto_right.."" + local reportar = {"Details! " .. Loc ["STRING_ATTRIBUTE_DAMAGE_TAKEN"].. ": " .. frag [1]} --> localize-me + for i = 1, GameCooltip:GetNumLines() do + local texto_left, texto_right = GameCooltip:GetText (i) + if (texto_left and texto_right) then + texto_left = texto_left:gsub (("|T(.*)|t "), "") + reportar [#reportar+1] = ""..texto_left.." "..texto_right.."" + end end + + return _detalhes:Reportar (reportar, {_no_current = true, _no_inverse = true, _custom = true}) end - return _detalhes:Reportar (reportar, {_no_current = true, _no_inverse = true, _custom = true}) -end + function atributo_damage:AtualizarFrags (tabela, qual_barra, colocacao, instancia) -function atributo_damage:AtualizarFrags (tabela, qual_barra, colocacao, instancia) - - tabela ["frags"] = true --> marca que esta tabela é uma tabela de frags, usado no controla na hora de montar o tooltip - local esta_barra = instancia.barras [qual_barra] --> pega a referência da barra na janela - - if (not esta_barra) then - print ("DEBUG: problema com "..qual_barra.." "..lugar) - return - end - - local tabela_anterior = esta_barra.minha_tabela - - esta_barra.minha_tabela = tabela - - tabela.nome = tabela [1] --> evita dar erro ao redimencionar a janela - tabela.minha_barra = qual_barra - esta_barra.colocacao = colocacao - - if (not _getmetatable (tabela)) then - _setmetatable (tabela, {__call = RefreshBarraFrags}) - tabela._custom = true - end - - esta_barra.texto_esquerdo:SetText (colocacao .. ". " .. tabela [1]) - esta_barra.texto_direita:SetText (tabela [2]) - - if (colocacao == 1) then - esta_barra.statusbar:SetValue (100) - else - esta_barra.statusbar:SetValue (tabela [2] / instancia.top * 100) - end - - if (esta_barra.hidden or esta_barra.fading_in or esta_barra.faded) then - gump:Fade (esta_barra, "out") - end - - --> ele nao come o texto quando a instância esta muito pequena - esta_barra.textura:SetVertexColor (_unpack (_detalhes.class_colors [tabela [3]])) - - if (tabela [3] == "UNKNOW" or tabela [3] == "UNGROUPPLAYER" or tabela [3] == "ENEMY") then - esta_barra.icone_classe:SetTexture ("Interface\\LFGFRAME\\LFGROLE_BW") - esta_barra.icone_classe:SetTexCoord (.25, .5, 0, 1) - esta_barra.icone_classe:SetVertexColor (1, 1, 1) - else - esta_barra.icone_classe:SetTexture (instancia.row_info.icon_file) - esta_barra.icone_classe:SetTexCoord (_unpack (_detalhes.class_coords [tabela [3]])) - esta_barra.icone_classe:SetVertexColor (1, 1, 1) - end - - if (esta_barra.mouse_over and not instancia.baseframe.isMoving) then --> precisa atualizar o tooltip - --gump:UpdateTooltip (qual_barra, esta_barra, instancia) - end - -end - -function atributo_damage:ReportSingleVoidZoneLine (actor, instancia) - local barra = instancia.barras [actor.minha_barra] - - local reportar = {"Details! " .. Loc ["STRING_ATTRIBUTE_DAMAGE_DEBUFFS_REPORT"] .. ": " .. actor.nome} --> localize-me - for i = 1, GameCooltip:GetNumLines() do - local texto_left, texto_right = GameCooltip:GetText (i) - if (texto_left and texto_right) then - texto_left = texto_left:gsub (("|T(.*)|t "), "") - reportar [#reportar+1] = ""..texto_left.." "..texto_right.."" + tabela ["frags"] = true --> marca que esta tabela é uma tabela de frags, usado no controla na hora de montar o tooltip + local esta_barra = instancia.barras [qual_barra] --> pega a referência da barra na janela + + if (not esta_barra) then + print ("DEBUG: problema com "..qual_barra.." "..lugar) + return end + + local tabela_anterior = esta_barra.minha_tabela + + esta_barra.minha_tabela = tabela + + tabela.nome = tabela [1] --> evita dar erro ao redimencionar a janela + tabela.minha_barra = qual_barra + esta_barra.colocacao = colocacao + + if (not _getmetatable (tabela)) then + _setmetatable (tabela, {__call = RefreshBarraFrags}) + tabela._custom = true + end + + esta_barra.texto_esquerdo:SetText (colocacao .. ". " .. tabela [1]) + esta_barra.texto_direita:SetText (tabela [2]) + + if (colocacao == 1) then + esta_barra.statusbar:SetValue (100) + else + esta_barra.statusbar:SetValue (tabela [2] / instancia.top * 100) + end + + if (esta_barra.hidden or esta_barra.fading_in or esta_barra.faded) then + gump:Fade (esta_barra, "out") + end + + --> ele nao come o texto quando a instância esta muito pequena + esta_barra.textura:SetVertexColor (_unpack (_detalhes.class_colors [tabela [3]])) + + if (tabela [3] == "UNKNOW" or tabela [3] == "UNGROUPPLAYER" or tabela [3] == "ENEMY") then + esta_barra.icone_classe:SetTexture ("Interface\\LFGFRAME\\LFGROLE_BW") + esta_barra.icone_classe:SetTexCoord (.25, .5, 0, 1) + esta_barra.icone_classe:SetVertexColor (1, 1, 1) + else + esta_barra.icone_classe:SetTexture (instancia.row_info.icon_file) + esta_barra.icone_classe:SetTexCoord (_unpack (_detalhes.class_coords [tabela [3]])) + esta_barra.icone_classe:SetVertexColor (1, 1, 1) + end + + if (esta_barra.mouse_over and not instancia.baseframe.isMoving) then --> precisa atualizar o tooltip + --gump:UpdateTooltip (qual_barra, esta_barra, instancia) + end + + end + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> void zones + + function atributo_damage:ReportSingleVoidZoneLine (actor, instancia) + local barra = instancia.barras [actor.minha_barra] + + local reportar = {"Details! " .. Loc ["STRING_ATTRIBUTE_DAMAGE_DEBUFFS_REPORT"] .. ": " .. actor.nome} --> localize-me + for i = 1, GameCooltip:GetNumLines() do + local texto_left, texto_right = GameCooltip:GetText (i) + if (texto_left and texto_right) then + texto_left = texto_left:gsub (("|T(.*)|t "), "") + reportar [#reportar+1] = ""..texto_left.." "..texto_right.."" + end + end + + return _detalhes:Reportar (reportar, {_no_current = true, _no_inverse = true, _custom = true}) end - return _detalhes:Reportar (reportar, {_no_current = true, _no_inverse = true, _custom = true}) -end - -function _detalhes:ToolTipVoidZones (instancia, actor, barra, keydown) - - local damage_actor = instancia.showing[1]:PegarCombatente (_, actor.damage_twin) - local habilidade - local alvos - - if (damage_actor) then - habilidade = damage_actor.spell_tables._ActorTable [actor.damage_spellid] - end - - if (habilidade) then - alvos = habilidade.targets - end - - local container = actor.debuff_uptime_targets._ActorTable - - for _, alvo in _ipairs (container) do - if (alvos) then - local damage_alvo = alvos._NameIndexTable [alvo.nome] - if (damage_alvo) then - damage_alvo = alvos._ActorTable [damage_alvo] - alvo.damage = damage_alvo.total + function _detalhes:ToolTipVoidZones (instancia, actor, barra, keydown) + + local damage_actor = instancia.showing[1]:PegarCombatente (_, actor.damage_twin) + local habilidade + local alvos + + if (damage_actor) then + habilidade = damage_actor.spell_tables._ActorTable [actor.damage_spellid] + end + + if (habilidade) then + alvos = habilidade.targets + end + + local container = actor.debuff_uptime_targets._ActorTable + + for _, alvo in _ipairs (container) do + if (alvos) then + local damage_alvo = alvos._NameIndexTable [alvo.nome] + if (damage_alvo) then + damage_alvo = alvos._ActorTable [damage_alvo] + alvo.damage = damage_alvo.total + else + alvo.damage = 0 + end else alvo.damage = 0 end - else - alvo.damage = 0 end - end - --> sort no container: - _table_sort (container, function (tabela1, tabela2) - if (tabela1.damage > tabela2.damage) then - return true; - elseif (tabela1.damage == tabela2.damage) then - return tabela1.uptime > tabela2.uptime; - end - return false; - end) - - actor.debuff_uptime_targets:remapear() - - --> monta o cooltip - - 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 + --> sort no container: + _table_sort (container, function (tabela1, tabela2) + if (tabela1.damage > tabela2.damage) then + return true; + elseif (tabela1.damage == tabela2.damage) then + return tabela1.uptime > tabela2.uptime; + end + return false; + end) + + actor.debuff_uptime_targets:remapear() + + --> monta o cooltip + 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) - if (minutos > 0) then - GameCooltip:AddLine (alvo.nome, FormatTooltipNumber (_, alvo.damage) .. " (" .. minutos .. "m " .. segundos .. "s" .. ")") - else - GameCooltip:AddLine (alvo.nome, FormatTooltipNumber (_, alvo.damage) .. " (" .. segundos .. "s" .. ")") + local minutos, segundos = _math_floor (alvo.uptime / 60), _math_floor (alvo.uptime % 60) + if (minutos > 0) then + GameCooltip:AddLine (alvo.nome, FormatTooltipNumber (_, alvo.damage) .. " (" .. minutos .. "m " .. segundos .. "s" .. ")") + else + GameCooltip:AddLine (alvo.nome, FormatTooltipNumber (_, alvo.damage) .. " (" .. segundos .. "s" .. ")") + end + + local classe = _detalhes:GetClass (alvo.nome) + if (classe) then + GameCooltip:AddIcon ([[Interface\AddOns\Details\images\classes_small]], nil, nil, 14, 14, unpack (_detalhes.class_coords [classe])) + else + GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, 14, 14, .25, .5, 0, 1) + end + + _detalhes:AddTooltipBackgroundStatusbar() + end - local classe = _detalhes:GetClass (alvo.nome) - if (classe) then - GameCooltip:AddIcon ([[Interface\AddOns\Details\images\classes_small]], nil, nil, 14, 14, unpack (_detalhes.class_coords [classe])) - else - GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, 14, 14, .25, .5, 0, 1) + 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 + + local function RefreshBarraVoidZone (tabela, barra, instancia) + tabela:AtualizarVoidZone (tabela.minha_barra, barra.colocacao, instancia) + end + + function atributo_misc:AtualizarVoidZone (qual_barra, colocacao, instancia) + + --> pega a referência da barra na janela + local esta_barra = instancia.barras [qual_barra] + + if (not esta_barra) then + print ("DEBUG: problema com "..qual_barra.." "..lugar) + return end - _detalhes:AddTooltipBackgroundStatusbar() - - end - - 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 - -local function RefreshBarraVoidZone (tabela, barra, instancia) - tabela:AtualizarVoidZone (tabela.minha_barra, barra.colocacao, instancia) -end - -function atributo_misc:AtualizarVoidZone (qual_barra, colocacao, instancia) - - local esta_barra = instancia.barras [qual_barra] --> pega a referência da barra na janela - - if (not esta_barra) then - print ("DEBUG: problema com "..qual_barra.." "..lugar) - return - end - - self._refresh_window = RefreshBarraVoidZone - - local tabela_anterior = esta_barra.minha_tabela - - esta_barra.minha_tabela = self - - self.minha_barra = qual_barra - esta_barra.colocacao = colocacao - - esta_barra.texto_esquerdo:SetText (colocacao .. ". " .. self.nome) - esta_barra.texto_direita:SetText (self.debuff_uptime) - - --if (colocacao == 1) then + self._refresh_window = RefreshBarraVoidZone + + local tabela_anterior = esta_barra.minha_tabela + + esta_barra.minha_tabela = self + + self.minha_barra = qual_barra + esta_barra.colocacao = colocacao + + esta_barra.texto_esquerdo:SetText (colocacao .. ". " .. self.nome) + esta_barra.texto_direita:SetText (self.debuff_uptime) + esta_barra.statusbar:SetValue (100) - --else - -- esta_barra.statusbar:SetValue (self.debuff_uptime / instancia.top * 100) - --end - - if (esta_barra.hidden or esta_barra.fading_in or esta_barra.faded) then - gump:Fade (esta_barra, "out") - end - - local _, _, icon = GetSpellInfo (self.damage_spellid) - local school_color = _detalhes.school_colors [self.spellschool] - if (not school_color) then - school_color = _detalhes.school_colors ["unknown"] - end - - esta_barra.textura:SetVertexColor (_unpack (school_color)) - esta_barra.icone_classe:SetTexture (icon) - esta_barra.icone_classe:SetTexCoord (0, 1, 0, 1) - esta_barra.icone_classe:SetVertexColor (1, 1, 1) + + if (esta_barra.hidden or esta_barra.fading_in or esta_barra.faded) then + gump:Fade (esta_barra, "out") + end + + local _, _, icon = GetSpellInfo (self.damage_spellid) + local school_color = _detalhes.school_colors [self.spellschool] + if (not school_color) then + school_color = _detalhes.school_colors ["unknown"] + end + + esta_barra.textura:SetVertexColor (_unpack (school_color)) + esta_barra.icone_classe:SetTexture (icon) + esta_barra.icone_classe:SetTexCoord (0, 1, 0, 1) + esta_barra.icone_classe:SetVertexColor (1, 1, 1) + + if (esta_barra.mouse_over and not instancia.baseframe.isMoving) then + --need call a refresh function + end - if (esta_barra.mouse_over and not instancia.baseframe.isMoving) then --> precisa atualizar o tooltip - --gump:UpdateTooltip (qual_barra, esta_barra, instancia) end -end - -local ntable = {} -local vtable = {} +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> main refresh function function atributo_damage:RefreshWindow (instancia, tabela_do_combate, forcar, exportar, refresh_needed) @@ -849,7 +865,6 @@ function atributo_damage:RefreshWindow (instancia, tabela_do_combate, forcar, ex if (not using_cache) then for index, player in _ipairs (conteudo) do - --if (_bit_band (player.flag, DFLAG_player_group) >= 0x101) then --> é um player e esta em grupo if (player.grupo) then --> é um player e esta em grupo if (player[keyName] < 1) then --> dano menor que 1, interromper o loop amount = index - 1 @@ -1401,11 +1416,7 @@ end --------------------------------------------- // TOOLTIPS // --------------------------------------------- ---[[Exported]] function _detalhes:TooltipForCustom (barra) - --GameCooltip:AddLine (barra.colocacao..". "..self.nome) - GameCooltip:AddLine (Loc ["STRING_LEFT_CLICK_SHARE"]) - return true -end + ---------> TOOLTIPS BIFURCAÇÃO @@ -1428,18 +1439,7 @@ end local r, g, b local barAlha = .6 ---[[exported]] function _detalhes.Sort1 (table1, table2) - return table1 [1] > table2 [1] - end ---[[exported]] function _detalhes.Sort2 (table1, table2) - return table1 [2] > table2 [2] - end ---[[exported]] function _detalhes.Sort3 (table1, table2) - return table1 [3] > table2 [3] - end ---[[exported]] function _detalhes.Sort4 (table1, table2) - return table1 [4] > table2 [4] - end + ---------> DAMAGE DONE & DPS diff --git a/classes/classe_damage_habilidade.lua b/classes/classe_damage_habilidade.lua index 53b24b92..4b4734e3 100644 --- a/classes/classe_damage_habilidade.lua +++ b/classes/classe_damage_habilidade.lua @@ -1,131 +1,123 @@ ---[[ classe do dano aplicado, usado nos eventos: -- SPELL_PERIODIC_DAMAGE -- SPELL_DAMAGE -- SWING_DAMAGE -- RANGE_DAMAGE +-- damage ability file -Parents: - addon -> combate atual -> Npc/Player Swicth -> Container de Habilidades -> esta tabela - ]] + local _detalhes = _G._detalhes + local _ -local _detalhes = _G._detalhes -local gump = _detalhes.gump +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> local pointers + local _setmetatable = setmetatable--lua local + local _ipairs = ipairs--lua local + local _pairs = pairs--lua local + local _UnitAura = UnitAura--api local -local alvo_da_habilidade = _detalhes.alvo_da_habilidade -local habilidade_dano = _detalhes.habilidade_dano -local container_combatentes = _detalhes.container_combatentes -local container_damage_target = _detalhes.container_type.CONTAINER_DAMAGETARGET_CLASS +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> constants ---lua locals -local _setmetatable = setmetatable -local _ipairs = ipairs -local _pairs = pairs -local _ ---api locals -local _UnitAura = UnitAura ---local _GetSpellInfo = _detalhes.getspellinfo + local alvo_da_habilidade = _detalhes.alvo_da_habilidade + local habilidade_dano = _detalhes.habilidade_dano + local container_combatentes = _detalhes.container_combatentes + local container_damage_target = _detalhes.container_type.CONTAINER_DAMAGETARGET_CLASS + local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC -local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC + local _recording_ability_with_buffs = false -local _recording_ability_with_buffs = false +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> internals ---id, nome, type, miss, dano, cura, overkill, school, resisted, blocked, absorbed, critico, glacing, crushing -function habilidade_dano:NovaTabela (id, link, token) --aqui eu não sei que parâmetros passar + function habilidade_dano:NovaTabela (id, link, token) - local _newDamageSpell = { - - total = 0, --total de dano aplicado por esta habilidade - counter = 0, --conta quantas vezes a habilidade foi chamada - id = id, - successful_casted = 0, + local _newDamageSpell = { - --> normal - n_min = 0, - n_max = 0, - n_amt = 0, - n_dmg = 0, + total = 0, --total damage + counter = 0, --counter + id = id, --spellid + successful_casted = 0, --successful casted times (only for enemies) + + --> normal hits + n_min = 0, + n_max = 0, + n_amt = 0, + n_dmg = 0, + + --> critical hits + c_min = 0, + c_max = 0, + c_amt = 0, + c_dmg = 0, + + --> glacing hits + g_amt = 0, + g_dmg = 0, + + --> resisted + r_amt = 0, + r_dmg = 0, + + --> blocked + b_amt = 0, + b_dmg = 0, + + --> obsorved + a_amt = 0, + a_dmg = 0, + + targets = container_combatentes:NovoContainer (container_damage_target) + } - --> criticos - c_min = 0, - c_max = 0, - c_amt = 0, - c_dmg = 0, - - --> glacing - g_amt = 0, - g_dmg = 0, + _setmetatable (_newDamageSpell, habilidade_dano) - --> resisted - r_amt = 0, - r_dmg = 0, + if (link) then + _newDamageSpell.targets.shadow = link.targets + end - --> blocked - b_amt = 0, - b_dmg = 0, - - --> obsorved - a_amt = 0, - a_dmg = 0, + if (token == "SPELL_PERIODIC_DAMAGE") then + _detalhes:SpellIsDot (id) + end - targets = container_combatentes:NovoContainer (container_damage_target) - } - - _setmetatable (_newDamageSpell, habilidade_dano) - - if (link) then - _newDamageSpell.targets.shadow = link.targets - end - - if (token == "SPELL_PERIODIC_DAMAGE") then - _detalhes:SpellIsDot (id) - end - - return _newDamageSpell -end - - -function habilidade_dano:AddMiss (serial, nome, flags, who_nome, missType) - self.counter = self.counter + 1 - - local miss = self [missType] or 0 - miss = miss + 1 - self [missType] = miss - - local alvo = self.targets:PegarCombatente (serial, nome, flags, true) - return alvo:AddQuantidade (0) -end - -function habilidade_dano:AddFF (amount) - self.counter = self.counter + 1 - self.total = self.total + amount -end - -function habilidade_dano:Add (serial, nome, flag, amount, who_nome, resisted, blocked, absorbed, critical, glacing, token) - - self.counter = self.counter + 1 - - local alvo = self.targets._NameIndexTable [nome] - if (not alvo) then - alvo = self.targets:PegarCombatente (serial, nome, flag, true) - else - alvo = self.targets._ActorTable [alvo] + return _newDamageSpell end - if (resisted and resisted > 0) then - self.r_dmg = self.r_dmg+amount --> tabela.total é o total de dano - self.r_amt = self.r_amt+1 --> tabela.total é o total de dano + function habilidade_dano:AddMiss (serial, nome, flags, who_nome, missType) + self.counter = self.counter + 1 + + local miss = self [missType] or 0 + miss = miss + 1 + self [missType] = miss + + self.targets:PegarCombatente (serial, nome, flags, true) --apenas criar o alvo para a abilidade end - - if (blocked and blocked > 0) then - self.b_dmg = self.b_dmg+amount --> amount é o total de dano - self.b_amt = self.b_amt+1 --> amount é o total de dano + + function habilidade_dano:AddFF (amount) + self.counter = self.counter + 1 + self.total = self.total + amount end - - if (absorbed and absorbed > 0) then - self.a_dmg = self.a_dmg+amount --> amount é o total de dano - self.a_amt = self.a_amt+1 --> amount é o total de dano - end - + + function habilidade_dano:Add (serial, nome, flag, amount, who_nome, resisted, blocked, absorbed, critical, glacing, token) + + self.counter = self.counter + 1 + + local alvo = self.targets._NameIndexTable [nome] + if (not alvo) then + alvo = self.targets:PegarCombatente (serial, nome, flag, true) + else + alvo = self.targets._ActorTable [alvo] + end + + if (resisted and resisted > 0) then + self.r_dmg = self.r_dmg+amount --> tabela.total é o total de dano + self.r_amt = self.r_amt+1 --> tabela.total é o total de dano + end + + if (blocked and blocked > 0) then + self.b_dmg = self.b_dmg+amount --> amount é o total de dano + self.b_amt = self.b_amt+1 --> amount é o total de dano + end + + if (absorbed and absorbed > 0) then + self.a_dmg = self.a_dmg+amount --> amount é o total de dano + self.a_amt = self.a_amt+1 --> amount é o total de dano + end + self.total = self.total + amount alvo.total = alvo.total + amount @@ -152,157 +144,139 @@ function habilidade_dano:Add (serial, nome, flag, amount, who_nome, resisted, bl self.n_min = amount end end - --end - - 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 + if (_recording_ability_with_buffs) then + if (who_nome == _detalhes.playername) then --aqui ele vai detalhar tudo sobre a magia usada - 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 + 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 end - SpellBuffDetails [buff_name] = buff_info end end end - end - - else + + 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 + 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 - SpellBuffDetails [name] = buff_info end end end end + end -end +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> core -function _detalhes.refresh:r_habilidade_dano (habilidade, shadow) --recebeu o container shadow - _setmetatable (habilidade, habilidade_dano) - habilidade.__index = habilidade_dano - habilidade.shadow = shadow._ActorTable [habilidade.id] - _detalhes.refresh:r_container_combatentes (habilidade.targets, habilidade.shadow.targets) -end + function _detalhes.refresh:r_habilidade_dano (habilidade, shadow) --recebeu o container shadow + _setmetatable (habilidade, habilidade_dano) + habilidade.__index = habilidade_dano + habilidade.shadow = shadow._ActorTable [habilidade.id] + _detalhes.refresh:r_container_combatentes (habilidade.targets, habilidade.shadow.targets) + end -function _detalhes.clear:c_habilidade_dano (habilidade) - --habilidade.__index = {} - habilidade.__index = nil - habilidade.shadow = nil - - _detalhes.clear:c_container_combatentes (habilidade.targets) -end + function _detalhes.clear:c_habilidade_dano (habilidade) + --habilidade.__index = {} + habilidade.__index = nil + habilidade.shadow = nil + + _detalhes.clear:c_container_combatentes (habilidade.targets) + end -habilidade_dano.__add = function (tabela1, tabela2) - tabela1.total = tabela1.total + tabela2.total - tabela1.counter = tabela1.counter + tabela2.counter - tabela1.successful_casted = tabela1.successful_casted + tabela2.successful_casted - - tabela1.n_min = tabela1.n_min + tabela2.n_min - tabela1.n_max = tabela1.n_max + tabela2.n_max - tabela1.n_amt = tabela1.n_amt + tabela2.n_amt - tabela1.n_dmg = tabela1.n_dmg + tabela2.n_dmg + habilidade_dano.__add = function (tabela1, tabela2) + tabela1.total = tabela1.total + tabela2.total + tabela1.counter = tabela1.counter + tabela2.counter + tabela1.successful_casted = tabela1.successful_casted + tabela2.successful_casted + + tabela1.n_min = tabela1.n_min + tabela2.n_min + tabela1.n_max = tabela1.n_max + tabela2.n_max + tabela1.n_amt = tabela1.n_amt + tabela2.n_amt + tabela1.n_dmg = tabela1.n_dmg + tabela2.n_dmg - tabela1.c_min = tabela1.c_min + tabela2.c_min - tabela1.c_max = tabela1.c_max + tabela2.c_max - tabela1.c_amt = tabela1.c_amt + tabela2.c_amt - tabela1.c_dmg = tabela1.c_dmg + tabela2.c_dmg - - --tabela1.g_min = tabela1.g_min + tabela2.g_min - --tabela1.g_max = tabela1.g_max + tabela2.g_max - tabela1.g_amt = tabela1.g_amt + tabela2.g_amt - tabela1.g_dmg = tabela1.g_dmg + tabela2.g_dmg - - --tabela1.r_min = tabela1.r_min + tabela2.r_min - --tabela1.r_max = tabela1.r_max + tabela2.r_max - tabela1.r_amt = tabela1.r_amt + tabela2.r_amt - tabela1.r_dmg = tabela1.r_dmg + tabela2.r_dmg - - --tabela1.b_min = tabela1.b_min + tabela2.b_min - --tabela1.b_max = tabela1.b_max + tabela2.b_max - tabela1.b_amt = tabela1.b_amt + tabela2.b_amt - tabela1.b_dmg = tabela1.b_dmg + tabela2.b_dmg - - --tabela1.a_min = tabela1.a_min + tabela2.a_min - --tabela1.a_max = tabela1.a_max + tabela2.a_max - tabela1.a_amt = tabela1.a_amt + tabela2.a_amt - tabela1.a_dmg = tabela1.a_dmg + tabela2.a_dmg - - --tabela1.crushing = tabela1.crushing + tabela2.crushing - - return tabela1 -end + tabela1.c_min = tabela1.c_min + tabela2.c_min + tabela1.c_max = tabela1.c_max + tabela2.c_max + tabela1.c_amt = tabela1.c_amt + tabela2.c_amt + tabela1.c_dmg = tabela1.c_dmg + tabela2.c_dmg + + tabela1.g_amt = tabela1.g_amt + tabela2.g_amt + tabela1.g_dmg = tabela1.g_dmg + tabela2.g_dmg + + tabela1.r_amt = tabela1.r_amt + tabela2.r_amt + tabela1.r_dmg = tabela1.r_dmg + tabela2.r_dmg + + tabela1.b_amt = tabela1.b_amt + tabela2.b_amt + tabela1.b_dmg = tabela1.b_dmg + tabela2.b_dmg + + tabela1.a_amt = tabela1.a_amt + tabela2.a_amt + tabela1.a_dmg = tabela1.a_dmg + tabela2.a_dmg + + return tabela1 + end -habilidade_dano.__sub = function (tabela1, tabela2) - tabela1.total = tabela1.total - tabela2.total - tabela1.counter = tabela1.counter - tabela2.counter - tabela1.successful_casted = tabela1.successful_casted - tabela2.successful_casted + habilidade_dano.__sub = function (tabela1, tabela2) + tabela1.total = tabela1.total - tabela2.total + tabela1.counter = tabela1.counter - tabela2.counter + tabela1.successful_casted = tabela1.successful_casted - tabela2.successful_casted - tabela1.n_min = tabela1.n_min - tabela2.n_min - tabela1.n_max = tabela1.n_max - tabela2.n_max - tabela1.n_amt = tabela1.n_amt - tabela2.n_amt - tabela1.n_dmg = tabela1.n_dmg - tabela2.n_dmg + tabela1.n_min = tabela1.n_min - tabela2.n_min + tabela1.n_max = tabela1.n_max - tabela2.n_max + tabela1.n_amt = tabela1.n_amt - tabela2.n_amt + tabela1.n_dmg = tabela1.n_dmg - tabela2.n_dmg - tabela1.c_min = tabela1.c_min - tabela2.c_min - tabela1.c_max = tabela1.c_max - tabela2.c_max - tabela1.c_amt = tabela1.c_amt - tabela2.c_amt - tabela1.c_dmg = tabela1.c_dmg - tabela2.c_dmg - - --tabela1.g_min = tabela1.g_min - tabela2.g_min - --tabela1.g_max = tabela1.g_max - tabela2.g_max - tabela1.g_amt = tabela1.g_amt - tabela2.g_amt - tabela1.g_dmg = tabela1.g_dmg - tabela2.g_dmg - - --tabela1.r_min = tabela1.r_min - tabela2.r_min - --tabela1.r_max = tabela1.r_max - tabela2.r_max - tabela1.r_amt = tabela1.r_amt - tabela2.r_amt - tabela1.r_dmg = tabela1.r_dmg - tabela2.r_dmg - - --tabela1.b_min = tabela1.b_min - tabela2.b_min - --tabela1.b_max = tabela1.b_max - tabela2.b_max - tabela1.b_amt = tabela1.b_amt - tabela2.b_amt - tabela1.b_dmg = tabela1.b_dmg - tabela2.b_dmg - - --tabela1.a_min = tabela1.a_min - tabela2.a_min - --tabela1.a_max = tabela1.a_max - tabela2.a_max - tabela1.a_amt = tabela1.a_amt - tabela2.a_amt - tabela1.a_dmg = tabela1.a_dmg - tabela2.a_dmg - - --tabela1.crushing = tabela1.crushing - tabela2.crushing - - return tabela1 -end + tabela1.c_min = tabela1.c_min - tabela2.c_min + tabela1.c_max = tabela1.c_max - tabela2.c_max + tabela1.c_amt = tabela1.c_amt - tabela2.c_amt + tabela1.c_dmg = tabela1.c_dmg - tabela2.c_dmg + + tabela1.g_amt = tabela1.g_amt - tabela2.g_amt + tabela1.g_dmg = tabela1.g_dmg - tabela2.g_dmg + + tabela1.r_amt = tabela1.r_amt - tabela2.r_amt + tabela1.r_dmg = tabela1.r_dmg - tabela2.r_dmg + + tabela1.b_amt = tabela1.b_amt - tabela2.b_amt + tabela1.b_dmg = tabela1.b_dmg - tabela2.b_dmg + + tabela1.a_amt = tabela1.a_amt - tabela2.a_amt + tabela1.a_dmg = tabela1.a_dmg - tabela2.a_dmg + + return tabela1 + end -function _detalhes:UpdateDamageAbilityGears() - _recording_ability_with_buffs = _detalhes.RecordPlayerAbilityWithBuffs -end + function _detalhes:UpdateDamageAbilityGears() + _recording_ability_with_buffs = _detalhes.RecordPlayerAbilityWithBuffs + end diff --git a/classes/classe_energy.lua b/classes/classe_energy.lua index 35aab44e..2a996117 100644 --- a/classes/classe_energy.lua +++ b/classes/classe_energy.lua @@ -53,10 +53,6 @@ local class_type = _detalhes.atributos.e_energy local DATA_TYPE_START = _detalhes._detalhes_props.DATA_TYPE_START local DATA_TYPE_END = _detalhes._detalhes_props.DATA_TYPE_END -local DFLAG_player = _detalhes.flags.player -local DFLAG_group = _detalhes.flags.in_group -local DFLAG_player_group = _detalhes.flags.player_in_group - local div_abre = _detalhes.divisores.abre local div_fecha = _detalhes.divisores.fecha local div_lugar = _detalhes.divisores.colocacao @@ -253,7 +249,6 @@ function atributo_energy:RefreshWindow (instancia, tabela_do_combate, forcar, ex end) for index, player in _ipairs (conteudo) do - --if (_bit_band (player.flag, DFLAG_player_group) >= 0x101) then --> é um player e esta em grupo if (player.grupo) then --> é um player e esta em grupo if (player[keyName] < 1) then --> dano menor que 1, interromper o loop amount = index - 1 diff --git a/classes/classe_energy_habilidade.lua b/classes/classe_energy_habilidade.lua index 37302d11..ce577258 100644 --- a/classes/classe_energy_habilidade.lua +++ b/classes/classe_energy_habilidade.lua @@ -1,102 +1,112 @@ -local _detalhes = _G._detalhes -local gump = _detalhes.gump +-- energy ability file -local alvo_da_habilidade = _detalhes.alvo_da_habilidade -local habilidade_energy = _detalhes.habilidade_e_energy -local container_combatentes = _detalhes.container_combatentes -local container_energy_target = _detalhes.container_type.CONTAINER_ENERGYTARGET_CLASS + local _detalhes = _G._detalhes + local _ ---lua locals -local _setmetatable = setmetatable -local _ipairs = ipairs ---api locals -local _UnitAura = UnitAura -local _ ---local _GetSpellInfo = _detalhes.getspellinfo +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> local pointers -local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC + local _setmetatable = setmetatable --lua local + local _ipairs = ipairs --lua local + local _UnitAura = UnitAura --api local -function habilidade_energy:NovaTabela (id, link, token) +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> constants - local _newEnergySpell = { + local alvo_da_habilidade = _detalhes.alvo_da_habilidade + local habilidade_energy = _detalhes.habilidade_e_energy + local container_combatentes = _detalhes.container_combatentes + local container_energy_target = _detalhes.container_type.CONTAINER_ENERGYTARGET_CLASS + local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC - id = id, - counter = 0, +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> internals + + function habilidade_energy:NovaTabela (id, link, token) + + local _newEnergySpell = { + + id = id, + counter = 0, + + mana = 0, + e_rage = 0, + e_energy = 0, + runepower = 0, + + targets = container_combatentes:NovoContainer (container_energy_target) + } - mana = 0, - e_rage = 0, - e_energy = 0, - runepower = 0, + _setmetatable (_newEnergySpell, habilidade_energy) - targets = container_combatentes:NovoContainer (container_energy_target) - } - - _setmetatable (_newEnergySpell, habilidade_energy) - - if (link) then - _newEnergySpell.targets.shadow = link.targets - end - - return _newEnergySpell -end - -function habilidade_energy:Add (serial, nome, flag, amount, who_nome, powertype) - - self.counter = self.counter + 1 - - --local alvo = self.targets:PegarCombatente (serial, nome, flag, true) - local alvo = self.targets._NameIndexTable [nome] - if (not alvo) then - alvo = self.targets:PegarCombatente (serial, nome, flag, true) - else - alvo = self.targets._ActorTable [alvo] + if (link) then + _newEnergySpell.targets.shadow = link.targets + end + + return _newEnergySpell end - - if (powertype == 0) then --> MANA - self.mana = self.mana + amount - alvo.mana = alvo.mana + amount - elseif (powertype == 1) then --> e_rage - self.e_rage = self.e_rage + amount - alvo.e_rage = alvo.e_rage + amount - elseif (powertype == 3) then --> ENERGIA - self.e_energy = self.e_energy + amount - alvo.e_energy = alvo.e_energy + amount - elseif (powertype == 6) then --> RUNEPOWER - self.runepower = self.runepower + amount - alvo.runepower = alvo.runepower + amount + function habilidade_energy:Add (serial, nome, flag, amount, who_nome, powertype) + + self.counter = self.counter + 1 + + local alvo = self.targets._NameIndexTable [nome] + if (not alvo) then + alvo = self.targets:PegarCombatente (serial, nome, flag, true) + else + alvo = self.targets._ActorTable [alvo] + end + + if (powertype == 0) then --> MANA + self.mana = self.mana + amount + alvo.mana = alvo.mana + amount + + elseif (powertype == 1) then --> e_rage + self.e_rage = self.e_rage + amount + alvo.e_rage = alvo.e_rage + amount + + elseif (powertype == 3) then --> ENERGIA + self.e_energy = self.e_energy + amount + alvo.e_energy = alvo.e_energy + amount + + elseif (powertype == 6) then --> RUNEPOWER + self.runepower = self.runepower + amount + alvo.runepower = alvo.runepower + amount + end + end -end +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> core -function _detalhes.refresh:r_habilidade_e_energy (habilidade, shadow) --recebeu o container shadow - _setmetatable (habilidade, habilidade_energy) - habilidade.__index = habilidade_energy - - if (shadow ~= -1) then - habilidade.shadow = shadow._ActorTable[habilidade.id] - _detalhes.refresh:r_container_combatentes (habilidade.targets, habilidade.shadow.targets) - else - _detalhes.refresh:r_container_combatentes (habilidade.targets, -1) + function _detalhes.refresh:r_habilidade_e_energy (habilidade, shadow) --recebeu o container shadow + _setmetatable (habilidade, habilidade_energy) + habilidade.__index = habilidade_energy + + if (shadow ~= -1) then + habilidade.shadow = shadow._ActorTable[habilidade.id] + _detalhes.refresh:r_container_combatentes (habilidade.targets, habilidade.shadow.targets) + else + _detalhes.refresh:r_container_combatentes (habilidade.targets, -1) + end end -end -function _detalhes.clear:c_habilidade_e_energy (habilidade) - --habilidade.__index = {} - habilidade.__index = {} - habilidade.shadow = nil - - _detalhes.clear:c_container_combatentes (habilidade.targets) -end + function _detalhes.clear:c_habilidade_e_energy (habilidade) + --habilidade.__index = {} + habilidade.__index = {} + habilidade.shadow = nil + + _detalhes.clear:c_container_combatentes (habilidade.targets) + end -habilidade_energy.__sub = function (tabela1, tabela2) + habilidade_energy.__sub = function (tabela1, tabela2) - tabela1.mana = tabela1.mana - tabela2.mana - tabela1.e_rage = tabela1.e_rage - tabela2.e_rage - tabela1.e_energy = tabela1.e_energy - tabela2.e_energy - tabela1.runepower = tabela1.runepower - tabela2.runepower - - tabela1.counter = tabela1.counter - tabela2.counter + tabela1.mana = tabela1.mana - tabela2.mana + tabela1.e_rage = tabela1.e_rage - tabela2.e_rage + tabela1.e_energy = tabela1.e_energy - tabela2.e_energy + tabela1.runepower = tabela1.runepower - tabela2.runepower + + tabela1.counter = tabela1.counter - tabela2.counter - return tabela1 -end + return tabela1 + end diff --git a/classes/classe_heal.lua b/classes/classe_heal.lua index 5c019c42..37d11efb 100644 --- a/classes/classe_heal.lua +++ b/classes/classe_heal.lua @@ -52,10 +52,6 @@ local class_type = _detalhes.atributos.cura local DATA_TYPE_START = _detalhes._detalhes_props.DATA_TYPE_START local DATA_TYPE_END = _detalhes._detalhes_props.DATA_TYPE_END -local DFLAG_player = _detalhes.flags.player -local DFLAG_group = _detalhes.flags.in_group -local DFLAG_player_group = _detalhes.flags.player_in_group - local div_abre = _detalhes.divisores.abre local div_fecha = _detalhes.divisores.fecha local div_lugar = _detalhes.divisores.colocacao @@ -331,7 +327,6 @@ function atributo_heal:RefreshWindow (instancia, tabela_do_combate, forcar, expo end)--]] for index, player in _ipairs (conteudo) do - --if (_bit_band (player.flag, DFLAG_player_group) >= 0x101) then --> é um player e esta em grupo if (player.grupo) then --> é um player e esta em grupo if (player[keyName] < 1) then --> dano menor que 1, interromper o loop amount = index - 1 diff --git a/classes/classe_heal_habilidade.lua b/classes/classe_heal_habilidade.lua index 21778142..d20af75b 100644 --- a/classes/classe_heal_habilidade.lua +++ b/classes/classe_heal_habilidade.lua @@ -1,154 +1,154 @@ ---[[ classe do dano aplicado, usado nos eventos: -- SPELL_HEAL -- SPELL_PERIODIC_HEAL -Parents: - addon -> combate atual -> Npc/Player Swicth -> Container de Habilidades -> esta tabela - ]] +-- heal ability file -local _detalhes = _G._detalhes -local gump = _detalhes.gump + local _detalhes = _G._detalhes + local _ -local alvo_da_habilidade = _detalhes.alvo_da_habilidade -local habilidade_cura = _detalhes.habilidade_cura -local container_combatentes = _detalhes.container_combatentes -local container_heal_target = _detalhes.container_type.CONTAINER_HEALTARGET_CLASS +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> local pointers -local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC - ---lua locals -local _setmetatable = setmetatable ---api locals - -function habilidade_cura:NovaTabela (id, link) --aqui eu não sei que parâmetros passar - - local _newHealSpell = { + local _setmetatable = setmetatable --lua local - total = 0, - totalabsorb = 0, - counter = 0, - id = id, +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> constants - --> normal hits - n_min = 0, - n_max = 0, - n_amt = 0, - n_curado = 0, + local alvo_da_habilidade = _detalhes.alvo_da_habilidade + local habilidade_cura = _detalhes.habilidade_cura + local container_combatentes = _detalhes.container_combatentes + local container_heal_target = _detalhes.container_type.CONTAINER_HEALTARGET_CLASS + local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> internals + + function habilidade_cura:NovaTabela (id, link) + + local _newHealSpell = { - --> critical hits - c_min = 0, - c_max = 0, - c_amt = 0, - c_curado = 0, + total = 0, + totalabsorb = 0, + counter = 0, + id = id, - absorbed = 0, - overheal = 0, + --> normal hits + n_min = 0, + n_max = 0, + n_amt = 0, + n_curado = 0, + + --> critical hits + c_min = 0, + c_max = 0, + c_amt = 0, + c_curado = 0, + + absorbed = 0, + overheal = 0, + + targets = container_combatentes:NovoContainer (container_heal_target) + } - targets = container_combatentes:NovoContainer (container_heal_target) - } - - _setmetatable (_newHealSpell, habilidade_cura) - - if (link) then - _newHealSpell.targets.shadow = link.targets - end - - return _newHealSpell -end - ---> o primeiro parametro "spell" vira self a atrasa 1 parâmetro em todos os argumentos. -function habilidade_cura:Add (serial, nome, flag, amount, who_nome, absorbed, critical, overhealing, is_shield) - - self.counter = self.counter + 1 - - --local alvo = self.targets:PegarCombatente (serial, nome, flag, true) - local alvo = self.targets._NameIndexTable [nome] - if (not alvo) then - alvo = self.targets:PegarCombatente (serial, nome, flag, true) - else - alvo = self.targets._ActorTable [alvo] - end - - if (absorbed and absorbed > 0) then - self.absorbed = self.absorbed + absorbed - alvo.absorbed = alvo.absorbed + absorbed - end - - if (overhealing and overhealing > 0) then - self.overheal = self.overheal + overhealing - alvo.overheal = alvo.overheal + overhealing - end - - if (amount and amount > 0) then - - self.total = self.total + amount - if (is_shield) then - self.totalabsorb = self.totalabsorb + amount + _setmetatable (_newHealSpell, habilidade_cura) + + if (link) then + _newHealSpell.targets.shadow = link.targets end + + return _newHealSpell + end - alvo:AddQuantidade (amount) + function habilidade_cura:Add (serial, nome, flag, amount, who_nome, absorbed, critical, overhealing, is_shield) - if (critical) then - self.c_curado = self.c_curado+amount --> amount é o total de dano - self.c_amt = self.c_amt+1 --> amount é o total de dano - if (amount > self.c_max) then - self.c_max = amount - end - if (self.c_min > amount or self.c_min == 0) then - self.c_min = amount - end + self.counter = self.counter + 1 + + local alvo = self.targets._NameIndexTable [nome] + if (not alvo) then + alvo = self.targets:PegarCombatente (serial, nome, flag, true) else - self.n_curado = self.n_curado+amount - self.n_amt = self.n_amt+1 - if (amount > self.n_max) then - self.n_max = amount + alvo = self.targets._ActorTable [alvo] + end + + if (absorbed and absorbed > 0) then + self.absorbed = self.absorbed + absorbed + alvo.absorbed = alvo.absorbed + absorbed + end + + if (overhealing and overhealing > 0) then + self.overheal = self.overheal + overhealing + alvo.overheal = alvo.overheal + overhealing + end + + if (amount and amount > 0) then + + self.total = self.total + amount + alvo.total = alvo.total + amount + + if (is_shield) then + self.totalabsorb = self.totalabsorb + amount end - if (self.n_min > amount or self.n_min == 0) then - self.n_min = amount + + if (critical) then + self.c_curado = self.c_curado+amount --> amount é o total de dano + self.c_amt = self.c_amt+1 --> amount é o total de dano + if (amount > self.c_max) then + self.c_max = amount + end + if (self.c_min > amount or self.c_min == 0) then + self.c_min = amount + end + else + self.n_curado = self.n_curado+amount + self.n_amt = self.n_amt+1 + if (amount > self.n_max) then + self.n_max = amount + end + if (self.n_min > amount or self.n_min == 0) then + self.n_min = amount + end end end - else - alvo:AddQuantidade (0) + end -end +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> core -function _detalhes.refresh:r_habilidade_cura (habilidade, shadow) - _setmetatable (habilidade, habilidade_cura) - habilidade.__index = habilidade_cura - - if (shadow ~= -1) then - habilidade.shadow = shadow._ActorTable[habilidade.id] - _detalhes.refresh:r_container_combatentes (habilidade.targets, habilidade.shadow.targets) - else - _detalhes.refresh:r_container_combatentes (habilidade.targets, -1) + function _detalhes.refresh:r_habilidade_cura (habilidade, shadow) + _setmetatable (habilidade, habilidade_cura) + habilidade.__index = habilidade_cura + + if (shadow ~= -1) then + habilidade.shadow = shadow._ActorTable[habilidade.id] + _detalhes.refresh:r_container_combatentes (habilidade.targets, habilidade.shadow.targets) + else + _detalhes.refresh:r_container_combatentes (habilidade.targets, -1) + end end -end -function _detalhes.clear:c_habilidade_cura (habilidade) - --habilidade.__index = {} - habilidade.__index = nil - habilidade.shadow = nil - - _detalhes.clear:c_container_combatentes (habilidade.targets) -end + function _detalhes.clear:c_habilidade_cura (habilidade) + --habilidade.__index = {} + habilidade.__index = nil + habilidade.shadow = nil + + _detalhes.clear:c_container_combatentes (habilidade.targets) + end -habilidade_cura.__sub = function (tabela1, tabela2) - tabela1.total = tabela1.total - tabela2.total - tabela1.totalabsorb = tabela1.totalabsorb - tabela2.totalabsorb - tabela1.counter = tabela1.counter - tabela2.counter + habilidade_cura.__sub = function (tabela1, tabela2) + tabela1.total = tabela1.total - tabela2.total + tabela1.totalabsorb = tabela1.totalabsorb - tabela2.totalabsorb + tabela1.counter = tabela1.counter - tabela2.counter - tabela1.n_min = tabela1.n_min - tabela2.n_min - tabela1.n_max = tabela1.n_max - tabela2.n_max - tabela1.n_amt = tabela1.n_amt - tabela2.n_amt - tabela1.n_curado = tabela1.n_curado - tabela2.n_curado + tabela1.n_min = tabela1.n_min - tabela2.n_min + tabela1.n_max = tabela1.n_max - tabela2.n_max + tabela1.n_amt = tabela1.n_amt - tabela2.n_amt + tabela1.n_curado = tabela1.n_curado - tabela2.n_curado - tabela1.c_min = tabela1.c_min - tabela2.c_min - tabela1.c_max = tabela1.c_max - tabela2.c_max - tabela1.c_amt = tabela1.c_amt - tabela2.c_amt - tabela1.c_curado = tabela1.c_curado - tabela2.c_curado + tabela1.c_min = tabela1.c_min - tabela2.c_min + tabela1.c_max = tabela1.c_max - tabela2.c_max + tabela1.c_amt = tabela1.c_amt - tabela2.c_amt + tabela1.c_curado = tabela1.c_curado - tabela2.c_curado - tabela1.absorbed = tabela1.absorbed - tabela2.absorbed - tabela1.overheal = tabela1.overheal - tabela2.overheal - - return tabela1 -end + tabela1.absorbed = tabela1.absorbed - tabela2.absorbed + tabela1.overheal = tabela1.overheal - tabela2.overheal + + return tabela1 + end diff --git a/classes/classe_others.lua b/classes/classe_others.lua index 125c79a0..735b27b6 100644 --- a/classes/classe_others.lua +++ b/classes/classe_others.lua @@ -53,10 +53,6 @@ local class_type = _detalhes.atributos.misc local DATA_TYPE_START = _detalhes._detalhes_props.DATA_TYPE_START local DATA_TYPE_END = _detalhes._detalhes_props.DATA_TYPE_END -local DFLAG_player = _detalhes.flags.player -local DFLAG_group = _detalhes.flags.in_group -local DFLAG_player_group = _detalhes.flags.player_in_group - local div_abre = _detalhes.divisores.abre local div_fecha = _detalhes.divisores.fecha local div_lugar = _detalhes.divisores.colocacao @@ -547,7 +543,6 @@ function atributo_misc:RefreshWindow (instancia, tabela_do_combate, forcar, expo --end for index, player in _ipairs (conteudo) do - --if (_bit_band (player.flag, DFLAG_player_group) >= 0x101) then --> é um player e esta em grupo if (player.grupo) then --> é um player e esta em grupo if (not player[keyName] or player[keyName] < 1) then --> dano menor que 1, interromper o loop amount = index - 1 diff --git a/classes/classe_others_habilidade.lua b/classes/classe_others_habilidade.lua index a9437922..ad0a4f7a 100644 --- a/classes/classe_others_habilidade.lua +++ b/classes/classe_others_habilidade.lua @@ -1,58 +1,198 @@ -local _detalhes = _G._detalhes ---local gump = _detalhes.gump +-- misc ability file + local _detalhes = _G._detalhes + local _ -local alvo_da_habilidade = _detalhes.alvo_da_habilidade -local habilidade_misc = _detalhes.habilidade_misc -local container_combatentes = _detalhes.container_combatentes -local container_misc_target = _detalhes.container_type.CONTAINER_MISCTARGET_CLASS +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> local pointers ---lua locals -local _ -local _setmetatable = setmetatable -local _ipairs = ipairs ---api locals -local _UnitAura = UnitAura + local _setmetatable = setmetatable --lua local + local _ipairs = ipairs --lua local + local _UnitAura = UnitAura --api local -local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> constants -function habilidade_misc:NovaTabela (id, link, token) --aqui eu não sei que parâmetros passar + local alvo_da_habilidade = _detalhes.alvo_da_habilidade + local habilidade_misc = _detalhes.habilidade_misc + local container_combatentes = _detalhes.container_combatentes + local container_misc_target = _detalhes.container_type.CONTAINER_MISCTARGET_CLASS + local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC - local _newMiscSpell = { - id = id, - counter = 0, - targets = container_combatentes:NovoContainer (container_misc_target) - } - - if (token == "BUFF_UPTIME" or token == "DEBUFF_UPTIME") then - _newMiscSpell.uptime = 0 - _newMiscSpell.actived = false - _newMiscSpell.activedamt = 0 - elseif (token == "SPELL_INTERRUPT") then - _newMiscSpell.interrompeu_oque = {} - elseif (token == "SPELL_DISPEL" or token == "SPELL_STOLEN") then - _newMiscSpell.dispell_oque = {} - elseif (token == "SPELL_AURA_BROKEN" or token == "SPELL_AURA_BROKEN_SPELL") then - _newMiscSpell.cc_break_oque = {} - end +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> internals - _setmetatable (_newMiscSpell, habilidade_misc) - - if (link) then - _newMiscSpell.targets.shadow = link.targets - end - - return _newMiscSpell -end + function habilidade_misc:NovaTabela (id, link, token) -function habilidade_misc:Add (serial, nome, flag, who_nome, token, spellID, spellName) - - --alvo:AddQuantidade (1) - if (spellID == "BUFF_OR_DEBUFF") then + local _newMiscSpell = { + id = id, + counter = 0, + targets = container_combatentes:NovoContainer (container_misc_target) + } - if (spellName == "COOLDOWN") then - self.counter = self.counter + 1 + if (token == "BUFF_UPTIME" or token == "DEBUFF_UPTIME") then + _newMiscSpell.uptime = 0 + _newMiscSpell.actived = false + _newMiscSpell.activedamt = 0 + elseif (token == "SPELL_INTERRUPT") then + _newMiscSpell.interrompeu_oque = {} + elseif (token == "SPELL_DISPEL" or token == "SPELL_STOLEN") then + _newMiscSpell.dispell_oque = {} + elseif (token == "SPELL_AURA_BROKEN" or token == "SPELL_AURA_BROKEN_SPELL") then + _newMiscSpell.cc_break_oque = {} + end + + _setmetatable (_newMiscSpell, habilidade_misc) + + if (link) then + _newMiscSpell.targets.shadow = link.targets + end + + return _newMiscSpell + end + + function habilidade_misc:Add (serial, nome, flag, who_nome, token, spellID, spellName) + + if (spellID == "BUFF_OR_DEBUFF") then - --> alvo + if (spellName == "COOLDOWN") then + self.counter = self.counter + 1 + + --> alvo + local alvo = self.targets._NameIndexTable [nome] + if (not alvo) then + alvo = self.targets:PegarCombatente (serial, nome, flag, true) + else + alvo = self.targets._ActorTable [alvo] + end + alvo.total = alvo.total + 1 + + elseif (spellName == "BUFF_UPTIME_REFRESH") then + if (self.actived_at and self.actived) then + self.uptime = self.uptime + _detalhes._tempo - self.actived_at + token.buff_uptime = token.buff_uptime + _detalhes._tempo - self.actived_at --> token = actor misc object + + end + self.actived_at = _detalhes._tempo + self.actived = true + + elseif (spellName == "BUFF_UPTIME_OUT") then + if (self.actived_at and self.actived) then + self.uptime = self.uptime + _detalhes._tempo - self.actived_at + token.buff_uptime = token.buff_uptime + _detalhes._tempo - self.actived_at --> token = actor misc object + end + self.actived = false + self.actived_at = nil + + elseif (spellName == "BUFF_UPTIME_IN" or spellName == "DEBUFF_UPTIME_IN") then + self.actived = true + self.activedamt = self.activedamt + 1 + + if (self.actived_at and self.actived and spellName == "DEBUFF_UPTIME_IN") then + --> ja esta ativo em outro mob e jogou num novo + self.uptime = self.uptime + _detalhes._tempo - self.actived_at + token.debuff_uptime = token.debuff_uptime + _detalhes._tempo - self.actived_at + end + + self.actived_at = _detalhes._tempo + + elseif (spellName == "DEBUFF_UPTIME_REFRESH") then + if (self.actived_at and self.actived) then + self.uptime = self.uptime + _detalhes._tempo - self.actived_at + token.debuff_uptime = token.debuff_uptime + _detalhes._tempo - self.actived_at + end + self.actived_at = _detalhes._tempo + self.actived = true + + elseif (spellName == "DEBUFF_UPTIME_OUT") then + if (self.actived_at and self.actived) then + self.uptime = self.uptime + _detalhes._tempo - self.actived_at + token.debuff_uptime = token.debuff_uptime + _detalhes._tempo - self.actived_at --> token = actor misc object + end + + self.activedamt = self.activedamt - 1 + + if (self.activedamt == 0) then + self.actived = false + self.actived_at = nil + else + self.actived_at = _detalhes._tempo + end + + end + + elseif (token == "SPELL_INTERRUPT") then + self.counter = self.counter + 1 + + if (not self.interrompeu_oque [spellID]) then --> interrompeu_oque a NIL value + self.interrompeu_oque [spellID] = 1 + else + self.interrompeu_oque [spellID] = self.interrompeu_oque [spellID] + 1 + end + + --alvo + local alvo = self.targets._NameIndexTable [nome] + if (not alvo) then + alvo = self.targets:PegarCombatente (serial, nome, flag, true) + else + alvo = self.targets._ActorTable [alvo] + end + alvo.total = alvo.total + 1 + + elseif (token == "SPELL_RESURRECT") then + if (not self.ress) then + self.ress = 1 + else + self.ress = self.ress + 1 + end + + --alvo + local alvo = self.targets._NameIndexTable [nome] + if (not alvo) then + alvo = self.targets:PegarCombatente (serial, nome, flag, true) + else + alvo = self.targets._ActorTable [alvo] + end + alvo.total = alvo.total + 1 + + + elseif (token == "SPELL_DISPEL" or token == "SPELL_STOLEN") then + if (not self.dispell) then + self.dispell = 1 + else + self.dispell = self.dispell + 1 + end + + if (not self.dispell_oque [spellID]) then + self.dispell_oque [spellID] = 1 + else + self.dispell_oque [spellID] = self.dispell_oque [spellID] + 1 + end + + --alvo + local alvo = self.targets._NameIndexTable [nome] + if (not alvo) then + alvo = self.targets:PegarCombatente (serial, nome, flag, true) + else + alvo = self.targets._ActorTable [alvo] + end + alvo.total = alvo.total + 1 + + + elseif (token == "SPELL_AURA_BROKEN_SPELL" or token == "SPELL_AURA_BROKEN") then + + if (not self.cc_break) then + self.cc_break = 1 + else + self.cc_break = self.cc_break + 1 + end + + if (not self.cc_break_oque [spellID]) then + self.cc_break_oque [spellID] = 1 + else + self.cc_break_oque [spellID] = self.cc_break_oque [spellID] + 1 + end + + --alvo local alvo = self.targets._NameIndexTable [nome] if (not alvo) then alvo = self.targets:PegarCombatente (serial, nome, flag, true) @@ -60,190 +200,57 @@ function habilidade_misc:Add (serial, nome, flag, who_nome, token, spellID, spel alvo = self.targets._ActorTable [alvo] end alvo.total = alvo.total + 1 - - elseif (spellName == "BUFF_UPTIME_REFRESH") then - if (self.actived_at and self.actived) then - self.uptime = self.uptime + _detalhes._tempo - self.actived_at - token.buff_uptime = token.buff_uptime + _detalhes._tempo - self.actived_at --> token = actor misc object - - end - self.actived_at = _detalhes._tempo - self.actived = true - - elseif (spellName == "BUFF_UPTIME_OUT") then - if (self.actived_at and self.actived) then - self.uptime = self.uptime + _detalhes._tempo - self.actived_at - token.buff_uptime = token.buff_uptime + _detalhes._tempo - self.actived_at --> token = actor misc object - end - self.actived = false - self.actived_at = nil - - elseif (spellName == "BUFF_UPTIME_IN" or spellName == "DEBUFF_UPTIME_IN") then - self.actived = true - self.activedamt = self.activedamt + 1 - - if (self.actived_at and self.actived and spellName == "DEBUFF_UPTIME_IN") then - --> ja esta ativo em outro mob e jogou num novo - self.uptime = self.uptime + _detalhes._tempo - self.actived_at - token.debuff_uptime = token.debuff_uptime + _detalhes._tempo - self.actived_at - end - - self.actived_at = _detalhes._tempo - - elseif (spellName == "DEBUFF_UPTIME_REFRESH") then - if (self.actived_at and self.actived) then - self.uptime = self.uptime + _detalhes._tempo - self.actived_at - token.debuff_uptime = token.debuff_uptime + _detalhes._tempo - self.actived_at - end - self.actived_at = _detalhes._tempo - self.actived = true - - elseif (spellName == "DEBUFF_UPTIME_OUT") then - if (self.actived_at and self.actived) then - self.uptime = self.uptime + _detalhes._tempo - self.actived_at - token.debuff_uptime = token.debuff_uptime + _detalhes._tempo - self.actived_at --> token = actor misc object - end - - self.activedamt = self.activedamt - 1 - - if (self.activedamt == 0) then - self.actived = false - self.actived_at = nil - else - self.actived_at = _detalhes._tempo - end - - end - - elseif (token == "SPELL_INTERRUPT") then - self.counter = self.counter + 1 - - if (not self.interrompeu_oque [spellID]) then --> interrompeu_oque a NIL value - self.interrompeu_oque [spellID] = 1 - else - self.interrompeu_oque [spellID] = self.interrompeu_oque [spellID] + 1 - end - - --alvo - local alvo = self.targets._NameIndexTable [nome] - if (not alvo) then - alvo = self.targets:PegarCombatente (serial, nome, flag, true) - else - alvo = self.targets._ActorTable [alvo] - end - alvo.total = alvo.total + 1 - - elseif (token == "SPELL_RESURRECT") then - if (not self.ress) then - self.ress = 1 - else - self.ress = self.ress + 1 - end - - --alvo - local alvo = self.targets._NameIndexTable [nome] - if (not alvo) then - alvo = self.targets:PegarCombatente (serial, nome, flag, true) - else - alvo = self.targets._ActorTable [alvo] - end - alvo.total = alvo.total + 1 - - - elseif (token == "SPELL_DISPEL" or token == "SPELL_STOLEN") then - if (not self.dispell) then - self.dispell = 1 - else - self.dispell = self.dispell + 1 - end - - if (not self.dispell_oque [spellID]) then - self.dispell_oque [spellID] = 1 - else - self.dispell_oque [spellID] = self.dispell_oque [spellID] + 1 end - --alvo - local alvo = self.targets._NameIndexTable [nome] - if (not alvo) then - alvo = self.targets:PegarCombatente (serial, nome, flag, true) - else - alvo = self.targets._ActorTable [alvo] - end - alvo.total = alvo.total + 1 - - - elseif (token == "SPELL_AURA_BROKEN_SPELL" or token == "SPELL_AURA_BROKEN") then - - if (not self.cc_break) then - self.cc_break = 1 - else - self.cc_break = self.cc_break + 1 - end - - if (not self.cc_break_oque [spellID]) then - self.cc_break_oque [spellID] = 1 - else - self.cc_break_oque [spellID] = self.cc_break_oque [spellID] + 1 - end - - --alvo - local alvo = self.targets._NameIndexTable [nome] - if (not alvo) then - alvo = self.targets:PegarCombatente (serial, nome, flag, true) - else - alvo = self.targets._ActorTable [alvo] - end - alvo.total = alvo.total + 1 end -end +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> core ---> habilidade atual e o container de habilidades da shadow -function _detalhes.refresh:r_habilidade_misc (habilidade, shadow) --recebeu o container shadow - _setmetatable (habilidade, habilidade_misc) - habilidade.__index = habilidade_misc - - if (shadow ~= -1) then - habilidade.shadow = shadow._ActorTable[habilidade.id] - _detalhes.refresh:r_container_combatentes (habilidade.targets, habilidade.shadow.targets) - else - _detalhes.refresh:r_container_combatentes (habilidade.targets, -1) - end -end - -function _detalhes.clear:c_habilidade_misc (habilidade) - --habilidade.__index = {} - habilidade.__index = nil - habilidade.shadow = nil - - _detalhes.clear:c_container_combatentes (habilidade.targets) -end - -habilidade_misc.__sub = function (tabela1, tabela2) - - --interrupts & cooldowns - tabela1.counter = tabela1.counter - tabela2.counter - - --buff uptime ou debuff uptime - if (tabela1.uptime and tabela2.uptime) then - tabela1.uptime = tabela1.uptime - tabela2.uptime - end - - --ressesrs - if (tabela1.ress and tabela2.ress) then - tabela1.ress = tabela1.ress - tabela2.ress - end - - --dispells - if (tabela1.dispell and tabela2.dispell) then - tabela1.dispell = tabela1.dispell - tabela2.dispell - end - - --cc_breaks - if (tabela1.cc_break and tabela2.cc_break) then - tabela1.cc_break = tabela1.cc_break - tabela2.cc_break + function _detalhes.refresh:r_habilidade_misc (habilidade, shadow) --recebeu o container shadow + _setmetatable (habilidade, habilidade_misc) + habilidade.__index = habilidade_misc + + if (shadow ~= -1) then + habilidade.shadow = shadow._ActorTable[habilidade.id] + _detalhes.refresh:r_container_combatentes (habilidade.targets, habilidade.shadow.targets) + else + _detalhes.refresh:r_container_combatentes (habilidade.targets, -1) + end end - return tabela1 -end + function _detalhes.clear:c_habilidade_misc (habilidade) + --habilidade.__index = {} + habilidade.__index = nil + habilidade.shadow = nil + + _detalhes.clear:c_container_combatentes (habilidade.targets) + end + + habilidade_misc.__sub = function (tabela1, tabela2) + + --interrupts & cooldowns + tabela1.counter = tabela1.counter - tabela2.counter + + --buff uptime ou debuff uptime + if (tabela1.uptime and tabela2.uptime) then + tabela1.uptime = tabela1.uptime - tabela2.uptime + end + + --ressesrs + if (tabela1.ress and tabela2.ress) then + tabela1.ress = tabela1.ress - tabela2.ress + end + + --dispells + if (tabela1.dispell and tabela2.dispell) then + tabela1.dispell = tabela1.dispell - tabela2.dispell + end + + --cc_breaks + if (tabela1.cc_break and tabela2.cc_break) then + tabela1.cc_break = tabela1.cc_break - tabela2.cc_break + end + + return tabela1 + end diff --git a/classes/classe_target.lua b/classes/classe_target.lua index a602b484..763316cb 100644 --- a/classes/classe_target.lua +++ b/classes/classe_target.lua @@ -1,49 +1,51 @@ +-- class target file -local _detalhes = _G._detalhes ---local AceLocale = LibStub ("AceLocale-3.0") ---local Loc = AceLocale:GetLocale ( "Details" ) - -local gump = _detalhes.gump - -local alvo_da_habilidade = _detalhes.alvo_da_habilidade - ---lua locals -local _setmetatable = setmetatable ---api locals - ---esta tabela irá ser usada por todas os tipos? tipo dano, cura, interrupts? - -function alvo_da_habilidade:NovaTabela (link) - - local esta_tabela = {total = 0} - _setmetatable (esta_tabela, alvo_da_habilidade) + local _detalhes = _G._detalhes - return esta_tabela -end +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> local pointers -function alvo_da_habilidade:AddQuantidade (amt) - self.total = self.total + amt - if (self.shadow) then - return self.shadow:AddQuantidade (amt) + local _setmetatable = setmetatable --lua local + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> constants + + local alvo_da_habilidade = _detalhes.alvo_da_habilidade + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> internals + + function alvo_da_habilidade:NovaTabela (link) + + local esta_tabela = {total = 0} + _setmetatable (esta_tabela, alvo_da_habilidade) + + return esta_tabela end -end -function _detalhes.refresh:r_alvo_da_habilidade (este_alvo, shadow) - _setmetatable (este_alvo, alvo_da_habilidade) - este_alvo.__index = alvo_da_habilidade - este_alvo.shadow = shadow._ActorTable [shadow._NameIndexTable [este_alvo.nome]] -end - -function _detalhes.clear:c_alvo_da_habilidade (este_alvo) - este_alvo.shadow = nil - --este_alvo.__index = {} - este_alvo.__index = nil -end - -alvo_da_habilidade.__sub = function (tabela1, tabela2) - tabela1.total = tabela1.total - tabela2.total - if (tabela1.overheal) then - tabela1.overheal = tabela1.overheal - tabela2.overheal - tabela1.absorbed = tabela1.absorbed - tabela2.absorbed + function alvo_da_habilidade:AddQuantidade (amt) + self.total = self.total + amt + end + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> core + + function _detalhes.refresh:r_alvo_da_habilidade (este_alvo, shadow) + _setmetatable (este_alvo, alvo_da_habilidade) + este_alvo.__index = alvo_da_habilidade + este_alvo.shadow = shadow._ActorTable [shadow._NameIndexTable [este_alvo.nome]] + end + + function _detalhes.clear:c_alvo_da_habilidade (este_alvo) + este_alvo.shadow = nil + --este_alvo.__index = {} + este_alvo.__index = nil + end + + alvo_da_habilidade.__sub = function (tabela1, tabela2) + tabela1.total = tabela1.total - tabela2.total + if (tabela1.overheal) then + tabela1.overheal = tabela1.overheal - tabela2.overheal + tabela1.absorbed = tabela1.absorbed - tabela2.absorbed + end end -end diff --git a/classes/container_combatentes.lua b/classes/container_combatentes.lua index 3ca12af3..90cf7184 100644 --- a/classes/container_combatentes.lua +++ b/classes/container_combatentes.lua @@ -1,511 +1,464 @@ -local _detalhes = _G._detalhes -local gump = _detalhes.gump +-- actor container file -local combatente = _detalhes.combatente -local container_combatentes = _detalhes.container_combatentes -local alvo_da_habilidade = _detalhes.alvo_da_habilidade -local atributo_damage = _detalhes.atributo_damage -local atributo_heal = _detalhes.atributo_heal -local atributo_energy = _detalhes.atributo_energy -local atributo_misc = _detalhes.atributo_misc + local _detalhes = _G._detalhes + local _ -local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC -local container_damage = _detalhes.container_type.CONTAINER_DAMAGE_CLASS -local container_heal = _detalhes.container_type.CONTAINER_HEAL_CLASS -local container_heal_target = _detalhes.container_type.CONTAINER_HEALTARGET_CLASS -local container_friendlyfire = _detalhes.container_type.CONTAINER_FRIENDLYFIRE -local container_damage_target = _detalhes.container_type.CONTAINER_DAMAGETARGET_CLASS -local container_energy = _detalhes.container_type.CONTAINER_ENERGY_CLASS -local container_energy_target = _detalhes.container_type.CONTAINER_ENERGYTARGET_CLASS -local container_misc = _detalhes.container_type.CONTAINER_MISC_CLASS -local container_misc_target = _detalhes.container_type.CONTAINER_MISCTARGET_CLASS -local container_enemydebufftarget_target = _detalhes.container_type.CONTAINER_ENEMYDEBUFFTARGET_CLASS +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> local pointers ---api locals -local _UnitClass = UnitClass -local _IsInInstance = IsInInstance ---lua locals -local _setmetatable = setmetatable -local _getmetatable = getmetatable -local _bit_band = bit.band -local _ipairs = ipairs -local _pairs = pairs - -local _ - ---local table_insert = table.insert - ---> FLAGS <== qual o tipo do objeto -local OBJECT_TYPE_MASK = 0x0000FC00 -local OBJECT_TYPE_OBJECT = 0x00004000 -local OBJECT_TYPE_PETGUARDIAN = 0x00003000 -local OBJECT_TYPE_GUARDIAN = 0x00002000 -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 - -function container_combatentes:NovoContainer (tipo_do_container, combatTable, combatId) - - local _newContainer = { + local _UnitClass = UnitClass --api local + local _IsInInstance = IsInInstance --api local - funcao_de_criacao = container_combatentes:FuncaoDeCriacao (tipo_do_container), - - tipo = tipo_do_container, - - combatId = combatId, - - _ActorTable = {}, - _NameIndexTable = {} - } + local _setmetatable = setmetatable --lua local + local _getmetatable = getmetatable --lua local + local _bit_band = bit.band --lua local + local _ipairs = ipairs --lua local + local _pairs = pairs --lua local - _setmetatable (_newContainer, container_combatentes) +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> constants - return _newContainer -end + local combatente = _detalhes.combatente + local container_combatentes = _detalhes.container_combatentes + local alvo_da_habilidade = _detalhes.alvo_da_habilidade + local atributo_damage = _detalhes.atributo_damage + local atributo_heal = _detalhes.atributo_heal + local atributo_energy = _detalhes.atributo_energy + local atributo_misc = _detalhes.atributo_misc -local function get_actor_class (novo_objeto, nome, flag) - local _, engClass = _UnitClass (nome) + local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC + local container_damage = _detalhes.container_type.CONTAINER_DAMAGE_CLASS + local container_heal = _detalhes.container_type.CONTAINER_HEAL_CLASS + local container_heal_target = _detalhes.container_type.CONTAINER_HEALTARGET_CLASS + local container_friendlyfire = _detalhes.container_type.CONTAINER_FRIENDLYFIRE + local container_damage_target = _detalhes.container_type.CONTAINER_DAMAGETARGET_CLASS + local container_energy = _detalhes.container_type.CONTAINER_ENERGY_CLASS + local container_energy_target = _detalhes.container_type.CONTAINER_ENERGYTARGET_CLASS + local container_misc = _detalhes.container_type.CONTAINER_MISC_CLASS + local container_misc_target = _detalhes.container_type.CONTAINER_MISCTARGET_CLASS + local container_enemydebufftarget_target = _detalhes.container_type.CONTAINER_ENEMYDEBUFFTARGET_CLASS - if (engClass) then - novo_objeto.classe = engClass - return - else - if (flag) then - --> conferir se o jogador é um player - if (_bit_band (flag, OBJECT_TYPE_PLAYER) ~= 0) then - novo_objeto.classe = "UNGROUPPLAYER" - return - elseif (_bit_band (flag, OBJECT_TYPE_PETGUARDIAN) ~= 0) then - novo_objeto.classe = "PET" - return - end + --> flags + local REACTION_HOSTILE = 0x00000040 + local IS_GROUP_OBJECT = 0x00000007 + local OBJECT_TYPE_MASK = 0x0000FC00 + local OBJECT_TYPE_OBJECT = 0x00004000 + local OBJECT_TYPE_PETGUARDIAN = 0x00003000 + local OBJECT_TYPE_GUARDIAN = 0x00002000 + 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 + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> api functions + + function container_combatentes:GetAmount (actorName, key) + key = key or "total" + local index = self._NameIndexTable [actorName] + if (index) then + return self._ActorTable [index] [key] or 0 + else + return 0 end - novo_objeto.classe = "UNKNOW" - return end -end -function container_combatentes:GetAmount (actorName, key) - key = key or "total" - local index = self._NameIndexTable [actorName] - if (index) then - return self._ActorTable [index] [key] or 0 - else - return 0 - end -end +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> internals -local read_actor_flag = function (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) - -- converte a flag do wow em flag do details ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - --> pega afiliação - local details_flag = 0x00000000 - - if (flag) then - --print ("tem flag") - - if (_bit_band (flag, 0x00000400) ~= 0) then --> é um player - details_flag = details_flag+0x00000001 + --> build a new actor container + function container_combatentes:NovoContainer (tipo_do_container, combat_table, combat_id) + local _newContainer = { + funcao_de_criacao = container_combatentes:FuncaoDeCriacao (tipo_do_container), - novo_objeto.displayName = _detalhes:GetNickname (serial, false, true) --> serial, default, silent - if (not novo_objeto.displayName) then + tipo = tipo_do_container, + + combatId = combat_id, + + _ActorTable = {}, + _NameIndexTable = {} + } + + _setmetatable (_newContainer, container_combatentes) + + return _newContainer + end + + --> try to get the actor class from name + local function get_actor_class (novo_objeto, nome, flag) + local _, engClass = _UnitClass (nome) + + if (engClass) then + novo_objeto.classe = engClass + return + else + if (flag) then + --> conferir se o jogador é um player + if (_bit_band (flag, OBJECT_TYPE_PLAYER) ~= 0) then + novo_objeto.classe = "UNGROUPPLAYER" + return + elseif (_bit_band (flag, OBJECT_TYPE_PETGUARDIAN) ~= 0) then + novo_objeto.classe = "PET" + return + end + end + novo_objeto.classe = "UNKNOW" + return + end + end + + --> read the actor flag + local read_actor_flag = function (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) + + if (flag) then + + --> é um player + if (_bit_band (flag, OBJECT_TYPE_PLAYER) ~= 0) then + novo_objeto.displayName = _detalhes:GetNickname (serial, false, true) --> serial, default, silent + if (not novo_objeto.displayName) then + if (_IsInInstance() and _detalhes.remove_realm_from_name) then + novo_objeto.displayName = nome:gsub (("%-.*"), "") + else + novo_objeto.displayName = nome + end + end + + if (_bit_band (flag, IS_GROUP_OBJECT) ~= 0 and novo_objeto.classe ~= "UNGROUPPLAYER") then --> faz parte do grupo + novo_objeto.grupo = true + + if (shadow_objeto) then + shadow_objeto.grupo = true + end + + if (_detalhes:IsATank (serial)) then + novo_objeto.isTank = true + if (shadow_objeto) then + shadow_objeto.isTank = true + end + end + end + + --> é um pet + elseif (dono_do_pet) then + novo_objeto.owner = dono_do_pet + novo_objeto.ownerName = dono_do_pet.nome + if (_IsInInstance() and _detalhes.remove_realm_from_name) then - novo_objeto.displayName = nome:gsub (("%-.*"), "") - --print (novo_objeto.displayName) + novo_objeto.displayName = nome:gsub (("%-.*"), ">") else novo_objeto.displayName = nome end - end - - if (_bit_band (flag, EM_GRUPO) ~= 0 and novo_objeto.classe ~= "UNGROUPPLAYER") then --> faz parte do grupo - details_flag = details_flag+0x00000100 - novo_objeto.grupo = true - - if (shadow_objeto) then - shadow_objeto.grupo = true - end - if (_detalhes:IsATank (serial)) then - novo_objeto.isTank = true - if (shadow_objeto) then - shadow_objeto.isTank = true - end - end - end - - elseif (dono_do_pet) then --> é um pet - - details_flag = details_flag+0x00000002 - novo_objeto.owner = dono_do_pet - novo_objeto.ownerName = dono_do_pet.nome - - if (_IsInInstance() and _detalhes.remove_realm_from_name) then - novo_objeto.displayName = nome:gsub (("%-.*"), ">") else novo_objeto.displayName = nome end - --if (not novo_objeto.displayName:find (">")) then - -- novo_objeto.displayName = novo_objeto.displayName .. ">" - --end - - --print ("pet -> " .. nome) - else - novo_objeto.displayName = nome - end - - -- 0x00000060 --> inimigo neutro - if (_bit_band (flag, 0x00000010) ~= 0) then --> é amigo - details_flag = details_flag+0x00000010 - - elseif (_bit_band (flag, 0x00000020) ~= 0) then --> é neutro - details_flag = details_flag+0x00000020 - --print ("neutro -> " .. nome) - - elseif (_bit_band (flag, 0x00000040) ~= 0) then --> é inimigo - - details_flag = details_flag+0x00000040 - - if (_bit_band (flag, 0x00000400) == 0 and _bit_band (flag, OBJECT_TYPE_PETGUARDIAN) == 0) then - novo_objeto.monster = true - end - --print ("inimigos -> " .. nome) - end - else - --print (flag) - end - - novo_objeto.flag = details_flag - novo_objeto.flag_original = flag - novo_objeto.serial = serial -end - -function container_combatentes:PegarCombatente (serial, nome, flag, criar, isOwner) - - --> antes de mais nada, vamos verificar se é um pet - local dono_do_pet - if (flag and _bit_band (flag, OBJECT_TYPE_PETS) ~= 0) then --> é um pet - - --> aqui ele precisaria achar as tag < > pra saber se o nome passado já não veio com o dono imbutido - --> se não tiver as tags, terá que ser posto aqui - if (not nome:find ("<") or not nome:find (">")) then --> find é lento, não teria outra forma de fazer isso? - - local nome_dele, dono_nome, dono_serial, dono_flag = _detalhes.tabela_pets:PegaDono (serial, nome, flag) - - if (nome_dele) then - - nome = nome_dele - --if (_detalhes.debug) then - -- print ("creating actor for pet:", nome, "owner:", dono_nome) - --end - - --> e se olharmos no cache do parser antes de tentar cria-lo? - - dono_do_pet = self:PegarCombatente (dono_serial, dono_nome, dono_flag, true, nome) - + --> é inimigo + if (_bit_band (flag, 0x00000040) ~= 0) then + if (_bit_band (flag, OBJECT_TYPE_PLAYER) == 0 and _bit_band (flag, OBJECT_TYPE_PETGUARDIAN) == 0) then + novo_objeto.monster = true + end end end + + novo_objeto.flag_original = flag + novo_objeto.serial = serial end - local index = self._NameIndexTable [nome] --> pega o index no mapa - if (index) then - return self._ActorTable [index], dono_do_pet, nome - - elseif (criar) then + function container_combatentes:PegarCombatente (serial, nome, flag, criar, isOwner) - -- rotinas de criação do objeto shadow ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - local shadow = self.shadow --> espelho do container no overall - local shadow_objeto - - if (shadow) then --> se tiver o espelho (não for a tabela overall já) - shadow_objeto = shadow:PegarCombatente (_, nome) --> apenas verifica se ele existe ou não - if (not shadow_objeto) then --> se não existir, cria-lo - local novo_nome = nome:gsub ((" <.*"), "") --> tira o nome do pet - shadow_objeto = shadow:PegarCombatente (serial, novo_nome, flag, true) + --> verifica se é um pet, se for confere se tem o nome do dono, se não tiver, precisa por + local dono_do_pet + if (flag and _bit_band (flag, OBJECT_TYPE_PETS) ~= 0) then --> é um pet + --> aqui ele precisaria achar as tag < > pra saber se o nome passado já não veio com o dono imbutido, se não tiver as tags, terá que ser posto aqui + if (not nome:find ("<") or not nome:find (">")) then --> find é lento, não teria outra forma de fazer isso? + local nome_dele, dono_nome, dono_serial, dono_flag = _detalhes.tabela_pets:PegaDono (serial, nome, flag) + if (nome_dele) then + nome = nome_dele + dono_do_pet = self:PegarCombatente (dono_serial, dono_nome, dono_flag, true, nome) + end end end - local novo_objeto = self.funcao_de_criacao (_, serial, nome, shadow_objeto) --> shadow_objeto passa para o classe_damage gravar no .targets e .spell_tables, mas não grava nele mesmo + --> pega o index no mapa + local index = self._NameIndexTable [nome] + --> retorna o actor + if (index) then + return self._ActorTable [index], dono_do_pet, nome - novo_objeto.nome = nome - --print (nome) - - -- tipo do container ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + --> não achou, criar + elseif (criar) then - --if (self.tipo == container_playernpc) then --> CONTAINER COMUM - - if (self.tipo == container_damage) then --> CONTAINER DAMAGE + --> espelho do container no overall + local shadow = self.shadow + local shadow_objeto - 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 - end - - if (shadow_objeto) then - novo_objeto.shadow = shadow_objeto - novo_objeto:CriaLink (shadow_objeto) --> criando o link - shadow_objeto.flag = details_flag - if (novo_objeto.grupo and _detalhes.in_combat) then - _detalhes.cache_damage_group [#_detalhes.cache_damage_group+1] = novo_objeto + --> se tiver o espelho (não for a tabela overall já) + if (shadow) then + --> apenas verifica se ele existe ou não + shadow_objeto = shadow:PegarCombatente (_, nome) + --> se não existir, cria-lo + if (not shadow_objeto) then + --> tira o nome do pet + local novo_nome = nome:gsub ((" <.*"), "") + --> cria o objeto + shadow_objeto = shadow:PegarCombatente (serial, novo_nome, flag, true) end end - - if (novo_objeto.classe == "UNGROUPPLAYER") then --> is a player - if (_bit_band (flag, REACTION_HOSTILE ) ~= 0) then --> is hostile - novo_objeto.enemy = true - end - - --> try to guess his class - if (shadow) then --> não executar 2x - _detalhes:ScheduleTimer ("GuessClass", 1, {novo_objeto, self, 1}) - end - end - - if (novo_objeto.isTank) then - novo_objeto.avoidance = _detalhes:CreateActorAvoidanceTable() - end - - elseif (self.tipo == container_heal) then --> CONTAINER HEALING - - 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 - end - - if (shadow_objeto) then - novo_objeto.shadow = shadow_objeto - novo_objeto:CriaLink (shadow_objeto) --> criando o link - shadow_objeto.flag = details_flag - if (novo_objeto.grupo and _detalhes.in_combat) then - _detalhes.cache_healing_group [#_detalhes.cache_healing_group+1] = novo_objeto - end - end - - if (novo_objeto.classe == "UNGROUPPLAYER") then --> is a player - if (_bit_band (flag, REACTION_HOSTILE ) ~= 0) then --> is hostile - novo_objeto.enemy = true --print (nome.." EH UM INIMIGO -> " .. engRace) - end - - --> try to guess his class - if (shadow) then --> não executar 2x - _detalhes:ScheduleTimer ("GuessClass", 1, {novo_objeto, self, 1}) - end - end - - - elseif (self.tipo == container_energy) then --> CONTAINER ENERGY - - 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 - end - - if (shadow_objeto) then - novo_objeto.shadow = shadow_objeto - novo_objeto:CriaLink (shadow_objeto) --> criando o link - shadow_objeto.flag = details_flag - end - - if (novo_objeto.classe == "UNGROUPPLAYER") then --> is a player - if (_bit_band (flag, REACTION_HOSTILE ) ~= 0) then --> is hostile - novo_objeto.enemy = true --print (nome.." EH UM INIMIGO -> " .. engRace) - end - - --> try to guess his class - if (shadow) then --> não executar 2x - _detalhes:ScheduleTimer ("GuessClass", 1, {novo_objeto, self, 1}) - end - end - - elseif (self.tipo == container_misc) then --> CONTAINER MISC - - get_actor_class (novo_objeto, nome, flag) - read_actor_flag (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) - - --local teste_classe = - - if (dono_do_pet) then - dono_do_pet.pets [#dono_do_pet.pets+1] = nome - end - - if (shadow_objeto) then - novo_objeto.shadow = shadow_objeto - novo_objeto:CriaLink (shadow_objeto) --> criando o link - shadow_objeto.flag = details_flag - end - - if (novo_objeto.classe == "UNGROUPPLAYER") then --> is a player - if (_bit_band (flag, REACTION_HOSTILE ) ~= 0) then --> is hostile - novo_objeto.enemy = true --print (nome.." EH UM INIMIGO -> " .. engRace) - end - - --> try to guess his class - if (shadow) then --> não executar 2x - _detalhes:ScheduleTimer ("GuessClass", 1, {novo_objeto, self, 1}) - end - end - - elseif (self.tipo == container_damage_target) then --> CONTAINER ALVO DO DAMAGE - if (shadow_objeto) then - novo_objeto.shadow = shadow_objeto - --shadow_objeto.flag = details_flag - end - - elseif (self.tipo == container_heal_target) then --> CONTAINER ALVOS DO HEALING - novo_objeto.overheal = 0 - novo_objeto.absorbed = 0 - if (shadow_objeto) then - novo_objeto.shadow = shadow_objeto - --shadow_objeto.flag = details_flag - end - - elseif (self.tipo == container_energy_target) then --> CONTAINER ALVOS DO ENERGY - - novo_objeto.mana = 0 - novo_objeto.e_rage = 0 - novo_objeto.e_energy = 0 - novo_objeto.runepower = 0 - - if (shadow_objeto) then - novo_objeto.shadow = shadow_objeto - end - - elseif (self.tipo == container_enemydebufftarget_target) then - - novo_objeto.uptime = 0 - novo_objeto.actived = false - novo_objeto.activedamt = 0 - - if (shadow_objeto) then - novo_objeto.shadow = shadow_objeto - end - - elseif (self.tipo == container_misc_target) then --> CONTAINER ALVOS DO MISC - if (shadow_objeto) then - novo_objeto.shadow = shadow_objeto - --shadow_objeto.flag = details_flag + local novo_objeto = self.funcao_de_criacao (_, serial, nome, shadow_objeto) --> shadow_objeto passa para o classe_damage gravar no .targets e .spell_tables, mas não grava nele mesmo + novo_objeto.nome = nome + + -- tipo do container + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + + if (self.tipo == container_damage) then --> CONTAINER DAMAGE + + 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 + end + + if (shadow_objeto) then + novo_objeto.shadow = shadow_objeto + novo_objeto:CriaLink (shadow_objeto) --> criando o link + if (novo_objeto.grupo and _detalhes.in_combat) then + _detalhes.cache_damage_group [#_detalhes.cache_damage_group+1] = novo_objeto + end + end + + if (novo_objeto.classe == "UNGROUPPLAYER") then --> is a player + if (_bit_band (flag, REACTION_HOSTILE ) ~= 0) then --> is hostile + novo_objeto.enemy = true + end + + --> try to guess his class + if (shadow) then --> não executar 2x + _detalhes:ScheduleTimer ("GuessClass", 1, {novo_objeto, self, 1}) + end + end + + if (novo_objeto.isTank) then + novo_objeto.avoidance = _detalhes:CreateActorAvoidanceTable() + end + + elseif (self.tipo == container_heal) then --> CONTAINER HEALING + + 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 + end + + if (shadow_objeto) then + novo_objeto.shadow = shadow_objeto + novo_objeto:CriaLink (shadow_objeto) --> criando o link + if (novo_objeto.grupo and _detalhes.in_combat) then + _detalhes.cache_healing_group [#_detalhes.cache_healing_group+1] = novo_objeto + end + end + + if (novo_objeto.classe == "UNGROUPPLAYER") then --> is a player + if (_bit_band (flag, REACTION_HOSTILE ) ~= 0) then --> is hostile + novo_objeto.enemy = true --print (nome.." EH UM INIMIGO -> " .. engRace) + end + + --> try to guess his class + if (shadow) then --> não executar 2x + _detalhes:ScheduleTimer ("GuessClass", 1, {novo_objeto, self, 1}) + end + end + + + elseif (self.tipo == container_energy) then --> CONTAINER ENERGY + + 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 + end + + if (shadow_objeto) then + novo_objeto.shadow = shadow_objeto + novo_objeto:CriaLink (shadow_objeto) --> criando o link + end + + if (novo_objeto.classe == "UNGROUPPLAYER") then --> is a player + if (_bit_band (flag, REACTION_HOSTILE ) ~= 0) then --> is hostile + novo_objeto.enemy = true + end + + --> try to guess his class + if (shadow) then --> não executar 2x + _detalhes:ScheduleTimer ("GuessClass", 1, {novo_objeto, self, 1}) + end + end + + elseif (self.tipo == container_misc) then --> CONTAINER MISC + + get_actor_class (novo_objeto, nome, flag) + read_actor_flag (novo_objeto, shadow_objeto, dono_do_pet, serial, flag, nome) + + --local teste_classe = + + if (dono_do_pet) then + dono_do_pet.pets [#dono_do_pet.pets+1] = nome + end + + if (shadow_objeto) then + novo_objeto.shadow = shadow_objeto + novo_objeto:CriaLink (shadow_objeto) --> criando o link + end + + if (novo_objeto.classe == "UNGROUPPLAYER") then --> is a player + if (_bit_band (flag, REACTION_HOSTILE ) ~= 0) then --> is hostile + novo_objeto.enemy = true + end + + --> try to guess his class + if (shadow) then --> não executar 2x + _detalhes:ScheduleTimer ("GuessClass", 1, {novo_objeto, self, 1}) + end + end + + elseif (self.tipo == container_damage_target) then --> CONTAINER ALVO DO DAMAGE + if (shadow_objeto) then + novo_objeto.shadow = shadow_objeto + end + + elseif (self.tipo == container_heal_target) then --> CONTAINER ALVOS DO HEALING + novo_objeto.overheal = 0 + novo_objeto.absorbed = 0 + if (shadow_objeto) then + novo_objeto.shadow = shadow_objeto + end + + elseif (self.tipo == container_energy_target) then --> CONTAINER ALVOS DO ENERGY + + novo_objeto.mana = 0 + novo_objeto.e_rage = 0 + novo_objeto.e_energy = 0 + novo_objeto.runepower = 0 + + if (shadow_objeto) then + novo_objeto.shadow = shadow_objeto + end + + elseif (self.tipo == container_enemydebufftarget_target) then + + novo_objeto.uptime = 0 + novo_objeto.actived = false + novo_objeto.activedamt = 0 + + if (shadow_objeto) then + novo_objeto.shadow = shadow_objeto + end + + elseif (self.tipo == container_misc_target) then --> CONTAINER ALVOS DO MISC + + if (shadow_objeto) then + novo_objeto.shadow = shadow_objeto + end + + elseif (self.tipo == container_friendlyfire) then --> CONTAINER FRIENDLY FIRE + + get_actor_class (novo_objeto, nome) + + if (shadow_objeto) then + novo_objeto.shadow = shadow_objeto + end end - - elseif (self.tipo == container_friendlyfire) then --> CONTAINER FRIENDLY FIRE - - get_actor_class (novo_objeto, nome) - - if (shadow_objeto) then - novo_objeto.shadow = shadow_objeto - shadow_objeto.flag = details_flag - end - end - + + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- grava o objeto no mapa do container ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - --[[ - if (self.tipo == container_damage) then - if (nome:find ("Lyl")) then - if (nome:find ("-")) then - print ("nome FIM com -", isOwner) - else - --print ("nome FIM okey", isOwner) - end + local size = #self._ActorTable+1 + self._ActorTable [size] = novo_objeto --> grava na tabela de indexes + self._NameIndexTable [nome] = size --> grava no hash map o index deste jogador + + return novo_objeto, dono_do_pet, nome + else + return nil, nil, nil + end + end + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> core + + function container_combatentes:FuncaoDeCriacao (tipo) + if (tipo == container_damage_target) then + return alvo_da_habilidade.NovaTabela + + elseif (tipo == container_damage) then + return atributo_damage.NovaTabela + + elseif (tipo == container_heal_target) then + return alvo_da_habilidade.NovaTabela + + elseif (tipo == container_heal) then + return atributo_heal.NovaTabela + + elseif (tipo == container_friendlyfire) then + return atributo_damage.FF_funcao_de_criacao + + elseif (tipo == container_enemydebufftarget_target) then + return alvo_da_habilidade.NovaTabela + + elseif (tipo == container_energy) then + return atributo_energy.NovaTabela + + elseif (tipo == container_energy_target) then + return alvo_da_habilidade.NovaTabela + + elseif (tipo == container_misc) then + return atributo_misc.NovaTabela + + elseif (tipo == container_misc_target) then + return alvo_da_habilidade.NovaTabela + + end + end + + --> chama a função para ser executada em todos os atores + function container_combatentes:ActorCallFunction (funcao, ...) + for index, actor in _ipairs (self._ActorTable) do + funcao (nil, actor, ...) + end + end + + function container_combatentes:remapear() + local mapa = self._NameIndexTable + local conteudo = self._ActorTable + for i = 1, #conteudo do + mapa [conteudo[i].nome] = i + end + end + + function _detalhes.refresh:r_container_combatentes (container, shadow) + --> reconstrói meta e indexes + _setmetatable (container, _detalhes.container_combatentes) + container.__index = _detalhes.container_combatentes + container.funcao_de_criacao = container_combatentes:FuncaoDeCriacao (container.tipo) + + --> repara mapa + local mapa = {} + for i = 1, #container._ActorTable do + mapa [container._ActorTable[i].nome] = i end - end - --]] + container._NameIndexTable = mapa - local size = #self._ActorTable+1 - self._ActorTable [size] = novo_objeto --> grava na tabela de indexes - self._NameIndexTable [nome] = size --> grava no hash map o index deste jogador - - return novo_objeto, dono_do_pet, nome - else - return nil, nil, nil + --> seta a shadow + container.shadow = shadow end -end -function container_combatentes:FuncaoDeCriacao (tipo) - if (tipo == container_damage_target) then - return alvo_da_habilidade.NovaTabela - - elseif (tipo == container_damage) then - return atributo_damage.NovaTabela - - elseif (tipo == container_heal_target) then - return alvo_da_habilidade.NovaTabela - - elseif (tipo == container_heal) then - return atributo_heal.NovaTabela - - elseif (tipo == container_friendlyfire) then - return atributo_damage.FF_funcao_de_criacao - - elseif (tipo == container_enemydebufftarget_target) then - return alvo_da_habilidade.NovaTabela - - elseif (tipo == container_energy) then - return atributo_energy.NovaTabela - - elseif (tipo == container_energy_target) then - return alvo_da_habilidade.NovaTabela - - elseif (tipo == container_misc) then - return atributo_misc.NovaTabela - - elseif (tipo == container_misc_target) then - return alvo_da_habilidade.NovaTabela - - end -end - ---> chama a função para ser executada em todos os atores -function container_combatentes:ActorCallFunction (funcao, ...) - for index, actor in _ipairs (self._ActorTable) do - funcao (nil, actor, ...) - end -end - -function container_combatentes:remapear() - local mapa = self._NameIndexTable - local conteudo = self._ActorTable - for i = 1, #conteudo do - mapa [conteudo[i].nome] = i - end -end - -function _detalhes.refresh:r_container_combatentes (container, shadow) - --> reconstrói meta e indexes - _setmetatable (container, _detalhes.container_combatentes) - container.__index = _detalhes.container_combatentes - container.funcao_de_criacao = container_combatentes:FuncaoDeCriacao (container.tipo) - - --> repara mapa - local mapa = {} - for i = 1, #container._ActorTable do - mapa [container._ActorTable[i].nome] = i - end - container._NameIndexTable = mapa - - --> seta a shadow - container.shadow = shadow -end - -function _detalhes.clear:c_container_combatentes (container) - --container.__index = {} - container.__index = nil - container.shadow = nil - container._NameIndexTable = nil - container.need_refresh = nil - container.funcao_de_criacao = nil -end \ No newline at end of file + function _detalhes.clear:c_container_combatentes (container) + container.__index = nil + container.shadow = nil + container._NameIndexTable = nil + container.need_refresh = nil + container.funcao_de_criacao = nil + end \ No newline at end of file diff --git a/classes/container_habilidades.lua b/classes/container_habilidades.lua index 7a042922..11d32286 100644 --- a/classes/container_habilidades.lua +++ b/classes/container_habilidades.lua @@ -1,129 +1,124 @@ +-- spells container file + local _detalhes = _G._detalhes ---local AceLocale = LibStub ("AceLocale-3.0") ---local Loc = AceLocale:GetLocale ( "Details" ) - -local gump = _detalhes.gump - -local _setmetatable = setmetatable local _ -local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC -local container_damage = _detalhes.container_type.CONTAINER_DAMAGE_CLASS -local container_heal = _detalhes.container_type.CONTAINER_HEAL_CLASS -local container_heal_target = _detalhes.container_type.CONTAINER_HEALTARGET_CLASS -local container_friendlyfire = _detalhes.container_type.CONTAINER_FRIENDLYFIRE -local container_damage_target = _detalhes.container_type.CONTAINER_DAMAGETARGET_CLASS -local container_energy = _detalhes.container_type.CONTAINER_ENERGY_CLASS -local container_energy_target = _detalhes.container_type.CONTAINER_ENERGYTARGET_CLASS -local container_misc = _detalhes.container_type.CONTAINER_MISC_CLASS -local container_misc_target = _detalhes.container_type.CONTAINER_MISCTARGET_CLASS +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> local pointers -local habilidade_dano = _detalhes.habilidade_dano -local habilidade_cura = _detalhes.habilidade_cura -local habilidade_e_energy = _detalhes.habilidade_e_energy -local habilidade_misc = _detalhes.habilidade_misc + local _setmetatable = setmetatable --lua local -local container_habilidades = _detalhes.container_habilidades - -function container_habilidades:NovoContainer (tipo_do_container) - - local _newContainer = { - funcao_de_criacao = container_habilidades:FuncaoDeCriacao (tipo_do_container), - tipo = tipo_do_container, - _ActorTable = {} - } +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> constants - _setmetatable (_newContainer, container_habilidades) - - return _newContainer -end + local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC + local container_damage = _detalhes.container_type.CONTAINER_DAMAGE_CLASS + local container_heal = _detalhes.container_type.CONTAINER_HEAL_CLASS + local container_heal_target = _detalhes.container_type.CONTAINER_HEALTARGET_CLASS + local container_friendlyfire = _detalhes.container_type.CONTAINER_FRIENDLYFIRE + local container_damage_target = _detalhes.container_type.CONTAINER_DAMAGETARGET_CLASS + local container_energy = _detalhes.container_type.CONTAINER_ENERGY_CLASS + local container_energy_target = _detalhes.container_type.CONTAINER_ENERGYTARGET_CLASS + local container_misc = _detalhes.container_type.CONTAINER_MISC_CLASS + local container_misc_target = _detalhes.container_type.CONTAINER_MISCTARGET_CLASS -function container_habilidades: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 + local habilidade_dano = _detalhes.habilidade_dano + local habilidade_cura = _detalhes.habilidade_cura + local habilidade_e_energy = _detalhes.habilidade_e_energy + local habilidade_misc = _detalhes.habilidade_misc -function container_habilidades:GetSpell (id) - return self._ActorTable [id] -end + local container_habilidades = _detalhes.container_habilidades -function container_habilidades:PegaHabilidade (id, criar, token, cria_shadow) - local esta_habilidade = self._ActorTable [id] - if (esta_habilidade) then - return esta_habilidade - else - if (criar) then +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> internals + + function container_habilidades:NovoContainer (tipo_do_container) + local _newContainer = { + funcao_de_criacao = container_habilidades:FuncaoDeCriacao (tipo_do_container), + tipo = tipo_do_container, + _ActorTable = {} + } - if (cria_shadow) then - local novo_objeto = self.funcao_de_criacao (nil, id, nil, "") - self._ActorTable [id] = novo_objeto - return novo_objeto - end - - local shadow = self.shadow --> retorna o container semelhante a esta na tabela overall - local shadow_objeto = nil - - if (shadow) then --> talvez possa mandar todos os parâmetros de criação logo no inicio - shadow_objeto = shadow:PegaHabilidade (id) --> apenas verifica se ele existe ou não - if (not shadow_objeto) then --> se não existir, cria-lo - shadow_objeto = shadow:PegaHabilidade (id, true, token) - end - end - - --local novo_objeto = habilidade_dano:NovaTabela (id, shadow_objeto) - local novo_objeto = self.funcao_de_criacao (nil, id, shadow_objeto, token) - - if (shadow_objeto) then --> link é esta mesma tabela mas no container do overall - novo_objeto.shadow = shadow_objeto --> diz ao objeto qual a shadow dele na tabela overall - --novo_objeto:CriaLink (shadow_objeto) --> cria o link entre o objeto e a sua shadow - end + _setmetatable (_newContainer, container_habilidades) - self._ActorTable [id] = novo_objeto - - return novo_objeto + return _newContainer + end + + function container_habilidades:GetSpell (id) + return self._ActorTable [id] + end + + function container_habilidades:PegaHabilidade (id, criar, token, cria_shadow) + + local esta_habilidade = self._ActorTable [id] + + if (esta_habilidade) then + return esta_habilidade else - return nil + if (criar) then + + if (cria_shadow) then + local novo_objeto = self.funcao_de_criacao (nil, id, nil, "") + self._ActorTable [id] = novo_objeto + return novo_objeto + end + + local shadow = self.shadow + local shadow_objeto = nil + + if (shadow) then + --> apenas verifica se ele existe ou não + shadow_objeto = shadow:PegaHabilidade (id) + --> se não existir, cria-lo + if (not shadow_objeto) then + shadow_objeto = shadow:PegaHabilidade (id, true, token) + end + end + + local novo_objeto = self.funcao_de_criacao (nil, id, shadow_objeto, token) + + if (shadow_objeto) then + novo_objeto.shadow = shadow_objeto + end + + self._ActorTable [id] = novo_objeto + + return novo_objeto + else + return nil + end end end -end -function container_habilidades:FuncaoDeCriacao (tipo) - if (tipo == container_damage) then - return habilidade_dano.NovaTabela - - elseif (tipo == container_heal) then - return habilidade_cura.NovaTabela + function container_habilidades:FuncaoDeCriacao (tipo) + if (tipo == container_damage) then + return habilidade_dano.NovaTabela + + elseif (tipo == container_heal) then + return habilidade_cura.NovaTabela - elseif (tipo == container_energy) then - return habilidade_e_energy.NovaTabela - - elseif (tipo == container_misc) then - return habilidade_misc.NovaTabela - + elseif (tipo == container_energy) then + return habilidade_e_energy.NovaTabela + + elseif (tipo == container_misc) then + return habilidade_misc.NovaTabela + + end end -end -function _detalhes.refresh:r_container_habilidades (container, shadow) - --> reconstrói meta e indexes - _setmetatable (container, _detalhes.container_habilidades) - container.__index = _detalhes.container_habilidades - local func_criacao = container_habilidades:FuncaoDeCriacao (container.tipo) - container.funcao_de_criacao = func_criacao - --> seta a shadow - container.shadow = shadow -end + function _detalhes.refresh:r_container_habilidades (container, shadow) + --> reconstrói meta e indexes + _setmetatable (container, _detalhes.container_habilidades) + container.__index = _detalhes.container_habilidades + local func_criacao = container_habilidades:FuncaoDeCriacao (container.tipo) + container.funcao_de_criacao = func_criacao + --> seta a shadow + container.shadow = shadow + end -function _detalhes.clear:c_container_habilidades (container) - --container.__index = {} - container.__index = nil - container.shadow = nil - container.funcao_de_criacao = nil -end + function _detalhes.clear:c_container_habilidades (container) + --container.__index = {} + container.__index = nil + container.shadow = nil + container.funcao_de_criacao = nil + end diff --git a/core/control.lua b/core/control.lua index 789903a1..5f64b873 100644 --- a/core/control.lua +++ b/core/control.lua @@ -62,7 +62,7 @@ for _, actor in _ipairs (_detalhes.tabela_vigente[class_type_dano]._ActorTable) do - if (not actor.grupo and not actor.owner and not actor.nome:find ("[*]") and _bit_band (actor.flag, 0x00000060) ~= 0) then --> 0x20+0x40 neutral + enemy reaction + if (not actor.grupo and not actor.owner and not actor.nome:find ("[*]") and _bit_band (actor.flag_original, 0x00000060) ~= 0) then --> 0x20+0x40 neutral + enemy reaction if (trash_list) then local serial = tonumber (actor.serial:sub(6, 10), 16) diff --git a/core/meta.lua b/core/meta.lua index d5d24800..a167ab89 100644 --- a/core/meta.lua +++ b/core/meta.lua @@ -41,7 +41,6 @@ local class_type_cura = _detalhes.atributos.cura local class_type_e_energy = _detalhes.atributos.e_energy local class_type_misc = _detalhes.atributos.misc - local DFLAG_pet = _detalhes.flags.pet ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> core diff --git a/core/parser.lua b/core/parser.lua index 4d7c2fb0..ca837bfc 100644 --- a/core/parser.lua +++ b/core/parser.lua @@ -339,6 +339,27 @@ --if (_bit_band (who_flags, REACTION_FRIENDLY) ~= 0 and _bit_band (alvo_flags, REACTION_FRIENDLY) ~= 0) then (old friendly check) if (raid_members_cache [who_serial] and raid_members_cache [alvo_serial]) then + --> record death log + local t = jogador_alvo.last_events_table + local i = t.n + + t.n = i + 1 + + t = t [i] + + t [1] = true --> true if this is a damage || false for healing + t [2] = spellid --> spellid || false if this is a battle ress line + t [3] = amount --> amount of damage or healing + t [4] = time --> parser time + t [5] = _UnitHealth (alvo_name) --> current unit heal + t [6] = who_name --> source name + + i = i + 1 + if (i == 9) then + jogador_alvo.last_events_table.n = 1 + end + + --> faz a adução do friendly fire este_jogador.friendlyfire_total = este_jogador.friendlyfire_total + amount local amigo = este_jogador.friendlyfire._NameIndexTable [alvo_name] @@ -1462,7 +1483,7 @@ t = t [i] - t [1] = 1 --> true if this is a damage || false for healing || 1 for cooldown? + t [1] = 1 --> true if this is a damage || false for healing || 1 for cooldown t [2] = spellid --> spellid || false if this is a battle ress line t [3] = 1 --> amount of damage or healing t [4] = time --> parser time @@ -2104,30 +2125,42 @@ end end - --_table_sort (esta_morte, _detalhes.Sort4) + _table_sort (esta_morte, _detalhes.Sort4) + --[[ _table_sort (esta_morte, function (table1, table2) - - if (not table1) then return false end - if (not table2) then return true end - - if (table1 [4] == table2 [4]) then --> os 2 tem o mesmo tempo + if (not table1) then + print (1) + return false + + elseif (not table2) then + print (2) + return false + + elseif (table1 [4] == table2 [4]) then --> os 2 tem o mesmo tempo if (type (table1 [1]) == "boolean" and table1 [1] and type (table2 [1]) == "boolean" and table2) then --> ambos sao dano + print (3) return table1 [5] > table2 [5] --> joga pra cima quem tem mais vida elseif (type (table1 [1]) == "boolean" and not table1 [1] and type (table2 [1]) == "boolean" and not table2) then --> ambos sao cura + print (4) return table1 [5] < table2 [5] --> joga pra cima quem tem menos vida else if (type (table1 [1]) == "boolean" and table1 and type (table2 [1]) == "boolean" and table2) then --> primeiro é dano e segundo é heal + print (5) return true --> passa o dano pra frente elseif (type (table2 [1]) == "boolean" and table2 and type (table1 [1]) == "boolean" and table1) then --> primeiro é heal e o segundo é dano + print (6) return false --> passa o heal pra frente else + print (7) return table1 [5] < table2 [5] --> passa quem tem menos vida end end else + print (8) return table1 [4] < table2 [4] end end) + --]] if (_hook_deaths) then --> send event to registred functions @@ -2627,6 +2660,23 @@ end end + function _detalhes.parser_functions:PET_BATTLE_OPENING_START (...) + _detalhes.pet_battle = true + for index, instance in _ipairs (_detalhes.tabela_instancias) do + if (instance.ativa) then + instance:SetWindowAlphaForCombat (true, true) + end + end + end + function _detalhes.parser_functions:PET_BATTLE_CLOSE (...) + _detalhes.pet_battle = false + for index, instance in _ipairs (_detalhes.tabela_instancias) do + if (instance.ativa) then + instance:SetWindowAlphaForCombat() + end + end + end + local parser_functions = _detalhes.parser_functions function _detalhes:OnEvent (evento, ...) diff --git a/core/util.lua b/core/util.lua index 029a7c14..05f0cd08 100644 --- a/core/util.lua +++ b/core/util.lua @@ -308,11 +308,6 @@ return nil end - --> Armazena uma label recém criada - Store a new label on the pool - function _detalhes.font_pool:add (_fontstring) - self [#self+1] = _fontstring - end - local function frame_task (self, elapsed) self.FrameTime = self.FrameTime + elapsed diff --git a/framework/cooltip.lua b/framework/cooltip.lua index ee87d512..52cd7694 100644 --- a/framework/cooltip.lua +++ b/framework/cooltip.lua @@ -1500,7 +1500,11 @@ function DetailsCreateCoolTip() if (f2_start_point < f1_end_point) then local diff = f2_start_point - f1_end_point CoolTip.overlap_checked = true - return CoolTip:SetMyPoint (host, CoolTip.internal_x_mod + diff, CoolTip.internal_y_mod) + + frame2:ClearAllPoints() + frame2:SetPoint ("bottomright", frame1, "bottomleft") + --+ diff + return CoolTip:SetMyPoint (host, CoolTip.internal_x_mod , CoolTip.internal_y_mod) end end @@ -1702,6 +1706,9 @@ function DetailsCreateCoolTip() --> wipe all data ~reset function CoolTip:Reset() + + frame2:ClearAllPoints() + frame2:SetPoint ("bottomleft", frame1, "bottomright") CoolTip.FixedValue = nil CoolTip.HaveSubMenu = false diff --git a/functions/classes.lua b/functions/classes.lua index d055f4a4..e3a3278a 100644 --- a/functions/classes.lua +++ b/functions/classes.lua @@ -99,4 +99,12 @@ do CONTAINER_MISCTARGET_CLASS = 10, CONTAINER_ENEMYDEBUFFTARGET_CLASS = 11 } + + function _detalhes:Name (actor) + return self.nome or actor.nome + end + function _detalhes:GetName (actor) + return actor.nome or self.nome + end + end diff --git a/gumps/janela_custom.lua b/gumps/janela_custom.lua index bc9db60a..cf318a9d 100644 --- a/gumps/janela_custom.lua +++ b/gumps/janela_custom.lua @@ -50,13 +50,29 @@ local function CreateCustomWindow() insets = {left = 0, right = 0, top = 0, bottom = 0}} local frame = CreateFrame ("frame", "DetailsCustomPanel", UIParent) - frame:SetPoint ("center", UIParent, "center", 100, -300) + frame:SetPoint ("center", UIParent, "center", 100, -100) frame:SetWidth (512) - frame:SetHeight (150) + frame:SetHeight (183) frame:EnableMouse (true) frame:SetMovable (true) frame:SetFrameLevel (1) + local frameD = CreateFrame ("frame", "DetailsCustomPanelDisable", frame) + frameD:SetPoint ("center", frame, "center") + frameD:SetWidth (512) + frameD:SetHeight (183) + frameD:EnableMouse (true) + frameD:SetFrameStrata ("fullscreen") + frameD:SetBackdrop ({ + bgFile = "Interface\\AddOns\\Details\\images\\background", + edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", + tile = true, tileSize = 16, edgeSize = 4}) + frameD:SetBackdropColor (0, 0, 0, .8) + frameD.string = frameD:CreateFontString (nil, "overlay", "GameFontNormal") + frameD.string:SetPoint ("center", frameD, "center") + frameD.string:SetText ("There is a problem connecting some nether tubes\nOur ethereal engineers are already working to fix this issue,\n\nTo avoid mana wyrms proliferation, this panel is disabled for now.\n(Press Escape To Close)") + --frameD:Hide() + frame.fundo = frame:CreateTexture (nil, "border") frame.fundo:SetTexture ("Interface\\AddOns\\Details\\images\\custom_bg") frame.fundo:SetPoint ("topleft", frame, "topleft") @@ -210,16 +226,7 @@ local function CreateCustomWindow() fundoBrilha:SetPoint ("left", frame.MainMenu [atributo].icon , "right", -20, -10) - --[[ - for i = 1, 5 do - if (sub_atributos [atributo].lista[i]) then - frame.SubMenu [i].text:SetText (sub_atributos [atributo].lista[i]) - frame.SubMenu [i]:Show() - else - frame.SubMenu [i]:Hide() - end - end - --]] + frame.selectAttributeDropdown:Select (1, true) end frame.MainMenu = {} @@ -245,6 +252,8 @@ local function CreateCustomWindow() local half = 0.00048828125 local size = 0.03125 + local att_names = {Loc ["STRING_CUSTOM_ATT1"], Loc ["STRING_CUSTOM_ATT2"], Loc ["STRING_CUSTOM_ATT3"], Loc ["STRING_CUSTOM_ATT4"]} + for i = 1, 4 do local button = gump:NewDetailsButton (frame, frame, _, MainMenu, i, nil, 120, 15, "", "", "", "", nil, "DetailsCustomPanelAttributeButton"..i) @@ -282,8 +291,8 @@ local function CreateCustomWindow() button.textura:SetWidth (76) button.textura:SetHeight (40) - button:SetPoint ("topleft", frame, "topleft", x, i*-25 + (y)) - button.text:SetText (atributos.lista [i]) + button:SetPoint ("topleft", frame, "topleft", x, i*-33 + (y)) + button.text:SetText (att_names [i]) button.text:SetPoint ("left", button, "left", 65, 0) button:SetFrameLevel (frame:GetFrameLevel()+2) @@ -309,20 +318,52 @@ local function CreateCustomWindow() end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - --> Edit Boxes +--> Edit Boxes local xStart = 290 local WidthMax = 220 + +--> labels + local name_text = gump:NewLabel (frame, nil, "$parentNameBoxLabel", nil, Loc ["STRING_CUSTOM_NAME"], "GameFontHighlightLeft", 11) + local spell_text = gump:NewLabel (frame, nil, "$parentSpellBoxLabel", nil, Loc ["STRING_CUSTOM_SPELLID"]) + local source_text = gump:NewLabel (frame, nil, "$parentSourceBoxLabel", nil, Loc ["STRING_CUSTOM_SOURCE"]) + local target_text = gump:NewLabel (frame, nil, "$parentTargetBoxLabel", nil, Loc ["STRING_CUSTOM_TARGET"]) + local subattribute_text = gump:NewLabel (frame, nil, "$parentSubAttributeBoxLabel", nil, Loc ["STRING_CUSTOM_ATTRIBUTE"]) -----------> The name of the custom - local MyNameSelected = function (param1, param2, texto, editbox) --print (param1, param2, texto, editbox) + name_text:SetPoint ("topleft", frame, "topleft", xStart, -45) + subattribute_text:SetPoint ("topleft", frame, "topleft", xStart, -65) + source_text:SetPoint ("topleft", frame, "topleft", xStart, -85) + target_text:SetPoint ("topleft", frame, "topleft", xStart, -105) + spell_text:SetPoint ("topleft", frame, "topleft", xStart, -125) + +--> name entry + local name_entry = gump:NewTextEntry (frame, frame, "$parentNameEntry", "TextMyNameEntry", 140, 20) + name_entry:SetFrameLevel (frame:GetFrameLevel()+2) + name_entry:SetPoint ("left", name_text, "right", 2, 0) + +--> sub attribute + + local on_choose_attribute = function (_, _, attribute_number) + frame.sub_atributo = attribute_number + end + local build_attribute_menu = function() + local menu = {} + + local attributes = _detalhes.sub_atributos [frame.atributo].lista + local icons = _detalhes.sub_atributos [frame.atributo].icones + + for index, attribute_name in ipairs (attributes) do + menu [#menu+1] = {value = index, label = attribute_name, onclick = on_choose_attribute, icon = icons [index] [1], texcoord = icons [index] [2]} + end + + return menu end - gump:NewTextBox (frame, frame, "TextMyNameEntry", SpellIDSelected, "param_1", "param_2", 100, 15, {TabOnEnterPress = true, MySpace = WidthMax}) - frame ["TextMyNameEntry"]:SetFrameLevel (frame:GetFrameLevel()+2) - frame ["TextMyNameEntry"]:SetPointAndSpace ("topleft", frame, "topleft", xStart, -45, WidthMax) - frame ["TextMyNameEntry"]:SetLabelText (Loc ["STRING_CUSTOM_NAME"]..":") -----------> Spell Name ou ID + local select_attribute = gump:NewDropDown (frame, frame, "$parentAttributeDropdown", "selectAttributeDropdown", 140, 20, build_attribute_menu) + select_attribute:SetFrameLevel (frame:GetFrameLevel()+2) + select_attribute:SetPoint ("left", subattribute_text, "right", 2, 0) + +--> spell id entry local SpellIDSelected = function (param1, param2, texto, editbox) local _ThisSpellName, _, _ThisSpellIcon = _GetSpellInfo (tonumber (texto)) if (_ThisSpellName) then @@ -336,17 +377,12 @@ local function CreateCustomWindow() end end - gump:NewTextBox (frame, frame, "TextSpellIDEntry", SpellIDSelected, "param_1", "param_2", 80, 15, {TabOnEnterPress = true, MySpace = WidthMax-20}) + local spellid_entry = gump:NewSpellEntry (frame, SpellIDSelected, 140, 20, nil, nil, "TextSpellIDEntry", "$parentSpellidEntry") + spellid_entry:SetPoint ("left", spell_text, "right", 2, 0) frame ["TextSpellIDEntry"]:SetFrameLevel (frame:GetFrameLevel()+2) - frame ["TextSpellIDEntry"]:SetPointAndSpace ("topleft", frame, "topleft", xStart, -62, WidthMax-20) - frame ["TextSpellIDEntry"]:SetLabelText (Loc ["STRING_CUSTOM_SPELLID"]) - - local openSpellEncounter = function() - - end - + local frameEncounterSkill = CreateFrame ("frame", nil, frame) - frameEncounterSkill:SetPoint ("left", frame ["TextSpellIDEntry"], "right") + frameEncounterSkill:SetPoint ("left", frame ["TextSpellIDEntry"].widget, "right") frameEncounterSkill:SetWidth (20) frameEncounterSkill:SetHeight (20) frameEncounterSkill:SetFrameLevel (frame:GetFrameLevel()+2) @@ -479,8 +515,6 @@ local function CreateCustomWindow() GameCooltip:SetOption ("HeightAnchorMod", -10) GameCooltip:ShowCooltip() - - --_detalhes.EncounterInformation [instanceTable.id] = InstanceTable end frameEncounterSkill:SetScript ("OnEnter", function() @@ -492,100 +526,17 @@ local function CreateCustomWindow() frameEncounterSkillImage:SetBlendMode ("BLEND") end) - frame ["TextSpellIDEntry"].HaveMenu = false - - frame ["TextSpellIDEntry"].OnLeaveHook = function() - _detalhes.popup.buttonOver = false - if (_detalhes.popup.ativo) then - local passou = 0 - frame ["TextSpellIDEntry"]:SetScript ("OnUpdate", function (self, elapsed) - passou = passou+elapsed - if (passou > 0.3) then - if (not _detalhes.popup.mouseOver and not _detalhes.popup.buttonOver) then - _detalhes.popup:ShowMe (false) - end - frame ["TextSpellIDEntry"]:SetScript ("OnUpdate", nil) - end - end) - else - frame ["TextSpellIDEntry"]:SetScript ("OnUpdate", nil) - end - end - - frame ["TextSpellIDEntry"].OnFocusLostHook = function() - frame ["TextSpellIDEntry"].HaveMenu = false - end - - local OnClickMenu = function (_, _, SpellID) - frame ["TextSpellIDEntry"]:SetText (SpellID) - frame ["TextSpellIDEntry"]:PressEnter() - frame ["TextSpellIDEntry"].HaveMenu = false - _detalhes.popup:ShowMe (false) - end - local _string_lower = string.lower local _string_sub = string.sub - frame ["TextSpellIDEntry"].TextChangeedHook = function (userChanged) - if (not userChanged) then - return - end - - local texto = frame ["TextSpellIDEntry"]:GetText() - texto = _detalhes:trim (texto) - texto = _string_lower (texto) - - local index = _string_sub (texto, 1, 1) - local cached = _detalhes.spellcachefull [index] - - if (cached) then - - local CoolTip = _G.GameCooltip - - CoolTip:Reset() - CoolTip:SetType ("menu") - CoolTip:SetColor ("main", "transparent") - CoolTip:SetOwner (frame ["TextSpellIDEntry"]) - CoolTip:SetOption ("NoLastSelectedBar", true) - CoolTip:SetOption ("TextSize", 9.5) - - local CoolTipTable = {} - local texcoord = {0, 1, 0, 1} - local i = 1 - - for SpellID, SpellTable in _pairs (cached) do - - if (_string_lower (SpellTable[1]):find (texto)) then - local rank = SpellTable[3] - if (not rank or rank == "") then - rank = "" - else - rank = " ("..rank..")" - end - - CoolTip:AddMenu (1, OnClickMenu, SpellID, nil, nil, SpellID..": "..SpellTable[1]..rank, SpellTable[2], true) - - if (i > 20) then - break - else - i = i + 1 - end - end - - end - - frame ["TextSpellIDEntry"].HaveMenu = true - CoolTip.buttonOver = true - CoolTip:ShowCooltip() - end - end - -----------> Source +--> source local SourceSelected = function (param1, param2, texto, editbox) end - gump:NewTextBox (frame, frame, "TextSourceEntry", SourceSelected, "param_1", "param_2", 100, 15, {TabOnEnterPress = true, MySpace = WidthMax}) + + local source_entry = gump:NewTextEntry (frame, frame, "$parentSourceEntry", "TextSourceEntry", 140, 20) + frame ["TextSourceEntry"]:SetFrameLevel (frame:GetFrameLevel()+2) - frame ["TextSourceEntry"]:SetPointAndSpace ("topleft", frame, "topleft", xStart, -79, WidthMax) - frame ["TextSourceEntry"]:SetLabelText (Loc ["STRING_CUSTOM_SOURCE"]..":") + frame ["TextSourceEntry"]:SetPoint ("left", source_text, "right", 2, 0) + frame ["TextSourceEntry"].InputHook = function() local texto = frame ["TextSourceEntry"]:GetText() texto:gsub ("[raid]", "|cFFFF00FF|r[raid]") @@ -604,26 +555,24 @@ local function CreateCustomWindow() end end ----------> Actor Name - local ActorNameSelected = function (param1, param2, texto, editbox) end - gump:NewTextBox (frame, frame, "TextActorNameEntry", ActorNameSelected, "param_1", "param_2", 100, 15, {TabOnEnterPress = true}) - frame ["TextActorNameEntry"]: SetFrameLevel (frame:GetFrameLevel()+2) - frame ["TextActorNameEntry"]:SetPointAndSpace ("topleft", frame, "topleft", xStart, -96, WidthMax) - frame ["TextActorNameEntry"]:SetLabelText (Loc ["STRING_CUSTOM_TARGET"]..":") +--> target + + local target_entry = gump:NewTextEntry (frame, frame, "$parentTargetEntry", "TextActorNameEntry", 140, 20) + frame ["TextActorNameEntry"]:SetFrameLevel (frame:GetFrameLevel()+2) + frame ["TextActorNameEntry"]:SetPoint ("left", target_text, "right", 2, 0) --> Tab Order - frame ["TextMyNameEntry"]:SetNext (frame ["TextSpellIDEntry"]) - frame ["TextSpellIDEntry"]:SetNext (frame ["TextSourceEntry"]) + frame ["TextMyNameEntry"]:SetNext (frame ["TextSourceEntry"]) frame ["TextSourceEntry"]:SetNext (frame ["TextActorNameEntry"]) - frame ["TextActorNameEntry"]:SetNext (frame ["TextMyNameEntry"]) - frame ["TextActorNameEntry"]:Disable() + frame ["TextActorNameEntry"]:SetNext (frame ["TextSpellIDEntry"]) + frame ["TextSpellIDEntry"]:SetNext (frame ["TextMyNameEntry"]) --> Tooltips --> localize-me frame ["TextMyNameEntry"].tooltip = Loc ["STRING_CUSTOM_TOOLTIPNAME"] frame ["TextSpellIDEntry"].tooltip = Loc ["STRING_CUSTOM_TOOLTIPSPELL"] frame ["TextSourceEntry"].tooltip = Loc ["STRING_CUSTOM_TOOLTIPSOURCE"] - frame ["TextActorNameEntry"].tooltip = Loc ["STRING_CUSTOM_TOOLTIPTARGET"].."\n|cFFFF0000"..Loc ["STRING_CUSTOM_TOOLTIPNOTWORKING"] + frame ["TextActorNameEntry"].tooltip = Loc ["STRING_CUSTOM_TOOLTIPTARGET"] -- .."\n|cFFFF0000"..Loc ["STRING_CUSTOM_TOOLTIPNOTWORKING"] frame.IconTexture = "Interface\\Icons\\TEMP" @@ -810,7 +759,7 @@ local function CreateCustomWindow() end local CustomName = frame ["TextMyNameEntry"].text - local SpellID = frame ["TextSpellIDEntry"].text + local SpellID = tonumber (frame ["TextSpellIDEntry"].text) local Actor = frame ["TextActorNameEntry"].text local Source = frame ["TextSourceEntry"].text @@ -826,15 +775,16 @@ local function CreateCustomWindow() return end - if (string.len (SpellID) < 1) then - --print ("Sem id da magia") - print (Loc ["STRING_CUSTOM_NOSPELL"]) - frame ["TextSpellIDEntry"]:Blink() - return - end + --if (string.len (SpellID) < 1) then + -- --print ("Sem id da magia") + -- print (Loc ["STRING_CUSTOM_NOSPELL"]) + -- frame ["TextSpellIDEntry"]:Blink() + -- return + --end - _detalhes.custom [#_detalhes.custom+1] = {name = CustomName, spell = SpellID, target = Actor, source = Source, inout = InOut, icon = frame.IconTexture, attribute = Atributo, sattribute = SubAtributo} - print (Loc ["STRING_CUSTOM_CREATED"]) + _detalhes.custom [#_detalhes.custom+1] = {name = CustomName, spell = SpellID, target = Actor, source = Source, icon = frame.IconTexture, attribute = Atributo, sattribute = SubAtributo} + --print (CustomName, Actor, Source, SpellID, frame.IconTexture, Atributo, SubAtributo) + _detalhes:Msg (Loc ["STRING_CUSTOM_CREATED"]) _detalhes:CloseCustomWindow() reset() end @@ -842,7 +792,7 @@ local function CreateCustomWindow() local IconButton = gump:NewDetailsButton (frame, frame, _, ChooseIcon, nil, nil, 80, 15, "", "", "", "", nil, "DetailsCustomPanelIconButton") IconButton.text:SetText (Loc ["STRING_CUSTOM_ICON"]) IconButton.text:SetPoint ("left", IconButton, "left", 3, 0) - IconButton:SetPoint ("topleft", frame, "topleft", xStart+21, -118) + IconButton:SetPoint ("topleft", frame, "topleft", xStart+21, -158) IconButton:SetFrameLevel (frame:GetFrameLevel()+2) IconButton:InstallCustomTexture (_, {x1 = -20, x2 = 0, y1 = 0, y2 = 0}) frame.iconbutton = IconButton @@ -856,7 +806,7 @@ local function CreateCustomWindow() local CreateButton = gump:NewDetailsButton (frame, frame, _, CreateFunction, nil, nil, 80, 15, "", "", "", "", nil, "DetailsCustomPanelCreateButton") CreateButton.text:SetText (Loc ["STRING_CUSTOM_CREATE"]) - CreateButton:SetPoint ("topleft", frame, "topleft", 413, -118) + CreateButton:SetPoint ("topleft", frame, "topleft", 413, -158) CreateButton:SetFrameLevel (frame:GetFrameLevel()+2) CreateButton:InstallCustomTexture (_, {x1 = -20, x2 = 0, y1 = 0, y2 = 0}) @@ -970,21 +920,21 @@ function _detalhes:InitCustom() end function _detalhes:OpenCustomWindow() - if (InCombatLockdown()) then - print ("|cffFF2222"..Loc ["STRING_CUSTOM_INCOMBAT"]) - return - end + --if (InCombatLockdown()) then + -- print ("|cffFF2222"..Loc ["STRING_CUSTOM_INCOMBAT"]) + -- return + --end if (not _detalhes.CustomFrame.oponed) then _detalhes.CustomFrame.oponed = true - _detalhes:BuildSpellList() + --_detalhes:BuildSpellList() _detalhes.CustomFrame:Show() end end function _detalhes:CloseCustomWindow() _detalhes.CustomFrame.oponed = false - _detalhes:ClearSpellList() + --_detalhes:ClearSpellList() _detalhes.CustomFrame:Hide() end diff --git a/gumps/janela_info.lua b/gumps/janela_info.lua index 5cd046a6..96dc6460 100644 --- a/gumps/janela_info.lua +++ b/gumps/janela_info.lua @@ -1,5 +1,6 @@ local _detalhes = _G._detalhes local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) +local SharedMedia = LibStub:GetLibrary("LibSharedMedia-3.0") local gump = _detalhes.gump local _ @@ -7,7 +8,7 @@ local _ --local _string_len = string.len local _math_floor = math.floor local _ipairs = ipairs ---local _pairs = pairs +local _pairs = pairs local _type = type --api locals local _CreateFrame = CreateFrame @@ -1580,7 +1581,7 @@ function gump:CriaJanelaInfo() --]] end - + _detalhes:CreatePlayerDetailsTab ("Avoidance", --[1] tab name function (tabOBject, playerObject) --[2] condition if (playerObject.isTank) then @@ -1597,6 +1598,649 @@ function gump:CriaJanelaInfo() avoidance_create --[5] oncreate ) +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + local fill_compare_actors = function (self, player, other_players) + + --primeiro preenche a nossa barra + local spells_sorted = {} + for spellid, spelltable in _pairs (player.spell_tables._ActorTable) do + spells_sorted [#spells_sorted+1] = {spelltable, spelltable.total} + end + table.sort (spells_sorted, function (t1, t2) return t1[2] > t2[2] end) + + self.player = player:Name() + + local offset = FauxScrollFrame_GetOffset (self) + + local total = player.total_without_pet + local top = spells_sorted [1] [2] + + local frame2 = DetailsPlayerComparisonBox2 + frame2.player = other_players [1]:Name() + local player_2_total = other_players [1].total_without_pet + local player_2_spells_sorted = {} + for spellid, spelltable in _pairs (other_players [1].spell_tables._ActorTable) do + player_2_spells_sorted [#player_2_spells_sorted+1] = {spelltable, spelltable.total} + end + table.sort (player_2_spells_sorted, function (t1, t2) return t1[2] > t2[2] end) + local player_2_top = player_2_spells_sorted [1] [2] + local player_2_spell_info = {} + for index, spelltable in _ipairs (player_2_spells_sorted) do + player_2_spell_info [spelltable[1].id] = index + end + + local frame3 = DetailsPlayerComparisonBox3 + frame3.player = other_players [2] and other_players [2]:Name() + local player_3_total = other_players [2] and other_players [2].total_without_pet + local player_3_spells_sorted = {} + local player_3_spell_info = {} + local player_3_top + + if (other_players [2]) then + for spellid, spelltable in _pairs (other_players [2].spell_tables._ActorTable) do + player_3_spells_sorted [#player_3_spells_sorted+1] = {spelltable, spelltable.total} + end + table.sort (player_3_spells_sorted, function (t1, t2) return t1[2] > t2[2] end) + player_3_top = player_3_spells_sorted [1] [2] + for index, spelltable in _ipairs (player_3_spells_sorted) do + player_3_spell_info [spelltable[1].id] = index + end + end + + for i = 1, 9 do + local bar = self.bars [i] + local index = i + offset + + local data = spells_sorted [index] + + if (data) then + --seta no box principal + local spellid = data [1].id + local name, _, icon = _GetSpellInfo (spellid) + bar [1]:SetTexture (icon) + bar [2].lefttext:SetText (index .. ". " .. name) + bar [2].lefttext:SetTextColor (1, 1, 1, 1) + bar [2].righttext:SetText (_detalhes:ToK2Min (data [2])) -- .. " (" .. _math_floor (data [2] / total * 100) .. "%)" + bar [2]:SetValue (data [2] / top * 100) + bar [3][1] = data [1].counter --tooltip hits + bar [3][2] = data [2] / data [1].counter --tooltip average + bar [3][3] = _math_floor (data [1].c_amt / data [1].counter * 100) --tooltip critical + bar [3][4] = spellid + + --seta no segundo box + local player_2 = other_players [1] + local spell = player_2.spell_tables._ActorTable [spellid] + local bar_2 = frame2.bars [i] + + if (spell) then + bar_2 [1]:SetTexture (icon) + bar_2 [2].lefttext:SetText (player_2_spell_info [spellid] .. ". " .. name) + bar_2 [2].lefttext:SetTextColor (1, 1, 1, 1) + if (data [2] > spell.total) then + local diff = data [2] - spell.total + local up = diff / data [2] * 100 + bar_2 [2].righttext:SetText (_detalhes:ToK2Min (spell.total) .. " |cFFFF0000-(" .. _math_floor (up) .. "%)|r") + else + local diff = spell.total - data [2] + local down = diff / spell.total * 100 + bar_2 [2].righttext:SetText (_detalhes:ToK2Min (spell.total) .. " |cFF00FF00+(" .. _math_floor (down) .. "%)|r") + end + bar_2 [2]:SetValue (spell.total / player_2_top * 100) + bar_2 [3][1] = spell.counter --tooltip hits + bar_2 [3][2] = spell.total / spell.counter --tooltip average + bar_2 [3][3] = _math_floor (spell.c_amt / spell.counter * 100) --tooltip critical + else + bar_2 [1]:SetTexture ([[Interface\InventoryItems\WoWUnknownItem01]]) + bar_2 [2].lefttext:SetText ("-- x -- x --") + bar_2 [2].lefttext:SetTextColor (.5, .5, .5, 1) + bar_2 [2].righttext:SetText ("") + bar_2 [2]:SetValue (0) + end + + --seta o terceiro box + local bar_3 = frame3.bars [i] + + if (player_3_total) then + local player_3 = other_players [2] + local spell = player_3.spell_tables._ActorTable [spellid] + + if (spell) then + bar_3 [1]:SetTexture (icon) + bar_3 [2].lefttext:SetText (player_3_spell_info [spellid] .. ". " .. name) + bar_3 [2].lefttext:SetTextColor (1, 1, 1, 1) + if (data [2] > spell.total) then + local diff = data [2] - spell.total + local up = diff / data [2] * 100 + bar_3 [2].righttext:SetText (_detalhes:ToK2Min (spell.total) .. " |cFFFF0000-(" .. _math_floor (up) .. "%)|r") + else + local diff = spell.total - data [2] + local down = diff / spell.total * 100 + bar_3 [2].righttext:SetText (_detalhes:ToK2Min (spell.total) .. " |cFF00FF00+(" .. _math_floor (down) .. "%)|r") + end + bar_3 [2]:SetValue (spell.total / player_2_top * 100) + bar_3 [3][1] = spell.counter --tooltip hits + bar_3 [3][2] = spell.total / spell.counter --tooltip average + bar_3 [3][3] = _math_floor (spell.c_amt / spell.counter * 100) --tooltip critical + else + bar_3 [1]:SetTexture ([[Interface\InventoryItems\WoWUnknownItem01]]) + bar_3 [2].lefttext:SetText ("-- x -- x --") + bar_3 [2].lefttext:SetTextColor (.5, .5, .5, 1) + bar_3 [2].righttext:SetText ("") + bar_3 [2]:SetValue (0) + end + else + bar_3 [1]:SetTexture ([[Interface\InventoryItems\WoWUnknownItem01]]) + bar_3 [2].lefttext:SetText ("-- x -- x --") + bar_3 [2].lefttext:SetTextColor (.5, .5, .5, 1) + bar_3 [2].righttext:SetText ("") + bar_3 [2]:SetValue (0) + end + else + bar [1]:SetTexture ([[Interface\InventoryItems\WoWUnknownItem01]]) + bar [2].lefttext:SetText ("-- x -- x --") + bar [2].lefttext:SetTextColor (.5, .5, .5, 1) + bar [2].righttext:SetText ("") + bar [2]:SetValue (0) + local bar_2 = frame2.bars [i] + bar_2 [1]:SetTexture ([[Interface\InventoryItems\WoWUnknownItem01]]) + bar_2 [2].lefttext:SetText ("-- x -- x --") + bar_2 [2].lefttext:SetTextColor (.5, .5, .5, 1) + bar_2 [2].righttext:SetText ("") + bar_2 [2]:SetValue (0) + local bar_3 = frame3.bars [i] + bar_3 [1]:SetTexture ([[Interface\InventoryItems\WoWUnknownItem01]]) + bar_3 [2].lefttext:SetText ("-- x -- x --") + bar_3 [2].lefttext:SetTextColor (.5, .5, .5, 1) + bar_3 [2].righttext:SetText ("") + bar_3 [2]:SetValue (0) + end + + end + + for index, spelltable in _ipairs (spells_sorted) do + + end + + end + + local refresh_comparison_box = function (self) + + --atualiza a scroll + FauxScrollFrame_Update (self, math.max (self.tab.spells_amt, 10), 9, 15) + fill_compare_actors (self, self.tab.player, self.tab.players) + + end + + local refresh_target_box = function (self) + + end + + + + local compare_fill = function (tab, player, combat) + local players_to_compare = tab.players + + DetailsPlayerComparisonBox1.name_label:SetText (player:Name()) + + local label2 = _G ["DetailsPlayerComparisonBox2"].name_label + local label3 = _G ["DetailsPlayerComparisonBox3"].name_label + + if (players_to_compare [1]) then + label2:SetText (players_to_compare [1]:Name()) + end + if (players_to_compare [2]) then + label3:SetText (players_to_compare [2]:Name()) + else + label3:SetText ("Player 3") + end + + refresh_comparison_box (DetailsPlayerComparisonBox1) + end + + local on_enter = function (self) + + local frame1 = DetailsPlayerComparisonBox1 + local frame2 = DetailsPlayerComparisonBox2 + local frame3 = DetailsPlayerComparisonBox3 + + local bar1 = frame1.bars [self.index] + local bar2 = frame2.bars [self.index] + local bar3 = frame3.bars [self.index] + + frame1.tooltip:SetPoint ("bottomleft", bar1[2], "topleft", -18, 5) + frame2.tooltip:SetPoint ("bottomleft", bar2[2], "topleft", -18, 5) + frame3.tooltip:SetPoint ("bottomleft", bar3[2], "topleft", -18, 5) + + local spellid = bar1[3][4] + local player1 = frame1.player + local player2 = frame2.player + local player3 = frame3.player + + local hits = bar1[3][1] + local average = bar1[3][2] + local critical = bar1[3][3] + + local player1_misc = info.instancia.showing (4, player1) + local player2_misc = info.instancia.showing (4, player2) + local player3_misc = info.instancia.showing (4, player3) + local player1_uptime + + if (bar1[2].righttext:GetText()) then + bar1[2]:SetStatusBarColor (1, 1, 1, 1) + bar1[2].icon:SetTexCoord (.1, .9, .1, .9) + frame1.tooltip.hits_label2:SetText (hits) + frame1.tooltip.average_label2:SetText (_detalhes:ToK2Min (average)) + frame1.tooltip.crit_label2:SetText (critical .. "%") + + if (player1_misc) then + local spell = player1_misc.debuff_uptime_spell_tables and player1_misc.debuff_uptime_spell_tables._ActorTable and player1_misc.debuff_uptime_spell_tables._ActorTable [spellid] + if (spell) then + local minutos, segundos = _math_floor (spell.uptime/60), _math_floor (spell.uptime%60) + player1_uptime = spell.uptime + frame1.tooltip.uptime_label2:SetText (minutos .. "m" .. segundos .. "s") + else + frame1.tooltip.uptime_label2:SetText ("--x--x--") + end + else + frame1.tooltip.uptime_label2:SetText ("--x--x--") + end + + frame1.tooltip:Show() + end + + if (bar2[2].righttext:GetText()) then + + bar2[2]:SetStatusBarColor (1, 1, 1, 1) + bar2[2].icon:SetTexCoord (.1, .9, .1, .9) + + if (hits > bar2[3][1]) then + local diff = hits - bar2[3][1] + local up = diff / hits * 100 + frame2.tooltip.hits_label2:SetText (bar2[3][1] .. " |cFFFF0000-(" .. _math_floor (up) .. "%)|r") + else + local diff = bar2[3][1] - hits + local down = diff / bar2[3][1] * 100 + frame2.tooltip.hits_label2:SetText (bar2[3][1] .. " |cFF00FF00+(" .. _math_floor (down) .. "%)|r") + end + + if (average > bar2[3][2]) then + local diff = average - bar2[3][2] + local up = diff / average * 100 + frame2.tooltip.average_label2:SetText (_detalhes:ToK2Min (bar2[3][2]) .. " |cFFFF0000-(" .. _math_floor (up) .. "%)|r") + else + local diff = bar2[3][2] - average + local down = diff / bar2[3][2] * 100 + frame2.tooltip.average_label2:SetText (_detalhes:ToK2Min (bar2[3][2]) .. " |cFF00FF00+(" .. _math_floor (down) .. "%)|r") + end + + if (critical > bar2[3][3]) then + local diff = critical - bar2[3][3] + local up = diff / critical * 100 + frame2.tooltip.crit_label2:SetText (bar2[3][3] .. "%" .. " |cFFFF0000-(" .. _math_floor (up) .. "%)|r") + else + local diff = bar2[3][3] - critical + local down = diff / bar2[3][3] * 100 + frame2.tooltip.crit_label2:SetText (bar2[3][3] .. "%" .. " |cFF00FF00+(" .. _math_floor (down) .. "%)|r") + end + + if (player2_misc) then + local spell = player2_misc.debuff_uptime_spell_tables and player2_misc.debuff_uptime_spell_tables._ActorTable and player2_misc.debuff_uptime_spell_tables._ActorTable [spellid] + if (spell) then + local minutos, segundos = _math_floor (spell.uptime/60), _math_floor (spell.uptime%60) + if (player1_uptime > spell.uptime) then + local diff = player1_uptime - spell.uptime + local up = diff / player1_uptime * 100 + frame2.tooltip.uptime_label2:SetText (minutos .. "m" .. segundos .. "s |cFFFF0000-(" .. _math_floor (up) .. "%)|r") + else + local diff = spell.uptime - player1_uptime + local down = diff / spell.uptime * 100 + frame2.tooltip.uptime_label2:SetText (minutos .. "m" .. segundos .. "s |cFF00FF00+(" .. _math_floor (down) .. "%)|r") + end + else + frame2.tooltip.uptime_label2:SetText ("--x--x--") + end + else + frame2.tooltip.uptime_label2:SetText ("--x--x--") + end + + frame2.tooltip:Show() + end + + if (bar3[2].righttext:GetText()) then + bar3[2]:SetStatusBarColor (1, 1, 1, 1) + bar3[2].icon:SetTexCoord (.1, .9, .1, .9) + + if (hits > bar3[3][1]) then + local diff = hits - bar3[3][1] + local up = diff / hits * 100 + frame3.tooltip.hits_label2:SetText (bar3[3][1] .. " |cFFFF0000-(" .. _math_floor (up) .. "%)|r") + else + local diff = bar3[3][1] - hits + local down = diff / bar3[3][1] * 100 + frame3.tooltip.hits_label2:SetText (bar3[3][1] .. " |cFF00FF00+(" .. _math_floor (down) .. "%)|r") + end + + if (average > bar3[3][2]) then + local diff = average - bar3[3][2] + local up = diff / average * 100 + frame3.tooltip.average_label2:SetText (_detalhes:ToK2Min (bar3[3][2]) .. " |cFFFF0000-(" .. _math_floor (up) .. "%)|r") + else + local diff = bar3[3][2] - average + local down = diff / bar3[3][2] * 100 + frame3.tooltip.average_label2:SetText (_detalhes:ToK2Min (bar3[3][2]) .. " |cFF00FF00+(" .. _math_floor (down) .. "%)|r") + end + + if (critical > bar3[3][3]) then + local diff = critical - bar3[3][3] + local up = diff / critical * 100 + frame3.tooltip.crit_label2:SetText (bar3[3][3] .. "%" .. " |cFFFF0000-(" .. _math_floor (up) .. "%)|r") + else + local diff = bar3[3][3] - critical + local down = diff / bar3[3][3] * 100 + frame3.tooltip.crit_label2:SetText (bar3[3][3] .. "%" .. " |cFF00FF00+(" .. _math_floor (down) .. "%)|r") + end + + if (player3_misc) then + local spell = player3_misc.debuff_uptime_spell_tables and player3_misc.debuff_uptime_spell_tables._ActorTable and player3_misc.debuff_uptime_spell_tables._ActorTable [spellid] + if (spell) then + local minutos, segundos = _math_floor (spell.uptime/60), _math_floor (spell.uptime%60) + if (player1_uptime > spell.uptime) then + local diff = player1_uptime - spell.uptime + local up = diff / player1_uptime * 100 + frame3.tooltip.uptime_label2:SetText (minutos .. "m" .. segundos .. "s |cFFFF0000-(" .. _math_floor (up) .. "%)|r") + else + local diff = spell.uptime - player1_uptime + local down = diff / spell.uptime * 100 + frame3.tooltip.uptime_label2:SetText (minutos .. "m" .. segundos .. "s |cFF00FF00+(" .. _math_floor (down) .. "%)|r") + end + else + frame3.tooltip.uptime_label2:SetText ("--x--x--") + end + else + frame3.tooltip.uptime_label2:SetText ("--x--x--") + end + + frame3.tooltip:Show() + end + end + + local on_leave = function (self) + local frame1 = DetailsPlayerComparisonBox1 + local frame2 = DetailsPlayerComparisonBox2 + local frame3 = DetailsPlayerComparisonBox3 + + local bar1 = frame1.bars [self.index] + local bar2 = frame2.bars [self.index] + local bar3 = frame3.bars [self.index] + + bar1[2]:SetStatusBarColor (.5, .5, .5, 1) + bar1[2].icon:SetTexCoord (0, 1, 0, 1) + bar2[2]:SetStatusBarColor (.5, .5, .5, 1) + bar2[2].icon:SetTexCoord (0, 1, 0, 1) + bar3[2]:SetStatusBarColor (.5, .5, .5, 1) + bar3[2].icon:SetTexCoord (0, 1, 0, 1) + + frame1.tooltip:Hide() + frame2.tooltip:Hide() + frame3.tooltip:Hide() + end + + local compare_create = function (tab, frame) + + local create_bar = function (name, parent, index, main) + local y = ((index-1) * -15) - 7 + + local spellicon = parent:CreateTexture (nil, "overlay") + spellicon:SetSize (14, 14) + spellicon:SetPoint ("topleft", parent, "topleft", 4, y) + spellicon:SetTexture ([[Interface\InventoryItems\WoWUnknownItem01]]) + + local bar = CreateFrame ("StatusBar", name, parent) + bar.index = index + bar:SetPoint ("topleft", spellicon, "topright", 0, 0) + bar:SetPoint ("topright", parent, "topright", -4, y) + bar:SetStatusBarTexture (_detalhes.default_texture) + bar:SetStatusBarColor (.5, .5, .5, 1) + bar:SetMinMaxValues (0, 100) + bar:SetValue (100) + bar:SetHeight (14) + bar.icon = spellicon + + bar:SetScript ("OnEnter", on_enter) + bar:SetScript ("OnLeave", on_leave) + + bar.lefttext = bar:CreateFontString (nil, "OVERLAY", "GameFontHighlightSmall") + + local _, size, flags = bar.lefttext:GetFont() + local font = SharedMedia:Fetch ("font", "Arial Narrow") + bar.lefttext:SetFont (font, 11, "outline") + + bar.lefttext:SetPoint ("left", bar, "left", 2, 0) + bar.lefttext:SetJustifyH ("left") + bar.lefttext:SetTextColor (1, 1, 1, 1) + bar.lefttext:SetNonSpaceWrap (true) + bar.lefttext:SetWordWrap (false) + if (main) then + bar.lefttext:SetWidth (110) + else + bar.lefttext:SetWidth (70) + end + + bar.righttext = bar:CreateFontString (nil, "OVERLAY", "GameFontHighlightSmall") + bar.righttext:SetPoint ("right", bar, "right", -2, 0) + bar.righttext:SetJustifyH ("right") + bar.righttext:SetTextColor (1, 1, 1, 1) + + tinsert (parent.bars, {spellicon, bar, {0, 0, 0}}) + end + + local create_tooltip = function (name) + local tooltip = CreateFrame ("frame", name, UIParent) + tooltip:SetBackdrop({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], tile = true, tileSize = 16, edgeSize = 12, insets = {left = 1, right = 1, top = 1, bottom = 1},}) + tooltip:SetBackdropColor (0, 0, 0, 1) + tooltip:SetSize (175, 67) + tooltip:SetFrameStrata ("tooltip") + + local background = tooltip:CreateTexture (nil, "artwork") + background:SetTexture ([[Interface\SPELLBOOK\Spellbook-Page-1]]) + background:SetTexCoord (.6, 0.1, 0, 0.64453125) + background:SetVertexColor (1, 1, 1, 0.2) + background:SetPoint ("topleft", tooltip, "topleft", 2, -4) + background:SetPoint ("bottomright", tooltip, "bottomright", -4, 2) + + tooltip.hits_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") + tooltip.hits_label:SetPoint ("topleft", tooltip, "topleft", 10, -10) + tooltip.hits_label:SetText ("Total Hits:") + tooltip.hits_label:SetJustifyH ("left") + tooltip.hits_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") + tooltip.hits_label2:SetPoint ("topright", tooltip, "topright", -10, -10) + tooltip.hits_label2:SetText ("0") + tooltip.hits_label2:SetJustifyH ("right") + + tooltip.average_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") + tooltip.average_label:SetPoint ("topleft", tooltip, "topleft", 10, -22) + tooltip.average_label:SetText ("Average:") + tooltip.average_label:SetJustifyH ("left") + tooltip.average_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") + tooltip.average_label2:SetPoint ("topright", tooltip, "topright", -10, -22) + tooltip.average_label2:SetText ("0") + tooltip.average_label2:SetJustifyH ("right") + + tooltip.crit_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") + tooltip.crit_label:SetPoint ("topleft", tooltip, "topleft", 10, -34) + tooltip.crit_label:SetText ("Critical:") + tooltip.crit_label:SetJustifyH ("left") + tooltip.crit_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") + tooltip.crit_label2:SetPoint ("topright", tooltip, "topright", -10, -34) + tooltip.crit_label2:SetText ("0") + tooltip.crit_label2:SetJustifyH ("right") + + tooltip.uptime_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") + tooltip.uptime_label:SetPoint ("topleft", tooltip, "topleft", 10, -46) + tooltip.uptime_label:SetText ("Uptime:") + tooltip.uptime_label:SetJustifyH ("left") + tooltip.uptime_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") + tooltip.uptime_label2:SetPoint ("topright", tooltip, "topright", -10, -46) + tooltip.uptime_label2:SetText ("0") + tooltip.uptime_label2:SetJustifyH ("right") + + return tooltip + end + + local frame1 = CreateFrame ("scrollframe", "DetailsPlayerComparisonBox1", frame, "FauxScrollFrameTemplate") + frame1:SetScript ("OnVerticalScroll", function (self, offset) FauxScrollFrame_OnVerticalScroll (self, offset, 14, refresh_comparison_box) end) + frame1:SetSize (175, 150) + frame1:SetPoint ("topleft", frame, "topleft", 10, -30) + frame1:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1},}) + frame1:SetBackdropColor (0, 0, 0, .7) + frame1.bars = {} + frame1.tab = tab + frame1.tooltip = create_tooltip ("DetailsPlayerComparisonBox1Tooltip") + + local playername1 = frame1:CreateFontString (nil, "overlay", "GameFontNormal") + playername1:SetPoint ("bottomleft", frame1, "topleft", 2, 0) + playername1:SetText ("Player 1") + frame1.name_label = playername1 + + --criar as barras do frame1 + for i = 1, 9 do + create_bar ("DetailsPlayerComparisonBox1Bar"..i, frame1, i, true) + end + + + + --cria o box dos targets + local target1 = CreateFrame ("scrollframe", "DetailsPlayerComparisonTarget1", frame, "FauxScrollFrameTemplate") + target1:SetScript ("OnVerticalScroll", function (self, offset) FauxScrollFrame_OnVerticalScroll (self, offset, 14, refresh_target_box) end) + target1:SetSize (175, 70) + target1:SetPoint ("topleft", frame1, "bottomleft", 0, -10) + target1:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1},}) + target1:SetBackdropColor (0, 0, 0, .7) + target1.bars = {} + target1.tab = tab + + --criar as barras do target1 + for i = 1, 4 do + create_bar ("DetailsPlayerComparisonTarget1Bar"..i, target1, i, true) + end + +-------------------------------------------- + local frame2 = CreateFrame ("frame", "DetailsPlayerComparisonBox2", frame) + local frame3 = CreateFrame ("frame", "DetailsPlayerComparisonBox3", frame) + + frame2:SetPoint ("topleft", frame1, "topright", 25, 0) + frame2:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1},}) + frame2:SetSize (170, 150) + frame2:SetBackdropColor (0, 0, 0, .7) + frame2.bars = {} + frame2.tooltip = create_tooltip ("DetailsPlayerComparisonBox2Tooltip") + + local playername2 = frame2:CreateFontString (nil, "overlay", "GameFontNormal") + playername2:SetPoint ("bottomleft", frame2, "topleft", 2, 0) + playername2:SetText ("Player 2") + frame2.name_label = playername2 + + --criar as barras do frame2 + for i = 1, 9 do + create_bar ("DetailsPlayerComparisonBox2Bar"..i, frame2, i) + end + + --cria o box dos targets + local target2 = CreateFrame ("frame", "DetailsPlayerComparisonTarget2", frame) + target2:SetSize (170, 70) + target2:SetPoint ("topleft", frame2, "bottomleft", 0, -10) + target2:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1},}) + target2:SetBackdropColor (0, 0, 0, .7) + target2.bars = {} + + --criar as barras do target2 + for i = 1, 4 do + create_bar ("DetailsPlayerComparisonTarget2Bar"..i, target2, i) + end + + frame3:SetPoint ("topleft", frame2, "topright", 5, 0) + frame3:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1},}) + frame3:SetSize (170, 150) + frame3:SetBackdropColor (0, 0, 0, .7) + frame3.bars = {} + frame3.tooltip = create_tooltip ("DetailsPlayerComparisonBox3Tooltip") + + local playername3 = frame3:CreateFontString (nil, "overlay", "GameFontNormal") + playername3:SetPoint ("bottomleft", frame3, "topleft", 2, 0) + playername3:SetText ("Player 3") + frame3.name_label = playername3 + + --criar as barras do frame3 + for i = 1, 9 do + create_bar ("DetailsPlayerComparisonBox3Bar"..i, frame3, i) + end + + --cria o box dos targets + local target3 = CreateFrame ("frame", "DetailsPlayerComparisonTarget3", frame) + target3:SetSize (170, 70) + target3:SetPoint ("topleft", frame3, "bottomleft", 0, -10) + target3:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1},}) + target3:SetBackdropColor (0, 0, 0, .7) + target3.bars = {} + + --criar as barras do target1 + for i = 1, 4 do + create_bar ("DetailsPlayerComparisonTarget3Bar"..i, target3, i) + end + end + + -- ~compare + _detalhes:CreatePlayerDetailsTab ("Compare", --[1] tab name + function (tabOBject, playerObject) --[2] condition + + local same_class = {} + local class = playerObject.classe + local my_spells = {} + local my_spells_total = 0 + --> build my spell list + for spellid, _ in _pairs (playerObject.spell_tables._ActorTable) do + my_spells [spellid] = true + my_spells_total = my_spells_total + 1 + end + + tabOBject.players = {} + tabOBject.player = playerObject + tabOBject.spells_amt = my_spells_total + + for index, actor in _ipairs (info.instancia.showing [info.atributo]._ActorTable) do + if (actor.classe == class and actor ~= playerObject) then + + local same_spells = 0 + for spellid, _ in _pairs (actor.spell_tables._ActorTable) do + if (my_spells [spellid]) then + same_spells = same_spells + 1 + end + end + + local match_percentage = same_spells / my_spells_total * 100 + + if (match_percentage > 30) then + tinsert (tabOBject.players, actor) + end + end + end + + if (#tabOBject.players > 0) then + return true + end + + return false + --return true + end, + + compare_fill, --[3] fill function + + nil, --[4] onclick + + compare_create --[5] oncreate + ) + function este_gump:ShowTabs() local amt_positive = 0 diff --git a/gumps/janela_news.lua b/gumps/janela_news.lua index 07d3f850..d53a6167 100644 --- a/gumps/janela_news.lua +++ b/gumps/janela_news.lua @@ -42,7 +42,7 @@ function _detalhes:CreateOrOpenNewsWindow() local frame_upper = CreateFrame ("scrollframe", nil, frame) local frame_lower = CreateFrame ("frame", nil, frame_upper) - frame_lower:SetSize (450, 390) + frame_lower:SetSize (450, 2000) frame_upper:SetPoint ("topleft", frame, "topleft", 15, -70) frame_upper:SetWidth (465) frame_upper:SetHeight (400) @@ -66,7 +66,7 @@ function _detalhes:CreateOrOpenNewsWindow() slider:SetOrientation ("vertical"); slider:SetSize (16, 399) slider:SetPoint ("topleft", frame_upper, "topright") - slider:SetMinMaxValues (0, 1000) + slider:SetMinMaxValues (0, 2000) slider:SetValue(0) slider:SetScript("OnValueChanged", function (self) frame_upper:SetVerticalScroll (self:GetValue()) @@ -78,8 +78,8 @@ function _detalhes:CreateOrOpenNewsWindow() if (IsShiftKeyDown() and (delta > 0)) then slider:SetValue(0) elseif (IsShiftKeyDown() and (delta < 0)) then - slider:SetValue (1000) - elseif ((delta < 0) and (current < 1000)) then + slider:SetValue (2000) + elseif ((delta < 0) and (current < 2000)) then slider:SetValue (current + 20) elseif ((delta > 0) and (current > 1)) then slider:SetValue (current - 20) @@ -93,7 +93,7 @@ function _detalhes:CreateOrOpenNewsWindow() texto:SetJustifyV ("top") texto:SetTextColor (1, 1, 1) texto:SetWidth (450) - texto:SetHeight (1400) + texto:SetHeight (2500) -- /script _detalhes.OpenNewsWindow() --> forum text local forum_button = CreateFrame ("Button", "DetailsNewsWindowForumButton", frame, "OptionsButtonTemplate") diff --git a/gumps/janela_principal.lua b/gumps/janela_principal.lua index 7ea55a35..93a0d4ce 100644 --- a/gumps/janela_principal.lua +++ b/gumps/janela_principal.lua @@ -1932,6 +1932,7 @@ function CreateAlertFrame (baseframe, instancia) frame_upper:SetPoint ("left", baseframe, "left", 3, 0) frame_upper:SetPoint ("right", baseframe, "right", -3, 0) frame_upper:SetHeight (13) + frame_upper:SetFrameStrata ("fullscreen") local frame_lower = CreateFrame ("frame", "DetailsAlertFrameScrollChild" .. instancia.meu_id, frame_upper) frame_lower:SetHeight (25) @@ -2759,11 +2760,9 @@ function gump:CriaNovaBarra (instancia, index) instancia:SetFontSize (esta_barra.texto_esquerdo, instancia.row_info.font_size) instancia:SetFontFace (esta_barra.texto_esquerdo, instancia.row_info.font_face_file) - --_detalhes.font_pool:add (esta_barra.texto_esquerdo) instancia:SetFontSize (esta_barra.texto_direita, instancia.row_info.font_size) instancia:SetFontFace (esta_barra.texto_direita, instancia.row_info.font_face_file) - --_detalhes.font_pool:add (esta_barra.texto_direita) if (instancia.row_info.textL_outline) then instancia:SetFontOutline (esta_barra.texto_esquerdo, instancia.row_info.textL_outline) @@ -3267,6 +3266,10 @@ function _detalhes:SetWindowAlphaForCombat (entering_in_combat, true_hide) amount = self.hide_in_combat_alpha / 100 self.combat_changes_alpha = amount rowsamount = amount + if (_detalhes.pet_battle) then + amount = 0 + rowsamount = 0 + end else if (self.menu_alpha.enabled) then --auto transparency if (self.is_interacting) then diff --git a/images/custom_bg.tga b/images/custom_bg.tga index 4001e2d1..c5db4a74 100644 Binary files a/images/custom_bg.tga and b/images/custom_bg.tga differ diff --git a/locales/Details-enUS.lua b/locales/Details-enUS.lua index 5490a6d7..e5af59fd 100644 --- a/locales/Details-enUS.lua +++ b/locales/Details-enUS.lua @@ -2,7 +2,7 @@ local Loc = LibStub("AceLocale-3.0"):NewLocale("Details", "enUS", true) if not Loc then return end -------------------------------------------------------------------------------------------------------------------------------------------- - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v1.15.0 - v1.15.3|r:\n\n|cFFFFFF00-|r Damage -> Enemies now also show neutral creatures.\n\n|cFFFFFF00-|r Added support to dungeons, bosses and trash mobs are now recognized.\n\n|cFFFFFF00-|r Added target information for each spell in Player Detail Window.\n\n|cFFFFFF00-|r Added options for change the location of tooltips.\n\n|cFFFFFF00-|r Added options for change the Overall Data functionality.\n\n|cFFFFFF00-|r Added tooltips for lock and detach buttons.\n\n|cFFFFFF00-|r Added new row texture: Details Vidro.\n\n|cFFFFFF00-|r Revamp on death log tooltips.\n\n|cFFFFFF00-|r Improved the visual effect for the instance which current moving window can snap to.\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." + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v1.15.0 - v1.15.3 - v1.15.3b (|cFFFFCC00Jun 03, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Emergencial fix for death logs which sometimes was breaking the addon data capture.\n\n|cFFFFFF00-|r Fixed window alerts which was showing behind the bars.\n\n|cFFFFFF00-|r Fixed death log issue with friendly fire hits.\n\n|cFFFFFF00-|r Fixed a issue where Details! windows wasn't hidden when a pet battle starts.\n\n|cFFFFFF00-|r Fixed a issue with segments menu when a window is placed on the right side of the screen.\n\n|cFFFFFF00-|r Damage -> Enemies now also show neutral creatures.\n\n|cFFFFFF00-|r Added support to dungeons, bosses and trash mobs are now recognized.\n\n|cFFFFFF00-|r Added target information for each spell in Player Detail Window.\n\n|cFFFFFF00-|r Added options for change the location of tooltips.\n\n|cFFFFFF00-|r Added options for change the Overall Data functionality.\n\n|cFFFFFF00-|r Added tooltips for lock and detach buttons.\n\n|cFFFFFF00-|r Added new row texture: Details Vidro.\n\n|cFFFFFF00-|r Revamp on death log tooltips.\n\n|cFFFFFF00-|r Improved the visual effect for the instance which current moving window can snap to.\n\n|cFFFFFF00v1.14.5 - 1.14.6 (|cFFFFCC00May 24, 2014|r|cFFFFFF00):|r\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 (|cFFFFCC00May 17, 2014|r|cFFFFFF00):\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 (|cFFFFCC00May 09, 2014|r|cFFFFFF00):\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 (|cFFFFCC00May 02, 2014|r|cFFFFFF00):|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 (|cFFFFCC00Apr 25, 2014|r|cFFFFFF00):|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 (|cFFFFCC00Apr 18, 2014|r|cFFFFFF00):|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." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails:|r " --> color and details name @@ -130,14 +130,21 @@ if not Loc then return end Loc ["STRING_CUSTOM_REMOVE"] = "Remove" Loc ["STRING_CUSTOM_BROADCAST"] = "Shout" - Loc ["STRING_CUSTOM_NAME"] = "Custom Name" - Loc ["STRING_CUSTOM_SPELLID"] = "Spell Id" - Loc ["STRING_CUSTOM_SOURCE"] = "Source" - Loc ["STRING_CUSTOM_TARGET"] = "Target" + Loc ["STRING_CUSTOM_NAME"] = "Name:" + Loc ["STRING_CUSTOM_SPELLID"] = "Spell Id:" + Loc ["STRING_CUSTOM_SOURCE"] = "Source:" + Loc ["STRING_CUSTOM_TARGET"] = "Target:" + Loc ["STRING_CUSTOM_ATTRIBUTE"] = "Attribute:" + + Loc ["STRING_CUSTOM_ATT1"] = "Damage" + Loc ["STRING_CUSTOM_ATT2"] = "Heal" + Loc ["STRING_CUSTOM_ATT3"] = "Energy" + Loc ["STRING_CUSTOM_ATT4"] = "Misc" + Loc ["STRING_CUSTOM_TOOLTIPNAME"] = "Insert here the name of your custom display.\nAllow letters and numbers, minimum of 5 characters and 32 max." Loc ["STRING_CUSTOM_TOOLTIPSPELL"] = "Select a boss ability from the menu on the right\nor type the spell name to filter." - Loc ["STRING_CUSTOM_TOOLTIPSOURCE"] = "Spell source allow (with brackets):\n|cFF00FF00[all]|r: Search for spell in all Actors.\n|cFFFF9900[raid]|r: Search only in your raid or party members.\n|cFF33CCFF[player]|r: Check only you\nAny other text will be considered an spesific Actor name." - Loc ["STRING_CUSTOM_TOOLTIPTARGET"] = "Insert the ability (player, monster, boss) target name." + Loc ["STRING_CUSTOM_TOOLTIPSOURCE"] = "Source is who is triggering the attribute chosen.\nIt allows (maintain the brackets):\n\n|cFF00FF00[all]|r: search for matches in all characters.\n|cFFFFFF00[raid]|r: search only in your raid or party members.\n|cFF33CCFF[player]|r: only you are checked during the search for results.\n\nAny other text is considered an spesific character." + Loc ["STRING_CUSTOM_TOOLTIPTARGET"] = "Source target." Loc ["STRING_CUSTOM_TOOLTIPNOTWORKING"] = "Ouch, some gnome engineer touched this and broke it =(" Loc ["STRING_CUSTOM_BROADCASTSENT"] = "Sent" Loc ["STRING_CUSTOM_CREATED"] = "The new display has been created." diff --git a/locales/Details-ptBR.lua b/locales/Details-ptBR.lua index 1eb7b25e..59029cc3 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.15.0 - v1.15.3|r:\n\n|cFFFFFF00-|r Damage -> Enemies now also show neutral creatures.\n\n|cFFFFFF00-|r Added support to dungeons, bosses and trash mobs are now recognized.\n\n|cFFFFFF00-|r Added target information for each spell in Player Detail Window.\n\n|cFFFFFF00-|r Added options for change the location of tooltips.\n\n|cFFFFFF00-|r Added options for change the Overall Data functionality.\n\n|cFFFFFF00-|r Added tooltips for lock and detach buttons.\n\n|cFFFFFF00-|r Added new row texture: Details Vidro.\n\n|cFFFFFF00-|r Revamp on death log tooltips.\n\n|cFFFFFF00-|r Improved the visual effect for the instance which current moving window can snap to.\n\n|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." + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v1.15.0 - v1.15.3 - v1.15.3b|r:\n\n|cFFFFFF00-|r Emergencial fix for death logs which sometimes was breaking the addon data capture.\n\n|cFFFFFF00-|r Fixed window alerts which was showing behind the bars.\n\n|cFFFFFF00-|r Fixed death log issue with friendly fire hits.\n\n|cFFFFFF00-|r Fixed a issue where Details! windows wasn't hidden when a pet battle starts.\n\n|cFFFFFF00-|r Fixed a issue with segments menu when a window is placed on the right side of the screen.\n\n|cFFFFFF00-|r Damage -> Enemies now also show neutral creatures.\n\n|cFFFFFF00-|r Added support to dungeons, bosses and trash mobs are now recognized.\n\n|cFFFFFF00-|r Added target information for each spell in Player Detail Window.\n\n|cFFFFFF00-|r Added options for change the location of tooltips.\n\n|cFFFFFF00-|r Added options for change the Overall Data functionality.\n\n|cFFFFFF00-|r Added tooltips for lock and detach buttons.\n\n|cFFFFFF00-|r Added new row texture: Details Vidro.\n\n|cFFFFFF00-|r Revamp on death log tooltips.\n\n|cFFFFFF00-|r Improved the visual effect for the instance which current moving window can snap to.\n\n|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." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetalhes:|r " --> color and details name diff --git a/startup.lua b/startup.lua index 2153c059..064fc653 100644 --- a/startup.lua +++ b/startup.lua @@ -219,6 +219,9 @@ function _G._detalhes:Start() self.listener:RegisterEvent ("ENCOUNTER_START") self.listener:RegisterEvent ("ENCOUNTER_END") + + self.listener:RegisterEvent ("PET_BATTLE_OPENING_START") + self.listener:RegisterEvent ("PET_BATTLE_CLOSE") --self.listener:RegisterAllEvents() @@ -1039,6 +1042,7 @@ function _G._detalhes:Start() function _detalhes:OpenOptionsWindowAtStart() --_detalhes:OpenOptionsWindow (_detalhes.tabela_instancias[1]) --print (_G ["DetailsClearSegmentsButton1"]:GetSize()) + --_detalhes:OpenCustomWindow() end _detalhes:ScheduleTimer ("OpenOptionsWindowAtStart", 2)