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
## Title: Details! Damage Meter
## 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
## OptionalDeps: Ace3, LibSharedMedia-3.0, LibWindow-1.1, LibDBIcon-1.0, NickTag-1.0, LibDataBroker-1.1, LibGraph-2.0
## Version: #@project-version@
@@ -72,6 +72,7 @@ functions\warcraftlogs.lua
functions\textures.lua
functions\journal.lua
core\aura_scan.lua
core\timemachine.lua
frames\anime.lua
+1
View File
@@ -67,6 +67,7 @@ functions\testbars.lua
functions\warcraftlogs.lua
functions\textures.lua
core\aura_scan.lua
core\timemachine.lua
frames\anime.lua
+1
View File
@@ -67,6 +67,7 @@ functions\testbars.lua
functions\warcraftlogs.lua
functions\textures.lua
core\aura_scan.lua
core\timemachine.lua
frames\anime.lua
+2 -1
View File
@@ -1861,14 +1861,15 @@ function DF:CreateCoolTip()
if (type(spellId) == "number") then
spellId = C_SpellBook.GetOverrideSpell(spellId)
local spellName, spellRank, spellIcon, castTime, minRange, maxRange = GetSpellInfo(spellId)
--castTime zero represents an instant cast or a channeled cast
if (spellName) then
local spellDescription = GetSpellDescription(spellId)
local cooldownTime, globalCooldown = GetSpellBaseCooldown(spellId)
--local cooldown = cooldownTime / 1000
local bIsPassive = IsPassiveSpell(spellId, "player")
local chargesAvailable, maxCharges, chargeCooldownStart, rechargeTime, chargeModRate = GetSpellCharges(spellId)
local tResourceCost = GetSpellPowerCost(spellId)
local tResourceCost = GetSpellPowerCost(spellId)
--[=[
hasRequiredAura=false,
type=0,
+1 -1
View File
@@ -1,6 +1,6 @@
local dversion = 497
local dversion = 498
local major, minor = "DetailsFramework-1.0", dversion
local DF, oldminor = LibStub:NewLibrary(major, minor)
+32 -5
View File
@@ -1457,8 +1457,22 @@ detailsFramework.CastFrameFunctions = {
end
end,
UpdateCastingInfo = function(self, unit)
local name, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible, spellID = CastInfo.UnitCastingInfo(unit)
UpdateCastingInfo = function(self, 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?
if (not self:IsValid(unit, name, isTradeSkill, true)) then
@@ -1519,8 +1533,8 @@ detailsFramework.CastFrameFunctions = {
self:UpdateInterruptState()
end,
UNIT_SPELLCAST_START = function(self, unit)
self:UpdateCastingInfo(unit)
UNIT_SPELLCAST_START = function(self, unit, ...)
self:UpdateCastingInfo(unit, ...)
self:RunHooksForWidget("OnCastStart", self, self.unit, "UNIT_SPELLCAST_START")
end,
@@ -1570,7 +1584,20 @@ detailsFramework.CastFrameFunctions = {
UpdateChannelInfo = function(self, unit, ...)
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?
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
local major = "LibOpenRaid-1.0"
local CONST_LIB_VERSION = 119
local CONST_LIB_VERSION = 120
if (LIB_OPEN_RAID_MAX_VERSION) then
if (CONST_LIB_VERSION <= LIB_OPEN_RAID_MAX_VERSION) then
@@ -563,8 +563,8 @@ end
["sendPvPTalent_Schedule"] = 14,
["leaveCombat_Schedule"] = 18,
["encounterEndCooldownsCheck_Schedule"] = 24,
["sendKeystoneInfoToParty_Schedule"] = 2,
["sendKeystoneInfoToGuild_Schedule"] = 2,
--["sendKeystoneInfoToParty_Schedule"] = 2,
--["sendKeystoneInfoToGuild_Schedule"] = 2,
}
openRaidLib.Schedules = {
@@ -613,7 +613,7 @@ end
if (openRaidLib.Schedules.IsUniqueTimerOnCooldown(namespace, scheduleName)) then
return
end
time = defaultScheduleCooldownTimeByScheduleName[scheduleName]
time = defaultScheduleCooldownTimeByScheduleName[scheduleName] or time
else
openRaidLib.Schedules.CancelUniqueTimer(namespace, scheduleName)
end
@@ -2689,11 +2689,17 @@ openRaidLib.commHandler.RegisterComm(CONST_COMM_COOLDOWNREQUEST_PREFIX, openRaid
local _, instanceType = GetInstanceInfo()
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
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
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
_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 version, build, date, tocversion = GetBuildInfo()
@@ -74,6 +79,12 @@
return Details222.ColorScheme[colorScheme]
end
function Details222.DebugMsg(...)
if (Details.debug) then
print("|cFFCCAAAADetails! Debug:|r", ...)
end
end
--namespace for damage spells (spellTable)
Details222.DamageSpells = {}
--namespace for texture
@@ -127,6 +138,8 @@
}
--store all data from the encounter journal
Details222.EncounterJournalDump = {}
--aura scanner
Details222.AuraScan = {}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--initialization stuff
@@ -1490,6 +1503,8 @@ Details222.UnitIdCache.Party = {
[4] = "party4",
}
Details222.UnitIdCache.PartyIds = {"player", "party1", "party2", "party3", "party4"}
Details222.UnitIdCache.Boss = {
[1] = "boss1",
[2] = "boss2",
+2
View File
@@ -686,6 +686,8 @@ function classCombat:NovaTabela(bTimeStarted, overallCombatObject, combatId, ...
combatObject.end_time = nil
end
combatObject.is_challenge = Details:IsInMythicPlus()
-- o container ir armazenar as classes de dano -- cria um novo container de indexes de seriais de jogadores --parmetro 1 classe armazenada no container, parmetro 2 = flag da classe
combatObject[1].need_refresh = true
combatObject[2].need_refresh = true
+124 -11
View File
@@ -3463,13 +3463,26 @@ function damageClass.PredictedAugSpellsOnEnter(self)
---@type actorcontainer
local utilityContainer = combatObject:GetContainer(DETAILS_ATTRIBUTE_MISC)
---@type table<spellid, table<spellid, number, actorname, actorname, class, boolean>>
local buffUptimeTable = {}
--for each actor in the container
local CONST_SPELLID_EBONMIGHT = 395152
local CONST_SPELLID_PRESCIENCE = 410089
local CONST_SPELLID_BLACKATTUNEMENT = 403264
---@type actor[]
local augmentationEvokers = {}
--prescience and ebon might updatime on each actor
for _, actorObject in utilityContainer:ListActors() do
---@type spellcontainer
local receivedBuffs = actorObject.received_buffs_spells
--check if the actor is an augmentation evoker
if (actorObject.spec == 1473) then
augmentationEvokers[#augmentationEvokers+1] = actorObject
end
if (receivedBuffs and actorObject:IsPlayer() and actorObject:IsGroupPlayer()) then
for sourceNameSpellId, spellTable in receivedBuffs:ListSpells() do
local sourceName, spellId = strsplit("@", sourceNameSpellId)
@@ -3477,20 +3490,28 @@ function damageClass.PredictedAugSpellsOnEnter(self)
spellId = tonumber(spellId)
local spellName, _, spellIcon = Details.GetSpellInfo(spellId)
if (spellName) then
if (spellName and spellId) then
sourceName = detailsFramework:RemoveRealmName(sourceName)
local targetName = actorObject:Name()
targetName = detailsFramework:RemoveRealmName(targetName)
local uptime = spellTable.uptime or 0
buffUptimeTable[#buffUptimeTable+1] = {spellId, uptime, sourceName, targetName, actorObject:Class()}
local bCanShowOnTooltip = true
buffUptimeTable[spellId] = buffUptimeTable[spellId] or {}
table.insert(buffUptimeTable[spellId], {spellId, uptime, sourceName, targetName, actorObject:Class(), bCanShowOnTooltip})
end
end
end
end
end
table.sort(buffUptimeTable, Details.Sort2)
for spellId, buffTable in pairs(buffUptimeTable) do
local totalUptime = 0
for i = 1, #buffTable do
totalUptime = totalUptime + buffTable[i][2]
end
table.sort(buffTable, Details.Sort2)
end
Details:FormatCooltipForSpells()
Details:AddTooltipSpellHeaderText(Loc ["STRING_SPELLS"], headerColor, #buffUptimeTable, Details.tooltip_spell_icon.file, unpack(Details.tooltip_spell_icon.coords))
@@ -3499,24 +3520,86 @@ function damageClass.PredictedAugSpellsOnEnter(self)
local iconSize = 22
local iconBorderInfo = Details.tooltip.icon_border_texcoord
--add the total combat time into the tooltip
local combatTimeMinutes, combatTimeSeconds = math.floor(combatTime / 60), math.floor(combatTime % 60)
GameCooltip:AddLine("Combat Time", combatTimeMinutes .. "m " .. combatTimeSeconds .. "s" .. " (" .. format("%.1f", 100) .. "%)")
GameCooltip:AddIcon([[Interface\TARGETINGFRAME\UnitFrameIcons]], nil, nil, iconSize, iconSize, iconBorderInfo.L, iconBorderInfo.R, iconBorderInfo.T, iconBorderInfo.B)
Details:AddTooltipBackgroundStatusbar(false, 100, true, "green")
Details:AddTooltipBackgroundStatusbar(false, 100, true, "limegreen")
if (#buffUptimeTable > 0) then
for i = 1, min(30, #buffUptimeTable) do
local uptimeTable = buffUptimeTable[i]
GameCooltip:AddLine("", "")
GameCooltip:AddIcon("", nil, nil, 1, 1)
local ebonMightTable = buffUptimeTable[CONST_SPELLID_EBONMIGHT][1]
if (ebonMightTable) then
local uptime = ebonMightTable[2]
local spellName, _, spellIcon = _GetSpellInfo(CONST_SPELLID_EBONMIGHT)
local uptimePercent = uptime / combatTime * 100
local sourceName = ebonMightTable[3]
if (uptime <= combatTime) then
local minutes, seconds = math.floor(uptime / 60), math.floor(uptime % 60)
if (minutes > 0) then
GameCooltip:AddLine(spellName, minutes .. "m " .. seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, sourceName and "limegreen")
else
GameCooltip:AddLine(spellName, seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, sourceName and "limegreen")
end
GameCooltip:AddIcon(spellIcon, nil, nil, iconSize, iconSize, iconBorderInfo.L, iconBorderInfo.R, iconBorderInfo.T, iconBorderInfo.B)
end
end
GameCooltip:AddLine("", "")
GameCooltip:AddIcon("", nil, nil, 1, 1)
for i = 1, #augmentationEvokers do
local actorObject = augmentationEvokers[i]
if (actorObject:Name() == actorName) then
local buffUptimeSpellContainer = actorObject:GetSpellContainer("buff")
if (buffUptimeSpellContainer) then
local spellTable = buffUptimeSpellContainer:GetSpell(403264)
if (spellTable) then
local uptime = spellTable.uptime
local spellName, _, spellIcon = _GetSpellInfo(CONST_SPELLID_BLACKATTUNEMENT)
local uptimePercent = uptime / combatTime * 100
if (uptime <= combatTime) then
local minutes, seconds = math.floor(uptime / 60), math.floor(uptime % 60)
if (minutes > 0) then
GameCooltip:AddLine(spellName, minutes .. "m " .. seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, "limegreen")
else
GameCooltip:AddLine(spellName, seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, "limegreen")
end
GameCooltip:AddIcon(spellIcon, nil, nil, iconSize, iconSize, iconBorderInfo.L, iconBorderInfo.R, iconBorderInfo.T, iconBorderInfo.B)
end
end
end
end
end
GameCooltip:AddLine("", "")
GameCooltip:AddIcon("", nil, nil, 1, 1)
--add the buff uptime into the tooltip
local allPrescienceTargets = buffUptimeTable[CONST_SPELLID_PRESCIENCE]
if (#allPrescienceTargets > 0) then
for i = 1, math.min(30, #allPrescienceTargets) do
local uptimeTable = allPrescienceTargets[i]
local spellId = uptimeTable[1]
local uptime = uptimeTable[2]
local sourceName = uptimeTable[3]
local targetName = uptimeTable[4]
local targetClass = uptimeTable[5]
local bCanShow = uptimeTable[6]
local uptimePercent = uptime / combatTime * 100
if (uptime > 0 and uptimePercent < 99.5) then
if (uptime > 0 and uptimePercent < 99.5 and bCanShow) then
local spellName, _, spellIcon = _GetSpellInfo(spellId)
if (sourceName) then
@@ -3529,10 +3612,10 @@ function damageClass.PredictedAugSpellsOnEnter(self)
local minutes, seconds = math.floor(uptime / 60), math.floor(uptime % 60)
if (minutes > 0) then
GameCooltip:AddLine(spellName, minutes .. "m " .. seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, sourceName and "green")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, sourceName and "limegreen")
else
GameCooltip:AddLine(spellName, seconds .. "s" .. " (" .. format("%.1f", uptimePercent) .. "%)")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, sourceName and "green")
Details:AddTooltipBackgroundStatusbar(false, uptimePercent, true, sourceName and "limegreen")
end
GameCooltip:AddIcon(spellIcon, nil, nil, iconSize, iconSize, iconBorderInfo.L, iconBorderInfo.R, iconBorderInfo.T, iconBorderInfo.B)
@@ -3542,6 +3625,36 @@ function damageClass.PredictedAugSpellsOnEnter(self)
else
GameCooltip:AddLine(Loc ["STRING_NO_SPELL"])
end
local evokerObject = combatObject:GetActor(DETAILS_ATTRIBUTE_MISC, actorName)
GameCooltip:AddLine(" ")
GameCooltip:AddIcon(" ", 1, 1, 10, 10)
if (evokerObject) then
GameCooltip:AddLine("Prescience Uptime by Amount of Applications")
local prescienceData = evokerObject.cleu_prescience_time --real time
if (prescienceData) then
prescienceData = prescienceData.stackTime
local totalTimeWithPrescienceUp = 0
for amountOfPrescienceApplied, time in ipairs(prescienceData) do
totalTimeWithPrescienceUp = totalTimeWithPrescienceUp + time
end
for amountOfPrescienceApplied, time in ipairs(prescienceData) do
if (time > 0) then
local uptimePercent = time / combatTime * 100
local timeString = detailsFramework:IntegerToTimer(time)
GameCooltip:AddLine("Presciece Applied: " .. amountOfPrescienceApplied, timeString .. " (" .. format("%.1f", uptimePercent) .. "%)")
--5199639 prescience icon
GameCooltip:AddIcon([[Interface\AddOns\Details\images\spells\prescience_time]], nil, nil, iconSize, iconSize)
Details:AddTooltipBackgroundStatusbar(false, time/totalTimeWithPrescienceUp*100, true, "green")
end
end
end
end
end
GameCooltip:AddLine("feature under test, can't disable atm")
+115 -81
View File
@@ -1335,115 +1335,93 @@ function _detalhes:CloseEnemyDebuffsUptime()
return
end
function _detalhes:CatchRaidDebuffUptime (in_or_out) -- "DEBUFF_UPTIME_IN"
function _detalhes:CatchRaidDebuffUptime(sOperationType) -- "DEBUFF_UPTIME_IN"
if (sOperationType == "DEBUFF_UPTIME_OUT") then
local combatObject = Details:GetCurrentCombat()
local utilityContainer = combatObject:GetContainer(DETAILS_ATTRIBUTE_MISC)
if (in_or_out == "DEBUFF_UPTIME_OUT") then
local combat = _detalhes.tabela_vigente
local misc_container = combat [4]._ActorTable --error attempt to index a new value
for _, actor in ipairs(misc_container) do
if (actor.debuff_uptime) then
for spellid, spell in pairs(actor.debuff_uptime_spells._ActorTable) do
if (spell.actived and spell.actived_at) then
spell.uptime = spell.uptime + _detalhes._tempo - spell.actived_at
actor.debuff_uptime = actor.debuff_uptime + _detalhes._tempo - spell.actived_at
spell.actived = false
spell.actived_at = nil
for _, actorObject in utilityContainer:ListActors() do
if (actorObject.debuff_uptime) then
for spellId, spellTable in pairs(actorObject.debuff_uptime_spells._ActorTable) do
if (spellTable.actived and spellTable.actived_at) then
spellTable.uptime = spellTable.uptime + _detalhes._tempo - spellTable.actived_at
actorObject.debuff_uptime = actorObject.debuff_uptime + _detalhes._tempo - spellTable.actived_at
spellTable.actived = false
spellTable.actived_at = nil
end
end
end
end
return
end
local cacheGetTime = GetTime()
elseif (sOperationType == "DEBUFF_UPTIME_IN") then
local cacheGetTime = GetTime()
if (IsInRaid()) then
if (IsInRaid()) then
local checked = {}
local checked = {}
for raidIndex = 1, GetNumGroupMembers() do
for raidIndex = 1, GetNumGroupMembers() do
local target = "raid"..raidIndex.."target"
local his_target = UnitGUID(target)
local target = "raid"..raidIndex.."target"
local his_target = UnitGUID(target)
if (his_target and not checked [his_target]) then
local rect = UnitReaction (target, "player")
if (rect and rect <= 4) then
if (his_target and not checked [his_target]) then
local rect = UnitReaction (target, "player")
if (rect and rect <= 4) then
checked [his_target] = true
for debuffIndex = 1, 41 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff (target, debuffIndex)
if (name and unitCaster) then
local playerGUID = UnitGUID(unitCaster)
if (playerGUID) then
local playerName, realmName = _UnitName (unitCaster)
if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName
end
_detalhes.parser:add_debuff_uptime (nil, cacheGetTime, playerGUID, playerName, 0x00000417, his_target, _UnitName (target), 0x842, nil, spellid, name, sOperationType)
end
end
end
end
end
end
elseif (IsInGroup()) then
local checked = {}
for raidIndex = 1, GetNumGroupMembers()-1 do
local his_target = UnitGUID("party"..raidIndex.."target")
local rect = UnitReaction ("party"..raidIndex.."target", "player")
if (his_target and not checked [his_target] and rect and rect <= 4) then
checked [his_target] = true
for debuffIndex = 1, 41 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff (target, debuffIndex)
for debuffIndex = 1, 40 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("party"..raidIndex.."target", debuffIndex)
if (name and unitCaster) then
local playerName, realmName = _UnitName (unitCaster)
local playerGUID = UnitGUID(unitCaster)
if (playerGUID) then
local playerName, realmName = _UnitName (unitCaster)
if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName
end
_detalhes.parser:add_debuff_uptime (nil, cacheGetTime, playerGUID, playerName, 0x00000417, his_target, _UnitName (target), 0x842, nil, spellid, name, in_or_out)
_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("party"..raidIndex.."target"), 0x842, nil, spellid, name, sOperationType)
end
end
end
end
end
end
elseif (IsInGroup()) then
local checked = {}
for raidIndex = 1, GetNumGroupMembers()-1 do
local his_target = UnitGUID("party"..raidIndex.."target")
local rect = UnitReaction ("party"..raidIndex.."target", "player")
local his_target = UnitGUID("playertarget")
local rect = UnitReaction ("playertarget", "player")
if (his_target and not checked [his_target] and rect and rect <= 4) then
checked [his_target] = true
for debuffIndex = 1, 40 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("party"..raidIndex.."target", debuffIndex)
if (name and unitCaster) then
local playerName, realmName = _UnitName (unitCaster)
local playerGUID = UnitGUID(unitCaster)
if (playerGUID) then
if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName
end
_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("party"..raidIndex.."target"), 0x842, nil, spellid, name, in_or_out)
end
end
end
end
end
local his_target = UnitGUID("playertarget")
local rect = UnitReaction ("playertarget", "player")
if (his_target and not checked [his_target] and rect and rect <= 4) then
for debuffIndex = 1, 40 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("playertarget", debuffIndex)
if (name and unitCaster) then
local playerName, realmName = _UnitName (unitCaster)
local playerGUID = UnitGUID(unitCaster)
if (playerGUID) then
if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName
end
_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("playertarget"), 0x842, nil, spellid, name, in_or_out)
end
end
end
end
else
local his_target = UnitGUID("playertarget")
if (his_target) then
local reaction = UnitReaction ("playertarget", "player")
if (reaction and reaction <= 4) then
for debuffIndex = 1, 40 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("playertarget", debuffIndex)
if (name and unitCaster) then
@@ -1453,7 +1431,28 @@ function _detalhes:CatchRaidDebuffUptime (in_or_out) -- "DEBUFF_UPTIME_IN"
if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName
end
_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("playertarget"), 0x842, nil, spellid, name, in_or_out)
_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("playertarget"), 0x842, nil, spellid, name, sOperationType)
end
end
end
end
else
local his_target = UnitGUID("playertarget")
if (his_target) then
local reaction = UnitReaction ("playertarget", "player")
if (reaction and reaction <= 4) then
for debuffIndex = 1, 40 do
local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("playertarget", debuffIndex)
if (name and unitCaster) then
local playerName, realmName = _UnitName (unitCaster)
local playerGUID = UnitGUID(unitCaster)
if (playerGUID) then
if (realmName and realmName ~= "") then
playerName = playerName .. "-" .. realmName
end
_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("playertarget"), 0x842, nil, spellid, name, sOperationType)
end
end
end
end
@@ -1672,6 +1671,10 @@ function _detalhes:CatchRaidBuffUptime(sOperationType)
-- _detalhes:Msg(string_output)
end
if (sOperationType == "BUFF_UPTIME_OUT") then
end
end
local Sort2Reverse = function(a, b)
@@ -2595,6 +2598,17 @@ function atributo_misc:r_connect_shadow(actor, no_refresh, combat_object)
DetailsFramework.table.addunique(shadow.pets, petName)
end
if (actor.cleu_prescience_time) then
local shadowPrescienceStackData = shadow.cleu_prescience_time
if (not shadowPrescienceStackData) then
shadow.cleu_prescience_time = detailsFramework.table.copy({}, actor.cleu_prescience_time)
else
for amountOfPrescienceApplied, time in pairs(actor.cleu_prescience_time.stackTime) do
shadow.cleu_prescience_time.stackTime[amountOfPrescienceApplied] = shadow.cleu_prescience_time.stackTime[amountOfPrescienceApplied] + time
end
end
end
if (actor.cc_done) then
if (not shadow.cc_done_targets) then
shadow.cc_done = _detalhes:GetOrderNumber()
@@ -2948,6 +2962,17 @@ function _detalhes.clear:c_atributo_misc (este_jogador)
end
atributo_misc.__add = function(tabela1, tabela2)
if (tabela2.cleu_prescience_time) then --timeline
local shadowPrescienceStackData = tabela1.cleu_prescience_time
if (not shadowPrescienceStackData) then
tabela1.cleu_prescience_time = detailsFramework.table.copy({}, tabela2.cleu_prescience_time)
else
for amountOfPrescienceApplied, time in pairs(tabela2.cleu_prescience_time.stackTime) do
tabela1.cleu_prescience_time.stackTime[amountOfPrescienceApplied] = tabela1.cleu_prescience_time.stackTime[amountOfPrescienceApplied] + time
end
end
end
if (tabela2.cc_done) then
tabela1.cc_done = tabela1.cc_done + tabela2.cc_done
@@ -3223,6 +3248,15 @@ local subtractKeyValues = function(habilidade, habilidade_tabela1)
end
atributo_misc.__sub = function(tabela1, tabela2)
if (tabela2.cleu_prescience_time) then --timeline
local shadowPrescienceStackData = tabela1.cleu_prescience_time
if (shadowPrescienceStackData) then
for amountOfPrescienceApplied, time in pairs(tabela2.cleu_prescience_time.stackTime) do
tabela1.cleu_prescience_time.stackTime[amountOfPrescienceApplied] = tabela1.cleu_prescience_time.stackTime[amountOfPrescienceApplied] - time
end
end
end
if (tabela2.cc_done) then
tabela1.cc_done = tabela1.cc_done - tabela2.cc_done
+4 -4
View File
@@ -153,7 +153,7 @@ function segmentClass:AddToOverallData(combatObject)
if (combatObject.instance_type == "raid" and combatObject.is_boss) then
if (Details.last_encounter ~= Details.last_encounter2) then
if (Details.debug) then
Details:Msg("(debug) new boss detected 'overall_clear_newboss' is true, cleaning overall data.")
--Details:Msg("(debug) new boss detected 'overall_clear_newboss' is true, cleaning overall data.")
end
for index, combat in ipairs(Details:GetCombatSegments()) do
@@ -198,7 +198,7 @@ function segmentClass:AddToOverallData(combatObject)
end
if (Details.debug) then
Details:Msg("(debug) adding the segment to overall data: " .. (combatObject:GetCombatName(true) or "no name") .. " with time of: " .. (combatObject:GetCombatTime() or "no time"))
--Details:Msg("(debug) adding the segment to overall data: " .. (combatObject:GetCombatName(true) or "no name") .. " with time of: " .. (combatObject:GetCombatTime() or "no time"))
end
Details.tabela_overall = Details.tabela_overall + combatObject
@@ -487,7 +487,7 @@ function Details222.Combat.AddCombat(combatToBeAdded)
if (bCanAddToOverall) then
if (Details.debug) then
Details:Msg("(debug) overall data flag match addind the combat to overall data.")
--Details:Msg("(debug) overall data flag match addind the combat to overall data.")
end
--add to overall data
segmentClass:AddToOverallData(combatToBeAdded)
@@ -566,7 +566,7 @@ function segmentClass:AddCombat(combatObject)
local canAddToOverall = Details:CanAddCombatToOverall(combatObject)
if (canAddToOverall) then
if (Details.debug) then
Details:Msg("(debug) overall data flag match addind the combat to overall data.")
--Details:Msg("(debug) overall data flag match addind the combat to overall data.")
end
segmentClass:AddToOverallData(combatObject)
end
+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 (...)
if (Details.debug) then
Details:Msg("(debug) |cFFFFFF00started a new combat|r|cFFFF7700", Details.encounter_table and Details.encounter_table.name or "")
local from = debugstack(2, 1, 0)
print("from:", from)
--local from = debugstack(2, 1, 0)
--print("from:", from)
end
local segmentsTable = Details:GetCombatSegments()
@@ -355,14 +355,29 @@
local bFromCombatStart = true
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()
--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")
end)
Details:CatchRaidDebuffUptime("DEBUFF_UPTIME_IN")
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)
--we already have boss information? build .is_boss table
@@ -464,6 +479,8 @@
---@type combat
local currentCombat = Details:GetCurrentCombat()
Details:SendEvent("COMBAT_PLAYER_LEAVING", nil, currentCombat)
if (currentCombat.bIsClosed) then
return
end
@@ -505,13 +522,17 @@
end
end
Details:OnCombatPhaseChanged() --.PhaseData is nil here on alpha-32
Details:OnCombatPhaseChanged()
if (currentCombat.bossFunction) then
Details:CancelTimer(currentCombat.bossFunction)
currentCombat.bossFunction = nil
end
if (currentCombat.is_challenge or Details.debug) then
--Details222.AuraScan.Stop() --combat ended (m+ active)
end
--stop combat ticker
Details:StopCombatTicker()
@@ -621,7 +642,7 @@
local enemy = Details:FindEnemy()
if (enemy and Details.debug) then
Details:Msg("(debug) enemy found", enemy)
--Details:Msg("(debug) enemy found", enemy)
end
currentCombat.enemy = enemy
@@ -692,7 +713,7 @@
Details:CaptureSet(false, "spellcast", false, 15)
if (Details.debug) then
Details:Msg("(debug) freezing parser for 15 seconds.")
--Details:Msg("(debug) freezing parser for 15 seconds.")
end
end
@@ -839,12 +860,12 @@
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
Details:Destroy(Details.encounter_table)
else
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
+2 -2
View File
@@ -1869,7 +1869,7 @@ local MIN_ILEVEL_TO_STORE = 50
local LOOP_TIME = 7
function _detalhes:IlvlFromNetwork (player, realm, core, serialNumber, itemLevel, talentsSelected, currentSpec)
if (_detalhes.debug) then
if (_detalhes.debug and false) then
local talents = "Invalid Talents"
if (type(talentsSelected) == "table") then
talents = ""
@@ -1877,7 +1877,7 @@ function _detalhes:IlvlFromNetwork (player, realm, core, serialNumber, itemLevel
talents = talents .. talentsSelected [i] .. ","
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
if (not player) then
+4 -4
View File
@@ -683,9 +683,9 @@ local classTypeUtility = Details.atributos.misc
if (Details.debug) then
if (bShouldForceCollect) then
Details:Msg("(debug) collecting garbage with forced state:", bShouldForceCollect)
--Details:Msg("(debug) collecting garbage with forced state:", bShouldForceCollect)
else
Details:Msg("(debug) collecting garbage.")
--Details:Msg("(debug) collecting garbage.")
end
end
@@ -730,8 +730,8 @@ local classTypeUtility = Details.atributos.misc
Details222.GarbageCollector.lastCollectTime = Details._tempo
if (Details.debug) then
Details:Msg("(debug) executing: collectgarbage().")
collectgarbage()
--Details:Msg("(debug) executing: collectgarbage().")
--collectgarbage()
end
end
+73 -51
View File
@@ -190,12 +190,12 @@
---@field key7 number
local augmentation_aura_list = {
[395152] = true,--ebon might (evoker 10.1.5) 395296 = the evoker buff on it self
[413984] = true,
[410089] = true,--prescience (evoker 10.1.5)
[409560] = true,
[360827] = true,
[410263] = true,
[395152] = true, --ebon might (evoker 10.1.5) 395296 = the evoker buff on it self
[413984] = true, --Shifting Sands
[410089] = true, --prescience (evoker 10.1.5)
[409560] = true, --Temporal Wound
[360827] = true, --Blistering Scales
[410263] = true, --Inferno's Blessing
}
--list of buffs given by another player but should also be credited to the which received it
@@ -213,6 +213,7 @@
local augmentation_cache = {
ebon_might = {},
prescience = {},
prescience_stacks = {},
---@type table<serial, evokereonsbreathinfo[]>
breath_targets = {},
flyaway = {},
@@ -778,7 +779,6 @@
sourceFlags = reflection.who_flags
--data of the aura that caused the reflection
--print("2", spellid, GetSpellInfo(spellid))
isreflected = spellId --which spell was reflected
spellId = reflection.spellid --which spell made the reflection
spellName = reflection.spellname
@@ -908,7 +908,7 @@
Details.WhoAggroTimer = C_Timer.NewTimer(0.1, whoAggro)
Details.WhoAggroTimer.HitBy = "|cFFFFFF00First Hit|r: " .. (link or "") .. " from " .. (sourceName or "Unknown")
print("debug:", Details.WhoAggroTimer.HitBy)
Details:Msg("(debug):", Details.WhoAggroTimer.HitBy)
end
Details:EntrarEmCombate(sourceSerial, sourceName, sourceFlags, targetSerial, targetName, targetFlags)
@@ -1714,7 +1714,7 @@
local this_event = t[i]
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
this_event [1] = true --true if this is a damage || false for healing
@@ -1809,7 +1809,7 @@
local this_event = t [i]
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
this_event [1] = true --true if this is a damage || false for healing
@@ -1929,7 +1929,7 @@
local this_event = t [i]
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
this_event [1] = true --true if this is a damage || false for healing
@@ -2827,7 +2827,7 @@
local thisEvent = deathLog[i]
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
thisEvent[1] = 5 --5 = buff aplication
@@ -3328,7 +3328,7 @@
local this_event = t [i]
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
this_event [1] = 4 --4 = debuff aplication
@@ -3375,7 +3375,7 @@
local this_event = t [i]
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
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)
if (petName) then
ownerActor = _current_misc_container:GetOrCreateActor(ownerGUID, ownerName, ownerFlags, true)
--print("pet found:", petName, ownerName, ownerGUID, ownerFlags)
end
end
@@ -4084,10 +4083,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
amountOfCasts = amountOfCasts + 1
_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
--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[5] = 0 --player health when the event happened
newEventTable[6] = enemyName --source name
--print("addin enemy cast event", alvo_name, i, enemyCastTime+0.1, ">", eventTime)
tinsert(eventsBeforePlayerDeath, i, newEventTable)
currentEnemyCastIndex = enemyCastEventIndex + 1
break
@@ -5137,6 +5131,29 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
return Details.zone_type
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(...)
return Details.Schedules.After(1, Details.Check_ZONE_CHANGED_NEW_AREA)
end
@@ -5152,6 +5169,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
_in_resting_zone = IsResting()
parser:WipeSourceCache()
Details.listener:UnregisterEvent("UNIT_FLAGS")
_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
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
Details:LeftArena()
end
@@ -5260,6 +5274,8 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
Details.ScheduleLoadStorage()
end
end
Details.listener:RegisterEvent("UNIT_FLAGS")
end
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
local openRaidLib = LibStub:GetLibrary("LibOpenRaid-1.0", true)
if (openRaidLib) then
print("sent my keystone to party")
openRaidLib.KeystoneInfoManager.SendPlayerKeystoneInfoToParty()
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
end
Details222.DebugMsg("|cFFFFFF00Who Aggro by UNIT_FLAGS:", Details.LastAggro)
if (not Details.WhoAggroTimer and Details.announce_firsthit.enabled) then
Details.WhoAggroTimer = C_Timer.NewTimer(0.1, whoAggro)
for i = 1, 5 do
@@ -5382,8 +5399,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
return
end
Details222.Cache.ClearAugmentationCache()
Details.latest_ENCOUNTER_END = Details.latest_ENCOUNTER_END or 0
if (Details.latest_ENCOUNTER_END + 15 > GetTime()) then
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, ...)
Details222.Cache.ClearAugmentationCache()
Details:Destroy(Details.encounter_table)
Details:Destroy(dk_pets_cache.army)
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)
function Details:RunScheduledEventsAfterCombat(OnRegenEnabled)
if (Details.debug) then
Details:Msg("(debug) running scheduled events after combat end.")
--Details:Msg("(debug) running scheduled events after combat end.")
end
@@ -5724,20 +5741,14 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
wipe(keystoneLevels)
local libOpenRaid = LibStub("LibOpenRaid-1.0", true)
--print("saveGroupMembersKeystoneLevel() called", libOpenRaid, GetNumGroupMembers()-1)
for i = 1, GetNumGroupMembers()-1 do
local unitId = "party" .. i
if (UnitExists(unitId)) then
local unitKeystoneInfo = libOpenRaid.GetKeystoneInfo(unitId)
--print("unitExists", unitId, unitKeystoneInfo)
if (unitKeystoneInfo) then
local unitName = Details:GetFullName(unitId)
keystoneLevels[unitName] = unitKeystoneInfo.level
--print("saved keystone level for", unitName, unitKeystoneInfo.level)
end
else
--print("unit does not exist", unitId)
end
end
@@ -5747,7 +5758,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
if (unitKeystoneInfo) then
local unitName = Details:GetFullName(unitId)
keystoneLevels[unitName] = unitKeystoneInfo.level
--print("saved keystone level for", unitName, unitKeystoneInfo.level)
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()
if (ChallengeModeCompleteBanner) then
ChallengeModeCompleteBanner.timeToHold = 0.1
--print("ChallengeModeCompleteBanner.timeToHold Existed!")
else
--print("ChallengeModeCompleteBanner.timeToHold DID NOT Existed!")
end
end)
end
@@ -5852,10 +5859,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
end
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
Details:InstanceCall(autoSwapDynamicOverallData, false)
end
@@ -5949,6 +5952,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
end
end
--[=[
--this is mostly triggered when the player enters in a dual against another player
function Details.parser_functions:UNIT_FACTION(unit)
if (true) then
@@ -6001,6 +6005,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
end
end
end
--]=]
function Details.parser_functions:ROLE_CHANGED_INFORM(...)
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
amount = amount + 1
end
print("parser damage_cache", amount)
Details:Msg("parser damage_cache", amount)
amount = 0
for n, nn in pairs(damage_cache_pets) do
amount = amount + 1
end
print("parser damage_cache_pets", amount)
Details:Msg("parser damage_cache_pets", amount)
amount = 0
for n, nn in pairs(damage_cache_petsOwners) do
amount = amount + 1
end
print("parser damage_cache_petsOwners", amount)
Details:Msg("parser damage_cache_petsOwners", amount)
amount = 0
for n, nn in pairs(healing_cache) do
amount = amount + 1
end
print("parser healing_cache", amount)
Details:Msg("parser healing_cache", amount)
amount = 0
for n, nn in pairs(energy_cache) do
amount = amount + 1
end
print("parser energy_cache", amount)
Details:Msg("parser energy_cache", amount)
amount = 0
for n, nn in pairs(misc_cache) do
amount = amount + 1
end
print("parser misc_cache", amount)
print("group damage", #Details.cache_damage_group)
print("group damage", #Details.cache_healing_group)
Details:Msg("parser misc_cache", amount)
Details:Msg("group damage", #Details.cache_damage_group)
Details:Msg("group damage", #Details.cache_healing_group)
end
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
end
--called when the zone type changes and ENCOUNTER_END event
function Details222.Cache.ClearAugmentationCache()
Details:Destroy(augmentation_cache.ebon_might) --~roskash
Details:Destroy(augmentation_cache.prescience)
Details:Destroy(augmentation_cache.shield)
Details:Destroy(augmentation_cache.infernobless)
Details:Destroy(augmentation_cache.breath_targets)
Details:Destroy(augmentation_cache.prescience_stacks)
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
Details:Destroy(damage_cache)
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
Details:Destroy(augmentation_cache.ebon_might) --~roskash
Details:Destroy(augmentation_cache.prescience)
Details:Destroy(augmentation_cache.prescience_stacks)
Details:Destroy(augmentation_cache.shield)
Details:Destroy(augmentation_cache.infernobless)
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
return Details:ClearParserCache(bIsFromCombatStart)
Details:ClearParserCache(bIsFromCombatStart)
end
function Details.DumpIgnoredNpcs()
@@ -7275,3 +7284,16 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
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
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)
if (spellIdToFind == spellId and UnitExists(sourceUnitId)) then
if (casterName == Details:GetUnitNameForAPI(sourceUnitId)) then
@@ -1287,7 +1291,7 @@ end
--coach feature
if (not Details.Coach.Server.IsEnabled()) 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
@@ -85,6 +85,24 @@ local updateTargetBar = function(targetBar, index, combatObject, scrollFrame, he
--statusbar color
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.actorName = bkTargetData.name
+4
View File
@@ -36,6 +36,7 @@
["COMBAT_ENCOUNTER_END"] = {},
["COMBAT_PLAYER_ENTER"] = {},
["COMBAT_PLAYER_LEAVE"] = {},
["COMBAT_PLAYER_LEAVING"] = {},
["COMBAT_PLAYER_TIMESTARTED"] = {},
["COMBAT_BOSS_WIPE"] = {},
["COMBAT_BOSS_DEFEATED"] = {},
@@ -49,6 +50,7 @@
["COMBAT_ARENA_END"] = {},
["COMBAT_MYTHICDUNGEON_START"] = {},
["COMBAT_MYTHICDUNGEON_END"] = {},
["COMBAT_MYTHICPLUS_OVERALL_READY"] = {},
--area
["ZONE_TYPE_CHANGED"] = {},
@@ -100,6 +102,7 @@ local common_events = {
["COMBAT_ENCOUNTER_END"] = true,
["COMBAT_PLAYER_ENTER"] = true,
["COMBAT_PLAYER_LEAVE"] = true,
["COMBAT_PLAYER_LEAVING"] = true,
["COMBAT_PLAYER_TIMESTARTED"] = true,
["COMBAT_BOSS_WIPE"] = true,
["COMBAT_BOSS_DEFEATED"] = true,
@@ -113,6 +116,7 @@ local common_events = {
["COMBAT_ARENA_END"] = true,
["COMBAT_MYTHICDUNGEON_START"] = true,
["COMBAT_MYTHICDUNGEON_END"] = true,
["COMBAT_MYTHICPLUS_OVERALL_READY"] = true,
["GROUP_ONENTER"] = true,
["GROUP_ONLEAVE"] = true,
["ZONE_TYPE_CHANGED"] = true,
+4
View File
@@ -64,6 +64,8 @@ function DetailsMythicPlusFrame.MergeSegmentsOnEnd() --~merge
local newCombat = Details:GetCurrentCombat()
local segmentsTable = Details:GetCombatSegments()
newCombat.is_challenge = true
local timeInCombat = 0
local startDate, endDate = "", ""
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)
end
end
Details:SendEvent("COMBAT_MYTHICPLUS_OVERALL_READY")
end
--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")
if (openRaidLib) then
if (not DetailsKeystoneInfoFrame) then
---@type detailsframework
local detailsFramework = DetailsFramework
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_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_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:SetScript("OnMouseDown", nil) --disable framework native moving scripts
@@ -1959,15 +1961,43 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
LibWindow.MakeDraggable(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)
local statusBar = DetailsFramework:CreateStatusBar(f)
local statusBar = detailsFramework:CreateStatusBar(f)
statusBar.text = statusBar:CreateFontString(nil, "overlay", "GameFontNormal")
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")
DetailsFramework:SetFontSize(statusBar.text, 11)
DetailsFramework:SetFontColor(statusBar.text, "gray")
statusBar.text:SetText("By Terciob | From Details! Damage Meter")
detailsFramework:SetFontSize(statusBar.text, 12)
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
local headerTable = {
@@ -1995,8 +2025,8 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
header_click_callback = headerOnClickCallback,
}
f.Header = DetailsFramework:CreateHeader(f, headerTable, headerOptions, "DetailsKeystoneInfoFrameHeader")
f.Header:SetPoint("topleft", f, "topleft", 5, -25)
f.Header = detailsFramework:CreateHeader(f, headerTable, headerOptions, "DetailsKeystoneInfoFrameHeader")
f.Header:SetPoint("topleft", f, "topleft", 3, -25)
--scroll
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)
--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.keystoneLevelText.text = level
line.dungeonNameText.text = mapName
DetailsFramework:TruncateText(line.dungeonNameText, 240)
detailsFramework:TruncateText(line.dungeonNameText, 240)
line.classicDungeonNameText.text = "" --mapNameChallenge
DetailsFramework:TruncateText(line.classicDungeonNameText, 120)
detailsFramework:TruncateText(line.classicDungeonNameText, 120)
line.inMyParty = inMyParty > 0
line.inMyGuild = isGuildMember
@@ -2083,8 +2113,8 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
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)
DetailsFramework:ReskinSlider(scrollFrame)
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)
scrollFrame:SetPoint("topleft", f.Header, "bottomleft", -1, -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:SetBackdropColor(unpack(backdrop_color))
DetailsFramework:Mixin(line, DetailsFramework.HeaderFunctions)
detailsFramework:Mixin(line, detailsFramework.HeaderFunctions)
line:SetScript("OnEnter", lineOnEnter)
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)
--player name
local playerNameText = DetailsFramework:CreateLabel(line)
local playerNameText = detailsFramework:CreateLabel(line, "")
--keystone level
local keystoneLevelText = DetailsFramework:CreateLabel(line)
local keystoneLevelText = detailsFramework:CreateLabel(line, "")
--dungeon name
local dungeonNameText = DetailsFramework:CreateLabel(line)
local dungeonNameText = detailsFramework:CreateLabel(line, "")
--classic dungeon name
local classicDungeonNameText = DetailsFramework:CreateLabel(line)
local classicDungeonNameText = detailsFramework:CreateLabel(line, "")
--player rating
local ratingText = DetailsFramework:CreateLabel(line)
local ratingText = detailsFramework:CreateLabel(line, "")
line.icon = icon
line.playerNameText = playerNameText
@@ -2170,6 +2200,16 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
local guildUsers = {}
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
local realmNameGsub = "%-.*"
local guildName = GetGuildInfo("player")
@@ -2258,18 +2298,23 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
--sort by player class
if (columnIndex == 1) then
sortByIndex = 5
--sort by player name
elseif (columnIndex == 2) then
sortByIndex = 1
--sort by keystone level
elseif (columnIndex == 3) then
sortByIndex = 2
--sort by dungeon name
elseif (columnIndex == 4) then
sortByIndex = 3
--sort by classic dungeon name
--elseif (columnIndex == 5) then
-- sortByIndex = 4
--sort by mythic+ ranting
elseif (columnIndex == 5) then
sortByIndex = 6
@@ -2290,7 +2335,7 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
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
if (IsInGroup() and not IsInRaid()) then
@@ -2334,17 +2379,23 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
end)
end
--call an update on the guild roster
if (C_GuildInfo and C_GuildInfo.GuildRoster) then
C_GuildInfo.GuildRoster()
end
--show the frame
DetailsKeystoneInfoFrame:Show()
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
openRaidLib.RequestKeystoneDataFromRaid()
@@ -2352,8 +2403,6 @@ if (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE) then
openRaidLib.RequestKeystoneDataFromParty()
end
openRaidLib.RequestKeystoneDataFromGuild()
DetailsKeystoneInfoFrame.RefreshData()
end
end
+301 -4
View File
@@ -3,6 +3,13 @@ local addonName, Details222 = ...
local Details = Details
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 UnitIsUnit = UnitIsUnit
@@ -11,12 +18,240 @@ local augmentationCache = Details222.SpecHelpers[1473].augmentation_cache
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)
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
end
@@ -43,10 +278,42 @@ function augmentationFunctions.BuffIn(token, time, sourceSerial, sourceName, sou
end
elseif (spellId == 410089) then --prescience
--added Prescience to a player (targetName)
augmentationCache.prescience[targetSerial] = augmentationCache.prescience[targetSerial] or {}
local evokerInfo = {sourceSerial, sourceName, sourceFlags, amount}
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
local unitIDAffected = Details:FindUnitIDByUnitSerial(targetSerial)
if (unitIDAffected) then
@@ -76,6 +343,8 @@ function augmentationFunctions.BuffIn(token, time, sourceSerial, sourceName, sou
end
end
function augmentationFunctions.BuffRefresh(token, time, sourceSerial, sourceName, sourceFlags, targetSerial, targetName, targetFlags, targetFlags2, spellId, spellName, spellschool, tipo, amount)
if (spellId == 395152) then
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)
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
--print("tinha buff", targetName, targetSerial)
for index, evokerInfo in ipairs(augmentationCache.ebon_might[targetSerial]) do
@@ -159,7 +432,7 @@ function augmentationFunctions.BuffOut(token, time, sourceSerial, sourceName, so
end
end
elseif (spellId == 413984) then
elseif (spellId == 413984) then --ss
if (augmentationCache.ss[targetSerial]) then
for index, evokerInfo in ipairs(augmentationCache.ss[targetSerial]) do
if (evokerInfo[1] == sourceSerial) then
@@ -169,7 +442,7 @@ function augmentationFunctions.BuffOut(token, time, sourceSerial, sourceName, so
end
end
elseif (spellId == 410089) then
elseif (spellId == 410089) then --prescience
if (augmentationCache.prescience[targetSerial]) then
for index, evokerInfo in ipairs(augmentationCache.prescience[targetSerial]) do
if (evokerInfo[1] == sourceSerial) then
@@ -177,6 +450,30 @@ function augmentationFunctions.BuffOut(token, time, sourceSerial, sourceName, so
break
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
elseif (spellId == 360827) then
+3 -3
View File
@@ -4074,7 +4074,7 @@ local SplitLoadFunc = function(self, deltaTime)
if (not container) then
if (Details.debug) then
Details:Msg("(debug) finished index spells.")
--Details:Msg("(debug) finished index spells.")
end
SplitLoadFrame:SetScript("OnUpdate", nil)
return
@@ -4096,7 +4096,7 @@ local SplitLoadFunc = function(self, deltaTime)
if (SplitLoadFrame.NextActorContainer == 5) then
SplitLoadFrame:SetScript("OnUpdate", nil)
if (Details.debug) then
Details:Msg("(debug) finished index spells.")
--Details:Msg("(debug) finished index spells.")
end
return
end
@@ -4187,7 +4187,7 @@ end
function Details.StoreSpells()
if (Details.debug) then
Details:Msg("(debug) started to index spells.")
--Details:Msg("(debug) started to index spells.")
end
SplitLoadFrame:SetScript("OnUpdate", SplitLoadFunc)
SplitLoadFrame.NextActorContainer = 1
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB