local Details = _G.Details local detailsFramework = _G.DetailsFramework local openRaidLib = LibStub:GetLibrary("LibOpenRaid-1.0", true) local addonName, Details222 = ... local bitBand = bit.band local CONST_OBJECT_TYPE_PLAYER = 0x00000400 local CONST_OBJECT_TYPE_NEUTRAL_OR_ENEMY = 0x00000060 local actorSpellContainers = { "debuff", "buff", "spell", "cooldowns", "crowdcontrol", "dispel" } Details222.Mixins.ActorMixin = { ---return a table containing the spellContainers names: 'debuff', 'buff', 'spell', 'cooldowns', 'crowdcontrol' ---@return string[] GetSpellContainerNames = function() return actorSpellContainers end, ---return a spellContainer from an actor ---@param actor actor ---@param containerType string ---@return spellcontainer|nil GetSpellContainer = function(actor, containerType) if (containerType == "debuff") then return actor.debuff_uptime_spells elseif (containerType == "buff") then return actor.buff_uptime_spells elseif (containerType == "spell") then return actor.spells elseif (containerType == "cooldowns") then return actor.cooldowns_defensive_spells elseif (containerType == "crowdcontrol") then ---@cast actor actorutility return actor.cc_done_spells elseif (containerType == "dispel") then ---@cast actor actorutility return actor.dispell_spells elseif (containerType == "dispelwhat") then ---@cast actor actorutility return actor.dispell_oque elseif (containerType == "interrupt") then ---@cast actor actorutility return actor.interrupt_spells elseif (containerType == "interruptwhat") then ---@cast actor actorutility return actor.interrompeu_oque --is intended to be in portuguese elseif (containerType == "interrupttargets") then ---@cast actor actorutility return actor.interrupt_targets end end, ---return a spellTable from a spellContainer ---@param actor actor ---@param spellContainerName string ---@param spellId number ---@return spelltable|nil GetSpellTableFromContainer = function(actor, spellContainerName, spellId) ---@type spellcontainer local spellContainer = actor[spellContainerName] if (spellContainer) then ---@type spelltable local spellTable = spellContainer._ActorTable[spellId] return spellTable end end, ---return a table containing pet names ---@param actor actor ---@return table GetPets = function(actor) return actor.pets end, ---return a table containing the targets of the actor ---@param actor actor ---@param key string optional, if not provided, will use the default target table: 'targets' ---@return targettable GetTargets = function(actor, key) return actor[key or "targets"] end, ---return a table containing spellTables ---@param actor actor ---@return table GetSpellList = function(actor) return actor.spells._ActorTable end, ---this function sums all the targets of all spellTables conteining on a 'spelltableadv' ---@param actor actor ---@param bkSpellData spelltableadv ---@param targetTableName string ---@return table BuildSpellTargetFromBreakdownSpellData = function(actor, bkSpellData, targetTableName) targetTableName = targetTableName or "targets" local spellTables = bkSpellData.spellTables ---@type table store the index of the target name in the result table local cacheIndex = {} ---@type table store the result which is returned by this function local result = {} for i = 1, #spellTables do ---@type spelltable local spellTable = spellTables[i] ---@type table local targets = spellTable[targetTableName] for targetName, value in pairs(targets) do local index = cacheIndex[targetName] if (index) then result[index][2] = result[index][2] + value else result[#result+1] = {targetName, value} cacheIndex[targetName] = #result end end end table.sort(result, function(t1, t2) return t1[2] > t2[2] end) return result end, ---this function receives a key for the name of the target table (usually is 'targets') and return a table containing the targets and the damage done in order of bigger to lower value ---@param actor actor ---@param spellTable spelltable ---@param targetKey string ---@return table BuildSpellTargetFromSpellTable = function(actor, spellTable, targetKey) targetKey = targetKey or "targets" ---@type table[] store the result which is returned by this function local result = {} ---@type table local targets = spellTable[targetKey] for targetName, value in pairs(targets) do ---@cast targetName string ---@cast value number result[#result+1] = {targetName, value} end table.sort(result, function(t1, t2) return t1[2] > t2[2] end) return result end, ---return true if the actor is controlled by a player ---@param actorObject actor ---@return boolean IsPlayer = function(actorObject) if (actorObject.flag_original) then if (bitBand(actorObject.flag_original, CONST_OBJECT_TYPE_PLAYER) ~= 0) then return true end end return false end, ---return true if the actor is a pet or guardian ---@param actorObject actor ---@return boolean IsPetOrGuardian = function(actorObject) return actorObject.owner and true or false end, ---return true if the actor is or was in the player group ---@param actorObject table ---@return boolean IsGroupPlayer = function(actorObject) return actorObject.grupo and true or false end, ---return true if the actor is an enemy of neutral npc ---@param actorObject actor ---@return boolean IsNeutralOrEnemy = function(actorObject) if (actorObject.flag_original) then if (bitBand(actorObject.flag_original, CONST_OBJECT_TYPE_NEUTRAL_OR_ENEMY) ~= 0) then local npcId = Details:GetNpcIdFromGuid(actorObject.serial) if (Details.IgnoredEnemyNpcsTable[npcId]) then return false end return true end end return false end, }