diff --git a/Definitions.lua b/Definitions.lua index 42117b93..3d8f59c6 100644 --- a/Definitions.lua +++ b/Definitions.lua @@ -27,6 +27,10 @@ ---@class tablesize : {H: number, W: number} ---@class tablecoords : {L: number, R: number, T: number, B: number} +---@class spellid : number +---@class actorname : string +---@class spellname : string +---@class actorid : string ---@class red : number color value representing the red component of a color, the value must be between 0 and 1. To retrieve a color from a string or table use: local red, green, blue, alpha = DetailsFramework:ParseColors(color) ---@class green : number color value representing the green component of a color, the value must be between 0 and 1. To retrieve a color from a string or table use: local red, green, blue, alpha = DetailsFramework:ParseColors(color) ---@class blue : number color value representing the blue component of a color, the value must be between 0 and 1. To retrieve a color from a string or table use: local red, green, blue, alpha = DetailsFramework:ParseColors(color) @@ -312,6 +316,7 @@ ---@field is_mythic_dungeon_trash boolean ---@field is_mythic_dungeon_run_id number ---@field is_mythic_dungeon_segment boolean +---@field trinketProcs table> ---@field GetCombatTime fun(combat) : number ---@field GetDeaths fun(combat) : table --get the table which contains the deaths of the combat ---@field GetStartTime fun(combat: combat) : number @@ -440,6 +445,18 @@ ---@field RefreshData fun(instance: instance, force: boolean|nil) ---@field RefreshWindow fun(instance: instance, force: boolean|nil) +---@class trinketdata : table +---@field itemName string +---@field spellName string +---@field lastActivation number +---@field lastPlayerName string +---@field totalCooldownTime number +---@field activations number +---@field lastCombatId number +---@field minTime number +---@field maxTime number +---@field averageTime number + ---@class tabframe : frame this is the tab frame object for the breakdown window ---@class breakdownscrolldata : table diff --git a/classes/class_combat.lua b/classes/class_combat.lua index 3ea08bfd..0294406b 100644 --- a/classes/class_combat.lua +++ b/classes/class_combat.lua @@ -1,5 +1,5 @@ - local _detalhes = _G.Details + local Details = _G.Details local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" ) local _ local addonName, Details222 = ... @@ -43,12 +43,12 @@ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --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 classCombat = Details.combate + local classActorContainer = Details.container_combatentes + local class_type_dano = Details.atributos.dano + local class_type_cura = Details.atributos.cura + local class_type_e_energy = Details.atributos.e_energy + local class_type_misc = Details.atributos.misc local REACTION_HOSTILE = 0x00000040 local CONTROL_PLAYER = 0x00000100 @@ -60,21 +60,21 @@ --api functions --combat (container type, actor name) - _detalhes.call_combate = function(self, class_type, name) + Details.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 + classCombat.__call = Details.call_combate --get the start date and end date - function combate:GetDate() + function classCombat:GetDate() return self.data_inicio, self.data_fim end --set the combat date - function combate:SetDate (started, ended) + function classCombat:SetDate (started, ended) if (started and type(started) == "string") then self.data_inicio = started end @@ -84,76 +84,76 @@ end --return data for charts - function combate:GetTimeData (name) + function classCombat:GetTimeData (name) return self.TimeData [name] end - function combate:GetContainer (attribute) + function classCombat:GetContainer (attribute) return self [attribute] end - function combate:GetRoster() + function classCombat:GetRoster() return self.raid_roster end - function combate:InstanceType() + function classCombat:InstanceType() return rawget(self, "instance_type") end - function combate:IsTrash() + function classCombat:IsTrash() return rawget(self, "is_trash") end - function combate:GetDifficulty() + function classCombat:GetDifficulty() return self.is_boss and self.is_boss.diff end - function combate:GetEncounterCleuID() + function classCombat:GetEncounterCleuID() return self.is_boss and self.is_boss.id end - function combate:GetBossInfo() + function classCombat:GetBossInfo() return self.is_boss end - function combate:GetPhases() + function classCombat:GetPhases() return self.PhaseData end - function combate:GetPvPInfo() + function classCombat:GetPvPInfo() return self.is_pvp end - function combate:GetMythicDungeonInfo() + function classCombat:GetMythicDungeonInfo() return self.is_mythic_dungeon end - function combate:GetMythicDungeonTrashInfo() + function classCombat:GetMythicDungeonTrashInfo() return self.is_mythic_dungeon_trash end ---return if the combat is a mythic dungeon segment and the run id ---@return boolean ---@return number - function combate:IsMythicDungeon() + function classCombat:IsMythicDungeon() local bIsMythicPlusSegment = self.is_mythic_dungeon_segment local runId = self.is_mythic_dungeon_run_id return bIsMythicPlusSegment, runId end - function combate:IsMythicDungeonOverall() + function classCombat:IsMythicDungeonOverall() return self.is_mythic_dungeon and self.is_mythic_dungeon.OverallSegment end - function combate:GetArenaInfo() + function classCombat:GetArenaInfo() return self.is_arena end - function combate:GetDeaths() + function classCombat:GetDeaths() return self.last_events_tables end - function combate:GetPlayerDeaths(deadPlayerName) + function classCombat:GetPlayerDeaths(deadPlayerName) local allDeaths = self:GetDeaths() local deaths = {} @@ -168,15 +168,15 @@ return deaths end - function combate:GetCombatId() + function classCombat:GetCombatId() return self.combat_id end - function combate:GetCombatNumber() + function classCombat:GetCombatNumber() return self.combat_counter end - function combate:GetAlteranatePower() + function classCombat:GetAlteranatePower() return self.alternate_power end @@ -185,7 +185,7 @@ ---@param actorName string ---@param spellName string ---@return number - function combate:GetSpellCastAmount(actorName, spellName) + function classCombat:GetSpellCastAmount(actorName, spellName) return self.amountCasts[actorName] and self.amountCasts[actorName][spellName] or 0 end @@ -193,7 +193,7 @@ ---@param self combat ---@param actorName string|nil ---@return table - function combate:GetSpellCastTable(actorName) + function classCombat:GetSpellCastTable(actorName) if (actorName) then return self.amountCasts[actorName] or {} else @@ -204,7 +204,7 @@ ---delete an actor from the spell casts amount ---@param self combat ---@param actorName string - function combate:RemoveActorFromSpellCastTable(actorName) + function classCombat:RemoveActorFromSpellCastTable(actorName) self.amountCasts[actorName] = nil end @@ -213,7 +213,7 @@ ---@param spellId number ---@param auraType string|nil if nil get 'buff' ---@return number - function combate:GetSpellUptime(actorName, spellId, auraType) + function classCombat:GetSpellUptime(actorName, spellId, auraType) ---@type actorcontainer local utilityContainer = self:GetContainer(DETAILS_ATTRIBUTE_MISC) ---@type actor @@ -258,7 +258,7 @@ end --return the name of the encounter or enemy - function combate:GetCombatName(try_find) + function classCombat:GetCombatName(try_find) if (self.is_pvp) then return self.is_pvp.name @@ -276,15 +276,15 @@ return self.enemy end if (try_find) then - return _detalhes:FindEnemy() + return Details:FindEnemy() end end return Loc ["STRING_UNKNOW"] end - function combate:GetCombatType() + function classCombat:GetCombatType() --mythic dungeon - local isMythicDungeon = is_mythic_dungeon_segment + local isMythicDungeon = self.is_mythic_dungeon_segment if (isMythicDungeon) then local isMythicDungeonTrash = self.is_mythic_dungeon_trash if (isMythicDungeonTrash) then @@ -340,7 +340,7 @@ end --overall data - if (self == _detalhes.tabela_overall) then + if (self == Details.tabela_overall) then return DETAILS_SEGMENTTYPE_OVERALL end @@ -348,48 +348,53 @@ end --return a numeric table with all actors on the specific containter - function combate:GetActorList (container) + function classCombat:GetActorList (container) return self [container]._ActorTable end - function combate:GetActor(container, name) - local index = self [container] and self [container]._NameIndexTable [name] + ---return an actor object for the given container and actor name + ---@param container number + ---@param name string + ---@return actor|nil + function classCombat:GetActor(container, name) + local index = self[container] and self[container]._NameIndexTable[name] if (index) then - return self [container]._ActorTable [index] + return self[container]._ActorTable[index] end return nil end - --return the combat time in seconds - function combate:GetFormatedCombatTime() + ---return the combat time in seconds + ---@return number, number + function classCombat:GetFormatedCombatTime() local combatTime = self:GetCombatTime() - local m, s = floor(combatTime/60), floor(combatTime%60) - return m, s + local minute, second = floor(combatTime / 60), floor(combatTime % 60) + return minute, second end ---return the amount of time the combat has elapsed ---@return number - function combate:GetCombatTime() + function classCombat:GetCombatTime() if (self.end_time) then return _math_max (self.end_time - self.start_time, 0.1) - elseif (self.start_time and _detalhes.in_combat and self ~= _detalhes.tabela_overall) then + elseif (self.start_time and Details.in_combat and self ~= Details.tabela_overall) then return _math_max (GetTime() - self.start_time, 0.1) else return 0.1 end end - function combate:GetStartTime() + function classCombat:GetStartTime() return self.start_time end - function combate:SetStartTime(thisTime) + function classCombat:SetStartTime(thisTime) self.start_time = thisTime end - function combate:GetEndTime() + function classCombat:GetEndTime() return self.end_time end - function combate:SetEndTime(thisTime) + function classCombat:SetEndTime(thisTime) self.end_time = thisTime end @@ -398,7 +403,7 @@ ---@param combat1 combat ---@param combat2 combat ---@param bMythicPlus boolean - function combate.CopyDeathsFrom(combat1, combat2, bMythicPlus) + function classCombat.CopyDeathsFrom(combat1, combat2, bMythicPlus) local deathsTable = combat1:GetDeaths() local deathsToCopy = combat2:GetDeaths() @@ -417,7 +422,7 @@ --return the total of a specific attribute local power_table = {0, 1, 3, 6, 0, "alternatepower"} - function combate:GetTotal(attribute, subAttribute, onlyGroup) + function classCombat:GetTotal(attribute, subAttribute, onlyGroup) if (attribute == 1 or attribute == 2) then if (onlyGroup) then return self.totals_grupo [attribute] @@ -436,7 +441,7 @@ end elseif (attribute == 4) then - local subName = _detalhes:GetInternalSubAttributeName (attribute, subAttribute) + local subName = Details:GetInternalSubAttributeName (attribute, subAttribute) if (onlyGroup) then return self.totals_grupo [attribute] [subName] else @@ -447,14 +452,14 @@ return 0 end - function combate:CreateAlternatePowerTable (actorName) + function classCombat:CreateAlternatePowerTable (actorName) local t = {last = 0, total = 0} self.alternate_power [actorName] = t return t end --delete an actor from the combat ~delete ~erase ~remove - function combate:DeleteActor(attribute, actorName, removeDamageTaken, cannotRemap) + function classCombat:DeleteActor(attribute, actorName, removeDamageTaken, cannotRemap) local container = self[attribute] if (container) then @@ -539,110 +544,117 @@ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --internals - function combate:CreateNewCombatTable() - return combate:NovaTabela() + function classCombat:CreateNewCombatTable() + return classCombat:NovaTabela() end - --class constructor - function combate:NovaTabela (iniciada, _tabela_overall, combatId, ...) + ---class constructor + ---@param bTimeStarted boolean if true set the start time to now with GetTime + ---@param overallCombatObject combat + ---@param combatId number + ---@param ... unknown + ---@return combat + function classCombat:NovaTabela(bTimeStarted, overallCombatObject, combatId, ...) + ---@type combat + local combatObject = {} - local esta_tabela = {true, true, true, true, true} + combatObject[1] = classActorContainer:NovoContainer(Details.container_type.CONTAINER_DAMAGE_CLASS, combatObject, combatId) --Damage + combatObject[2] = classActorContainer:NovoContainer(Details.container_type.CONTAINER_HEAL_CLASS, combatObject, combatId) --Healing + combatObject[3] = classActorContainer:NovoContainer(Details.container_type.CONTAINER_ENERGY_CLASS, combatObject, combatId) --Energies + combatObject[4] = classActorContainer:NovoContainer(Details.container_type.CONTAINER_MISC_CLASS, combatObject, combatId) --Misc + combatObject[5] = classActorContainer:NovoContainer(Details.container_type.CONTAINER_DAMAGE_CLASS, combatObject, combatId) --place holder for customs - 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(combatObject, classCombat) - setmetatable(esta_tabela, combate) - - esta_tabela.amountCasts = {} - - _detalhes.combat_counter = _detalhes.combat_counter + 1 - esta_tabela.combat_counter = _detalhes.combat_counter + Details.combat_counter = Details.combat_counter + 1 + combatObject.combat_counter = Details.combat_counter --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 + combatObject.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 + combatObject.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 + combatObject.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 + combatObject.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��o? + combatObject.pvp = true --se ambos s�o friendly, seria isso um PVP entre jogadores da mesma fac��o? end end --start/end time (duration) - esta_tabela.data_fim = 0 - esta_tabela.data_inicio = 0 - esta_tabela.tempo_start = _tempo + combatObject.data_fim = 0 + combatObject.data_inicio = 0 + combatObject.tempo_start = _tempo + + ---store trinket procs + combatObject.trinketProcs = {} + + ---store the amount of casts of each player + ---@type table> + combatObject.amountCasts = {} --record deaths - esta_tabela.last_events_tables = {} + combatObject.last_events_tables = {} --last events from players - esta_tabela.player_last_events = {} + combatObject.player_last_events = {} --players in the raid - esta_tabela.raid_roster = {} - esta_tabela.raid_roster_indexed = {} + combatObject.raid_roster = {} + combatObject.raid_roster_indexed = {} --frags - esta_tabela.frags = {} - esta_tabela.frags_need_refresh = false + combatObject.frags = {} + combatObject.frags_need_refresh = false --alternate power - esta_tabela.alternate_power = {} + combatObject.alternate_power = {} --time data container - esta_tabela.TimeData = _detalhes:TimeDataCreateCombatTables() - esta_tabela.PhaseData = {{1, 1}, damage = {}, heal = {}, damage_section = {}, heal_section = {}} --[1] phase number [2] phase started + combatObject.TimeData = Details:TimeDataCreateCombatTables() + combatObject.PhaseData = {{1, 1}, damage = {}, heal = {}, damage_section = {}, heal_section = {}} --[1] phase number [2] phase started --for external plugin usage, these tables are guaranteed to be saved with the combat - esta_tabela.spells_cast_timeline = {} - esta_tabela.aura_timeline = {} - esta_tabela.cleu_timeline = {} + combatObject.spells_cast_timeline = {} + combatObject.aura_timeline = {} + combatObject.cleu_timeline = {} --cleu events - esta_tabela.cleu_events = { + combatObject.cleu_events = { n = 1 --event counter } - --Skill cache (not used) - esta_tabela.CombatSkillCache = {} - - -- a tabela sem o tempo de inicio � a tabela descartavel do inicio do addon - if (iniciada) then + --a tabela sem o tempo de inicio � a tabela descartavel do inicio do addon + if (bTimeStarted) then --esta_tabela.start_time = _tempo - esta_tabela.start_time = GetTime() - esta_tabela.end_time = nil + combatObject.start_time = GetTime() + combatObject.end_time = nil else - esta_tabela.start_time = 0 - esta_tabela.end_time = nil + combatObject.start_time = 0 + combatObject.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 + combatObject[1].need_refresh = true + combatObject[2].need_refresh = true + combatObject[3].need_refresh = true + combatObject[4].need_refresh = true + combatObject[5].need_refresh = true - if (_tabela_overall) then --link � a tabela de combate do overall - esta_tabela[1].shadow = _tabela_overall[1] - esta_tabela[2].shadow = _tabela_overall[2] - esta_tabela[3].shadow = _tabela_overall[3] - esta_tabela[4].shadow = _tabela_overall[4] + if (overallCombatObject) then --link � a tabela de combate do overall + combatObject[1].shadow = overallCombatObject[1] + combatObject[2].shadow = overallCombatObject[2] + combatObject[3].shadow = overallCombatObject[3] + combatObject[4].shadow = overallCombatObject[4] end - esta_tabela.totals = { + combatObject.totals = { 0, --dano 0, --cura {--e_energy @@ -669,7 +681,7 @@ --end } - esta_tabela.totals_grupo = { + combatObject.totals_grupo = { 0, --dano 0, --cura {--e_energy @@ -691,15 +703,15 @@ } } - return esta_tabela + return combatObject end ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --core - function combate:CreateLastEventsTable (player_name) + function classCombat:CreateLastEventsTable (player_name) local t = {} - for i = 1, _detalhes.deadlog_events do + for i = 1, Details.deadlog_events do t [i] = {} end t.n = 1 @@ -708,7 +720,7 @@ end --trava o tempo dos jogadores ap�s o t�rmino do combate. - function combate:TravarTempos() + function classCombat: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 @@ -741,26 +753,26 @@ end end - function combate:seta_data (tipo) - if (tipo == _detalhes._detalhes_props.DATA_TYPE_START) then + function classCombat:seta_data (tipo) + if (tipo == Details._detalhes_props.DATA_TYPE_START) then self.data_inicio = _date ("%H:%M:%S") - elseif (tipo == _detalhes._detalhes_props.DATA_TYPE_END) then + elseif (tipo == Details._detalhes_props.DATA_TYPE_END) then self.data_fim = _date ("%H:%M:%S") end end - function combate:seta_tempo_decorrido() + function classCombat:seta_tempo_decorrido() --self.end_time = _tempo self.end_time = GetTime() end - function _detalhes.refresh:r_combate (tabela_combate, shadow) - setmetatable(tabela_combate, _detalhes.combate) - tabela_combate.__index = _detalhes.combate + function Details.refresh:r_combate (tabela_combate, shadow) + setmetatable(tabela_combate, Details.combate) + tabela_combate.__index = Details.combate tabela_combate.shadow = shadow end - function _detalhes.clear:c_combate (tabela_combate) + function Details.clear:c_combate (tabela_combate) --tabela_combate.__index = {} tabela_combate.__index = nil tabela_combate.__call = {} @@ -768,9 +780,9 @@ tabela_combate.shadow = nil end - combate.__sub = function(combate1, combate2) + classCombat.__sub = function(combate1, combate2) - if (combate1 ~= _detalhes.tabela_overall) then + if (combate1 ~= Details.tabela_overall) then return end @@ -843,11 +855,11 @@ end - combate.__add = function(combate1, combate2) + classCombat.__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} local custom_combat - if (combate1 ~= _detalhes.tabela_overall) then + if (combate1 ~= Details.tabela_overall) then custom_combat = combate1 end @@ -856,13 +868,13 @@ local shadow if (class_type == class_type_dano) then - shadow = _detalhes.atributo_damage:r_connect_shadow (actor, true, custom_combat) + shadow = Details.atributo_damage:r_connect_shadow (actor, true, custom_combat) elseif (class_type == class_type_cura) then - shadow = _detalhes.atributo_heal:r_connect_shadow (actor, true, custom_combat) + shadow = Details.atributo_heal:r_connect_shadow (actor, true, custom_combat) elseif (class_type == class_type_e_energy) then - shadow = _detalhes.atributo_energy:r_connect_shadow (actor, true, custom_combat) + shadow = Details.atributo_energy:r_connect_shadow (actor, true, custom_combat) elseif (class_type == class_type_misc) then - shadow = _detalhes.atributo_misc:r_connect_shadow (actor, true, custom_combat) + shadow = Details.atributo_misc:r_connect_shadow (actor, true, custom_combat) end shadow.boss_fight_component = actor.boss_fight_component or shadow.boss_fight_component @@ -885,6 +897,6 @@ return combate1 end - function _detalhes:UpdateCombat() - _tempo = _detalhes._tempo + function Details:UpdateCombat() + _tempo = Details._tempo end diff --git a/classes/class_damage.lua b/classes/class_damage.lua index 54d3cf95..9de38b11 100644 --- a/classes/class_damage.lua +++ b/classes/class_damage.lua @@ -4613,7 +4613,7 @@ function atributo_damage:MontaInfoDamageDone() --I guess this fills the list of local bkSpellData = { id = spellId, spellschool = spellTable.spellschool, - expanded = Details222.BreakdownWindow.IsSpellExpanded(spellId), + bIsExpanded = Details222.BreakdownWindow.IsSpellExpanded(spellId), bCanExpand = false, spellIds = {spellId}, diff --git a/classes/container_actors.lua b/classes/container_actors.lua index 1cb232cd..62a5d4c9 100644 --- a/classes/container_actors.lua +++ b/classes/container_actors.lua @@ -465,6 +465,7 @@ end return newContainer end + --try to get the actor class from name local getActorClass = function(actorObject, actorName, actorFlags, actorSerial) --get spec diff --git a/core/parser.lua b/core/parser.lua index 7d78f6de..7d2cecd0 100755 --- a/core/parser.lua +++ b/core/parser.lua @@ -1241,6 +1241,7 @@ end if (_trinket_data_cache[spellId] and _in_combat) then + ---@type trinketdata local thisData = _trinket_data_cache[spellId] if (thisData.lastCombatId == _global_combat_counter) then if (thisData.lastPlayerName == sourceName) then @@ -1265,6 +1266,18 @@ thisData.lastActivation = time thisData.lastPlayerName = sourceName end + + if (_current_combat.trinketProcs) then + local playerTrinketData = _current_combat.trinketProcs[sourceName] or {} + _current_combat.trinketProcs[sourceName] = playerTrinketData + local trinketData = playerTrinketData[spellId] or {cooldown = 0, total = 0} + playerTrinketData[spellId] = trinketData + + if (trinketData.cooldown < time) then + trinketData.cooldown = time + 20 + trinketData.total = trinketData.total + 1 + end + end end return _spell_damage_func(spellTable, targetSerial, targetName, targetFlags, amount, sourceName, resisted, blocked, absorbed, critical, glacing, token, isoffhand, isreflected) diff --git a/frames/window_playerbreakdown_spells.lua b/frames/window_playerbreakdown_spells.lua index ac7915c6..95a95c43 100644 --- a/frames/window_playerbreakdown_spells.lua +++ b/frames/window_playerbreakdown_spells.lua @@ -423,7 +423,7 @@ function spellsTab.OnCreateTabCallback(tabButton, tabFrame) --~init spellsTab.TabFrame = tabFrame --create a button in the breakdown window to open the options for this tab - local optionsButton = DF:CreateButton(Details.playerDetailWindow, Details.OpenSpellBreakdownOptions, 130, 20, "Open Options", 10, nil, nil, nil, nil, nil, DF:GetTemplate("button", "OPTIONS_BUTTON_TEMPLATE")) + local optionsButton = DF:CreateButton(Details.playerDetailWindow, Details.OpenSpellBreakdownOptions, 130, 20, "Options", 10, nil, nil, nil, nil, nil, DF:GetTemplate("button", "OPTIONS_BUTTON_TEMPLATE")) optionsButton:SetPoint("topleft", Details.playerDetailWindow, "topleft", 210, -45) optionsButton.textsize = 15 optionsButton.textcolor = "white" @@ -479,6 +479,9 @@ local onEnterSpellBar = function(spellBar, motion) --parei aqui: precisa por nom ---@type instance local instance = spellsTab.GetInstance() + ---@type combat + local combatObject = spellsTab.GetCombat() + ---@type number, number local mainAttribute, subAttribute = instance:GetDisplay() @@ -492,6 +495,9 @@ local onEnterSpellBar = function(spellBar, motion) --parei aqui: precisa por nom ---@type number local elapsedTime = spellBar.combatTime --this should be actorObject:Tempo() + ---@type string + local actorName = spellsTab.GetActor():Name() + ---@type spelltable local spellTable = spellBar.spellTable @@ -510,6 +516,9 @@ local onEnterSpellBar = function(spellBar, motion) --parei aqui: precisa por nom GameTooltip:Show() end + ---@type trinketdata + local trinketData = Details:GetTrinketData() + ---@type number local blockIndex = 1 @@ -533,8 +542,18 @@ local onEnterSpellBar = function(spellBar, motion) --parei aqui: precisa por nom local blockLine1, blockLine2, blockLine3 = summaryBlock:GetLines() local totalCasts = spellBar.amountCasts > 0 and spellBar.amountCasts or "(?)" - blockLine1.leftText:SetText(Loc ["STRING_CAST"] .. ": " .. totalCasts) --total amount of casts + + if (trinketData[spellId] and combatObject.trinketProcs) then + local trinketProcData = combatObject.trinketProcs[actorName] + if (trinketProcData) then + local trinketProc = trinketProcData[spellId] + if (trinketProc) then + blockLine1.leftText:SetText("Procs: " .. trinketProc.total) + end + end + end + blockLine1.rightText:SetText(Loc ["STRING_HITS"]..": " .. totalHits) --hits and uptime blockLine2.leftText:SetText(Loc ["STRING_DAMAGE"]..": " .. Details:Format(spellTable.total)) --total damage @@ -602,6 +621,28 @@ local onEnterSpellBar = function(spellBar, motion) --parei aqui: precisa por nom blockLine3.rightText:SetText(Loc ["STRING_DPS"] .. ": " .. Details:CommaValue(spellTable.c_total / critTempoPercent)) end + if (trinketData[spellId]) then + ---@type trinketdata + local trinketInfo = trinketData[spellId] + + local minTime = trinketInfo.minTime + local maxTime = trinketInfo.maxTime + local average = trinketInfo.averageTime + + ---@type breakdownspellblock + local trinketBlock = spellBlockContainer:GetBlock(blockIndex) + trinketBlock:Show() + trinketBlock:SetValue(100) + blockIndex = blockIndex + 1 + + local blockLine1, blockLine2, blockLine3 = trinketBlock:GetLines() + blockLine1.leftText:SetText("Trinket Info") + + blockLine1.rightText:SetText("PPM: " .. string.format("%.2f", average / 60)) + blockLine2.leftText:SetText("Min Time: " .. math.floor(minTime)) + blockLine2.rightText:SetText("Max Time: " .. math.floor(maxTime)) + end + elseif (mainAttribute == DETAILS_ATTRIBUTE_HEAL) then --this should run within the heal class ~healing ---@type number local totalHits = spellTable.counter @@ -1419,6 +1460,11 @@ local formatPetName = function(petName, spellName, ownerName) local bUseAlphaIcons = true local specIcon = false local iconSize = 14 + + if (petName:len() == 0) then + return Details:AddClassOrSpecIcon(spellName, "PET", specIcon, iconSize, bUseAlphaIcons) + end + petNameWithoutOwner = Details:AddClassOrSpecIcon(petNameWithoutOwner, "PET", specIcon, iconSize, bUseAlphaIcons) return spellName .. " |cFFCCBBBB" .. petNameWithoutOwner .. "|r" @@ -1437,7 +1483,8 @@ end ---@param topValue number ---@param bIsMainLine boolean if true this is the line which has all the values of the spell merged ---@param sortKey string -local updateSpellBar = function(spellBar, index, actorName, combatObject, scrollFrame, headerTable, bkSpellData, spellTableIndex, totalValue, topValue, bIsMainLine, sortKey) +---@param spellTablesAmount number +local updateSpellBar = function(spellBar, index, actorName, combatObject, scrollFrame, headerTable, bkSpellData, spellTableIndex, totalValue, topValue, bIsMainLine, sortKey, spellTablesAmount) --scrollFrame is defined as a table which is false, scrollFrame is a frame local textIndex = 1 @@ -1493,7 +1540,14 @@ local updateSpellBar = function(spellBar, index, actorName, combatObject, scroll end if (petName ~= "") then - spellName = formatPetName(petName, spellName, actorName) + --if is a pet spell and has more pets nested + if (spellTablesAmount > 1 and bIsMainLine) then + spellName = formatPetName("", spellName, "") + elseif (bIsMainLine) then + spellName = formatPetName(petName, spellName, actorName) + else + spellName = formatPetName(petName, "", "") + end end spellBar.spellId = spellId @@ -1674,7 +1728,7 @@ local refreshFunc = function(scrollFrame, scrollData, offset, totalLines) --~ref local sortKey = scrollFrame.SortKey local headerTable = spellsTab.spellsHeaderData - --todo: when swapping sort orders, close allexpanded spells + --todo: when swapping sort orders, close already expanded spells local lineIndex = 1 for i = 1, totalLines do @@ -1707,13 +1761,14 @@ local refreshFunc = function(scrollFrame, scrollData, offset, totalLines) --~ref if (mainSpellBar) then lineIndex = lineIndex + 1 local bIsMainLine = true - updateSpellBar(mainSpellBar, index, actorName, combatObject, scrollFrame, headerTable, bkSpellData, 1, totalValue, topValue, bIsMainLine, sortKey) + updateSpellBar(mainSpellBar, index, actorName, combatObject, scrollFrame, headerTable, bkSpellData, 1, totalValue, topValue, bIsMainLine, sortKey, spellTablesAmount) end end --then it adds the lines for each spell merged, but it cannot use the bkSpellData, it needs the spellTable, it's kinda using bkSpellData, need to debug if (bkSpellData.bIsExpanded and spellTablesAmount > 1) then ---@type number spellTableIndex is the same counter as bkSpellStableIndex + --as the nested actors or spells never get sorted, it might be required to sort the data here for spellTableIndex = 1, spellTablesAmount do ---@type breakdownspellbar local spellBar = getSpellBar(scrollFrame, lineIndex) @@ -1725,9 +1780,7 @@ local refreshFunc = function(scrollFrame, scrollData, offset, totalLines) --~ref local nameToUse = petName ~= "" and petName or actorName local bIsMainLine = false - - - updateSpellBar(spellBar, index, nameToUse, combatObject, scrollFrame, headerTable, bkSpellData, spellTableIndex, totalValue, topValue, bIsMainLine, sortKey) + updateSpellBar(spellBar, index, nameToUse, combatObject, scrollFrame, headerTable, bkSpellData, spellTableIndex, totalValue, topValue, bIsMainLine, sortKey, spellTablesAmount) mainSpellBar.ExpandedChildren[#mainSpellBar.ExpandedChildren + 1] = spellBar end end diff --git a/functions/slash.lua b/functions/slash.lua index fb7cad34..11742e5b 100644 --- a/functions/slash.lua +++ b/functions/slash.lua @@ -607,6 +607,31 @@ function SlashCmdList.DETAILS (msg, editbox) --Details.VarDump (_detalhes.ResetButton) + elseif (command == "trinket") then + local tooltipData = GameTooltip:GetTooltipData() + if (tooltipData) then + local spellId = tooltipData.id + local spellName = GetSpellInfo(spellId) + + if (spellName) then + + local itemLink = GetInventoryItemLink("player", 13) + if (itemLink) then + local itemName = GetItemInfo(itemLink) + if (itemName) then + local itemID, enchantID, gemID1, gemID2, gemID3, gemID4, suffixID, uniqueID, linkLevel, specializationID, modifiersMask, itemContext = select(2, strsplit(":", itemLink)) + + itemID = tonumber(itemID) + + if (itemID) then + local s = "["..spellId.."] = {name = formatTextForItem("..itemID..")}, --trinket: ".. itemName + dumpt({s}) + end + end + end + end + end + elseif (command == "mini") then local instance = _detalhes.tabela_instancias [1] --Details.VarDump () diff --git a/functions/spellcache.lua b/functions/spellcache.lua index da5f8f38..3d7e3646 100644 --- a/functions/spellcache.lua +++ b/functions/spellcache.lua @@ -244,16 +244,26 @@ do [214200] = {name = formatTextForItem(133646)}, --trinket: Mote of Sanctification [387036] = {name = formatTextForItem(193748)}, --trinket: Kyrakka's Searing Embers (heal) [397376] = {name = formatTextForItem(193748), isPassive = true, itemId = 193748}, --trinket: Kyrakka's Searing Embers (damage) - --[] = {name = GetSpellInfo() .. formatTextForItem(193757), isPassive = true}, --trinket: Ruby Whelp Shell - [214985] = {name = formatTextForItem(137486)}, --trinket: Windscar Whetstone [384004] = {name = formatTextForItem(193815)}, --trinket: Homeland Raid Horn - --[] = {name = GetSpellInfo() .. formatTextForItem()}, --trinket: Mutated Magmammoth Scale - did no proc - - --/dump C_Item.GetItemNameByID(137486) --to check an item - --default tooltip script gets the item id - [377459] = {name = formatTextForItem(194306)}, --trinket: All-Totem of the Master + + --[] = {name = GetSpellInfo() .. formatTextForItem(193757), isPassive = true}, --trinket: Ruby Whelp Shell + --to check an item : /dump C_Item.GetItemNameByID(137486) + --get the itemId from default tooltip using /code > script name > "SpellID on Tooltip" + --spellId is from details breakdown + --/de trinket on the spell icon on the breakdown, trinket equipped + + [408815] = {name = formatTextForItem(202569)}, --weapon: Djaruun, Pillar of the Elder Flame + [407961] = {name = formatTextForItem(203996), isPassive = true, itemId = 203996}, --trinket: Igneous Flowstone + [408682] = {name = formatTextForItem(202610)}, --trinket: Dragonfire Bomb Dispenser + [401324] = {name = formatTextForItem(202617), isPassive = true, itemId = 202617}, --trinket: Elementium Pocket Anvil + [401306] = {name = formatTextForItem(202617)}, --trinket: Elementium Pocket Anvil (use) + [402583] = {name = formatTextForItem(203963)}, --trinket: Beacon to the Beyond + [384325] = {name = formatTextForItem(193672), isPassive = true, itemId = 193672}, --trinket: Frenzying Signoll Flare + [384290] = {name = formatTextForItem(193672), isPassive = true, itemId = 193672}, --trinket: Frenzying Signoll Flare (dot) + [388948] = {name = formatTextForItem(193732)}, --trinket: Globe of Jagged Ice + [381760] = {name = formatTextForItem(193786), isPassive = true, itemId = 193786}, --trinket: Mutated Magmammoth Scale (melee) } for spellId, spellCustomization in pairs(dragonflightTrinkets) do diff --git a/startup.lua b/startup.lua index 1d40a2b0..47b84d4a 100644 --- a/startup.lua +++ b/startup.lua @@ -446,7 +446,8 @@ function Details:StartMeUp() Details:LoadFramesForBroadcastTools() Details:BrokerTick() - --build trinket data + ---return the table where the trinket data is stored + ---@return table function Details:GetTrinketData() return Details.trinket_data end @@ -456,6 +457,7 @@ function Details:StartMeUp() for spellId, trinketTable in pairs(customSpellList) do if (trinketTable.isPassive) then if (not trinketData[spellId]) then + ---@type trinketdata local thisTrinketData = { itemName = C_Item.GetItemNameByID(trinketTable.itemId), spellName = GetSpellInfo(spellId) or "spell not found",