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 -1
View File
@@ -1,7 +1,7 @@
## Interface: 100200 ## Interface: 100200
## Title: Details! Damage Meter ## Title: Details! Damage Meter
## Notes: Essential tool to impress that chick in your raid. ## Notes: Essential tool to impress that chick in your raid.
## SavedVariables: _detalhes_global, __details_backup ## SavedVariables: _detalhes_global, __details_backup, __details_debug
## SavedVariablesPerCharacter: _detalhes_database ## SavedVariablesPerCharacter: _detalhes_database
## OptionalDeps: Ace3, LibSharedMedia-3.0, LibWindow-1.1, LibDBIcon-1.0, NickTag-1.0, LibDataBroker-1.1, LibGraph-2.0 ## OptionalDeps: Ace3, LibSharedMedia-3.0, LibWindow-1.1, LibDBIcon-1.0, NickTag-1.0, LibDataBroker-1.1, LibGraph-2.0
## Version: #@project-version@ ## Version: #@project-version@
@@ -72,6 +72,7 @@ functions\warcraftlogs.lua
functions\textures.lua functions\textures.lua
functions\journal.lua functions\journal.lua
core\aura_scan.lua
core\timemachine.lua core\timemachine.lua
frames\anime.lua frames\anime.lua
+1
View File
@@ -67,6 +67,7 @@ functions\testbars.lua
functions\warcraftlogs.lua functions\warcraftlogs.lua
functions\textures.lua functions\textures.lua
core\aura_scan.lua
core\timemachine.lua core\timemachine.lua
frames\anime.lua frames\anime.lua
+1
View File
@@ -67,6 +67,7 @@ functions\testbars.lua
functions\warcraftlogs.lua functions\warcraftlogs.lua
functions\textures.lua functions\textures.lua
core\aura_scan.lua
core\timemachine.lua core\timemachine.lua
frames\anime.lua frames\anime.lua
+2 -1
View File
@@ -1861,14 +1861,15 @@ function DF:CreateCoolTip()
if (type(spellId) == "number") then if (type(spellId) == "number") then
spellId = C_SpellBook.GetOverrideSpell(spellId) spellId = C_SpellBook.GetOverrideSpell(spellId)
local spellName, spellRank, spellIcon, castTime, minRange, maxRange = GetSpellInfo(spellId) local spellName, spellRank, spellIcon, castTime, minRange, maxRange = GetSpellInfo(spellId)
--castTime zero represents an instant cast or a channeled cast
if (spellName) then if (spellName) then
local spellDescription = GetSpellDescription(spellId) local spellDescription = GetSpellDescription(spellId)
local cooldownTime, globalCooldown = GetSpellBaseCooldown(spellId) local cooldownTime, globalCooldown = GetSpellBaseCooldown(spellId)
--local cooldown = cooldownTime / 1000 --local cooldown = cooldownTime / 1000
local bIsPassive = IsPassiveSpell(spellId, "player") local bIsPassive = IsPassiveSpell(spellId, "player")
local chargesAvailable, maxCharges, chargeCooldownStart, rechargeTime, chargeModRate = GetSpellCharges(spellId) local chargesAvailable, maxCharges, chargeCooldownStart, rechargeTime, chargeModRate = GetSpellCharges(spellId)
local tResourceCost = GetSpellPowerCost(spellId)
local tResourceCost = GetSpellPowerCost(spellId)
--[=[ --[=[
hasRequiredAura=false, hasRequiredAura=false,
type=0, type=0,
+1 -1
View File
@@ -1,6 +1,6 @@
local dversion = 497 local dversion = 498
local major, minor = "DetailsFramework-1.0", dversion local major, minor = "DetailsFramework-1.0", dversion
local DF, oldminor = LibStub:NewLibrary(major, minor) local DF, oldminor = LibStub:NewLibrary(major, minor)
+32 -5
View File
@@ -1457,8 +1457,22 @@ detailsFramework.CastFrameFunctions = {
end end
end, end,
UpdateCastingInfo = function(self, unit) UpdateCastingInfo = function(self, unit, ...)
local name, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible, spellID = CastInfo.UnitCastingInfo(unit) local unitID, castID, spellID = ...
local name, text, texture, startTime, endTime, isTradeSkill, uciCastID, notInterruptible, uciSpellID = CastInfo.UnitCastingInfo(unit)
spellID = uciSpellID or spellID
castID = uciCastID or castID
if spellID and (not name or not texture or not text) then
local siName, _, siIcon, siCastTime = GetSpellInfo(spellID)
texture = texture or siIcon
name = name or siName
text = text or siName
if not startTime then
startTime = GetTime()
endTime = startTime + siCastTime
end
end
--is valid? --is valid?
if (not self:IsValid(unit, name, isTradeSkill, true)) then if (not self:IsValid(unit, name, isTradeSkill, true)) then
@@ -1519,8 +1533,8 @@ detailsFramework.CastFrameFunctions = {
self:UpdateInterruptState() self:UpdateInterruptState()
end, end,
UNIT_SPELLCAST_START = function(self, unit) UNIT_SPELLCAST_START = function(self, unit, ...)
self:UpdateCastingInfo(unit) self:UpdateCastingInfo(unit, ...)
self:RunHooksForWidget("OnCastStart", self, self.unit, "UNIT_SPELLCAST_START") self:RunHooksForWidget("OnCastStart", self, self.unit, "UNIT_SPELLCAST_START")
end, end,
@@ -1570,7 +1584,20 @@ detailsFramework.CastFrameFunctions = {
UpdateChannelInfo = function(self, unit, ...) UpdateChannelInfo = function(self, unit, ...)
local unitID, castID, spellID = ... local unitID, castID, spellID = ...
local name, text, texture, startTime, endTime, isTradeSkill, notInterruptible, spellID, _, numStages = CastInfo.UnitChannelInfo (unit) local name, text, texture, startTime, endTime, isTradeSkill, notInterruptible, uciSpellID, _, numStages = CastInfo.UnitChannelInfo (unit)
spellID = uciSpellID or spellID
castID = uciCastID or castID
if spellID and (not name or not texture or not text) then
local siName, _, siIcon, siCastTime = GetSpellInfo(spellID)
texture = texture or siIcon
name = name or siName
text = text or siName
if not startTime then
startTime = GetTime()
endTime = startTime + siCastTime
end
end
--is valid? --is valid?
if (not self:IsValid (unit, name, isTradeSkill, true)) then if (not self:IsValid (unit, name, isTradeSkill, true)) then
+12 -6
View File
@@ -43,7 +43,7 @@ if (WOW_PROJECT_ID ~= WOW_PROJECT_MAINLINE and not isExpansion_Dragonflight()) t
end end
local major = "LibOpenRaid-1.0" local major = "LibOpenRaid-1.0"
local CONST_LIB_VERSION = 119 local CONST_LIB_VERSION = 120
if (LIB_OPEN_RAID_MAX_VERSION) then if (LIB_OPEN_RAID_MAX_VERSION) then
if (CONST_LIB_VERSION <= LIB_OPEN_RAID_MAX_VERSION) then if (CONST_LIB_VERSION <= LIB_OPEN_RAID_MAX_VERSION) then
@@ -563,8 +563,8 @@ end
["sendPvPTalent_Schedule"] = 14, ["sendPvPTalent_Schedule"] = 14,
["leaveCombat_Schedule"] = 18, ["leaveCombat_Schedule"] = 18,
["encounterEndCooldownsCheck_Schedule"] = 24, ["encounterEndCooldownsCheck_Schedule"] = 24,
["sendKeystoneInfoToParty_Schedule"] = 2, --["sendKeystoneInfoToParty_Schedule"] = 2,
["sendKeystoneInfoToGuild_Schedule"] = 2, --["sendKeystoneInfoToGuild_Schedule"] = 2,
} }
openRaidLib.Schedules = { openRaidLib.Schedules = {
@@ -613,7 +613,7 @@ end
if (openRaidLib.Schedules.IsUniqueTimerOnCooldown(namespace, scheduleName)) then if (openRaidLib.Schedules.IsUniqueTimerOnCooldown(namespace, scheduleName)) then
return return
end end
time = defaultScheduleCooldownTimeByScheduleName[scheduleName] time = defaultScheduleCooldownTimeByScheduleName[scheduleName] or time
else else
openRaidLib.Schedules.CancelUniqueTimer(namespace, scheduleName) openRaidLib.Schedules.CancelUniqueTimer(namespace, scheduleName)
end end
@@ -2689,11 +2689,17 @@ openRaidLib.commHandler.RegisterComm(CONST_COMM_COOLDOWNREQUEST_PREFIX, openRaid
local _, instanceType = GetInstanceInfo() local _, instanceType = GetInstanceInfo()
if (instanceType == "party") then if (instanceType == "party") then
openRaidLib.Schedules.NewUniqueTimer(0.01, openRaidLib.KeystoneInfoManager.SendPlayerKeystoneInfoToParty, "KeystoneInfoManager", "sendKeystoneInfoToParty_Schedule") openRaidLib.Schedules.NewUniqueTimer(math.random(1), openRaidLib.KeystoneInfoManager.SendPlayerKeystoneInfoToParty, "KeystoneInfoManager", "sendKeystoneInfoToParty_Schedule")
elseif (instanceType == "raid" or instanceType == "pvp") then
openRaidLib.Schedules.NewUniqueTimer(math.random(0, 30) + math.random(1), openRaidLib.KeystoneInfoManager.SendPlayerKeystoneInfoToParty, "KeystoneInfoManager", "sendKeystoneInfoToParty_Schedule")
else
openRaidLib.Schedules.NewUniqueTimer(math.random(4), openRaidLib.KeystoneInfoManager.SendPlayerKeystoneInfoToParty, "KeystoneInfoManager", "sendKeystoneInfoToParty_Schedule")
end end
if (IsInGuild()) then if (IsInGuild()) then
openRaidLib.Schedules.NewUniqueTimer(math.random(0, 3) + math.random(), openRaidLib.KeystoneInfoManager.SendPlayerKeystoneInfoToGuild, "KeystoneInfoManager", "sendKeystoneInfoToGuild_Schedule") openRaidLib.Schedules.NewUniqueTimer(math.random(0, 10) + math.random(), openRaidLib.KeystoneInfoManager.SendPlayerKeystoneInfoToGuild, "KeystoneInfoManager", "sendKeystoneInfoToGuild_Schedule")
end end
end end
openRaidLib.commHandler.RegisterComm(CONST_COMM_KEYSTONE_DATAREQUEST_PREFIX, openRaidLib.KeystoneInfoManager.OnReceiveRequestData) openRaidLib.commHandler.RegisterComm(CONST_COMM_KEYSTONE_DATAREQUEST_PREFIX, openRaidLib.KeystoneInfoManager.OnReceiveRequestData)
+15
View File
@@ -10,6 +10,11 @@
--add the original name to the global namespace --add the original name to the global namespace
_detalhes = _G.Details --[[GLOBAL]] _detalhes = _G.Details --[[GLOBAL]]
__details_debug = __details_debug or {}
if (__details_debug.prescience_timeline) then
wipe(__details_debug.prescience_timeline)
end
local addonName, Details222 = ... local addonName, Details222 = ...
local version, build, date, tocversion = GetBuildInfo() local version, build, date, tocversion = GetBuildInfo()
@@ -74,6 +79,12 @@
return Details222.ColorScheme[colorScheme] return Details222.ColorScheme[colorScheme]
end end
function Details222.DebugMsg(...)
if (Details.debug) then
print("|cFFCCAAAADetails! Debug:|r", ...)
end
end
--namespace for damage spells (spellTable) --namespace for damage spells (spellTable)
Details222.DamageSpells = {} Details222.DamageSpells = {}
--namespace for texture --namespace for texture
@@ -127,6 +138,8 @@
} }
--store all data from the encounter journal --store all data from the encounter journal
Details222.EncounterJournalDump = {} Details222.EncounterJournalDump = {}
--aura scanner
Details222.AuraScan = {}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--initialization stuff --initialization stuff
@@ -1490,6 +1503,8 @@ Details222.UnitIdCache.Party = {
[4] = "party4", [4] = "party4",
} }
Details222.UnitIdCache.PartyIds = {"player", "party1", "party2", "party3", "party4"}
Details222.UnitIdCache.Boss = { Details222.UnitIdCache.Boss = {
[1] = "boss1", [1] = "boss1",
[2] = "boss2", [2] = "boss2",
+2
View File
@@ -686,6 +686,8 @@ function classCombat:NovaTabela(bTimeStarted, overallCombatObject, combatId, ...
combatObject.end_time = nil combatObject.end_time = nil
end 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 -- 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[1].need_refresh = true
combatObject[2].need_refresh = true combatObject[2].need_refresh = true
+124 -11
View File
@@ -3463,13 +3463,26 @@ function damageClass.PredictedAugSpellsOnEnter(self)
---@type actorcontainer ---@type actorcontainer
local utilityContainer = combatObject:GetContainer(DETAILS_ATTRIBUTE_MISC) local utilityContainer = combatObject:GetContainer(DETAILS_ATTRIBUTE_MISC)
---@type table<spellid, table<spellid, number, actorname, actorname, class, boolean>>
local buffUptimeTable = {} 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 for _, actorObject in utilityContainer:ListActors() do
---@type spellcontainer ---@type spellcontainer
local receivedBuffs = actorObject.received_buffs_spells 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 if (receivedBuffs and actorObject:IsPlayer() and actorObject:IsGroupPlayer()) then
for sourceNameSpellId, spellTable in receivedBuffs:ListSpells() do for sourceNameSpellId, spellTable in receivedBuffs:ListSpells() do
local sourceName, spellId = strsplit("@", sourceNameSpellId) local sourceName, spellId = strsplit("@", sourceNameSpellId)
@@ -3477,20 +3490,28 @@ function damageClass.PredictedAugSpellsOnEnter(self)
spellId = tonumber(spellId) spellId = tonumber(spellId)
local spellName, _, spellIcon = Details.GetSpellInfo(spellId) local spellName, _, spellIcon = Details.GetSpellInfo(spellId)
if (spellName) then if (spellName and spellId) then
sourceName = detailsFramework:RemoveRealmName(sourceName) sourceName = detailsFramework:RemoveRealmName(sourceName)
local targetName = actorObject:Name() local targetName = actorObject:Name()
targetName = detailsFramework:RemoveRealmName(targetName) targetName = detailsFramework:RemoveRealmName(targetName)
local uptime = spellTable.uptime or 0 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 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:FormatCooltipForSpells()
Details:AddTooltipSpellHeaderText(Loc ["STRING_SPELLS"], headerColor, #buffUptimeTable, Details.tooltip_spell_icon.file, unpack(Details.tooltip_spell_icon.coords)) 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 iconSize = 22
local iconBorderInfo = Details.tooltip.icon_border_texcoord 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) local combatTimeMinutes, combatTimeSeconds = math.floor(combatTime / 60), math.floor(combatTime % 60)
GameCooltip:AddLine("Combat Time", combatTimeMinutes .. "m " .. combatTimeSeconds .. "s" .. " (" .. format("%.1f", 100) .. "%)") 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) 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 GameCooltip:AddLine("", "")
for i = 1, min(30, #buffUptimeTable) do GameCooltip:AddIcon("", nil, nil, 1, 1)
local uptimeTable = buffUptimeTable[i]
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 spellId = uptimeTable[1]
local uptime = uptimeTable[2] local uptime = uptimeTable[2]
local sourceName = uptimeTable[3] local sourceName = uptimeTable[3]
local targetName = uptimeTable[4] local targetName = uptimeTable[4]
local targetClass = uptimeTable[5] local targetClass = uptimeTable[5]
local bCanShow = uptimeTable[6]
local uptimePercent = uptime / combatTime * 100 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) local spellName, _, spellIcon = _GetSpellInfo(spellId)
if (sourceName) then if (sourceName) then
@@ -3529,10 +3612,10 @@ function damageClass.PredictedAugSpellsOnEnter(self)
local minutes, seconds = math.floor(uptime / 60), math.floor(uptime % 60) local minutes, seconds = math.floor(uptime / 60), math.floor(uptime % 60)
if (minutes > 0) then if (minutes > 0) then
GameCooltip:AddLine(spellName, minutes .. "m " .. seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)") 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 else
GameCooltip:AddLine(spellName, seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)") 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 end
GameCooltip:AddIcon(spellIcon, nil, nil, iconSize, iconSize, iconBorderInfo.L, iconBorderInfo.R, iconBorderInfo.T, iconBorderInfo.B) GameCooltip:AddIcon(spellIcon, nil, nil, iconSize, iconSize, iconBorderInfo.L, iconBorderInfo.R, iconBorderInfo.T, iconBorderInfo.B)
@@ -3542,6 +3625,36 @@ function damageClass.PredictedAugSpellsOnEnter(self)
else else
GameCooltip:AddLine(Loc ["STRING_NO_SPELL"]) GameCooltip:AddLine(Loc ["STRING_NO_SPELL"])
end 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 end
GameCooltip:AddLine("feature under test, can't disable atm") GameCooltip:AddLine("feature under test, can't disable atm")
+115 -81
View File
@@ -1335,115 +1335,93 @@ function _detalhes:CloseEnemyDebuffsUptime()
return return
end 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 for _, actorObject in utilityContainer:ListActors() do
local combat = _detalhes.tabela_vigente if (actorObject.debuff_uptime) then
local misc_container = combat [4]._ActorTable --error attempt to index a new value for spellId, spellTable in pairs(actorObject.debuff_uptime_spells._ActorTable) do
if (spellTable.actived and spellTable.actived_at) then
for _, actor in ipairs(misc_container) do spellTable.uptime = spellTable.uptime + _detalhes._tempo - spellTable.actived_at
if (actor.debuff_uptime) then actorObject.debuff_uptime = actorObject.debuff_uptime + _detalhes._tempo - spellTable.actived_at
for spellid, spell in pairs(actor.debuff_uptime_spells._ActorTable) do spellTable.actived = false
if (spell.actived and spell.actived_at) then spellTable.actived_at = nil
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
end end
end end
end end
end end
return 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 target = "raid"..raidIndex.."target"
local his_target = UnitGUID(target) local his_target = UnitGUID(target)
if (his_target and not checked [his_target]) then if (his_target and not checked [his_target]) then
local rect = UnitReaction (target, "player") local rect = UnitReaction (target, "player")
if (rect and rect <= 4) then 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 checked [his_target] = true
for debuffIndex = 1, 41 do for debuffIndex = 1, 40 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff (target, debuffIndex) local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("party"..raidIndex.."target", debuffIndex)
if (name and unitCaster) then if (name and unitCaster) then
local playerName, realmName = _UnitName (unitCaster)
local playerGUID = UnitGUID(unitCaster) local playerGUID = UnitGUID(unitCaster)
if (playerGUID) then if (playerGUID) then
local playerName, realmName = _UnitName (unitCaster)
if (realmName and realmName ~= "") then if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName playerName = playerName .. "-" .. realmName
end 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
end end
end end
end
elseif (IsInGroup()) then local his_target = UnitGUID("playertarget")
local rect = UnitReaction ("playertarget", "player")
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 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 for debuffIndex = 1, 40 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("playertarget", debuffIndex) local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("playertarget", debuffIndex)
if (name and unitCaster) then if (name and unitCaster) then
@@ -1453,7 +1431,28 @@ function _detalhes:CatchRaidDebuffUptime (in_or_out) -- "DEBUFF_UPTIME_IN"
if (realmName and realmName ~= "") then if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName playerName = playerName .. "-" .. realmName
end 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 end
end end
@@ -1672,6 +1671,10 @@ function _detalhes:CatchRaidBuffUptime(sOperationType)
-- _detalhes:Msg(string_output) -- _detalhes:Msg(string_output)
end end
if (sOperationType == "BUFF_UPTIME_OUT") then
end
end end
local Sort2Reverse = function(a, b) 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) DetailsFramework.table.addunique(shadow.pets, petName)
end 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 (actor.cc_done) then
if (not shadow.cc_done_targets) then if (not shadow.cc_done_targets) then
shadow.cc_done = _detalhes:GetOrderNumber() shadow.cc_done = _detalhes:GetOrderNumber()
@@ -2948,6 +2962,17 @@ function _detalhes.clear:c_atributo_misc (este_jogador)
end end
atributo_misc.__add = function(tabela1, tabela2) 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 if (tabela2.cc_done) then
tabela1.cc_done = tabela1.cc_done + tabela2.cc_done tabela1.cc_done = tabela1.cc_done + tabela2.cc_done
@@ -3223,6 +3248,15 @@ local subtractKeyValues = function(habilidade, habilidade_tabela1)
end end
atributo_misc.__sub = function(tabela1, tabela2) 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 if (tabela2.cc_done) then
tabela1.cc_done = tabela1.cc_done - tabela2.cc_done 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 (combatObject.instance_type == "raid" and combatObject.is_boss) then
if (Details.last_encounter ~= Details.last_encounter2) then if (Details.last_encounter ~= Details.last_encounter2) then
if (Details.debug) 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 end
for index, combat in ipairs(Details:GetCombatSegments()) do for index, combat in ipairs(Details:GetCombatSegments()) do
@@ -198,7 +198,7 @@ function segmentClass:AddToOverallData(combatObject)
end end
if (Details.debug) then 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 end
Details.tabela_overall = Details.tabela_overall + combatObject Details.tabela_overall = Details.tabela_overall + combatObject
@@ -487,7 +487,7 @@ function Details222.Combat.AddCombat(combatToBeAdded)
if (bCanAddToOverall) then if (bCanAddToOverall) then
if (Details.debug) 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 end
--add to overall data --add to overall data
segmentClass:AddToOverallData(combatToBeAdded) segmentClass:AddToOverallData(combatToBeAdded)
@@ -566,7 +566,7 @@ function segmentClass:AddCombat(combatObject)
local canAddToOverall = Details:CanAddCombatToOverall(combatObject) local canAddToOverall = Details:CanAddCombatToOverall(combatObject)
if (canAddToOverall) then if (canAddToOverall) then
if (Details.debug) 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 end
segmentClass:AddToOverallData(combatObject) segmentClass:AddToOverallData(combatObject)
end end
+382
View File
@@ -0,0 +1,382 @@
local Details = _G.Details
local addonName, Details222 = ...
local detailsFramework = DetailsFramework
local _
local AuraUtil, wipe, C_UnitAuras, GetSpellInfo, GetTime, UnitGUID, UnitExists = AuraUtil, table.wipe, C_UnitAuras, GetSpellInfo, GetTime, UnitGUID, UnitExists
local AuraScan = Details222.AuraScan
AuraScan.Enabled = false
AuraScan.Callbacks = {}
AuraScan.AurasToScan = {}
---store the auras applied to the unit, format: [unitGUID] = {auraInstanceId = aurainfo}
---@type table<guid, table<number, aurainfo>>
AuraScan.UnitAurasStorage = {}
AuraScan.AurasToTimeline = {} --which spells should be added to the timeline
AuraScan.AuraTimelineStorage = {} --store the timeline here
function AuraScan.RegisterCallback(callback)
AuraScan.Callbacks[callback] = true
end
function AuraScan.UnregisterCallback(callback)
AuraScan.Callbacks[callback] = nil
end
---return a table with all auras applied to the unit, format: [unitGUID] = {auraInstanceId = aurainfo}
function AuraScan.GetOrCreateUnitAuraTable(unitGUID)
local auras = AuraScan.UnitAurasStorage[unitGUID]
if (not auras) then
auras = {}
AuraScan.UnitAurasStorage[unitGUID] = auras
end
return auras
end
function AuraScan.WipeAllUnitAuraTables()
wipe(AuraScan.UnitAurasStorage)
end
function AuraScan.WipeUnitAuraTable(unitGUID)
local auras = AuraScan.GetOrCreateUnitAuraTable(unitGUID)
wipe(auras)
end
function AuraScan.GetAura(unitGUID, spellId)
if (not unitGUID or not spellId) then
return false
end
local auraTbl = AuraScan.GetOrCreateUnitAuraTable(unitGUID)
if (not auraTbl) then
--happens if the guid is invalid
return false
end
return auraTbl[spellId]
end
function AuraScan.AddAura(spellId, bAddToTimeLine)
if (not spellId or type(spellId) ~= "number") then
Details:Msg("AuraScan.AddAura() called, but spellId is not a number.")
return
end
local spellName = GetSpellInfo(spellId)
if (spellName) then
AuraScan.AurasToScan[spellId] = true
if (bAddToTimeLine) then
AuraScan.AurasToTimeline[spellId] = true
end
else
Details:Msg("AuraScan.AddAura() called, but spellId is not a valid spell.")
end
end
--is the aura added?
function AuraScan.IsAuraAdded(spellId)
if (not spellId or type(spellId) ~= "number") then
Details:Msg("AuraScan.IsAuraAdded() called, but spellId is not a number.")
return
end
return AuraScan.AurasToScan[spellId]
end
function AuraScan.RemoveAura(spellId)
if (not spellId or type(spellId) ~= "number") then
Details:Msg("AuraScan.RemoveAura() called, but spellId is not a number.")
return
end
AuraScan.AurasToScan[spellId] = nil
AuraScan.AurasToTimeline[spellId] = nil
end
function AuraScan.RemoveAllAuras()
wipe(AuraScan.AurasToScan)
end
------------------------------------------------------------------------------------------------------------------------------
--aura parser
---@class details_auratimeline : table
---@field time number time when this aura had its status changed
---@field appliedTime number time when this aura was applied
---@field removedTime number time when this aura was removed
---@field expireTime number
---@field event string
---@field sourceName string
---@field targetName string
---@field targetGUID string
---@field spellId number
---@field closed boolean when true this received received aura In and Out
---@field duration number
---@field elapsedTime number
---@field auraInstanceID number
---@field addTimeLineTable details_auratimeline
---@type table<number, aurainfo>
local unitAuraTable
local targetUnitGUID
local targetName
local bIsInitialScan = false
local timeLastAuraRemovedFromTimeLine = 0
local sourceNameLastAuraRemovedFromTimeLine = 0
local auraInstanceIdLastAuraRemovedFromTimeLine = 0
local fAddAura = function(auraInfo)
---@cast auraInfo aurainfo
local spellId = auraInfo.spellId
if (auraInfo and auraInfo.auraInstanceID and spellId) then
if (AuraScan.IsAuraAdded(spellId)) then
unitAuraTable[auraInfo.auraInstanceID] = auraInfo
auraInfo.targetName = targetName
auraInfo.targetGUID = targetUnitGUID
if (bIsInitialScan) then
if (auraInfo.name == "Prescience") then
Details222.DebugMsg("|cFFFFFF00INIT! Prescience Added.")
end
end
--callback
for callback in pairs(AuraScan.Callbacks) do
callback("AURA_UPDATE", targetUnitGUID, auraInfo, "BUFF_UPTIME_IN")
end
if (AuraScan.AurasToTimeline[spellId]) then
local sourceName = Details:GetFullName(auraInfo.sourceUnit)
local lastestEventAdded = AuraScan.AuraTimelineStorage[#AuraScan.AuraTimelineStorage]
if (not lastestEventAdded or lastestEventAdded.time ~= GetTime() or lastestEventAdded.targetName ~= targetName) then
---@type details_auratimeline
---@diagnostic disable-next-line: missing-fields
local auraTimelineTable = {
appliedTime = GetTime(),
time = GetTime(),
removedTime = 0,
expireTime = auraInfo.expirationTime, --the format is GetTime()
event = "BUFF_UPTIME_IN",
sourceName = sourceName,
targetName = targetName,
targetGUID = targetUnitGUID,
spellId = spellId,
closed = false,
duration = auraInfo.duration,
elapsedTime = 0,
auraInstanceID = auraInfo.auraInstanceID,
name = auraInfo.name,
combatTime = Details:GetCurrentCombat():GetCombatTime(),
}
AuraScan.AuraTimelineStorage[#AuraScan.AuraTimelineStorage+1] = auraTimelineTable
end
end
end
end
end
local fUpdateAura = function(auraInfo)
if (AuraScan.AurasToTimeline[auraInfo.spellId]) then
--find the aura in the timeline and update the expiration time
for i = #AuraScan.AuraTimelineStorage, 1, -1 do
local auraTimelineTable = AuraScan.AuraTimelineStorage[i]
if (auraTimelineTable.auraInstanceID == auraInfo.auraInstanceID) then
local elapsedTime = GetTime() - auraTimelineTable.time
auraTimelineTable.elapsedTime = auraTimelineTable.elapsedTime + elapsedTime
auraTimelineTable.time = GetTime()
auraTimelineTable.expireTime = auraInfo.expirationTime
auraTimelineTable.duration = auraInfo.duration
auraTimelineTable.closed = false
Details222.DebugMsg("|cFFFFFF00REFRESH! Prescience Updated. Duration:", auraTimelineTable.duration)
break
end
end
end
end
local fRemoveAura = function(auraInstanceId)
local auraInfo = unitAuraTable[auraInstanceId]
if (auraInfo) then
unitAuraTable[auraInstanceId] = nil
--callback
for callback in pairs(AuraScan.Callbacks) do
callback("AURA_UPDATE", targetUnitGUID, auraInfo, "BUFF_UPTIME_OUT")
end
if (AuraScan.AurasToTimeline[auraInfo.spellId]) then
local sourceName = Details:GetFullName(auraInfo.sourceUnit)
if (timeLastAuraRemovedFromTimeLine ~= GetTime() or auraInstanceIdLastAuraRemovedFromTimeLine ~= auraInstanceId) then
--find the aura in the timeline and update the elapsedTime
local auraTimelineTableWhenAdded
for i = #AuraScan.AuraTimelineStorage, 1, -1 do
local auraTimelineTable = AuraScan.AuraTimelineStorage[i]
if (auraTimelineTable.auraInstanceID == auraInstanceId) then
local elapsedTime = GetTime() - auraTimelineTable.time
auraTimelineTable.elapsedTime = auraTimelineTable.elapsedTime + elapsedTime
auraTimelineTableWhenAdded = auraTimelineTable
break
end
end
if (not auraTimelineTableWhenAdded) then
Details:Msg("|cFFFF9900AuraScan: fRemoveAura() addedAura was not found in the timeline.")
return
end
--create a new table with the information when the aura was removed
---@type details_auratimeline
local auraClosure = {
time = GetTime(),
appliedTime = auraTimelineTableWhenAdded.appliedTime,
removedTime = GetTime(),
elapsedTime = auraTimelineTableWhenAdded.elapsedTime,
expireTime = 0,
event = "BUFF_UPTIME_OUT",
sourceName = sourceName,
targetName = targetName,
targetGUID = targetUnitGUID,
spellId = auraInfo.spellId,
closed = true,
duration = auraInfo.expirationTime,
auraInstanceID = auraInstanceId,
addTimeLineTable = auraTimelineTableWhenAdded,
name = auraInfo.name,
combatTime = Details:GetCurrentCombat():GetCombatTime(),
}
AuraScan.AuraTimelineStorage[#AuraScan.AuraTimelineStorage+1] = auraClosure
timeLastAuraRemovedFromTimeLine = GetTime()
sourceNameLastAuraRemovedFromTimeLine = sourceName
auraInstanceIdLastAuraRemovedFromTimeLine = auraInstanceId
end
end
end
end
local fFullAuraScan = function(unitId, unitGUID)
local maxCount = nil
local bUsePackedAura = true
unitAuraTable = AuraScan.GetOrCreateUnitAuraTable(unitGUID)
AuraUtil.ForEachAura(unitId, "HELPFUL", maxCount, fAddAura, bUsePackedAura)
end
function AuraScan.OnEvent(frame, eventName, unitId, updateInfo)
--get the unit guid
local unitGUID = UnitGUID(unitId)
if (not unitGUID) then
return
end
if (not updateInfo or updateInfo.isFullUpdate) then
AuraScan.WipeUnitAuraTable(unitGUID)
unitAuraTable = AuraScan.GetOrCreateUnitAuraTable(unitGUID)
fFullAuraScan(unitId, unitGUID)
return
end
targetUnitGUID = unitGUID
targetName = Details:GetFullName(unitId)
--auras added
if (updateInfo.addedAuras) then
unitAuraTable = AuraScan.GetOrCreateUnitAuraTable(unitGUID)
for auraIndex = 1, #updateInfo.addedAuras do
---@type aurainfo
local auraInfo = updateInfo.addedAuras[auraIndex]
print(unitId, targetName, auraInfo.name)
fAddAura(auraInfo)
end
end
--auras updated
if (updateInfo.updatedAuraInstanceIDs) then
unitAuraTable = AuraScan.GetOrCreateUnitAuraTable(unitGUID)
for auraIndex = 1, #updateInfo.updatedAuraInstanceIDs do
local auraInstanceId = updateInfo.updatedAuraInstanceIDs[auraIndex]
---@type aurainfo
local auraInfo = C_UnitAuras.GetAuraDataByAuraInstanceID(unitId, auraInstanceId)
if (auraInfo and auraInfo.auraInstanceID) then
if (auraInfo.name == "Prescience") then
local thisAuraInfo = unitAuraTable[auraInfo.auraInstanceID]
if (not thisAuraInfo) then
Details222.DebugMsg("|cFFFFAA00Prescience Updated, but not found in the table.")
end
end
fUpdateAura(auraInfo)
end
end
end
--auras removed
if (updateInfo.removedAuraInstanceIDs) then
unitAuraTable = AuraScan.GetOrCreateUnitAuraTable(unitGUID)
for auraIndex = 1, #updateInfo.removedAuraInstanceIDs do
local auraInstanceId = updateInfo.removedAuraInstanceIDs[auraIndex]
fRemoveAura(auraInstanceId)
end
end
end
------------------------------------------------------------------------------------------------------------------------------
local scanFrame = CreateFrame("frame", "DetailsAuraScanFrame", UIParent)
function AuraScan.Start()
AuraScan.Enabled = true
--clear the up table holding the current player being scanned
wipe(unitAuraTable or {})
--clear the cache of auras
AuraScan.WipeAllUnitAuraTables()
bIsInitialScan = true
--do the initial aura scan
for i = 1, 4 do --need to change this on raid groups, atm it's only for party
local unitId = "party" .. i
if (UnitExists(unitId)) then
local unitGUID = UnitGUID(unitId)
fFullAuraScan(unitId, unitGUID)
end
end
local unitId = "player"
local unitGUID = UnitGUID(unitId)
fFullAuraScan(unitId, unitGUID)
bIsInitialScan = false
DetailsAuraScanFrame:RegisterEvent("UNIT_AURA")
DetailsAuraScanFrame:SetScript("OnEvent", AuraScan.OnEvent)
end
function AuraScan.Stop()
if (AuraScan.Enabled) then
AuraScan.Enabled = false
DetailsAuraScanFrame:UnregisterEvent("UNIT_AURA")
DetailsAuraScanFrame:SetScript("OnEvent", nil)
--close all opened auras (by running the remove function)
for targetGUID, auras in pairs(AuraScan.UnitAurasStorage) do
unitAuraTable = AuraScan.GetOrCreateUnitAuraTable(targetGUID)
for auraInstanceID, auraInfo in pairs(auras) do
targetUnitGUID = targetGUID
targetName = auraInfo["targetName"]
fRemoveAura(auraInstanceID)
end
end
--callback
for callback in pairs(AuraScan.Callbacks) do
callback("TIMELINE_READY", AuraScan.AuraTimelineStorage)
end
else
Details:Msg("AuraScan.Stop() called, but AuraScan is not enabled.")
end
end
+30 -9
View File
@@ -295,8 +295,8 @@
function Details:EntrarEmCombate (...) function Details:EntrarEmCombate (...)
if (Details.debug) then if (Details.debug) then
Details:Msg("(debug) |cFFFFFF00started a new combat|r|cFFFF7700", Details.encounter_table and Details.encounter_table.name or "") Details:Msg("(debug) |cFFFFFF00started a new combat|r|cFFFF7700", Details.encounter_table and Details.encounter_table.name or "")
local from = debugstack(2, 1, 0) --local from = debugstack(2, 1, 0)
print("from:", from) --print("from:", from)
end end
local segmentsTable = Details:GetCombatSegments() local segmentsTable = Details:GetCombatSegments()
@@ -355,14 +355,29 @@
local bFromCombatStart = true local bFromCombatStart = true
Details:UpdateParserGears(bFromCombatStart) Details:UpdateParserGears(bFromCombatStart)
--get all buff already applied before the combat start --retrieve all buffs applied before the combat starts
C_Timer.After(0.05, function() C_Timer.After(0.05, function()
--wait the initial aura wipe done by the client on certain situations --wait for the initial aura wipe performed by the client in certain situations
Details:CatchRaidBuffUptime("BUFF_UPTIME_IN") Details:CatchRaidBuffUptime("BUFF_UPTIME_IN")
end) end)
Details:CatchRaidDebuffUptime("DEBUFF_UPTIME_IN") Details:CatchRaidDebuffUptime("DEBUFF_UPTIME_IN")
Details:UptadeRaidMembersCache() Details:UptadeRaidMembersCache()
--is inside a mythic dungeon and running a mythic+?
if (newCombatObject.is_challenge or Details.debug) then
--local bRegisterAuraScanTimeLine = true
--Details222.AuraScan.AddAura(395152) --ebon might
--Details222.AuraScan.AddAura(395296) --the evoker buff on it self
--Details222.AuraScan.AddAura(410089--[[, bRegisterAuraScanTimeLine--]]) --prescience
--Details222.AuraScan.AddAura(413984) --Shifting Sands
--Details222.AuraScan.AddAura(409560) --Temporal Wound
--Details222.AuraScan.AddAura(360827) --Blistering Scales
--Details222.AuraScan.AddAura(410263) --Inferno's Blessing
--Details222.AuraScan.RegisterCallback(Details222.SpecHelpers[1473].OnAugmentationBuffUpdate)
--Details222.AuraScan.Start() --combat started (m+ active)
end
--Details222.TimeCapture.StartCombatTimer(Details.tabela_vigente) --Details222.TimeCapture.StartCombatTimer(Details.tabela_vigente)
--we already have boss information? build .is_boss table --we already have boss information? build .is_boss table
@@ -464,6 +479,8 @@
---@type combat ---@type combat
local currentCombat = Details:GetCurrentCombat() local currentCombat = Details:GetCurrentCombat()
Details:SendEvent("COMBAT_PLAYER_LEAVING", nil, currentCombat)
if (currentCombat.bIsClosed) then if (currentCombat.bIsClosed) then
return return
end end
@@ -505,13 +522,17 @@
end end
end end
Details:OnCombatPhaseChanged() --.PhaseData is nil here on alpha-32 Details:OnCombatPhaseChanged()
if (currentCombat.bossFunction) then if (currentCombat.bossFunction) then
Details:CancelTimer(currentCombat.bossFunction) Details:CancelTimer(currentCombat.bossFunction)
currentCombat.bossFunction = nil currentCombat.bossFunction = nil
end end
if (currentCombat.is_challenge or Details.debug) then
--Details222.AuraScan.Stop() --combat ended (m+ active)
end
--stop combat ticker --stop combat ticker
Details:StopCombatTicker() Details:StopCombatTicker()
@@ -621,7 +642,7 @@
local enemy = Details:FindEnemy() local enemy = Details:FindEnemy()
if (enemy and Details.debug) then if (enemy and Details.debug) then
Details:Msg("(debug) enemy found", enemy) --Details:Msg("(debug) enemy found", enemy)
end end
currentCombat.enemy = enemy currentCombat.enemy = enemy
@@ -692,7 +713,7 @@
Details:CaptureSet(false, "spellcast", false, 15) Details:CaptureSet(false, "spellcast", false, 15)
if (Details.debug) then if (Details.debug) then
Details:Msg("(debug) freezing parser for 15 seconds.") --Details:Msg("(debug) freezing parser for 15 seconds.")
end end
end end
@@ -839,12 +860,12 @@
Details.pre_pot_used = nil Details.pre_pot_used = nil
--do not wipe the encounter table if is in the argus encounter ~REMOVE on 8.0 --do not wipe the encounter table if is in the argus encounter
if (Details.encounter_table and Details.encounter_table.id ~= 2092) then if (Details.encounter_table and Details.encounter_table.id ~= 2092) then
Details:Destroy(Details.encounter_table) Details:Destroy(Details.encounter_table)
else else
if (Details.debug) then if (Details.debug) then
Details:Msg("(debug) in argus encounter, cannot wipe the encounter table.") --Details:Msg("(debug) in argus encounter, cannot wipe the encounter table.")
end end
end end
+2 -2
View File
@@ -1869,7 +1869,7 @@ local MIN_ILEVEL_TO_STORE = 50
local LOOP_TIME = 7 local LOOP_TIME = 7
function _detalhes:IlvlFromNetwork (player, realm, core, serialNumber, itemLevel, talentsSelected, currentSpec) function _detalhes:IlvlFromNetwork (player, realm, core, serialNumber, itemLevel, talentsSelected, currentSpec)
if (_detalhes.debug) then if (_detalhes.debug and false) then
local talents = "Invalid Talents" local talents = "Invalid Talents"
if (type(talentsSelected) == "table") then if (type(talentsSelected) == "table") then
talents = "" talents = ""
@@ -1877,7 +1877,7 @@ function _detalhes:IlvlFromNetwork (player, realm, core, serialNumber, itemLevel
talents = talents .. talentsSelected [i] .. "," talents = talents .. talentsSelected [i] .. ","
end end
end end
_detalhes:Msg("(debug) Received PlayerInfo Data: " .. (player or "Invalid Player Name") .. " | " .. (itemLevel or "Invalid Item Level") .. " | " .. (currentSpec or "Invalid Spec") .. " | " .. talents .. " | " .. (serialNumber or "Invalid Serial")) Details222.DebugMsg("Received PlayerInfo Data: " .. (player or "Invalid Player Name") .. " | " .. (itemLevel or "Invalid Item Level") .. " | " .. (currentSpec or "Invalid Spec") .. " | " .. talents .. " | " .. (serialNumber or "Invalid Serial"))
end end
if (not player) then if (not player) then
+4 -4
View File
@@ -683,9 +683,9 @@ local classTypeUtility = Details.atributos.misc
if (Details.debug) then if (Details.debug) then
if (bShouldForceCollect) then if (bShouldForceCollect) then
Details:Msg("(debug) collecting garbage with forced state:", bShouldForceCollect) --Details:Msg("(debug) collecting garbage with forced state:", bShouldForceCollect)
else else
Details:Msg("(debug) collecting garbage.") --Details:Msg("(debug) collecting garbage.")
end end
end end
@@ -730,8 +730,8 @@ local classTypeUtility = Details.atributos.misc
Details222.GarbageCollector.lastCollectTime = Details._tempo Details222.GarbageCollector.lastCollectTime = Details._tempo
if (Details.debug) then if (Details.debug) then
Details:Msg("(debug) executing: collectgarbage().") --Details:Msg("(debug) executing: collectgarbage().")
collectgarbage() --collectgarbage()
end end
end end
+73 -51
View File
@@ -190,12 +190,12 @@
---@field key7 number ---@field key7 number
local augmentation_aura_list = { local augmentation_aura_list = {
[395152] = true,--ebon might (evoker 10.1.5) 395296 = the evoker buff on it self [395152] = true, --ebon might (evoker 10.1.5) 395296 = the evoker buff on it self
[413984] = true, [413984] = true, --Shifting Sands
[410089] = true,--prescience (evoker 10.1.5) [410089] = true, --prescience (evoker 10.1.5)
[409560] = true, [409560] = true, --Temporal Wound
[360827] = true, [360827] = true, --Blistering Scales
[410263] = true, [410263] = true, --Inferno's Blessing
} }
--list of buffs given by another player but should also be credited to the which received it --list of buffs given by another player but should also be credited to the which received it
@@ -213,6 +213,7 @@
local augmentation_cache = { local augmentation_cache = {
ebon_might = {}, ebon_might = {},
prescience = {}, prescience = {},
prescience_stacks = {},
---@type table<serial, evokereonsbreathinfo[]> ---@type table<serial, evokereonsbreathinfo[]>
breath_targets = {}, breath_targets = {},
flyaway = {}, flyaway = {},
@@ -778,7 +779,6 @@
sourceFlags = reflection.who_flags sourceFlags = reflection.who_flags
--data of the aura that caused the reflection --data of the aura that caused the reflection
--print("2", spellid, GetSpellInfo(spellid))
isreflected = spellId --which spell was reflected isreflected = spellId --which spell was reflected
spellId = reflection.spellid --which spell made the reflection spellId = reflection.spellid --which spell made the reflection
spellName = reflection.spellname spellName = reflection.spellname
@@ -908,7 +908,7 @@
Details.WhoAggroTimer = C_Timer.NewTimer(0.1, whoAggro) Details.WhoAggroTimer = C_Timer.NewTimer(0.1, whoAggro)
Details.WhoAggroTimer.HitBy = "|cFFFFFF00First Hit|r: " .. (link or "") .. " from " .. (sourceName or "Unknown") Details.WhoAggroTimer.HitBy = "|cFFFFFF00First Hit|r: " .. (link or "") .. " from " .. (sourceName or "Unknown")
print("debug:", Details.WhoAggroTimer.HitBy) Details:Msg("(debug):", Details.WhoAggroTimer.HitBy)
end end
Details:EntrarEmCombate(sourceSerial, sourceName, sourceFlags, targetSerial, targetName, targetFlags) Details:EntrarEmCombate(sourceSerial, sourceName, sourceFlags, targetSerial, targetName, targetFlags)
@@ -1714,7 +1714,7 @@
local this_event = t[i] local this_event = t[i]
if (not this_event) then if (not this_event) then
return print("Parser Event Error -> Set to 16 DeathLogs and /reload", i, _amount_of_last_events) return Details:Msg("Parser Event Error -> Set to 16 DeathLogs and /reload", i, _amount_of_last_events)
end end
this_event [1] = true --true if this is a damage || false for healing this_event [1] = true --true if this is a damage || false for healing
@@ -1809,7 +1809,7 @@
local this_event = t [i] local this_event = t [i]
if (not this_event) then if (not this_event) then
return print("Parser Event Error -> Set to 16 DeathLogs and /reload", i, _amount_of_last_events) return Details:Msg("Parser Event Error -> Set to 16 DeathLogs and /reload", i, _amount_of_last_events)
end end
this_event [1] = true --true if this is a damage || false for healing this_event [1] = true --true if this is a damage || false for healing
@@ -1929,7 +1929,7 @@
local this_event = t [i] local this_event = t [i]
if (not this_event) then if (not this_event) then
return print("Parser Event Error -> Set to 16 DeathLogs and /reload", i, _amount_of_last_events) return Details:Msg("Parser Event Error -> Set to 16 DeathLogs and /reload", i, _amount_of_last_events)
end end
this_event [1] = true --true if this is a damage || false for healing this_event [1] = true --true if this is a damage || false for healing
@@ -2827,7 +2827,7 @@
local thisEvent = deathLog[i] local thisEvent = deathLog[i]
if (not thisEvent) then if (not thisEvent) then
return print("Parser Event Error -> Set to 16 DeathLogs and /reload", i, _amount_of_last_events) return Details:Msg("Parser Event Error -> Set to 16 DeathLogs and /reload", i, _amount_of_last_events)
end end
thisEvent[1] = 5 --5 = buff aplication thisEvent[1] = 5 --5 = buff aplication
@@ -3328,7 +3328,7 @@
local this_event = t [i] local this_event = t [i]
if (not this_event) then if (not this_event) then
return print("Parser Event Error -> Set to 16 DeathLogs and /reload", i, _amount_of_last_events) return Details:Msg("Parser Event Error -> Set to 16 DeathLogs and /reload", i, _amount_of_last_events)
end end
this_event [1] = 4 --4 = debuff aplication this_event [1] = 4 --4 = debuff aplication
@@ -3375,7 +3375,7 @@
local this_event = t [i] local this_event = t [i]
if (not this_event) then if (not this_event) then
return print("Parser Event Error -> Set to 16 DeathLogs and /reload", i, _amount_of_last_events) return Details:Msg("Parser Event Error -> Set to 16 DeathLogs and /reload", i, _amount_of_last_events)
end end
this_event [1] = 4 --4 = debuff aplication this_event [1] = 4 --4 = debuff aplication
@@ -3931,7 +3931,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
petName, ownerName, ownerGUID, ownerFlags = Details.tabela_pets:GetPetOwner(sourceSerial, sourceName, sourceFlags) petName, ownerName, ownerGUID, ownerFlags = Details.tabela_pets:GetPetOwner(sourceSerial, sourceName, sourceFlags)
if (petName) then if (petName) then
ownerActor = _current_misc_container:GetOrCreateActor(ownerGUID, ownerName, ownerFlags, true) ownerActor = _current_misc_container:GetOrCreateActor(ownerGUID, ownerName, ownerFlags, true)
--print("pet found:", petName, ownerName, ownerGUID, ownerFlags)
end end
end end
@@ -4084,10 +4083,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
amountOfCasts = amountOfCasts + 1 amountOfCasts = amountOfCasts + 1
_current_combat.amountCasts[sourceName][spellName] = amountOfCasts _current_combat.amountCasts[sourceName][spellName] = amountOfCasts
--if (sourceSerial == UnitGUID("player")) then
-- print(sourceName, spellName, amountOfCasts)
--end
------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------
--record cooldowns cast which can't track with buff applyed --record cooldowns cast which can't track with buff applyed
--a player is the caster --a player is the caster
@@ -4609,7 +4604,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
newEventTable[4] = enemyCastTime --when the event happened using unix time newEventTable[4] = enemyCastTime --when the event happened using unix time
newEventTable[5] = 0 --player health when the event happened newEventTable[5] = 0 --player health when the event happened
newEventTable[6] = enemyName --source name newEventTable[6] = enemyName --source name
--print("addin enemy cast event", alvo_name, i, enemyCastTime+0.1, ">", eventTime)
tinsert(eventsBeforePlayerDeath, i, newEventTable) tinsert(eventsBeforePlayerDeath, i, newEventTable)
currentEnemyCastIndex = enemyCastEventIndex + 1 currentEnemyCastIndex = enemyCastEventIndex + 1
break break
@@ -5137,6 +5131,29 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
return Details.zone_type return Details.zone_type
end end
local gotAggro = false
function Details.parser_functions:UNIT_FLAGS(...)
if (gotAggro) then
return
end
if (Details:GetZoneType() ~= "raid" and Details:GetZoneType() ~= "party") then
return
end
local unitId = ...
if (UnitExists(unitId)) then
if (UnitAffectingCombat(unitId) and not UnitAffectingCombat("player")) then
Details.LastAggro = UnitName(unitId)
gotAggro = true
C_Timer.After(1, function()
gotAggro = false
end)
end
end
end
function Details.parser_functions:ZONE_CHANGED_NEW_AREA(...) function Details.parser_functions:ZONE_CHANGED_NEW_AREA(...)
return Details.Schedules.After(1, Details.Check_ZONE_CHANGED_NEW_AREA) return Details.Schedules.After(1, Details.Check_ZONE_CHANGED_NEW_AREA)
end end
@@ -5152,6 +5169,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
_in_resting_zone = IsResting() _in_resting_zone = IsResting()
parser:WipeSourceCache() parser:WipeSourceCache()
Details.listener:UnregisterEvent("UNIT_FLAGS")
_is_in_instance = false _is_in_instance = false
@@ -5174,10 +5192,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
Details.time_type = Details.time_type_original Details.time_type = Details.time_type_original
if (Details.debug) then
Details:Msg("(debug) zone change:", Details.zone_name, "is a", Details.zone_type, "zone.")
end
if (Details.is_in_arena and zoneType ~= "arena") then if (Details.is_in_arena and zoneType ~= "arena") then
Details:LeftArena() Details:LeftArena()
end end
@@ -5260,6 +5274,8 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
Details.ScheduleLoadStorage() Details.ScheduleLoadStorage()
end end
end end
Details.listener:RegisterEvent("UNIT_FLAGS")
end end
if (Details:IsInInstance()) then if (Details:IsInInstance()) then
@@ -5306,7 +5322,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
if (zoneType == "party") then if (zoneType == "party") then
local openRaidLib = LibStub:GetLibrary("LibOpenRaid-1.0", true) local openRaidLib = LibStub:GetLibrary("LibOpenRaid-1.0", true)
if (openRaidLib) then if (openRaidLib) then
print("sent my keystone to party")
openRaidLib.KeystoneInfoManager.SendPlayerKeystoneInfoToParty() openRaidLib.KeystoneInfoManager.SendPlayerKeystoneInfoToParty()
end end
end end
@@ -5315,6 +5330,8 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
Details.current_exp_raid_encounters[encounterID] = true Details.current_exp_raid_encounters[encounterID] = true
end end
Details222.DebugMsg("|cFFFFFF00Who Aggro by UNIT_FLAGS:", Details.LastAggro)
if (not Details.WhoAggroTimer and Details.announce_firsthit.enabled) then if (not Details.WhoAggroTimer and Details.announce_firsthit.enabled) then
Details.WhoAggroTimer = C_Timer.NewTimer(0.1, whoAggro) Details.WhoAggroTimer = C_Timer.NewTimer(0.1, whoAggro)
for i = 1, 5 do for i = 1, 5 do
@@ -5382,8 +5399,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
return return
end end
Details222.Cache.ClearAugmentationCache()
Details.latest_ENCOUNTER_END = Details.latest_ENCOUNTER_END or 0 Details.latest_ENCOUNTER_END = Details.latest_ENCOUNTER_END or 0
if (Details.latest_ENCOUNTER_END + 15 > GetTime()) then if (Details.latest_ENCOUNTER_END + 15 > GetTime()) then
return return
@@ -5432,6 +5447,8 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
Details:SendEvent("COMBAT_ENCOUNTER_END", nil, ...) Details:SendEvent("COMBAT_ENCOUNTER_END", nil, ...)
Details222.Cache.ClearAugmentationCache()
Details:Destroy(Details.encounter_table) Details:Destroy(Details.encounter_table)
Details:Destroy(dk_pets_cache.army) Details:Destroy(dk_pets_cache.army)
Details:Destroy(dk_pets_cache.apoc) Details:Destroy(dk_pets_cache.apoc)
@@ -5619,7 +5636,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
--can also run when the player leaves combat state (regen enabled) --can also run when the player leaves combat state (regen enabled)
function Details:RunScheduledEventsAfterCombat(OnRegenEnabled) function Details:RunScheduledEventsAfterCombat(OnRegenEnabled)
if (Details.debug) then if (Details.debug) then
Details:Msg("(debug) running scheduled events after combat end.") --Details:Msg("(debug) running scheduled events after combat end.")
end end
@@ -5724,20 +5741,14 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
wipe(keystoneLevels) wipe(keystoneLevels)
local libOpenRaid = LibStub("LibOpenRaid-1.0", true) local libOpenRaid = LibStub("LibOpenRaid-1.0", true)
--print("saveGroupMembersKeystoneLevel() called", libOpenRaid, GetNumGroupMembers()-1)
for i = 1, GetNumGroupMembers()-1 do for i = 1, GetNumGroupMembers()-1 do
local unitId = "party" .. i local unitId = "party" .. i
if (UnitExists(unitId)) then if (UnitExists(unitId)) then
local unitKeystoneInfo = libOpenRaid.GetKeystoneInfo(unitId) local unitKeystoneInfo = libOpenRaid.GetKeystoneInfo(unitId)
--print("unitExists", unitId, unitKeystoneInfo)
if (unitKeystoneInfo) then if (unitKeystoneInfo) then
local unitName = Details:GetFullName(unitId) local unitName = Details:GetFullName(unitId)
keystoneLevels[unitName] = unitKeystoneInfo.level keystoneLevels[unitName] = unitKeystoneInfo.level
--print("saved keystone level for", unitName, unitKeystoneInfo.level)
end end
else
--print("unit does not exist", unitId)
end end
end end
@@ -5747,7 +5758,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
if (unitKeystoneInfo) then if (unitKeystoneInfo) then
local unitName = Details:GetFullName(unitId) local unitName = Details:GetFullName(unitId)
keystoneLevels[unitName] = unitKeystoneInfo.level keystoneLevels[unitName] = unitKeystoneInfo.level
--print("saved keystone level for", unitName, unitKeystoneInfo.level)
end end
end end
end end
@@ -5805,9 +5815,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
C_Timer.After(0, function() C_Timer.After(0, function()
if (ChallengeModeCompleteBanner) then if (ChallengeModeCompleteBanner) then
ChallengeModeCompleteBanner.timeToHold = 0.1 ChallengeModeCompleteBanner.timeToHold = 0.1
--print("ChallengeModeCompleteBanner.timeToHold Existed!")
else
--print("ChallengeModeCompleteBanner.timeToHold DID NOT Existed!")
end end
end) end)
end end
@@ -5852,10 +5859,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
end end
function Details.parser_functions:PLAYER_REGEN_ENABLED(...) function Details.parser_functions:PLAYER_REGEN_ENABLED(...)
if (Details.debug) then
Details:Msg("(debug) |cFFFFFF00PLAYER_REGEN_ENABLED|r event triggered.")
end
if (Details.auto_swap_to_dynamic_overall) then if (Details.auto_swap_to_dynamic_overall) then
Details:InstanceCall(autoSwapDynamicOverallData, false) Details:InstanceCall(autoSwapDynamicOverallData, false)
end end
@@ -5949,6 +5952,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
end end
end end
--[=[
--this is mostly triggered when the player enters in a dual against another player --this is mostly triggered when the player enters in a dual against another player
function Details.parser_functions:UNIT_FACTION(unit) function Details.parser_functions:UNIT_FACTION(unit)
if (true) then if (true) then
@@ -6001,6 +6005,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
end end
end end
end end
--]=]
function Details.parser_functions:ROLE_CHANGED_INFORM(...) function Details.parser_functions:ROLE_CHANGED_INFORM(...)
if (Details.last_assigned_role ~= _UnitGroupRolesAssigned("player")) then if (Details.last_assigned_role ~= _UnitGroupRolesAssigned("player")) then
@@ -6637,39 +6642,39 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
for n, nn in pairs(damage_cache) do for n, nn in pairs(damage_cache) do
amount = amount + 1 amount = amount + 1
end end
print("parser damage_cache", amount) Details:Msg("parser damage_cache", amount)
amount = 0 amount = 0
for n, nn in pairs(damage_cache_pets) do for n, nn in pairs(damage_cache_pets) do
amount = amount + 1 amount = amount + 1
end end
print("parser damage_cache_pets", amount) Details:Msg("parser damage_cache_pets", amount)
amount = 0 amount = 0
for n, nn in pairs(damage_cache_petsOwners) do for n, nn in pairs(damage_cache_petsOwners) do
amount = amount + 1 amount = amount + 1
end end
print("parser damage_cache_petsOwners", amount) Details:Msg("parser damage_cache_petsOwners", amount)
amount = 0 amount = 0
for n, nn in pairs(healing_cache) do for n, nn in pairs(healing_cache) do
amount = amount + 1 amount = amount + 1
end end
print("parser healing_cache", amount) Details:Msg("parser healing_cache", amount)
amount = 0 amount = 0
for n, nn in pairs(energy_cache) do for n, nn in pairs(energy_cache) do
amount = amount + 1 amount = amount + 1
end end
print("parser energy_cache", amount) Details:Msg("parser energy_cache", amount)
amount = 0 amount = 0
for n, nn in pairs(misc_cache) do for n, nn in pairs(misc_cache) do
amount = amount + 1 amount = amount + 1
end end
print("parser misc_cache", amount) Details:Msg("parser misc_cache", amount)
print("group damage", #Details.cache_damage_group) Details:Msg("group damage", #Details.cache_damage_group)
print("group damage", #Details.cache_healing_group) Details:Msg("group damage", #Details.cache_healing_group)
end end
function Details:GetActorsOnDamageCache() function Details:GetActorsOnDamageCache()
@@ -6680,14 +6685,17 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
return Details.cache_healing_group return Details.cache_healing_group
end end
--called when the zone type changes and ENCOUNTER_END event
function Details222.Cache.ClearAugmentationCache() function Details222.Cache.ClearAugmentationCache()
Details:Destroy(augmentation_cache.ebon_might) --~roskash Details:Destroy(augmentation_cache.ebon_might) --~roskash
Details:Destroy(augmentation_cache.prescience) Details:Destroy(augmentation_cache.prescience)
Details:Destroy(augmentation_cache.shield) Details:Destroy(augmentation_cache.shield)
Details:Destroy(augmentation_cache.infernobless) Details:Destroy(augmentation_cache.infernobless)
Details:Destroy(augmentation_cache.breath_targets) Details:Destroy(augmentation_cache.breath_targets)
Details:Destroy(augmentation_cache.prescience_stacks)
end end
--called when restaring the garbage collector, on some options change, at the end of a combat (before COMBAT_PLAYER_LEAVE and after COMBAT_PLAYER_LEAVING)
function Details:ClearParserCache(bIsFromCombatStart) --~wipe function Details:ClearParserCache(bIsFromCombatStart) --~wipe
Details:Destroy(damage_cache) Details:Destroy(damage_cache)
Details:Destroy(damage_cache_pets) Details:Destroy(damage_cache_pets)
@@ -6720,6 +6728,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
if (Details.zone_type ~= "party") then if (Details.zone_type ~= "party") then
Details:Destroy(augmentation_cache.ebon_might) --~roskash Details:Destroy(augmentation_cache.ebon_might) --~roskash
Details:Destroy(augmentation_cache.prescience) Details:Destroy(augmentation_cache.prescience)
Details:Destroy(augmentation_cache.prescience_stacks)
Details:Destroy(augmentation_cache.shield) Details:Destroy(augmentation_cache.shield)
Details:Destroy(augmentation_cache.infernobless) Details:Destroy(augmentation_cache.infernobless)
end end
@@ -7033,7 +7042,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
is_using_spellId_override = Details.override_spellids is_using_spellId_override = Details.override_spellids
return Details:ClearParserCache(bIsFromCombatStart) Details:ClearParserCache(bIsFromCombatStart)
end end
function Details.DumpIgnoredNpcs() function Details.DumpIgnoredNpcs()
@@ -7275,3 +7284,16 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
end end
function detailsParserDebugFrame:BlinkIcon(spellId, iconId)
local spellName, _, spellIcon = GetSpellInfo(spellId)
local icon = self.AllIcons[iconId]
if (spellIcon) then
icon:SetTexture(spellIcon)
icon:Show()
C_Timer.After(1, function()
icon:Hide()
end)
end
end
+5 -1
View File
@@ -35,6 +35,10 @@
local gump = Details.gump --details local local gump = Details.gump --details local
function Details:IsInMythicPlus()
return C_ChallengeMode and C_ChallengeMode.IsChallengeModeActive and C_ChallengeMode.IsChallengeModeActive()
end
local predicateFunc = function(spellIdToFind, casterName, _, name, icon, applications, dispelName, duration, expirationTime, sourceUnitId, isStealable, nameplateShowPersonal, spellId, canApplyAura, isBossAura, isFromPlayerOrPlayerPet, nameplateShowAll, timeMod, applications) local predicateFunc = function(spellIdToFind, casterName, _, name, icon, applications, dispelName, duration, expirationTime, sourceUnitId, isStealable, nameplateShowPersonal, spellId, canApplyAura, isBossAura, isFromPlayerOrPlayerPet, nameplateShowAll, timeMod, applications)
if (spellIdToFind == spellId and UnitExists(sourceUnitId)) then if (spellIdToFind == spellId and UnitExists(sourceUnitId)) then
if (casterName == Details:GetUnitNameForAPI(sourceUnitId)) then if (casterName == Details:GetUnitNameForAPI(sourceUnitId)) then
@@ -1287,7 +1291,7 @@ end
--coach feature --coach feature
if (not Details.Coach.Server.IsEnabled()) then if (not Details.Coach.Server.IsEnabled()) then
if (Details.debug) then if (Details.debug) then
Details:Msg("coach is disabled, the combat is now over!") --Details:Msg("coach is disabled, the combat is now over!")
end end
end end
@@ -85,6 +85,24 @@ local updateTargetBar = function(targetBar, index, combatObject, scrollFrame, he
--statusbar color --statusbar color
targetBar.statusBar:SetStatusBarColor(1, 1, 1, 1) targetBar.statusBar:SetStatusBarColor(1, 1, 1, 1)
local platerNameplates = _G.Plater
if (platerNameplates) then
local npcId = tonumber(targetActorObject.aID)
if (npcId) then
local platerProfile = platerNameplates.db.profile
local npcColors = platerProfile.npc_colors
local platerNpcColorTable = npcColors[npcId]
if (platerNpcColorTable) then
if (platerNpcColorTable[1] == true) then
local color = platerNpcColorTable[3]
local r, g, b, a = DF:ParseColors(color)
targetBar.statusBar:SetStatusBarColor(r, g, b, a)
end
end
end
end
targetBar.combatTime = combatTime targetBar.combatTime = combatTime
targetBar.actorName = bkTargetData.name targetBar.actorName = bkTargetData.name
+4
View File
@@ -36,6 +36,7 @@
["COMBAT_ENCOUNTER_END"] = {}, ["COMBAT_ENCOUNTER_END"] = {},
["COMBAT_PLAYER_ENTER"] = {}, ["COMBAT_PLAYER_ENTER"] = {},
["COMBAT_PLAYER_LEAVE"] = {}, ["COMBAT_PLAYER_LEAVE"] = {},
["COMBAT_PLAYER_LEAVING"] = {},
["COMBAT_PLAYER_TIMESTARTED"] = {}, ["COMBAT_PLAYER_TIMESTARTED"] = {},
["COMBAT_BOSS_WIPE"] = {}, ["COMBAT_BOSS_WIPE"] = {},
["COMBAT_BOSS_DEFEATED"] = {}, ["COMBAT_BOSS_DEFEATED"] = {},
@@ -49,6 +50,7 @@
["COMBAT_ARENA_END"] = {}, ["COMBAT_ARENA_END"] = {},
["COMBAT_MYTHICDUNGEON_START"] = {}, ["COMBAT_MYTHICDUNGEON_START"] = {},
["COMBAT_MYTHICDUNGEON_END"] = {}, ["COMBAT_MYTHICDUNGEON_END"] = {},
["COMBAT_MYTHICPLUS_OVERALL_READY"] = {},
--area --area
["ZONE_TYPE_CHANGED"] = {}, ["ZONE_TYPE_CHANGED"] = {},
@@ -100,6 +102,7 @@ local common_events = {
["COMBAT_ENCOUNTER_END"] = true, ["COMBAT_ENCOUNTER_END"] = true,
["COMBAT_PLAYER_ENTER"] = true, ["COMBAT_PLAYER_ENTER"] = true,
["COMBAT_PLAYER_LEAVE"] = true, ["COMBAT_PLAYER_LEAVE"] = true,
["COMBAT_PLAYER_LEAVING"] = true,
["COMBAT_PLAYER_TIMESTARTED"] = true, ["COMBAT_PLAYER_TIMESTARTED"] = true,
["COMBAT_BOSS_WIPE"] = true, ["COMBAT_BOSS_WIPE"] = true,
["COMBAT_BOSS_DEFEATED"] = true, ["COMBAT_BOSS_DEFEATED"] = true,
@@ -113,6 +116,7 @@ local common_events = {
["COMBAT_ARENA_END"] = true, ["COMBAT_ARENA_END"] = true,
["COMBAT_MYTHICDUNGEON_START"] = true, ["COMBAT_MYTHICDUNGEON_START"] = true,
["COMBAT_MYTHICDUNGEON_END"] = true, ["COMBAT_MYTHICDUNGEON_END"] = true,
["COMBAT_MYTHICPLUS_OVERALL_READY"] = true,
["GROUP_ONENTER"] = true, ["GROUP_ONENTER"] = true,
["GROUP_ONLEAVE"] = true, ["GROUP_ONLEAVE"] = true,
["ZONE_TYPE_CHANGED"] = true, ["ZONE_TYPE_CHANGED"] = true,
+4
View File
@@ -64,6 +64,8 @@ function DetailsMythicPlusFrame.MergeSegmentsOnEnd() --~merge
local newCombat = Details:GetCurrentCombat() local newCombat = Details:GetCurrentCombat()
local segmentsTable = Details:GetCombatSegments() local segmentsTable = Details:GetCombatSegments()
newCombat.is_challenge = true
local timeInCombat = 0 local timeInCombat = 0
local startDate, endDate = "", "" local startDate, endDate = "", ""
local lastSegment local lastSegment
@@ -209,6 +211,8 @@ function DetailsMythicPlusFrame.MergeSegmentsOnEnd() --~merge
instance:InstanceAlert ("Showing Mythic+ Run Segment", {[[Interface\AddOns\Details\images\icons]], 16, 16, false, 434/512, 466/512, 243/512, 273/512}, 6, func, true) instance:InstanceAlert ("Showing Mythic+ Run Segment", {[[Interface\AddOns\Details\images\icons]], 16, 16, false, 434/512, 466/512, 243/512, 273/512}, 6, func, true)
end end
end end
Details:SendEvent("COMBAT_MYTHICPLUS_OVERALL_READY")
end end
--after each boss fight, if enalbed on settings, create an extra segment with all trash segments from the boss just killed --after each boss fight, if enalbed on settings, create an extra segment with all trash segments from the boss just killed
+78 -29
View File
@@ -1933,9 +1933,11 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
local openRaidLib = LibStub:GetLibrary("LibOpenRaid-1.0") local openRaidLib = LibStub:GetLibrary("LibOpenRaid-1.0")
if (openRaidLib) then if (openRaidLib) then
if (not DetailsKeystoneInfoFrame) then if (not DetailsKeystoneInfoFrame) then
---@type detailsframework
local detailsFramework = DetailsFramework
local CONST_WINDOW_WIDTH = 614 local CONST_WINDOW_WIDTH = 614
local CONST_WINDOW_HEIGHT = 700 local CONST_WINDOW_HEIGHT = 720
local CONST_SCROLL_LINE_HEIGHT = 20 local CONST_SCROLL_LINE_HEIGHT = 20
local CONST_SCROLL_LINE_AMOUNT = 30 local CONST_SCROLL_LINE_AMOUNT = 30
@@ -1948,7 +1950,7 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
local backdrop_color_inguild = {.5, .8, .5, 0.2} local backdrop_color_inguild = {.5, .8, .5, 0.2}
local backdrop_color_on_enter_inguild = {.5, 1, .5, 0.4} local backdrop_color_on_enter_inguild = {.5, 1, .5, 0.4}
local f = DetailsFramework:CreateSimplePanel(UIParent, CONST_WINDOW_WIDTH, CONST_WINDOW_HEIGHT, "M+ Keystones (/key)", "DetailsKeystoneInfoFrame") local f = detailsFramework:CreateSimplePanel(UIParent, CONST_WINDOW_WIDTH, CONST_WINDOW_HEIGHT, "M+ Keystones (/key)", "DetailsKeystoneInfoFrame")
f:SetPoint("center", UIParent, "center", 0, 0) f:SetPoint("center", UIParent, "center", 0, 0)
f:SetScript("OnMouseDown", nil) --disable framework native moving scripts f:SetScript("OnMouseDown", nil) --disable framework native moving scripts
@@ -1959,15 +1961,43 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
LibWindow.MakeDraggable(f) LibWindow.MakeDraggable(f)
LibWindow.RestorePosition(f) LibWindow.RestorePosition(f)
local scaleBar = DetailsFramework:CreateScaleBar(f, Details.keystone_frame) f:SetScript("OnEvent", function(self, event, ...)
if (f:IsShown()) then
if (event == "GUILD_ROSTER_UPDATE") then
local bUpdateOkay = ...
if (bUpdateOkay) then
self:RefreshData()
end
end
end
end)
local scaleBar = detailsFramework:CreateScaleBar(f, Details.keystone_frame)
f:SetScale(Details.keystone_frame.scale) f:SetScale(Details.keystone_frame.scale)
local statusBar = DetailsFramework:CreateStatusBar(f) local statusBar = detailsFramework:CreateStatusBar(f)
statusBar.text = statusBar:CreateFontString(nil, "overlay", "GameFontNormal") statusBar.text = statusBar:CreateFontString(nil, "overlay", "GameFontNormal")
statusBar.text:SetPoint("left", statusBar, "left", 5, 0) statusBar.text:SetPoint("left", statusBar, "left", 5, 0)
statusBar.text:SetText("By Terciob | From Details! Damage Meter|Built with Details! Framework | Data from Open Raid Library") statusBar.text:SetText("By Terciob | From Details! Damage Meter")
DetailsFramework:SetFontSize(statusBar.text, 11) detailsFramework:SetFontSize(statusBar.text, 12)
DetailsFramework:SetFontColor(statusBar.text, "gray") detailsFramework:SetFontColor(statusBar.text, "gray")
local requestFromGuildButton = detailsFramework:CreateButton(f, function()
local guildName = GetGuildInfo("player")
if (guildName) then
f:RegisterEvent("GUILD_ROSTER_UPDATE")
C_Timer.After(30, function()
f:UnregisterEvent("GUILD_ROSTER_UPDATE")
end)
C_GuildInfo.GuildRoster()
openRaidLib.RequestKeystoneDataFromGuild()
end
end, 100, 20, "Request from Guild")
requestFromGuildButton:SetPoint("bottomleft", statusBar, "topleft", 2, 2)
requestFromGuildButton:SetTemplate(detailsFramework:GetTemplate("button", "OPTIONS_BUTTON_TEMPLATE"))
requestFromGuildButton:SetIcon("UI-RefreshButton", 20, 20, "overlay", {0, 1, 0, 1}, "lawngreen")
requestFromGuildButton:SetFrameLevel(f:GetFrameLevel()+5)
f.RequestFromGuildButton = requestFromGuildButton
--header --header
local headerTable = { local headerTable = {
@@ -1995,8 +2025,8 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
header_click_callback = headerOnClickCallback, header_click_callback = headerOnClickCallback,
} }
f.Header = DetailsFramework:CreateHeader(f, headerTable, headerOptions, "DetailsKeystoneInfoFrameHeader") f.Header = detailsFramework:CreateHeader(f, headerTable, headerOptions, "DetailsKeystoneInfoFrameHeader")
f.Header:SetPoint("topleft", f, "topleft", 5, -25) f.Header:SetPoint("topleft", f, "topleft", 3, -25)
--scroll --scroll
local refreshScrollLines = function(self, data, offset, totalLines) local refreshScrollLines = function(self, data, offset, totalLines)
@@ -2033,13 +2063,13 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
line.icon:SetTexCoord(L+0.02, R-0.02, T+0.02, B-0.02) line.icon:SetTexCoord(L+0.02, R-0.02, T+0.02, B-0.02)
--remove the realm name from the player name (if any) --remove the realm name from the player name (if any)
local unitNameNoRealm = DetailsFramework:RemoveRealmName(unitName) local unitNameNoRealm = detailsFramework:RemoveRealmName(unitName)
line.playerNameText.text = unitNameNoRealm line.playerNameText.text = unitNameNoRealm
line.keystoneLevelText.text = level line.keystoneLevelText.text = level
line.dungeonNameText.text = mapName line.dungeonNameText.text = mapName
DetailsFramework:TruncateText(line.dungeonNameText, 240) detailsFramework:TruncateText(line.dungeonNameText, 240)
line.classicDungeonNameText.text = "" --mapNameChallenge line.classicDungeonNameText.text = "" --mapNameChallenge
DetailsFramework:TruncateText(line.classicDungeonNameText, 120) detailsFramework:TruncateText(line.classicDungeonNameText, 120)
line.inMyParty = inMyParty > 0 line.inMyParty = inMyParty > 0
line.inMyGuild = isGuildMember line.inMyGuild = isGuildMember
@@ -2083,8 +2113,8 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
end end
end end
local scrollFrame = DetailsFramework:CreateScrollBox(f, "$parentScroll", refreshScrollLines, {}, CONST_WINDOW_WIDTH-10, CONST_WINDOW_HEIGHT-70, CONST_SCROLL_LINE_AMOUNT, CONST_SCROLL_LINE_HEIGHT) local scrollFrame = detailsFramework:CreateScrollBox(f, "$parentScroll", refreshScrollLines, {}, CONST_WINDOW_WIDTH-10, CONST_WINDOW_HEIGHT-90, CONST_SCROLL_LINE_AMOUNT, CONST_SCROLL_LINE_HEIGHT)
DetailsFramework:ReskinSlider(scrollFrame) detailsFramework:ReskinSlider(scrollFrame)
scrollFrame:SetPoint("topleft", f.Header, "bottomleft", -1, -1) scrollFrame:SetPoint("topleft", f.Header, "bottomleft", -1, -1)
scrollFrame:SetPoint("topright", f.Header, "bottomright", 0, -1) scrollFrame:SetPoint("topright", f.Header, "bottomright", 0, -1)
@@ -2115,7 +2145,7 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
line:SetBackdrop({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) line:SetBackdrop({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
line:SetBackdropColor(unpack(backdrop_color)) line:SetBackdropColor(unpack(backdrop_color))
DetailsFramework:Mixin(line, DetailsFramework.HeaderFunctions) detailsFramework:Mixin(line, detailsFramework.HeaderFunctions)
line:SetScript("OnEnter", lineOnEnter) line:SetScript("OnEnter", lineOnEnter)
line:SetScript("OnLeave", lineOnLeave) line:SetScript("OnLeave", lineOnLeave)
@@ -2125,19 +2155,19 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
icon:SetSize(CONST_SCROLL_LINE_HEIGHT - 2, CONST_SCROLL_LINE_HEIGHT - 2) icon:SetSize(CONST_SCROLL_LINE_HEIGHT - 2, CONST_SCROLL_LINE_HEIGHT - 2)
--player name --player name
local playerNameText = DetailsFramework:CreateLabel(line) local playerNameText = detailsFramework:CreateLabel(line, "")
--keystone level --keystone level
local keystoneLevelText = DetailsFramework:CreateLabel(line) local keystoneLevelText = detailsFramework:CreateLabel(line, "")
--dungeon name --dungeon name
local dungeonNameText = DetailsFramework:CreateLabel(line) local dungeonNameText = detailsFramework:CreateLabel(line, "")
--classic dungeon name --classic dungeon name
local classicDungeonNameText = DetailsFramework:CreateLabel(line) local classicDungeonNameText = detailsFramework:CreateLabel(line, "")
--player rating --player rating
local ratingText = DetailsFramework:CreateLabel(line) local ratingText = detailsFramework:CreateLabel(line, "")
line.icon = icon line.icon = icon
line.playerNameText = playerNameText line.playerNameText = playerNameText
@@ -2170,6 +2200,16 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
local guildUsers = {} local guildUsers = {}
local totalMembers, onlineMembers, onlineAndMobileMembers = GetNumGuildMembers() local totalMembers, onlineMembers, onlineAndMobileMembers = GetNumGuildMembers()
--[=[
local unitsInMyGroup = {
[Details:GetFullName("player")] = true,
}
for i = 1, GetNumGroupMembers() do
local unitName = Details:GetFullName("party" .. i)
unitsInMyGroup[unitName] = true
end
--]=]
--create a string to use into the gsub call when removing the realm name from the player name, by default all player names returned from GetGuildRosterInfo() has PlayerName-RealmName format --create a string to use into the gsub call when removing the realm name from the player name, by default all player names returned from GetGuildRosterInfo() has PlayerName-RealmName format
local realmNameGsub = "%-.*" local realmNameGsub = "%-.*"
local guildName = GetGuildInfo("player") local guildName = GetGuildInfo("player")
@@ -2258,18 +2298,23 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
--sort by player class --sort by player class
if (columnIndex == 1) then if (columnIndex == 1) then
sortByIndex = 5 sortByIndex = 5
--sort by player name --sort by player name
elseif (columnIndex == 2) then elseif (columnIndex == 2) then
sortByIndex = 1 sortByIndex = 1
--sort by keystone level --sort by keystone level
elseif (columnIndex == 3) then elseif (columnIndex == 3) then
sortByIndex = 2 sortByIndex = 2
--sort by dungeon name --sort by dungeon name
elseif (columnIndex == 4) then elseif (columnIndex == 4) then
sortByIndex = 3 sortByIndex = 3
--sort by classic dungeon name --sort by classic dungeon name
--elseif (columnIndex == 5) then --elseif (columnIndex == 5) then
-- sortByIndex = 4 -- sortByIndex = 4
--sort by mythic+ ranting --sort by mythic+ ranting
elseif (columnIndex == 5) then elseif (columnIndex == 5) then
sortByIndex = 6 sortByIndex = 6
@@ -2290,7 +2335,7 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
end end
end end
newData.offlineGuildPlayers = DetailsFramework.table.reverse(newData.offlineGuildPlayers) newData.offlineGuildPlayers = detailsFramework.table.reverse(newData.offlineGuildPlayers)
--put players in the group at the top of the list --put players in the group at the top of the list
if (IsInGroup() and not IsInRaid()) then if (IsInGroup() and not IsInRaid()) then
@@ -2334,17 +2379,23 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
end) end)
end end
--call an update on the guild roster
if (C_GuildInfo and C_GuildInfo.GuildRoster) then
C_GuildInfo.GuildRoster()
end
--show the frame --show the frame
DetailsKeystoneInfoFrame:Show() DetailsKeystoneInfoFrame:Show()
openRaidLib.RegisterCallback(DetailsKeystoneInfoFrame, "KeystoneUpdate", "OnKeystoneUpdate") openRaidLib.RegisterCallback(DetailsKeystoneInfoFrame, "KeystoneUpdate", "OnKeystoneUpdate")
openRaidLib.WipeKeystoneData() local guildName = GetGuildInfo("player")
if (guildName) then
--call an update on the guild roster
if (C_GuildInfo and C_GuildInfo.GuildRoster) then
C_GuildInfo.GuildRoster()
end
DetailsKeystoneInfoFrame.RequestFromGuildButton:Enable()
else
DetailsKeystoneInfoFrame.RequestFromGuildButton:Disable()
end
--openRaidLib.WipeKeystoneData()
if (IsInRaid()) then if (IsInRaid()) then
openRaidLib.RequestKeystoneDataFromRaid() openRaidLib.RequestKeystoneDataFromRaid()
@@ -2352,8 +2403,6 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
openRaidLib.RequestKeystoneDataFromParty() openRaidLib.RequestKeystoneDataFromParty()
end end
openRaidLib.RequestKeystoneDataFromGuild()
DetailsKeystoneInfoFrame.RefreshData() DetailsKeystoneInfoFrame.RefreshData()
end end
end end
+301 -4
View File
@@ -3,6 +3,13 @@ local addonName, Details222 = ...
local Details = Details local Details = Details
local _ local _
local CONST_SPELLID_EBONMIGHT = 395152
local CONST_SPELLID_SS = 413984
local CONST_SPELLID_PRESCIENCE = 410089
local CONST_SPELLID_EONS_BREATH = 409560
local CONST_SPELLID_TANK_SHIELD = 360827
local CONST_SPELLID_INFERNOBLESS = 410263
local UnitExists = UnitExists local UnitExists = UnitExists
local UnitIsUnit = UnitIsUnit local UnitIsUnit = UnitIsUnit
@@ -11,12 +18,240 @@ local augmentationCache = Details222.SpecHelpers[1473].augmentation_cache
local playerRealmName = GetRealmName() local playerRealmName = GetRealmName()
local getAmountOfBuffsAppliedBySpellId = function(spellId)
local amountBuffs = 0
local spellName = GetSpellInfo(spellId)
for i, unitId in ipairs(Details222.UnitIdCache.PartyIds) do
if (UnitExists(unitId)) then
for o = 1, 40 do
local auraName = UnitBuff(unitId, o)
if (auraName == spellName) then
amountBuffs = amountBuffs + 1
break
elseif (not auraName) then
break
end
end
else
break
end
end
return amountBuffs
end
local eventListener = Details:CreateEventListener()
--eventListener:RegisterEvent("COMBAT_PLAYER_ENTER")
eventListener:RegisterEvent("COMBAT_PLAYER_LEAVING", function(eventName, combatObject)
--close the time on the current amount of prescience stacks the evoker have
---@type combat
local combat = Details:GetCurrentCombat()
---@type actorcontainer
local damageContainer = combat:GetContainer(DETAILS_ATTRIBUTE_MISC)
--print(1, "COMBAT_PLAYER_LEAVING", next(augmentationCache.prescience_stacks))
for actorName, stackInfo in pairs(augmentationCache.prescience_stacks) do
local actorObject = damageContainer:GetActor(actorName)
local currentAmountOfApplications = stackInfo.currentStacks
if (currentAmountOfApplications >= 1 and currentAmountOfApplications <= 5) then
--close the time the evoker had this amount of stacks
local timeOfTheLastEvent = stackInfo.latestStackUpdateTime
local timeNow = GetTime()
local timeDiff = timeNow - timeOfTheLastEvent
if (timeDiff > 0) then
stackInfo.stackTime[currentAmountOfApplications] = stackInfo.stackTime[currentAmountOfApplications] + timeDiff
end
end
actorObject.prescience_stack_data_by_timeline = DetailsFramework.table.copy({}, stackInfo.stackTime)
end
end)
---@class details_evoker_presciencetimeline : table
---@field currentStacks number amount of stacks the evoker has at the moment
---@field stackTime table<number, number, number, number, number> amountof time the evoker had the amount of stacks, one stack if the first index, 5 stacks if the last index
---@field latestStackUpdateTime number GetTime() of the latest stack amount update, this is used to calculate the time the evoker had each amount of stacks
local latestPrescienceEvent = 0
local latestAuraInstanceId = 0
function augmentationFunctions.OnAugmentationBuffUpdate(eventName, ...)
---@combat
local currentCombat = Details:GetCurrentCombat()
--test #1: calculate the amount of stack in real time
if (eventName == "AURA_UPDATE" and Details.in_combat) then
local targetGUID, auraInfo, eventType = ...
local spellId = auraInfo.spellId
if (spellId == CONST_SPELLID_PRESCIENCE) then
--[=[
if (latestPrescienceEvent ~= GetTime()) then
latestPrescienceEvent = GetTime()
latestAuraInstanceId = auraInfo.instanceId
else
if (latestAuraInstanceId == auraInfo.instanceId) then
return
end
latestPrescienceEvent = GetTime()
latestAuraInstanceId = auraInfo.instanceId
end
if ((currentCombat and currentCombat.is_challenge) or Details.debug) then
local sourceUnitId = auraInfo.sourceUnit
local sourceGUID = UnitGUID(sourceUnitId)
local sourceName = Details:GetFullName(sourceUnitId)
local evokerUtilityObject = currentCombat:GetContainer(DETAILS_ATTRIBUTE_MISC):GetOrCreateActor(sourceGUID, sourceName, 0x514, true)
if (evokerUtilityObject) then
local stackInfo = evokerUtilityObject.prescience_stack_data2
if (not stackInfo) then
stackInfo = {
currentStacks = 0,
stackTime = {0, 0, 0, 0, 0},
latestStackUpdateTime = GetTime()
}
evokerUtilityObject.prescience_stack_data2 = stackInfo
end
if (eventType == "BUFF_UPTIME_IN") then
local currentAmountOfApplications = stackInfo.currentStacks
--print("in", currentAmountOfApplications, GetTime())
if (currentAmountOfApplications > 0) then
--the the time the evoker had this amount of stacks
local timeOfTheLastEvent = stackInfo.latestStackUpdateTime
local timeNow = GetTime()
local timeDiff = timeNow - timeOfTheLastEvent
if (timeDiff > 0) then
stackInfo.stackTime[currentAmountOfApplications] = stackInfo.stackTime[currentAmountOfApplications] + timeDiff
end
end
stackInfo.latestStackUpdateTime = GetTime()
stackInfo.currentStacks = stackInfo.currentStacks + 1
elseif (eventType == "BUFF_UPTIME_OUT") then
local currentAmountOfApplications = stackInfo.currentStacks
--print("out", currentAmountOfApplications)
if (currentAmountOfApplications > 0) then
--the the time the evoker had this amount of stacks
local timeOfTheLastEvent = stackInfo.latestStackUpdateTime
local timeNow = GetTime()
local timeDiff = timeNow - timeOfTheLastEvent
if (timeDiff > 0) then
stackInfo.stackTime[currentAmountOfApplications] = stackInfo.stackTime[currentAmountOfApplications] + timeDiff
end
end
stackInfo.latestStackUpdateTime = GetTime()
stackInfo.currentStacks = stackInfo.currentStacks - 1
end
end
end
--]=]
end
--test #2: calculate the amount of stacks post combat using a list of events (timeline)
--note to self: I'm not working with real time data, these are past events, GetTime() and time() will always return the same value
elseif (eventName == "TIMELINE_READY") then --not in use
--if true then return end
--timelineTable is an indexed table with all the timeline events
---@type details_auratimeline[]
local timelineTable = ...
__details_debug.prescience_timeline = __details_debug.prescience_timeline or {}
__details_debug.prescience_timeline[#__details_debug.prescience_timeline+1] = timelineTable
--amount of time the evoker had the amount of stacks
--[evokerName] = details_evoker_presciencetimeline
---@type table<string, details_evoker_presciencetimeline>
local prescienceStacksByEvoker = {}
for i = 1, #timelineTable do
---@type details_auratimeline
local auraEvent = timelineTable[i]
if (auraEvent.spellId == CONST_SPELLID_PRESCIENCE) then
local evokerName = auraEvent.sourceName
---@type details_evoker_presciencetimeline
local evokerPrescienceStackInfo = prescienceStacksByEvoker[evokerName]
if (auraEvent.event == "BUFF_UPTIME_IN") then
if (not evokerPrescienceStackInfo) then
evokerPrescienceStackInfo = {
currentStacks = 0,
stackTime = {0, 0, 0, 0, 0},
latestStackUpdateTime = 0
}
prescienceStacksByEvoker[evokerName] = evokerPrescienceStackInfo
end
local currentAmountOfStacks = evokerPrescienceStackInfo.currentStacks
--the evoker gained a stack, so we need to add the time he had the previous amount of stacks
if (currentAmountOfStacks > 0) then
local timeWithThisAmountOfStacks = evokerPrescienceStackInfo.stackTime[currentAmountOfStacks]
if (timeWithThisAmountOfStacks) then
local appliedTime = auraEvent.appliedTime
local timeDiff = appliedTime - evokerPrescienceStackInfo.latestStackUpdateTime
if (timeDiff > 0) then
evokerPrescienceStackInfo.stackTime[currentAmountOfStacks] = timeWithThisAmountOfStacks + timeDiff
end
end
end
evokerPrescienceStackInfo.latestStackUpdateTime = auraEvent.appliedTime
evokerPrescienceStackInfo.currentStacks = currentAmountOfStacks + 1
elseif (auraEvent.event == "BUFF_UPTIME_OUT") then
if (evokerPrescienceStackInfo) then
--the evoker lost a stack, so we need to add the time he had the previous amount of stacks
local currentAmountOfStacks = evokerPrescienceStackInfo.currentStacks
local timeWithThisAmountOfStacks = evokerPrescienceStackInfo.stackTime[currentAmountOfStacks]
auraEvent.addTimeLineTable.closed = true
if (timeWithThisAmountOfStacks) then
local timeNow = auraEvent.removedTime
local timeDiff = timeNow - evokerPrescienceStackInfo.latestStackUpdateTime
if (timeDiff > 0) then
evokerPrescienceStackInfo.stackTime[currentAmountOfStacks] = timeWithThisAmountOfStacks + timeDiff
end
end
evokerPrescienceStackInfo.currentStacks = evokerPrescienceStackInfo.currentStacks - 1
evokerPrescienceStackInfo.latestStackUpdateTime = auraEvent.removedTime
end
end
end
end
--iterate again and print the tables with the key 'closed' that are not set to true
local nonClosedTables = {}
for i = 1, #timelineTable do
---@type details_auratimeline
local auraEvent = timelineTable[i]
if (auraEvent.spellId == CONST_SPELLID_PRESCIENCE) then
if (auraEvent.event == "BUFF_UPTIME_IN") then
if (not auraEvent.closed) then
nonClosedTables[#nonClosedTables+1] = auraEvent
end
end
end
end
Details222.DebugMsg("|cFFFFFF00Non Closed Tables:", #nonClosedTables)
for evokerName, evokerPrescienceStackInfo in pairs(prescienceStacksByEvoker) do --table 'prescience_stack_data_by_timeline' not found, something wrong here
local evokerUtilityObject = currentCombat:GetContainer(DETAILS_ATTRIBUTE_MISC):GetActor(evokerName)
if (evokerUtilityObject) then
evokerUtilityObject.prescience_stack_data_by_timeline = DetailsFramework.table.copy({}, evokerPrescienceStackInfo.stackTime)
end
end
end
end
function augmentationFunctions.BuffIn(token, time, sourceSerial, sourceName, sourceFlags, targetSerial, targetName, targetFlags, targetFlags2, spellId, spellName, spellschool, auraType, amount) function augmentationFunctions.BuffIn(token, time, sourceSerial, sourceName, sourceFlags, targetSerial, targetName, targetFlags, targetFlags2, spellId, spellName, spellschool, auraType, amount)
if (not UnitAffectingCombat("player")) then --need documentation if (not Details.in_combat) then --when the player enter and leave combat, it tracks which players had buffs applied
return return
end end
@@ -43,10 +278,42 @@ function augmentationFunctions.BuffIn(token, time, sourceSerial, sourceName, sou
end end
elseif (spellId == 410089) then --prescience elseif (spellId == 410089) then --prescience
--added Prescience to a player (targetName)
augmentationCache.prescience[targetSerial] = augmentationCache.prescience[targetSerial] or {} augmentationCache.prescience[targetSerial] = augmentationCache.prescience[targetSerial] or {}
local evokerInfo = {sourceSerial, sourceName, sourceFlags, amount} local evokerInfo = {sourceSerial, sourceName, sourceFlags, amount}
table.insert(augmentationCache.prescience[targetSerial], evokerInfo) table.insert(augmentationCache.prescience[targetSerial], evokerInfo)
---@combat
local currentCombat = Details:GetCurrentCombat()
local evokerUtilityObject = currentCombat:GetContainer(DETAILS_ATTRIBUTE_MISC):GetOrCreateActor(sourceSerial, sourceName, sourceFlags, true)
local stackInfo = evokerUtilityObject.cleu_prescience_time
if (not stackInfo) then
stackInfo = {
currentStacks = 0,
stackTime = {0, 0, 0, 0, 0},
latestStackUpdateTime = GetTime()
}
evokerUtilityObject.cleu_prescience_time = stackInfo
end
local prescienceApplied = getAmountOfBuffsAppliedBySpellId(CONST_SPELLID_PRESCIENCE)
if (prescienceApplied > 0) then
local currentAmountOfApplications = stackInfo.currentStacks
if (currentAmountOfApplications >= 1 and currentAmountOfApplications <= 5) then
--the the time the evoker had this amount of stacks
local timeOfTheLastEvent = stackInfo.latestStackUpdateTime
local timeNow = GetTime()
local timeDiff = timeNow - timeOfTheLastEvent
if (timeDiff > 0) then
stackInfo.stackTime[currentAmountOfApplications] = stackInfo.stackTime[currentAmountOfApplications] + timeDiff
end
end
stackInfo.latestStackUpdateTime = GetTime()
stackInfo.currentStacks = prescienceApplied
end
elseif (spellId == 409560) then --eons breath elseif (spellId == 409560) then --eons breath
local unitIDAffected = Details:FindUnitIDByUnitSerial(targetSerial) local unitIDAffected = Details:FindUnitIDByUnitSerial(targetSerial)
if (unitIDAffected) then if (unitIDAffected) then
@@ -76,6 +343,8 @@ function augmentationFunctions.BuffIn(token, time, sourceSerial, sourceName, sou
end end
end end
function augmentationFunctions.BuffRefresh(token, time, sourceSerial, sourceName, sourceFlags, targetSerial, targetName, targetFlags, targetFlags2, spellId, spellName, spellschool, tipo, amount) function augmentationFunctions.BuffRefresh(token, time, sourceSerial, sourceName, sourceFlags, targetSerial, targetName, targetFlags, targetFlags2, spellId, spellName, spellschool, tipo, amount)
if (spellId == 395152) then if (spellId == 395152) then
local bFound = false local bFound = false
@@ -146,7 +415,11 @@ end
function augmentationFunctions.BuffOut(token, time, sourceSerial, sourceName, sourceFlags, targetSerial, targetName, targetFlags, targetFlags2, spellId, spellName, spellSchool, tipo, amount) function augmentationFunctions.BuffOut(token, time, sourceSerial, sourceName, sourceFlags, targetSerial, targetName, targetFlags, targetFlags2, spellId, spellName, spellSchool, tipo, amount)
if (spellId == 395152) then if (not Details.in_combat) then --when the player enter and leave combat, it tracks which players had buffs applied
return
end
if (spellId == 395152) then --ebon might
if (augmentationCache.ebon_might[targetSerial]) then if (augmentationCache.ebon_might[targetSerial]) then
--print("tinha buff", targetName, targetSerial) --print("tinha buff", targetName, targetSerial)
for index, evokerInfo in ipairs(augmentationCache.ebon_might[targetSerial]) do for index, evokerInfo in ipairs(augmentationCache.ebon_might[targetSerial]) do
@@ -159,7 +432,7 @@ function augmentationFunctions.BuffOut(token, time, sourceSerial, sourceName, so
end end
end end
elseif (spellId == 413984) then elseif (spellId == 413984) then --ss
if (augmentationCache.ss[targetSerial]) then if (augmentationCache.ss[targetSerial]) then
for index, evokerInfo in ipairs(augmentationCache.ss[targetSerial]) do for index, evokerInfo in ipairs(augmentationCache.ss[targetSerial]) do
if (evokerInfo[1] == sourceSerial) then if (evokerInfo[1] == sourceSerial) then
@@ -169,7 +442,7 @@ function augmentationFunctions.BuffOut(token, time, sourceSerial, sourceName, so
end end
end end
elseif (spellId == 410089) then elseif (spellId == 410089) then --prescience
if (augmentationCache.prescience[targetSerial]) then if (augmentationCache.prescience[targetSerial]) then
for index, evokerInfo in ipairs(augmentationCache.prescience[targetSerial]) do for index, evokerInfo in ipairs(augmentationCache.prescience[targetSerial]) do
if (evokerInfo[1] == sourceSerial) then if (evokerInfo[1] == sourceSerial) then
@@ -177,6 +450,30 @@ function augmentationFunctions.BuffOut(token, time, sourceSerial, sourceName, so
break break
end end
end end
---@combat
local currentCombat = Details:GetCurrentCombat()
local evokerUtilityObject = currentCombat:GetContainer(DETAILS_ATTRIBUTE_MISC):GetOrCreateActor(sourceSerial, sourceName, sourceFlags, true)
local stackInfo = evokerUtilityObject.cleu_prescience_time
if (stackInfo) then
local prescienceApplied = getAmountOfBuffsAppliedBySpellId(CONST_SPELLID_PRESCIENCE)
if (prescienceApplied >= 0) then
local currentAmountOfApplications = stackInfo.currentStacks
if (currentAmountOfApplications >= 1 and currentAmountOfApplications <= 5) then
--the the time the evoker had this amount of stacks
local timeOfTheLastEvent = stackInfo.latestStackUpdateTime
local timeNow = GetTime()
local timeDiff = timeNow - timeOfTheLastEvent
if (timeDiff > 0) then
stackInfo.stackTime[currentAmountOfApplications] = stackInfo.stackTime[currentAmountOfApplications] + timeDiff
end
end
stackInfo.latestStackUpdateTime = GetTime()
stackInfo.currentStacks = prescienceApplied
end
end
end end
elseif (spellId == 360827) then elseif (spellId == 360827) then
+3 -3
View File
@@ -4074,7 +4074,7 @@ local SplitLoadFunc = function(self, deltaTime)
if (not container) then if (not container) then
if (Details.debug) then if (Details.debug) then
Details:Msg("(debug) finished index spells.") --Details:Msg("(debug) finished index spells.")
end end
SplitLoadFrame:SetScript("OnUpdate", nil) SplitLoadFrame:SetScript("OnUpdate", nil)
return return
@@ -4096,7 +4096,7 @@ local SplitLoadFunc = function(self, deltaTime)
if (SplitLoadFrame.NextActorContainer == 5) then if (SplitLoadFrame.NextActorContainer == 5) then
SplitLoadFrame:SetScript("OnUpdate", nil) SplitLoadFrame:SetScript("OnUpdate", nil)
if (Details.debug) then if (Details.debug) then
Details:Msg("(debug) finished index spells.") --Details:Msg("(debug) finished index spells.")
end end
return return
end end
@@ -4187,7 +4187,7 @@ end
function Details.StoreSpells() function Details.StoreSpells()
if (Details.debug) then if (Details.debug) then
Details:Msg("(debug) started to index spells.") --Details:Msg("(debug) started to index spells.")
end end
SplitLoadFrame:SetScript("OnUpdate", SplitLoadFunc) SplitLoadFrame:SetScript("OnUpdate", SplitLoadFunc)
SplitLoadFrame.NextActorContainer = 1 SplitLoadFrame.NextActorContainer = 1
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB