API
API
Attributes:
=======================================
All these keys are globals:
DETAILS_ATTRIBUTE_DAMAGE = 1
DETAILS_SUBATTRIBUTE_DAMAGEDONE = 1
DETAILS_SUBATTRIBUTE_DPS = 2
DETAILS_SUBATTRIBUTE_DAMAGETAKEN = 3
DETAILS_SUBATTRIBUTE_FRIENDLYFIRE = 4
DETAILS_SUBATTRIBUTE_FRAGS = 5
DETAILS_SUBATTRIBUTE_ENEMIES = 6
DETAILS_SUBATTRIBUTE_VOIDZONES = 7
DETAILS_ATTRIBUTE_HEAL = 2
DETAILS_SUBATTRIBUTE_HEALDONE = 1
DETAILS_SUBATTRIBUTE_HPS = 2
DETAILS_SUBATTRIBUTE_OVERHEAL = 3
DETAILS_SUBATTRIBUTE_HEALTAKEN = 4
DETAILS_SUBATTRIBUTE_HEALENEMY = 5
DETAILS_SUBATTRIBUTE_HEALPREVENTED = 6
DETAILS_ATTRIBUTE_ENERGY = 3
DETAILS_SUBATTRIBUTE_REGENMANA = 1
DETAILS_SUBATTRIBUTE_REGENRAGE = 2
DETAILS_SUBATTRIBUTE_REGENENERGY = 3
DETAILS_SUBATTRIBUTE_REGENRUNE = 4
DETAILS_ATTRIBUTE_MISC = 4
DETAILS_SUBATTRIBUTE_CCBREAK = 1
DETAILS_SUBATTRIBUTE_RESS = 2
DETAILS_SUBATTRIBUTE_INTERRUPT = 3
DETAILS_SUBATTRIBUTE_DISPELL = 4
DETAILS_SUBATTRIBUTE_DEATH = 5
DETAILS_SUBATTRIBUTE_DCOOLDOWN = 6
DETAILS_SUBATTRIBUTE_BUFFUPTIME = 7
DETAILS_SUBATTRIBUTE_DEBUFFUPTIME = 8
TL;DR
=======================================
Details! has three main objects: Combat, Container and Actor:
"Combat" holds containers, when a fight is gone, the "Current Combat" is placed
inside the History Segment.
"Container" holds Actors.
"Actor" has members telling what the player or npc has made in the combat.
"Combat" has 4 indexes: [1] holds the Damage Container [2] Healing [3] Energy [4]
Misc.
These indexes are called "Attributes"
"Actor" has different data depending on which container the actor are, for
instance, if is a Damage Actor, it will have members like damage_taken, friendly
fire,
if is a Healing Actor, it will have members for overheal, absorbs etc.
Actors also have tables for spells and targets.
An Actor only is created inside a container when it performs an action which fits
the container, for instance, if the player didn't restored any energy/mana/rage,
etc,
it won't have an actor inside the Energy Container.
==========
| COMBAT | = { [1] = {DAMAGE CONTAINER}, [2] = {HEAL CONTAINER}, [3] =
{ENERGY CONTAINER}, [4] = {MISC CONTAINER} }
==========
============
| CONTAINER | = { ACTORS }
============
==========
| ACTOR | = {attribute_keys, spells = {}, targets = {}}
==========
attribute keys are the members which holds all the totals made by the actor (see
more below).
spells = {spellid = {SPELL}} targets = {["targetname"] = amount}
Important Functions:
=======================================
Details:Format (number, formatString)
if formatString is nil, Format uses current format chosen on details options panel.
Details:GetActorsOnDamageCache()
only usable while in combat, it returns a numeric table with all damage actors in
the group (combatlog flag matching 0x00000007).
the table is always sorted and only contains players in the raid or party.
Details:GetActorsOnHealingCache()
only usable while in combat, it returns a numeric table with all healing actors in
the group (combatlog flag matching 0x00000007).
the table is always sorted and only contains players in the raid or party.
*For out of combat, energy and misc containers or get all actors even pets, enemies
etc, you may use Container:SortByKey(key) and Container:ListActors().
history_segment_container = Details:GetCombatSegments()
returns the numeric table containing all past segments.
Details:ResetSegmentData()
reset the segment data including the overall segment
Details:ResetSegmentOverallData()
reset only the overall segment
Getting an Actor:
=======================================
local actor = Details:GetActor (combat = "current", attribute =
DETAILS_ATTRIBUTE_DAMAGE, actorname = Details.playername)
returns the actor for the requested combat, attribute and actor name.
if some parameter are omitted, it uses the default value which are current combat,
damage container and the name of the player character.
Combat Object:
=======================================
A Combat object is a table with 4 numerical indexes holding: damage, healing,
energy and misc containers.
function for combat objects:
bossInfo = combat:GetBossInfo()
returns the table containing informations about the boss encounter.
table members: name, zone, mapid, diff, diff_string, id, killed, index
battlegroudInfo = combat:GetPvPInfo()
returns the table containing infos about the battlegroud:
table members: name, mapid
arenaInfo = combat:GetArenaInfo()
returns the table containing infos about the arena:
table members: name, mapid, zone
time = combat:GetCombatTime()
returns the length of the combat in seconds, if the combat is in progress, returns
the current elapsed time.
isTrash = combat:IsTrash()
returns true if the combat is a trash segment.
encounterDiff = combat:GetDifficulty()
returns the difficulty number of the raid encounter.
deaths = combat:GetDeaths()
returns a numeric table containing the deaths, table is ordered by first death to
last death.
combatNumber = combat:GetCombatNumber()
returns an ID for the combat, this number is unique among other combats.
combatId = combat:GetCombatId()
returns an ID for the combat, this number represents valid combat, it may have the
same ID of a previous invalid combat.
roster = combat:GetRoster()
returns a hash table with player names preset in the raid group at the start of the
combat.
start_at = GetStartTime()
returns the GetTime() of when the combat started.
ended_at = GetEndTime()
returns the GetTime() of when the combat ended.
DETAILS_TOTALS_ONLYGROUP = true
combatType = combat:GetCombatType()
returns the combat identification (see segment types).
--------------------------------------------------------------------
Other Calls:
Details:GetCombatNumber()
returns the current unique combat number counter.
combat number is a unique number given to each combat started, this number won't
reset when data is wiped and each character have its own combat number counter.
Details:IsInCombat()
returns if Details! is in combat or not.
Details:IsInEncounter()
returns if Details! is in a raid encounter combat.
Details:UnpackDeathTable (deathTable)
break a death table returning the data from it:
playername, playerclass, deathtime, deathcombattime, deathtimestring,
playermaxhealth, deathevents, lastcooldown = Details:UnpackDeathTable (deathTable)
Container Object:
=======================================
A container is used to store actors, each combat have four containers, one for each
attribute.
There is spell containers which holds the spells used by actors, spell containers
are more limited and have only few functions.
ipairs() = container:ListActors()
returns a iterated table of actors inside the container.
Usage: 'for index, actor in container:ListActors() do'
Note: if the container is a spell container, returns pairs() instead: 'for spellid,
spelltable in container:ListActors() do'
container:GetSpell (spellid)
unique for spell container.
e.g. actor.spells:GetSpell (spellid)
return the spelltable for the requested spellid.
container:SortByKey (keyname)
sort the actor container placing in descending order actors with bigger amounts on
their 'keyname'.
*only works for actor container
Actor Object:
=======================================
name = actor:name()
returns the actor's name.
class = actor:class()
returns the actor class.
guid = actor:guid()
returns the GUID for this actor.
flag = actor:flag()
returns the combatlog flag for the actor.
displayName = actor:GetDisplayName()
returns the name shown on the player bar, can suffer modifications from realm name
removed, nicknames, etc.
name = actor:GetOnlyName()
returns only the actor name, remove realm or owner names.
activity = actor:Tempo()
returns the activity time for the actor.
isPlayer = actor:IsPlayer()
return true if the actor is a player.
isGroupMember = actor:IsGroupPlayer()
return true if the actor is a player and member of the raid group.
IsneutralOrEnemy = actor:IsNeutralOrEnemy()
return true if the actor is a neutral of an enemy.
isEnemy = actor:IsEnemy()
return true if the actor is a enemy.
isPet = actor:IsPetOrGuardian()
return true if the actor is a pet or guardian
list = actor:GetSpellList()
returns a hash table with spellid, spelltable.
r, g, b = actor:GetBarColor()
returns the color which the player bar will be painted on the window, it respects
owner, arena team, enemy, monster.
r, g, b = Details:GetClassColor()
returns the class color.
members:
actor.total = total of damage done.
actor.total_without_pet = without pet.
actor.damage_taken = total of damage taken.
actor.last_event = when the last event for this actor occured.
actor.start_time = time when this actor started to apply damage.
actor.end_time = time when the actor stopped with damage.
actor.friendlyfire_total = amount of friendlyfire.
tables:
actor.targets = hash table of targets: {[targetName] = amount}.
actor.damage_from = hash table of actors which applied damage to this actor:
{[aggresorName] = true}.
actor.pets = numeric table of GUIDs of pets summoned by this actor.
actor.friendlyfire = hash table of friendly fire targets: {[targetName] = table
{total = 0, spells = hash table: {[spellId] = amount}}}
actor.spells = spell container.
spell:
spell.total = total of damage by this spell.
spell.counter = how many hits this spell made.
spell.id = spellid
spell.successful_casted = how many times this spell has been casted successfully
(only for enemies).
- players has its own spell cast counter inside Misc Container with the
member "spell_cast".
- the reason os this is spell_cast holds all spells regardless of its
attribute (can hold healing/damage/energy/misc).
Getting Dps:
For activity time: DPS = actor.total / actor:Tempo()
For effective time: DPS = actor.total / combat:GetCombatTime()
members:
actor.total = total of healing done.
actor.totalover = total of overheal.
actor.totalabsorb = total of absorbs.
actor.total_without_pet = total without count the healing done from pets.
actor.totalover_without_pet = overheal without pets.
actor.heal_enemy_amt = how much this actor healing an enemy actor.
actor.healing_taken = total of received healing.
actor.last_event = when the last event for this actor occured.
actor.start_time = time when this actor started to apply heals.
actor.end_time = time when the actor stopped with healing.
tables:
actor.spells = spell container.
actor.targets = hash table of targets: {[targetName] = amount}.
actor.targets_overheal = hash table of overhealed targets: {[targetName] = amount}.
actor.targets_absorbs = hash table of shield absorbs: {[targetName] = amount}.
actor.healing_from = hash table of actors which applied healing to this actor:
{[healerName] = true}.
actor.pets = numeric table of GUIDs of pets summoned by this actor.
actor.heal_enemy = spells used to heal the enemy: {[spellid] = amount healed}
spell:
spell.total = total healing made by this spell.
spell.counter = how many times this spell healed something.
spell.id = spellid.
spell.totalabsorb = only for shields, tells how much damage this spell prevented.
spell.absorbed = is how many healing has been absorbed by some external mechanic
like Befouled on Fel Lord Zakuun encounter.
spell.overheal = amount of overheal made by this spell.
spell.n_min = minimal heal made on a normal hit.
spell.n_max = max heal made on a normal hit.
spell.n_amt = amount of normal hits.
spell.n_curado = total amount made doing only normal hits (weird name I know).
spell.c_min = minimal heal made on a critical hit.
spell.c_max = max heal made on a critical hit.
spell.c_amt = how many times this spell got a critical hit (doesn't count critical
by multistrike).
spell.c_curado = total amount made doing only normal hits.
Getting Hps:
For activity time: HPS = actor.total / actor:Tempo()
For effective time: HPS = actor.total / combat:GetCombatTime()
spell:
total = total energy restored by this spell.
counter = how many times this spell restored energy.
id = spellid
spell:
spell.counter = amount of times this spell has been used to perform a crowd
control.
spell.targets = hash table containing {["targetname"] = total of times this spell
made a CC on this target}
- Interrupts:
actor.interrupt = total amount of interrupts.
actor.interrupt_targets = hash table with target names and amount {[targetName] =
amount}.
actor.interrupt_spells = spell container.
actor.interrompeu_oque = hash table which tells what this actor interrupted {[spell
interrupted spellid] = amount}
spell:
spell.counter = amount of interrupts performed by this spell.
spell.interrompeu_oque = hash table talling what this spell interrupted {[spell
interrupted spellid] = amount}
spell.targets = hash table containing {["castername"] = total of times this spell
interrupted something from this caster}
- Aura Uptime:
actor.buff_uptime = seconds of all buffs uptime.
actor.buff_uptime_spells = spell container.
actor.debuff_uptime = seconds of all debuffs uptime.
actor.debuff_uptime_spells = spell container.
spell:
spell.id = spellid
spell.uptime = uptime amount in seconds.
- Cooldowns:
actor.cooldowns_defensive = amount of defensive cooldowns used by this actor.
actor.cooldowns_defensive_targets = in which player the cooldown was been used
{[targetName] = amount}.
actor.cooldowns_defensive_spells = spell container.
spell:
spell.id = spellid
spell.counter = how many times the player used this cooldown.
spell.targets = hash table with {["targetname"] = amount}
- Ress
actor.ress = amount of ress performed by this actor.
actor.ress_targets = which actors got ressed by this actor {["targetname"] =
amount}
actor.ress_spells = spell container.
spell:
spell.ress = amount of resses made by this spell.
spell.targets = hash table containing player names resurrected by this spell
{["playername"] = amount}
spell:
spell.dispell = amount of dispels by this spell.
spell.dispell_oque = hash table with {[spellid of the spell dispelled]} = amount
spell.targets = hash table with target names dispelled {["targetname"] = amount}
- CC Break
actor.cc_break = amount of times the actor broke a crowd control.
actor.cc_break_targets = hash table containing who this actor broke the CC
{[targetName] = amount}.
actor.cc_break_spells = spell container.
actor.cc_break_oque = hash table with spells broken {[CC spell id] = amount}
spell:
spell.cc_break = amount of CC broken by this spell.
spell.cc_break_oque = hash table with {[CC spellid] = amount}
spell.targets = hash table with {["targetname"] = amount}.
Details:GetSourceFromNpcId (npcId)
return the npc name for the specific npcId.
this is a expensive function, once you get a valid result, store the npc name
somewhere.
Details:SetDeathLogLimit (limit)
Set the amount of lines to store on death log.
Examples:
======================================= ---
-- as we want all players, we get here the container which stores all healing
actors:
local healingContainer = combat:GetContainer (DETAILS_ATTRIBUTE_HEAL)
-- sort the container with the key "totalover" - we got this key from "Keys for
Healing Actors":
healingContainer:SortByKey ("totalover")
-- inside the container has all entities which made any heal during the
combat, here we check if the actor is a player for our group.
if (actor:IsGroupPlayer()) then
actorsFound = actorsFound + 1
end
end
3) Damage done to an add called "Grand Corruptor U'rogg":
local actorsAmount = {}
for i, actor in damageContainer:ListActors() do
local amount = actor.targets [targetName]
if (amount and amount >= 1) then
tinsert (actorsAmount, {name = actor:name(), total = amount})
end
end
damageContainer:SortByKey ("custom")
local actorsDamagedTheTarget = 0
for i, actor in damageContainer:ListActors() do
actorsDamagedTheTarget = actorsDamagedTheTarget + 1
end
damageContainer:SortByKey ("custom")
damageContainer:SortByKey ("custom")
damageContainer:SortByKey ("custom")
end