--[=[ Details API 2.0 This is a high level API for Details! Damage Meter --]=] local addonName, Details222 = ... local GetSpellInfo = Details222.GetSpellInfo --local helpers local getCombatObject = function(segmentNumber) ---@type combat local combatObject --select which segment to use, use low level variables for performance if (segmentNumber == -1) then combatObject = Details.tabela_overall elseif (segmentNumber == 0) then combatObject = Details.tabela_vigente else local segmentsTable = Details:GetCombatSegments() combatObject = segmentsTable[segmentNumber] end return combatObject end local getActorObjectFromCombat = function(combatObject, containerID, actorName) local index = combatObject [containerID]._NameIndexTable [actorName] return combatObject [containerID]._ActorTable [index] end local getUnitName = function(unitId) local unitName = Details:GetFullName(unitId) or unitId return unitName end --return the spell object and the spellId local getSpellObject = function(playerObject, spellId, isLiteral) local parameterType = type(spellId) if (parameterType == "number" and isLiteral) then --is the id of a spell and literal, directly get the spell object return playerObject.spells._ActorTable [spellId], spellId else local passedSpellName if (parameterType == "string") then --passed a spell name, make the spell be in lower case passedSpellName = spellId:lower() elseif (parameterType == "number") then --passed a number but with literal off, transform the spellId into a spell name local spellName = GetSpellInfo(spellId) if (spellName) then passedSpellName = spellName:lower() end end if (passedSpellName) then for thisSpellId, spellObject in pairs(playerObject.spells._ActorTable) do local spellName = Details.GetSpellInfo(thisSpellId) if (spellName) then if (spellName:lower() == passedSpellName) then return spellObject, thisSpellId end end end end end end --api Details.API_Description = { addon = "Details! Damage Meter", namespaces = { { name = "Details", order = 1, api = {}, } }, } ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --~segments --[=[ Details.SegmentInfo (segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "SegmentInfo", desc = "Return a table containing information about the segment.", parameters = { { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "segmentInfo", type = "table", desc = "Table containing the following members: ", } }, type = 0, --misc }) function Details.SegmentInfo (segment) segment = segment or 0 local combatObject = getCombatObject (segment) local segmentInfo = { } if (not combatObject) then return segmentInfo end return segmentInfo end --[=[ Details.SegmentElapsedTime (segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "SegmentElapsedTime", desc = "Return the total elapsed time of a segment.", parameters = { { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "segmentElapsedTime", type = "number", desc = "Number representing the elapsed time of a combat.", } }, type = 0, --misc }) function Details.SegmentElapsedTime (segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end return combatObject:GetCombatTime() end --[=[ Details.SegmentDamagingUnits (segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "SegmentDamagingUnits", desc = "Return a numeric (ipairs) table with name of units that inflicted damage on the segment.", parameters = { { name = "includePlayerUnits", type = "boolean", default = "true", desc = "Include names of player units, e.g. name of players in your dungeon or raid group.", }, { name = "includeEnemyUnits", type = "boolean", default = "false", desc = "Include names of enemy units, e.g. name of a boss and their adds.", }, { name = "includeFriendlyPetUnits", type = "boolean", default = "false", desc = "Include names of player pets.", }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitNames", type = "table", desc = "A table with unit names.", } }, type = 1, --damage }) function Details.SegmentDamagingUnits (includePlayerUnits, includeEnemyUnits, includeFriendlyPetUnits, segment) segment = segment or 0 if (type(includePlayerUnits) ~= "boolean") then includePlayerUnits = true end local combatObject = getCombatObject (segment) local units = {} local nextIndex = 1 if (not combatObject) then return units end local damageContainer = combatObject:GetContainer (DETAILS_ATTRIBUTE_DAMAGE) for i = 1, #damageContainer._ActorTable do local playerObject = damageContainer._ActorTable [i] if (includePlayerUnits and playerObject.grupo) then units [nextIndex] = playerObject:GetName() nextIndex = nextIndex + 1 elseif (includeEnemyUnits and playerObject:IsEnemy()) then units [nextIndex] = playerObject:GetName() nextIndex = nextIndex + 1 elseif (includeFriendlyPetUnits and playerObject:IsPetOrGuardian()) then units [nextIndex] = playerObject:GetName() nextIndex = nextIndex + 1 end end return units end --[=[ Details.SegmentHealingUnits (segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "SegmentHealingUnits", desc = "Return a numeric (ipairs) table with name of units that inflicted healing on the segment.", parameters = { { name = "includePlayerUnits", type = "boolean", default = "true", desc = "Include names of player units, e.g. name of players in your dungeon or raid group.", }, { name = "includeEnemyUnits", type = "boolean", default = "false", desc = "Include names of enemy units, e.g. name of a boss and their adds.", }, { name = "includeFriendlyPetUnits", type = "boolean", default = "false", desc = "Include names of player pets.", }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitNames", type = "table", desc = "A table with unit names.", } }, type = 2, --healing }) function Details.SegmentHealingUnits (includePlayerUnits, includeEnemyUnits, includeFriendlyPetUnits, segment) segment = segment or 0 if (type(includePlayerUnits) ~= "boolean") then includePlayerUnits = true end local combatObject = getCombatObject (segment) local units = {} local nextIndex = 1 if (not combatObject) then return units end local damageContainer = combatObject:GetContainer (DETAILS_ATTRIBUTE_HEAL) for i = 1, #damageContainer._ActorTable do local playerObject = damageContainer._ActorTable [i] if (includePlayerUnits and playerObject.grupo) then units [nextIndex] = playerObject:GetName() nextIndex = nextIndex + 1 elseif (includeEnemyUnits and playerObject:IsEnemy()) then units [nextIndex] = playerObject:GetName() nextIndex = nextIndex + 1 elseif (includeFriendlyPetUnits and playerObject:IsPetOrGuardian()) then units [nextIndex] = playerObject:GetName() nextIndex = nextIndex + 1 end end return units end --[=[ Details.SegmentTotalDamage (segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "SegmentTotalDamage", desc = "Query the total damage done in the segment and only by players in the group.", parameters = { { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "totalDamage", type = "number", desc = "Amount of damage done by players in the group.", } }, type = 1, --damage }) function Details.SegmentTotalDamage (segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end return floor(combatObject.totals_grupo [1]) end --[=[ Details.SegmentTotalHealing (segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "SegmentTotalHealing", desc = "Query the total healing done in the segment and only by players in the group.", parameters = { { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "totalHealing", type = "number", desc = "Amount of healing done by players in the group.", } }, type = 2, --healing }) function Details.SegmentTotalHealing (segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end return floor(combatObject.totals_grupo [2]) end --[=[ Details.SegmentPhases (segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "SegmentPhases", desc = "Return a numeric (ipairs) table with phase numbers available on the segment.", parameters = { { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "phaseNumbers", type = "table", desc = "A table containing numbers representing phases of the encounter, these numbers can used with UnitDamageByPhase().", } }, type = 0, --misc }) function Details.SegmentPhases (segment) segment = segment or 0 local combatObject = getCombatObject (segment) local phases = {} if (not combatObject) then return phases end local phaseData = combatObject.PhaseData for phaseChangeId, phaseTable in ipairs(phaseData) do local phaseNumber = phaseTable [1] DetailsFramework.table.addunique (phases, phaseNumber) end return phases end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --unit ~information --[=[ Details.UnitInfo (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitInfo", desc = "Query basic information about the unit, like class and spec.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitInfo", type = "table", desc = "A table with information about the unit, the table contains: .class, .spec, .guid, .role, .isPlayer, .isEnemy, .isPet, .isArenaFriendly, .isArenaEnemy, .arenaTeam.", } }, type = 0, --misc }) function Details.UnitInfo (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) local unitInfo = { class = "UNKNOW", --old typo in details spec = 0, guid = "", role = "NONE", isPlayer = false, isEnemy = false, isPet = false, isArenaFriendly = false, isArenaEnemy = false, arenaTeam = false, } if (not combatObject) then return unitInfo end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 1, unitName) if (not playerObject) then return unitInfo end local specCache = Details.cached_specs local unitSerial = UnitGUID(unitId) local _, class = UnitClass(unitId) local playerInfo = {} local openRaidLib = LibStub:GetLibrary("LibOpenRaid-1.0") if (openRaidLib) then playerInfo = openRaidLib.GetUnitInfo(unitName) end unitInfo.class = playerObject.classe or class or "UNKNOW" unitInfo.spec = playerObject.spec or specCache[unitSerial] or playerInfo.spec or 0 unitInfo.guid = playerObject.serial or unitSerial or "" unitInfo.role = playerObject.role or Details.cached_roles[unitSerial] or "NONE" unitInfo.isPlayer = playerObject:IsPlayer() unitInfo.isEnemy = playerObject:IsEnemy() unitInfo.isPet = playerObject:IsPetOrGuardian() unitInfo.isArenaFriendly = playerObject.arena_ally or false unitInfo.isArenaEnemy = playerObject.arena_enemy or false unitInfo.arenaTeam = playerObject.arena_team or false return unitInfo end --[=[ Details.UnitTexture (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitTexture", desc = "Query the icon and texcoords for the class and spec icon.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "textureInfo", type = "table", desc = "A table containing texture paths for class and spec icons plus the texture coordinates (texture:SetTexCoord), the table contains: .classTexture, .classLeft, .classRight, .classTop, .classBottom, .specTexture, .specLeft, .specRight, .specTop, .specBottom.", } }, type = 0, --misc }) function Details.UnitTexture (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) local textureInfo = { classTexture = [[Interface\LFGFRAME\LFGROLE_BW]], classLeft = 0.25, classRight = 0.5, classTop = 0, classBottom = 1, specTexture = [[Interface\LFGFRAME\LFGROLE_BW]], specLeft = 0.25, specRight = 0.5, specTop = 0, specBottom = 1, } if (not combatObject) then return textureInfo end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 1, unitName) if (not playerObject) then return textureInfo end local texture, left, right, top, bottom = playerObject:GetClassIcon() textureInfo.classTexture = texture textureInfo.classLeft = left textureInfo.classRight = right textureInfo.classTop = top textureInfo.classBottom = bottom local texture, left, right, top, bottom = Details:GetSpecIcon (playerObject.spec) textureInfo.specTexture = texture textureInfo.specLeft = left textureInfo.specRight = right textureInfo.specTop = top textureInfo.specBottom = bottom return textureInfo end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --~damage --[=[ Details.UnitDamage (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitDamage", desc = "Query the damage of a unit.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitDamage", type = "number", desc = "Number representing the unit damage.", } }, type = 1, --damage }) function Details.UnitDamage (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 1, unitName) if (not playerObject) then return 0 end --/dump Details.UnitDamage("player") return floor(playerObject.total or 0) end --[=[ Details.UnitDamageByPhase (unitId, phaseNumber, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitDamageByPhase", desc = "Query the damage of a unit but only for a specific phase of a boss encounter.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "phaseNumber", type = "number", desc = "The phase number of an encounter. Some encounters has transition phases considered 'phase 1.5'. You may query SegmentPhases() to know which phases the encounter has.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitDamage", type = "number", desc = "Number representing the unit damage on the encounter phase.", } }, type = 1, --damage }) function Details.UnitDamageByPhase (unitId, phaseNumber, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end if (not phaseNumber) then return 0 end local unitName = getUnitName (unitId) local damagePhaseData = combatObject.PhaseData.damage [phaseNumber] if (not damagePhaseData) then return 0 end local phaseDamage = damagePhaseData [unitName] or 0 return floor(phaseDamage) end --[=[ Details.UnitDamageInfo (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitDamageInfo", desc = "Return a table with damage information.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "damageInfo", type = "table", desc = "Table containing damage information, keys are: .total, .totalWithoutPet, .damageAbsorbed, .damageTaken, .friendlyFire and .activityTime", } }, type = 1, --damage }) function Details.UnitDamageInfo (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local damageInfo = { total = 0, totalWithoutPet = 0, damageAbsorbed = 0, damageTaken = 0, friendlyFire = 0, activityTime = 0, } local playerObject = getActorObjectFromCombat (combatObject, 1, unitName) if (not playerObject) then return damageInfo end damageInfo.total = floor(playerObject.total) damageInfo.totalWithoutPet = floor(playerObject.total_without_pet) damageInfo.damageAbsorbed = floor(playerObject.totalabsorbed) damageInfo.damageTaken = floor(playerObject.damage_taken) damageInfo.friendlyFire = playerObject.friendlyfire_total damageInfo.activityTime = playerObject:Tempo() return damageInfo end --[=[ Details.UnitDamageBySpell (unitId, spellId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitDamageBySpell", desc = "Query the total damage done of a spell casted by the unit.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "spellId", type = "number", desc = "Id of a spell to query the damage done. Accept spell names.", required = true, }, { name = "isLiteral", type = "boolean", default = "true", desc = "Search for the spell without transforming the spellId into a spell name before the search.", }, { name = "segment", default = "0", type = "number", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitSpellDamage", type = "number", desc = "Number representing the spell damage done.", } }, type = 1, --damage }) function Details.UnitDamageBySpell (unitId, spellId, isLiteral, segment) if (type(isLiteral) ~= "boolean") then isLiteral = true end segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 1, unitName) if (not playerObject) then return 0 end local spellObject, spellId = getSpellObject (playerObject, spellId, isLiteral) if (spellObject) then return spellObject.total else return 0 end end --[=[ Details.UnitDamageSpellInfo (unitId, spellId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitDamageSpellInfo", desc = "Return a table with the spell damage information.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "spellId", type = "number", desc = "Id of a spell to query its damage information. Accept spell names.", required = true, }, { name = "isLiteral", type = "boolean", default = "true", desc = "Search for the spell without transforming the spellId into a spell name before the search.", }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "spellDamageInfo", type = "table", desc = "Table containing damage information, keys are: '.total', '.spellId', '.count', '.name', '.casted', '.regularMin', '.regularMax', '.regularHits', '.regularDamage', '.criticalMin', '.criticalMax', '.criticalHits', '.criticalDamage'", } }, type = 1, --damage }) function Details.UnitDamageSpellInfo (unitId, spellId, isLiteral, segment) if (type(isLiteral) ~= "boolean") then isLiteral = true end segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local spellInfo = { total = 0, spellId = 0, count = 0, name = "", casted = 0, regularMin = 0, regularMax = 0, regularHits = 0, regularDamage = 0, criticalMin = 0, criticalMax = 0, criticalHits = 0, criticalDamage = 0, } local playerObject = getActorObjectFromCombat(combatObject, 1, unitName) if (not playerObject) then return spellInfo end local spellObject, spellId = getSpellObject(playerObject, spellId, isLiteral) if (not spellObject) then return spellInfo end local spellName = GetSpellInfo(spellId) spellInfo.casted = combatObject:GetSpellCastAmount(unitName, spellName) if (spellObject) then spellInfo.total = spellObject.total spellInfo.count = spellObject.counter spellInfo.spellId = spellId spellInfo.name = spellName spellInfo.regularMin = spellObject.n_min spellInfo.regularMax = spellObject.n_max spellInfo.regularHits = spellObject.n_amt spellInfo.regularDamage = spellObject.n_total spellInfo.criticalMin = spellObject.c_min spellInfo.criticalMax = spellObject.c_max spellInfo.criticalHits = spellObject.c_amt spellInfo.criticalDamage = spellObject.c_total end return spellInfo end --[=[ Details.UnitDamageSpellOnUnit (unitId, spellId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitDamageSpellOnUnit", desc = "Query the damage done of a spell into a specific target.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "spellId", type = "number", desc = "Id of a spell to query its damage to an unit. Accept spell names.", required = true, }, { name = "targetUnitId", type = "string", desc = "Name or ID of an unit, example: 'Thrall', 'Jaina', 'player', 'target', 'raid5'.", required = true, }, { name = "isLiteral", type = "boolean", default = "true", desc = "Search for the spell without transforming the spellId into a spell name before the search.", }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitDamageSpellOnUnit", type = "number", desc = "Damage done by the spell into the target.", } }, type = 1, --damage }) function Details.UnitDamageSpellOnUnit (unitId, spellId, targetUnitId, isLiteral, segment) if (type(isLiteral) ~= "boolean") then isLiteral = true end segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 1, unitName) if (not playerObject) then return 0 end local spellObject, spellId = getSpellObject (playerObject, spellId, isLiteral) if (spellObject) then local targetName = getUnitName (targetUnitId) return spellObject.targets [targetName] or 0 else return 0 end end --[=[ Details.UnitDamageTaken (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitDamageTaken", desc = "Query the unit damage taken.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitDamageTaken", type = "number", desc = "Number representing the damage taken by the unit.", } }, type = 1, --damage }) function Details.UnitDamageTaken (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 1, unitName) if (not playerObject) then return 0 end return floor(playerObject.damage_taken) end --[=[ Details.UnitDamageOnUnit (unitId, targetUnitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitDamageOnUnit", desc = "Query the unit damage done on another unit.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "targetUnitId", type = "string", desc = "Name or ID of an unit, example: 'Thrall', 'Jaina', 'player', 'target', 'raid5'.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitDamageOnUnit", type = "number", desc = "Number representing the damage done by the unit on the target unit.", } }, type = 1, --damage }) function Details.UnitDamageOnUnit (unitId, targetUnitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 1, unitName) if (not playerObject) then return 0 end local targetName = getUnitName (targetUnitId) return playerObject.targets [targetName] or 0 end --[=[ Details.UnitDamageTakenFromSpell (unitId, spellId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitDamageTakenFromSpell", desc = "Query the unit damage taken from a spell.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "spellId", type = "number", desc = "Id of a spell to query its damage to an unit. Accept spell names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitDamageTakenFromSpell", type = "number", desc = "Number representing the damage taken by the unit from a spell.", } }, type = 1, --damage }) function Details.UnitDamageTakenFromSpell (unitId, spellId, isLiteral, segment) segment = segment or 0 if (type(isLiteral) ~= "boolean") then isLiteral = true end local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local damageContainer = combatObject:GetContainer (DETAILS_ATTRIBUTE_DAMAGE) local totalDamageTaken = 0 if (isLiteral and type(spellId) == "number") then for i = 1, #damageContainer._ActorTable do for thisSpellId, spellObject in pairs(damageContainer._ActorTable [i].spells._ActorTable) do if (thisSpellId == spellId) then totalDamageTaken = totalDamageTaken + (spellObject.targets [unitName] or 0) end end end else local spellName = GetSpellInfo(spellId) or spellId for i = 1, #damageContainer._ActorTable do for thisSpellId, spellObject in pairs(damageContainer._ActorTable [i].spells._ActorTable) do local thisSpellName = GetSpellInfo(thisSpellId) if (thisSpellName == spellName) then totalDamageTaken = totalDamageTaken + (spellObject.targets [unitName] or 0) end end end end return totalDamageTaken end --[=[ Details.UnitDamagingSpells (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitDamagingSpells", desc = "Return a numeric (ipairs) table with spells IDs used by the unit to apply damage.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitOffinsiveSpells", type = "table", desc = "Table with spellIds of spells the unit used to apply damage.", } }, type = 1, --damage }) function Details.UnitDamagingSpells (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return {} end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 1, unitName) if (not playerObject) then return {} end local unitSpells = playerObject.spells._ActorTable local resultTable = {} for spellId, spellObject in pairs(unitSpells) do resultTable [#resultTable + 1] = spellId end return resultTable end --[=[ Details.UnitDamagingTargets (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitDamagingTargets", desc = "Return a numeric (ipairs) table with names of targets the unit inflicted damage. You may query the amount of damage with Details.UnitDamageOnUnit( unitId, targetName ).", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "offensiveTargetNames", type = "table", desc = "Table containing names of all offensive targets of the unit.", } }, type = 1, --damage }) function Details.UnitDamagingTargets (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local offensiveTargetNames = {} local playerObject = getActorObjectFromCombat (combatObject, 1, unitName) if (not playerObject) then return offensiveTargetNames end for targetName, _ in pairs(playerObject.targets) do offensiveTargetNames [#offensiveTargetNames + 1] = targetName end return offensiveTargetNames end --[=[ Details.UnitDamagingPets (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitDamagingPets", desc = "Return a numeric (ipairs) table with all pet names the unit used to apply damage. Individual pet information can be queried with Details.UnitDamage( petName ).", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "petNames", type = "table", desc = "Table containing names of all pets the unit used to apply damage.", } }, type = 1, --damage }) function Details.UnitDamagingPets (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local petNames = {} local playerObject = getActorObjectFromCombat (combatObject, 1, unitName) if (not playerObject) then return petNames end for i = 1, #playerObject.pets do petNames [#petNames + 1] = playerObject.pets [i] end return petNames end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --~healing --[=[ Details.UnitHealing (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitHealing", desc = "Query the healing done of a unit.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitHealingDone", type = "number", desc = "Number representing the unit healing.", } }, type = 2, --healing }) function Details.UnitHealing (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 2, unitName) if (not playerObject) then return 0 end return floor(playerObject.total or 0) end --[=[ Details.UnitHealingInfo (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitHealingInfo", desc = "Return a table with healing information.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "healingInfo", type = "table", desc = "Table containing damage information, keys are: .total, .totalWithoutPet, .totalOverhealWithoutPet, .overhealing, .absorbed, .healingDenied, .healingEnemy, .healingTaken, .activityTime", } }, type = 2, --healing }) function Details.UnitHealingInfo (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local healingInfo = { total = 0, totalWithoutPet = 0, totalOverhealWithoutPet = 0, overhealing = 0, absorbed = 0, healingDenied = 0, healingEnemy = 0, healingTaken = 0, activityTime = 0, } local playerObject = getActorObjectFromCombat (combatObject, 2, unitName) if (not playerObject) then return healingInfo end healingInfo.total = floor(playerObject.total) healingInfo.totalWithoutPet = floor(playerObject.total_without_pet) healingInfo.totalOverhealWithoutPet = floor(playerObject.totalover_without_pet) healingInfo.overhealing = floor(playerObject.totalover) healingInfo.absorbed = floor(playerObject.totalabsorb) healingInfo.healingDenied = floor(playerObject.totaldenied) healingInfo.healingEnemy = floor(playerObject.heal_enemy_amt) healingInfo.healingTaken = floor(playerObject.healing_taken) healingInfo.activityTime = playerObject:Tempo() return healingInfo end --[=[ Details.UnitHealingBySpell (unitId, spellId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitHealingBySpell", desc = "Query the total healing done of a spell casted by the unit.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "spellId", type = "number", desc = "Id of a spell to query the healing done. Accept spell names.", required = true, }, { name = "isLiteral", type = "boolean", default = "true", desc = "Search for the spell without transforming the spellId into a spell name before the search.", }, { name = "segment", default = "0", type = "number", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitSpellHealing", type = "number", desc = "Number representing the spell healing done.", } }, type = 2, --healing }) function Details.UnitHealingBySpell (unitId, spellId, isLiteral, segment) if (type(isLiteral) ~= "boolean") then isLiteral = true end segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 2, unitName) if (not playerObject) then return 0 end local spellObject, spellId = getSpellObject (playerObject, spellId, isLiteral) if (spellObject) then return spellObject.total else return 0 end end --[=[ Details.UnitHealingSpellInfo (unitId, spellId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitHealingSpellInfo", desc = "Return a table with the spell healing information.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "spellId", type = "number", desc = "Id of a spell to query its healing information. Accept spell names.", required = true, }, { name = "isLiteral", type = "boolean", default = "true", desc = "Search for the spell without transforming the spellId into a spell name before the search.", }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "spellHealingInfo", type = "table", desc = "Table containing damage information, keys are: '.total', '.spellId', '.count', '.name', '.casted', '.regularMin', '.regularMax', '.regularAmount', '.regularDamage', '.criticalMin', '.criticalMax', '.criticalAmount', '.criticalDamage'", } }, type = 2, --healing }) function Details.UnitHealingSpellInfo (unitId, spellId, isLiteral, segment) if (type(isLiteral) ~= "boolean") then isLiteral = true end segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local spellInfo = { total = 0, spellId = 0, count = 0, name = "", casted = 0, regularMin = 0, regularMax = 0, regularHits = 0, regularHealing = 0, criticalMin = 0, criticalMax = 0, criticalHits = 0, criticalHealing = 0, } local playerObject = getActorObjectFromCombat (combatObject, 2, unitName) if (not playerObject) then return spellInfo end local spellObject, spellId = getSpellObject (playerObject, spellId, isLiteral) if (not spellObject) then return spellInfo end local spellName = GetSpellInfo(spellId) spellInfo.casted = combatObject:GetSpellCastAmount(unitName, spellName) if (spellObject) then spellInfo.total = spellObject.total spellInfo.count = spellObject.counter spellInfo.spellId = spellId spellInfo.name = spellName spellInfo.regularMin = spellObject.n_min spellInfo.regularMax = spellObject.n_max spellInfo.regularHits = spellObject.n_amt spellInfo.regularHealing = spellObject.n_total spellInfo.criticalMin = spellObject.c_min spellInfo.criticalMax = spellObject.c_max spellInfo.criticalHits = spellObject.c_amt spellInfo.criticalHealing = spellObject.c_total end return spellInfo end --[=[ Details.UnitHealingSpellOnUnit (unitId, spellId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitHealingSpellOnUnit", desc = "Query the healing done of a spell into a specific target.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "spellId", type = "number", desc = "Id of a spell to query its healing done to an unit. Accept spell names.", required = true, }, { name = "targetUnitId", type = "string", desc = "Name or ID of an unit, example: 'Thrall', 'Jaina', 'player', 'target', 'raid5'.", required = true, }, { name = "isLiteral", type = "boolean", default = "true", desc = "Search for the spell without transforming the spellId into a spell name before the search.", }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitHealingSpellOnUnit", type = "number", desc = "Healing done by the spell into the target.", } }, type = 2, --healing }) function Details.UnitHealingSpellOnUnit (unitId, spellId, targetUnitId, isLiteral, segment) if (type(isLiteral) ~= "boolean") then isLiteral = true end segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 2, unitName) if (not playerObject) then return 0 end local spellObject, spellId = getSpellObject (playerObject, spellId, isLiteral) if (spellObject) then local targetName = getUnitName (targetUnitId) return spellObject.targets [targetName] or 0 else return 0 end end --[=[ Details.UnitHealingTaken (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitHealingTaken", desc = "Query the unit healing taken.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitHealingTaken", type = "number", desc = "Number representing the healing taken by the unit.", } }, type = 2, --healing }) function Details.UnitHealingTaken (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 2, unitName) if (not playerObject) then return 0 end return floor(playerObject.healing_taken) end --[=[ Details.UnitHealingOnUnit (unitId, targetUnitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitHealingOnUnit", desc = "Query the unit healing done on another unit.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "targetUnitId", type = "string", desc = "Name or ID of an unit, example: 'Thrall', 'Jaina', 'player', 'target', 'raid5'.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitHealingOnUnit", type = "number", desc = "Number representing the healing done by the unit on the target unit.", } }, type = 2, --healing }) function Details.UnitHealingOnUnit (unitId, targetUnitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 2, unitName) if (not playerObject) then return 0 end local targetName = getUnitName (targetUnitId) return playerObject.targets [targetName] or 0 end --[=[ Details.UnitHealingTakenFromSpell (unitId, spellId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitHealingTakenFromSpell", desc = "Query the unit healing taken from a spell.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "spellId", type = "number", desc = "Id of a spell to query its healing to an unit. Accept spell names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitHealingTakenFromSpell", type = "number", desc = "Number representing the healing taken by the unit from a spell.", } }, type = 2, --healing }) function Details.UnitHealingTakenFromSpell (unitId, spellId, isLiteral, segment) segment = segment or 0 if (type(isLiteral) ~= "boolean") then isLiteral = true end local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local healingContainer = combatObject:GetContainer (DETAILS_ATTRIBUTE_HEAL) local totalHealingTaken = 0 if (isLiteral and type(spellId) == "number") then for i = 1, #healingContainer._ActorTable do for thisSpellId, spellObject in pairs(healingContainer._ActorTable [i].spells._ActorTable) do if (thisSpellId == spellId) then totalHealingTaken = totalHealingTaken + (spellObject.targets [unitName] or 0) end end end else local spellName = GetSpellInfo(spellId) or spellId for i = 1, #healingContainer._ActorTable do for thisSpellId, spellObject in pairs(healingContainer._ActorTable [i].spells._ActorTable) do local thisSpellName = GetSpellInfo(thisSpellId) if (thisSpellName == spellName) then totalHealingTaken = totalHealingTaken + (spellObject.targets [unitName] or 0) end end end end return totalHealingTaken end --[=[ Details.UnitHealingSpells (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitHealingSpells", desc = "Return a numeric (ipairs) table with spells IDs used by the unit to apply healing.", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "unitHealingSpells", type = "table", desc = "Table with spellIds of spells the unit used to apply healing.", } }, type = 2, --healing }) function Details.UnitHealingSpells (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return {} end local unitName = getUnitName (unitId) local playerObject = getActorObjectFromCombat (combatObject, 2, unitName) if (not playerObject) then return {} end local unitSpells = playerObject.spells._ActorTable local resultTable = {} for spellId, spellObject in pairs(unitSpells) do resultTable [#resultTable + 1] = spellId end return resultTable end --[=[ Details.UnitHealingTargets (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitHealingTargets", desc = "Return a numeric (ipairs) table with names of targets the unit applied heal. You may query the amount of damage with Details.UnitHealingOnUnit( unitId, targetName ).", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "healingTargetNames", type = "table", desc = "Table containing names of all targets the unit applied heal.", } }, type = 2, --healing }) function Details.UnitHealingTargets (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local healingTargetNames = {} local playerObject = getActorObjectFromCombat (combatObject, 2, unitName) if (not playerObject) then return healingTargetNames end for targetName, _ in pairs(playerObject.targets) do healingTargetNames [#healingTargetNames + 1] = targetName end return healingTargetNames end --[=[ Details.UnitHealingPets (unitId, segment) --=]=] table.insert(Details.API_Description.namespaces[1].api, { name = "UnitHealingPets", desc = "Return a numeric (ipairs) table with all pet names the unit used to apply healing. Individual pet information can be queried with Details.UnitHealing( petName ).", parameters = { { name = "unitId", type = "string", desc = "The ID of an unit, example: 'player', 'target', 'raid5'. Accept unit names.", required = true, }, { name = "segment", type = "number", default = "0", desc = "Which segment to retrive data, default value is zero (current segment). Use -1 for overall data or value from 1 to 25 for other segments.", }, }, returnValues = { { name = "petNames", type = "table", desc = "Table containing names of all pets the unit used to apply heal.", } }, type = 2, --healing }) function Details.UnitHealingPets (unitId, segment) segment = segment or 0 local combatObject = getCombatObject (segment) if (not combatObject) then return 0 end local unitName = getUnitName (unitId) local petNames = {} local playerObject = getActorObjectFromCombat (combatObject, 2, unitName) if (not playerObject) then return petNames end for i = 1, #playerObject.pets do petNames [#petNames + 1] = playerObject.pets [i] end return petNames end --stop auto complete: doo ende endp elsez