General Changes ad Improvements

- Added: Details:IsInMythicPlus() return true if the player is on a mythic dungeon run.
- CombatObjects now have the key 'is_challenge' if the combat is a part of a challenge mode or mythic+ run.
- Evoker extra bar tooltip's, now also show the uptime of Black Attunement and Prescience applications.
- Breakdown Window now show Plater Npc Colors in the target box.
- Added event: "COMBAT_MYTHICPLUS_OVERALL_READY", trigger when the overall segment for the mythic+ is ready.
- Added event: "COMBAT_PLAYER_LEAVING", trigger at the beginning of the leave combat process.
- Library updates: Details! Framework and Lib Open Raid.
This commit is contained in:
Tercio Jose
2024-01-08 14:18:08 -03:00
parent 99aff93ba8
commit 9eb4d344e6
25 changed files with 1215 additions and 213 deletions
+2
View File
@@ -686,6 +686,8 @@ function classCombat:NovaTabela(bTimeStarted, overallCombatObject, combatId, ...
combatObject.end_time = nil
end
combatObject.is_challenge = Details:IsInMythicPlus()
-- o container ir armazenar as classes de dano -- cria um novo container de indexes de seriais de jogadores --parmetro 1 classe armazenada no container, parmetro 2 = flag da classe
combatObject[1].need_refresh = true
combatObject[2].need_refresh = true
+124 -11
View File
@@ -3463,13 +3463,26 @@ function damageClass.PredictedAugSpellsOnEnter(self)
---@type actorcontainer
local utilityContainer = combatObject:GetContainer(DETAILS_ATTRIBUTE_MISC)
---@type table<spellid, table<spellid, number, actorname, actorname, class, boolean>>
local buffUptimeTable = {}
--for each actor in the container
local CONST_SPELLID_EBONMIGHT = 395152
local CONST_SPELLID_PRESCIENCE = 410089
local CONST_SPELLID_BLACKATTUNEMENT = 403264
---@type actor[]
local augmentationEvokers = {}
--prescience and ebon might updatime on each actor
for _, actorObject in utilityContainer:ListActors() do
---@type spellcontainer
local receivedBuffs = actorObject.received_buffs_spells
--check if the actor is an augmentation evoker
if (actorObject.spec == 1473) then
augmentationEvokers[#augmentationEvokers+1] = actorObject
end
if (receivedBuffs and actorObject:IsPlayer() and actorObject:IsGroupPlayer()) then
for sourceNameSpellId, spellTable in receivedBuffs:ListSpells() do
local sourceName, spellId = strsplit("@", sourceNameSpellId)
@@ -3477,20 +3490,28 @@ function damageClass.PredictedAugSpellsOnEnter(self)
spellId = tonumber(spellId)
local spellName, _, spellIcon = Details.GetSpellInfo(spellId)
if (spellName) then
if (spellName and spellId) then
sourceName = detailsFramework:RemoveRealmName(sourceName)
local targetName = actorObject:Name()
targetName = detailsFramework:RemoveRealmName(targetName)
local uptime = spellTable.uptime or 0
buffUptimeTable[#buffUptimeTable+1] = {spellId, uptime, sourceName, targetName, actorObject:Class()}
local bCanShowOnTooltip = true
buffUptimeTable[spellId] = buffUptimeTable[spellId] or {}
table.insert(buffUptimeTable[spellId], {spellId, uptime, sourceName, targetName, actorObject:Class(), bCanShowOnTooltip})
end
end
end
end
end
table.sort(buffUptimeTable, Details.Sort2)
for spellId, buffTable in pairs(buffUptimeTable) do
local totalUptime = 0
for i = 1, #buffTable do
totalUptime = totalUptime + buffTable[i][2]
end
table.sort(buffTable, Details.Sort2)
end
Details:FormatCooltipForSpells()
Details:AddTooltipSpellHeaderText(Loc ["STRING_SPELLS"], headerColor, #buffUptimeTable, Details.tooltip_spell_icon.file, unpack(Details.tooltip_spell_icon.coords))
@@ -3499,24 +3520,86 @@ function damageClass.PredictedAugSpellsOnEnter(self)
local iconSize = 22
local iconBorderInfo = Details.tooltip.icon_border_texcoord
--add the total combat time into the tooltip
local combatTimeMinutes, combatTimeSeconds = math.floor(combatTime / 60), math.floor(combatTime % 60)
GameCooltip:AddLine("Combat Time", combatTimeMinutes .. "m " .. combatTimeSeconds .. "s" .. " (" .. format("%.1f", 100) .. "%)")
GameCooltip:AddIcon([[Interface\TARGETINGFRAME\UnitFrameIcons]], nil, nil, iconSize, iconSize, iconBorderInfo.L, iconBorderInfo.R, iconBorderInfo.T, iconBorderInfo.B)
Details:AddTooltipBackgroundStatusbar(false, 100, true, "green")
Details:AddTooltipBackgroundStatusbar(false, 100, true, "limegreen")
if (#buffUptimeTable > 0) then
for i = 1, min(30, #buffUptimeTable) do
local uptimeTable = buffUptimeTable[i]
GameCooltip:AddLine("", "")
GameCooltip:AddIcon("", nil, nil, 1, 1)
local ebonMightTable = buffUptimeTable[CONST_SPELLID_EBONMIGHT][1]
if (ebonMightTable) then
local uptime = ebonMightTable[2]
local spellName, _, spellIcon = _GetSpellInfo(CONST_SPELLID_EBONMIGHT)
local uptimePercent = uptime / combatTime * 100
local sourceName = ebonMightTable[3]
if (uptime <= combatTime) then
local minutes, seconds = math.floor(uptime / 60), math.floor(uptime % 60)
if (minutes > 0) then
GameCooltip:AddLine(spellName, minutes .. "m " .. seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, sourceName and "limegreen")
else
GameCooltip:AddLine(spellName, seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, sourceName and "limegreen")
end
GameCooltip:AddIcon(spellIcon, nil, nil, iconSize, iconSize, iconBorderInfo.L, iconBorderInfo.R, iconBorderInfo.T, iconBorderInfo.B)
end
end
GameCooltip:AddLine("", "")
GameCooltip:AddIcon("", nil, nil, 1, 1)
for i = 1, #augmentationEvokers do
local actorObject = augmentationEvokers[i]
if (actorObject:Name() == actorName) then
local buffUptimeSpellContainer = actorObject:GetSpellContainer("buff")
if (buffUptimeSpellContainer) then
local spellTable = buffUptimeSpellContainer:GetSpell(403264)
if (spellTable) then
local uptime = spellTable.uptime
local spellName, _, spellIcon = _GetSpellInfo(CONST_SPELLID_BLACKATTUNEMENT)
local uptimePercent = uptime / combatTime * 100
if (uptime <= combatTime) then
local minutes, seconds = math.floor(uptime / 60), math.floor(uptime % 60)
if (minutes > 0) then
GameCooltip:AddLine(spellName, minutes .. "m " .. seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, "limegreen")
else
GameCooltip:AddLine(spellName, seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, "limegreen")
end
GameCooltip:AddIcon(spellIcon, nil, nil, iconSize, iconSize, iconBorderInfo.L, iconBorderInfo.R, iconBorderInfo.T, iconBorderInfo.B)
end
end
end
end
end
GameCooltip:AddLine("", "")
GameCooltip:AddIcon("", nil, nil, 1, 1)
--add the buff uptime into the tooltip
local allPrescienceTargets = buffUptimeTable[CONST_SPELLID_PRESCIENCE]
if (#allPrescienceTargets > 0) then
for i = 1, math.min(30, #allPrescienceTargets) do
local uptimeTable = allPrescienceTargets[i]
local spellId = uptimeTable[1]
local uptime = uptimeTable[2]
local sourceName = uptimeTable[3]
local targetName = uptimeTable[4]
local targetClass = uptimeTable[5]
local bCanShow = uptimeTable[6]
local uptimePercent = uptime / combatTime * 100
if (uptime > 0 and uptimePercent < 99.5) then
if (uptime > 0 and uptimePercent < 99.5 and bCanShow) then
local spellName, _, spellIcon = _GetSpellInfo(spellId)
if (sourceName) then
@@ -3529,10 +3612,10 @@ function damageClass.PredictedAugSpellsOnEnter(self)
local minutes, seconds = math.floor(uptime / 60), math.floor(uptime % 60)
if (minutes > 0) then
GameCooltip:AddLine(spellName, minutes .. "m " .. seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, sourceName and "green")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, sourceName and "limegreen")
else
GameCooltip:AddLine(spellName, seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, sourceName and "green")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, sourceName and "limegreen")
end
GameCooltip:AddIcon(spellIcon, nil, nil, iconSize, iconSize, iconBorderInfo.L, iconBorderInfo.R, iconBorderInfo.T, iconBorderInfo.B)
@@ -3542,6 +3625,36 @@ function damageClass.PredictedAugSpellsOnEnter(self)
else
GameCooltip:AddLine(Loc ["STRING_NO_SPELL"])
end
local evokerObject = combatObject:GetActor(DETAILS_ATTRIBUTE_MISC, actorName)
GameCooltip:AddLine(" ")
GameCooltip:AddIcon(" ", 1, 1, 10, 10)
if (evokerObject) then
GameCooltip:AddLine("Prescience Uptime by Amount of Applications")
local prescienceData = evokerObject.cleu_prescience_time --real time
if (prescienceData) then
prescienceData = prescienceData.stackTime
local totalTimeWithPrescienceUp = 0
for amountOfPrescienceApplied, time in ipairs(prescienceData) do
totalTimeWithPrescienceUp = totalTimeWithPrescienceUp + time
end
for amountOfPrescienceApplied, time in ipairs(prescienceData) do
if (time > 0) then
local uptimePercent = time / combatTime * 100
local timeString = detailsFramework:IntegerToTimer(time)
GameCooltip:AddLine("Presciece Applied: " .. amountOfPrescienceApplied, timeString .. " (" .. format("%.1f", uptimePercent) .. "%)")
--5199639 prescience icon
GameCooltip:AddIcon([[Interface\AddOns\Details\images\spells\prescience_time]], nil, nil, iconSize, iconSize)
Details:AddTooltipBackgroundStatusbar(false, time/totalTimeWithPrescienceUp*100, true, "green")
end
end
end
end
end
GameCooltip:AddLine("feature under test, can't disable atm")
+115 -81
View File
@@ -1335,115 +1335,93 @@ function _detalhes:CloseEnemyDebuffsUptime()
return
end
function _detalhes:CatchRaidDebuffUptime (in_or_out) -- "DEBUFF_UPTIME_IN"
function _detalhes:CatchRaidDebuffUptime(sOperationType) -- "DEBUFF_UPTIME_IN"
if (sOperationType == "DEBUFF_UPTIME_OUT") then
local combatObject = Details:GetCurrentCombat()
local utilityContainer = combatObject:GetContainer(DETAILS_ATTRIBUTE_MISC)
if (in_or_out == "DEBUFF_UPTIME_OUT") then
local combat = _detalhes.tabela_vigente
local misc_container = combat [4]._ActorTable --error attempt to index a new value
for _, actor in ipairs(misc_container) do
if (actor.debuff_uptime) then
for spellid, spell in pairs(actor.debuff_uptime_spells._ActorTable) do
if (spell.actived and spell.actived_at) then
spell.uptime = spell.uptime + _detalhes._tempo - spell.actived_at
actor.debuff_uptime = actor.debuff_uptime + _detalhes._tempo - spell.actived_at
spell.actived = false
spell.actived_at = nil
for _, actorObject in utilityContainer:ListActors() do
if (actorObject.debuff_uptime) then
for spellId, spellTable in pairs(actorObject.debuff_uptime_spells._ActorTable) do
if (spellTable.actived and spellTable.actived_at) then
spellTable.uptime = spellTable.uptime + _detalhes._tempo - spellTable.actived_at
actorObject.debuff_uptime = actorObject.debuff_uptime + _detalhes._tempo - spellTable.actived_at
spellTable.actived = false
spellTable.actived_at = nil
end
end
end
end
return
end
local cacheGetTime = GetTime()
elseif (sOperationType == "DEBUFF_UPTIME_IN") then
local cacheGetTime = GetTime()
if (IsInRaid()) then
if (IsInRaid()) then
local checked = {}
local checked = {}
for raidIndex = 1, GetNumGroupMembers() do
for raidIndex = 1, GetNumGroupMembers() do
local target = "raid"..raidIndex.."target"
local his_target = UnitGUID(target)
local target = "raid"..raidIndex.."target"
local his_target = UnitGUID(target)
if (his_target and not checked [his_target]) then
local rect = UnitReaction (target, "player")
if (rect and rect <= 4) then
if (his_target and not checked [his_target]) then
local rect = UnitReaction (target, "player")
if (rect and rect <= 4) then
checked [his_target] = true
for debuffIndex = 1, 41 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff (target, debuffIndex)
if (name and unitCaster) then
local playerGUID = UnitGUID(unitCaster)
if (playerGUID) then
local playerName, realmName = _UnitName (unitCaster)
if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName
end
_detalhes.parser:add_debuff_uptime (nil, cacheGetTime, playerGUID, playerName, 0x00000417, his_target, _UnitName (target), 0x842, nil, spellid, name, sOperationType)
end
end
end
end
end
end
elseif (IsInGroup()) then
local checked = {}
for raidIndex = 1, GetNumGroupMembers()-1 do
local his_target = UnitGUID("party"..raidIndex.."target")
local rect = UnitReaction ("party"..raidIndex.."target", "player")
if (his_target and not checked [his_target] and rect and rect <= 4) then
checked [his_target] = true
for debuffIndex = 1, 41 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff (target, debuffIndex)
for debuffIndex = 1, 40 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("party"..raidIndex.."target", debuffIndex)
if (name and unitCaster) then
local playerName, realmName = _UnitName (unitCaster)
local playerGUID = UnitGUID(unitCaster)
if (playerGUID) then
local playerName, realmName = _UnitName (unitCaster)
if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName
end
_detalhes.parser:add_debuff_uptime (nil, cacheGetTime, playerGUID, playerName, 0x00000417, his_target, _UnitName (target), 0x842, nil, spellid, name, in_or_out)
_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("party"..raidIndex.."target"), 0x842, nil, spellid, name, sOperationType)
end
end
end
end
end
end
elseif (IsInGroup()) then
local checked = {}
for raidIndex = 1, GetNumGroupMembers()-1 do
local his_target = UnitGUID("party"..raidIndex.."target")
local rect = UnitReaction ("party"..raidIndex.."target", "player")
local his_target = UnitGUID("playertarget")
local rect = UnitReaction ("playertarget", "player")
if (his_target and not checked [his_target] and rect and rect <= 4) then
checked [his_target] = true
for debuffIndex = 1, 40 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("party"..raidIndex.."target", debuffIndex)
if (name and unitCaster) then
local playerName, realmName = _UnitName (unitCaster)
local playerGUID = UnitGUID(unitCaster)
if (playerGUID) then
if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName
end
_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("party"..raidIndex.."target"), 0x842, nil, spellid, name, in_or_out)
end
end
end
end
end
local his_target = UnitGUID("playertarget")
local rect = UnitReaction ("playertarget", "player")
if (his_target and not checked [his_target] and rect and rect <= 4) then
for debuffIndex = 1, 40 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("playertarget", debuffIndex)
if (name and unitCaster) then
local playerName, realmName = _UnitName (unitCaster)
local playerGUID = UnitGUID(unitCaster)
if (playerGUID) then
if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName
end
_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("playertarget"), 0x842, nil, spellid, name, in_or_out)
end
end
end
end
else
local his_target = UnitGUID("playertarget")
if (his_target) then
local reaction = UnitReaction ("playertarget", "player")
if (reaction and reaction <= 4) then
for debuffIndex = 1, 40 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("playertarget", debuffIndex)
if (name and unitCaster) then
@@ -1453,7 +1431,28 @@ function _detalhes:CatchRaidDebuffUptime (in_or_out) -- "DEBUFF_UPTIME_IN"
if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName
end
_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("playertarget"), 0x842, nil, spellid, name, in_or_out)
_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("playertarget"), 0x842, nil, spellid, name, sOperationType)
end
end
end
end
else
local his_target = UnitGUID("playertarget")
if (his_target) then
local reaction = UnitReaction ("playertarget", "player")
if (reaction and reaction <= 4) then
for debuffIndex = 1, 40 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("playertarget", debuffIndex)
if (name and unitCaster) then
local playerName, realmName = _UnitName (unitCaster)
local playerGUID = UnitGUID(unitCaster)
if (playerGUID) then
if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName
end
_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("playertarget"), 0x842, nil, spellid, name, sOperationType)
end
end
end
end
@@ -1672,6 +1671,10 @@ function _detalhes:CatchRaidBuffUptime(sOperationType)
-- _detalhes:Msg(string_output)
end
if (sOperationType == "BUFF_UPTIME_OUT") then
end
end
local Sort2Reverse = function(a, b)
@@ -2595,6 +2598,17 @@ function atributo_misc:r_connect_shadow(actor, no_refresh, combat_object)
DetailsFramework.table.addunique(shadow.pets, petName)
end
if (actor.cleu_prescience_time) then
local shadowPrescienceStackData = shadow.cleu_prescience_time
if (not shadowPrescienceStackData) then
shadow.cleu_prescience_time = detailsFramework.table.copy({}, actor.cleu_prescience_time)
else
for amountOfPrescienceApplied, time in pairs(actor.cleu_prescience_time.stackTime) do
shadow.cleu_prescience_time.stackTime[amountOfPrescienceApplied] = shadow.cleu_prescience_time.stackTime[amountOfPrescienceApplied] + time
end
end
end
if (actor.cc_done) then
if (not shadow.cc_done_targets) then
shadow.cc_done = _detalhes:GetOrderNumber()
@@ -2948,6 +2962,17 @@ function _detalhes.clear:c_atributo_misc (este_jogador)
end
atributo_misc.__add = function(tabela1, tabela2)
if (tabela2.cleu_prescience_time) then --timeline
local shadowPrescienceStackData = tabela1.cleu_prescience_time
if (not shadowPrescienceStackData) then
tabela1.cleu_prescience_time = detailsFramework.table.copy({}, tabela2.cleu_prescience_time)
else
for amountOfPrescienceApplied, time in pairs(tabela2.cleu_prescience_time.stackTime) do
tabela1.cleu_prescience_time.stackTime[amountOfPrescienceApplied] = tabela1.cleu_prescience_time.stackTime[amountOfPrescienceApplied] + time
end
end
end
if (tabela2.cc_done) then
tabela1.cc_done = tabela1.cc_done + tabela2.cc_done
@@ -3223,6 +3248,15 @@ local subtractKeyValues = function(habilidade, habilidade_tabela1)
end
atributo_misc.__sub = function(tabela1, tabela2)
if (tabela2.cleu_prescience_time) then --timeline
local shadowPrescienceStackData = tabela1.cleu_prescience_time
if (shadowPrescienceStackData) then
for amountOfPrescienceApplied, time in pairs(tabela2.cleu_prescience_time.stackTime) do
tabela1.cleu_prescience_time.stackTime[amountOfPrescienceApplied] = tabela1.cleu_prescience_time.stackTime[amountOfPrescienceApplied] - time
end
end
end
if (tabela2.cc_done) then
tabela1.cc_done = tabela1.cc_done - tabela2.cc_done
+4 -4
View File
@@ -153,7 +153,7 @@ function segmentClass:AddToOverallData(combatObject)
if (combatObject.instance_type == "raid" and combatObject.is_boss) then
if (Details.last_encounter ~= Details.last_encounter2) then
if (Details.debug) then
Details:Msg("(debug) new boss detected 'overall_clear_newboss' is true, cleaning overall data.")
--Details:Msg("(debug) new boss detected 'overall_clear_newboss' is true, cleaning overall data.")
end
for index, combat in ipairs(Details:GetCombatSegments()) do
@@ -198,7 +198,7 @@ function segmentClass:AddToOverallData(combatObject)
end
if (Details.debug) then
Details:Msg("(debug) adding the segment to overall data: " .. (combatObject:GetCombatName(true) or "no name") .. " with time of: " .. (combatObject:GetCombatTime() or "no time"))
--Details:Msg("(debug) adding the segment to overall data: " .. (combatObject:GetCombatName(true) or "no name") .. " with time of: " .. (combatObject:GetCombatTime() or "no time"))
end
Details.tabela_overall = Details.tabela_overall + combatObject
@@ -487,7 +487,7 @@ function Details222.Combat.AddCombat(combatToBeAdded)
if (bCanAddToOverall) then
if (Details.debug) then
Details:Msg("(debug) overall data flag match addind the combat to overall data.")
--Details:Msg("(debug) overall data flag match addind the combat to overall data.")
end
--add to overall data
segmentClass:AddToOverallData(combatToBeAdded)
@@ -566,7 +566,7 @@ function segmentClass:AddCombat(combatObject)
local canAddToOverall = Details:CanAddCombatToOverall(combatObject)
if (canAddToOverall) then
if (Details.debug) then
Details:Msg("(debug) overall data flag match addind the combat to overall data.")
--Details:Msg("(debug) overall data flag match addind the combat to overall data.")
end
segmentClass:AddToOverallData(combatObject)
end