From 8b16b16b2102d93df657397c2361376d79eb5874 Mon Sep 17 00:00:00 2001 From: Tercio Date: Fri, 22 Dec 2017 09:09:34 -0200 Subject: [PATCH] - Create Aura and API window moved to the new plugin window. - API ingame list updated. - API: added global consts for segment ids: DETAILS_SEGMENTID_OVERALL and DETAILS_SEGMENTID_CURRENT. - API: added alias Details:GetActor ("playerName"). --- API.lua | 780 +++++++++++++++++++++++++++++++++++++ API.txt | 9 + Details.toc | 1 + boot.lua | 10 +- classes/classe_combate.lua | 3 + core/parser.lua | 5 + core/plugins.lua | 2 +- core/windows.lua | 639 +++--------------------------- gumps/janela_custom.lua | 9 +- images/icons.tga | Bin 410120 -> 412510 bytes 10 files changed, 855 insertions(+), 603 deletions(-) create mode 100644 API.lua diff --git a/API.lua b/API.lua new file mode 100644 index 00000000..1b871ae7 --- /dev/null +++ b/API.lua @@ -0,0 +1,780 @@ +-- API list to be visualized ingame +-- you may access .txt APIs in the Details! root folder + + +--[=[ + + Attributes List + Object: Combat + Object: Container + Object: Actor + Keys for Damage Actor + Keys for Healing Actor + Keys for Energy Actor + Keys for Misc Actor + General Functions + Custom Displays + Object: Custom Container + +--]=] + +Details.APITopics = { + "Basic Stuff", + "Global Constant List", + "Object: Combat", + "Object: Container", + "Object: Actor", + "Keys for Damage Actor", + "Keys for Healing Actor", + "Keys for Energy Actor", + "Keys for Misc Actor", + "General Functions", + "Custom Displays", + "Object: Custom Container", +} + +local titleColor = "FFAAFFAA" +local descColor = "FFBBBBBB" +local codeColor = "FFFFFFFF" + +Details.APIText = { + + --general calls +[[ +@TITLE- Getting the current combat:@ + +local currentCombat = Details:GetCurrentCombat() + + +@TITLE- Getting a specific combat:@ + +@CODElocal desiredCombat = Details:GetCombat (segmentID = DETAILS_SEGMENTID_CURRENT)@ + +@DESCFor overall use DETAILS_SEGMENTID_OVERALL, for older segments use the combat index (1 ... 25) new combats are always added to index 1.@ + + +@TITLE- Getting a player:@ + +@DESCThere's several ways to get a player object, the quick way is:@ + +@CODElocal actorObject = Details:GetActor (segmentID = DETAILS_SEGMENTID_CURRENT, attributeID = DETAILS_ATTRIBUTE_DAMAGE, playerName)@ + +@DESCThe segmentID is the same as described on GetCombat(), attributeID is the ID for the attribute type. +there is an alias which receives the player name as the first parameter: Details:GetPlayer (playerName, segmentID, attributeID), combat also accept GetActor(): combat:GetActor (attributeID, playerName). +Retriving actors is expensive, try to cache the object once you have it. +@ + + +@TITLE- Getting the damage done and dps of a player:@ + +@CODElocal combat = Details:GetCurrentTime() +local actor = Details:GetActor (DETAILS_SEGMENTID_CURRENT, DETAILS_ATTRIBUTE_DAMAGE, "MyCharacterName") + +local damageDone = actor.total +local combatTime = combat:GetCombatTime() + +local effectiveDPS = damageDone / combatTime +local activeDPS = damageDone / actor:Tempo()@ + + +@TITLE- Getting all players in a combat:@ + +@CODElocal combat = Details:GetCurrentCombat() +local actorContainer = combat:GetContainer (DETAILS_ATTRIBUTE_DAMAGE) + +for _, actorObject in actorContainer:ListActors() do + if (actorObject:IsPlayer()) then + --this is a player + end +end@ + +]], + + --attribute list +[[ +Attribute Indexes: + +DETAILS_ATTRIBUTE_DAMAGE = 1 +DETAILS_ATTRIBUTE_HEAL = 2 +DETAILS_ATTRIBUTE_ENERGY = 3 +DETAILS_ATTRIBUTE_MISC = 4 + +Sub Attribute Indexes: + +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_SUBATTRIBUTE_BYSPELLS = 8 + +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_SUBATTRIBUTE_HEALABSORBED = 7 + +DETAILS_SUBATTRIBUTE_REGENMANA = 1 +DETAILS_SUBATTRIBUTE_REGENRAGE = 2 +DETAILS_SUBATTRIBUTE_REGENENERGY = 3 +DETAILS_SUBATTRIBUTE_REGENRUNE = 4 +DETAILS_SUBATTRIBUTE_RESOURCES = 5 +DETAILS_SUBATTRIBUTE_ALTERNATEPOWER = 6 + +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 + +Segment Types: + +DETAILS_SEGMENTTYPE_GENERIC = 0 +DETAILS_SEGMENTTYPE_OVERALL = 1 +DETAILS_SEGMENTTYPE_DUNGEON_TRASH = 5 +DETAILS_SEGMENTTYPE_DUNGEON_BOSS = 6 +DETAILS_SEGMENTTYPE_RAID_TRASH = 7 +DETAILS_SEGMENTTYPE_RAID_BOSS = 8 +DETAILS_SEGMENTTYPE_MYTHICDUNGEON_GENERIC = 10 +DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASH = 11 +DETAILS_SEGMENTTYPE_MYTHICDUNGEON_OVERALL = 12 +DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASHOVERALL = 13 +DETAILS_SEGMENTTYPE_MYTHICDUNGEON_BOSS = 14 +DETAILS_SEGMENTTYPE_PVP_ARENA = 20 +DETAILS_SEGMENTTYPE_PVP_BATTLEGROUND = 21 + +Segment IDs: +DETAILS_SEGMENTID_OVERALL = -1 +DETAILS_SEGMENTID_CURRENT = 0 +]], + + + --combat object +[[ +Combat Object: +actor = combat:GetActor ( attribute, character_name ) or actor = combat ( attribute, character_name ) +returns an actor object + +characterList = combat:GetActorList ( attribute ) +returns a numeric table with all actors of the specific attribute, contains players, npcs, pets, etc. + +combatName = combat:GetCombatName ( try_to_find ) +returns the segment name, e.g. "Trainning Dummy", if try_to_find is true, it searches the combat for a enemy name. + +bossInfo = combat:GetBossInfo() +returns the table containing informations about the boss encounter. +table members: name, zone, mapid, diff, diff_string, id, ej_instance_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. + +minutes, seconds = GetFormatedCombatTime() +returns the combat time formated with minutes and seconds. + +startDate, endDate = combat:GetDate() +returns the start and end date as %H:%M:%S. + +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 the unique ID number for the combat. + +container = combat:GetContainer ( attribute ) +returns the container table for the requested attribute. + +roster = combat:GetRoster() +returns a hash table with player names preset in the raid group at the start of the combat. + +chartData = combat:GetTimeData ( chart_data_name ) +returns the table containing the data for create a chart. + +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 + +total = combat:GetTotal ( attribute, subAttribute [, onlyGroup] ) +returns the total of the requested attribute. + +mythictInfo = combat:GetMythicDungeonInfo() +returns a table with information about the mythic dungeon encounter. + +mythicTrashInfo = combat:GetMythicDungeonTrashInfo() +returns a table with information about the trash cleanup for this combat. + +isMythicDungeonSegment = combat:IsMythicDungeon() +returns if the segment is from a mythic dungeon. + +isMythicDungeonOverallSegment = combat:IsMythicDungeonOverall() +returns if the segment is an overall mythic dungeon segment. + +combatType = combat:GetCombatType() +returns the combat identification (see segment types). + +alternatePowerTable = combat:GetAlteranatePower() +returns a table containing information about alternate power gains from players. +]], + + + --container object +[[ +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' + +actor = container:GetActor (character_name) +returns the actor, for spell container use the spellid instead. + +container:GetSpell (spellid) +unique for spell container. +e.g. actor.spells:GetSpell (spellid) +return the spelltable for the requested spellid. + +amount = container:GetAmount (actorName [, key = "total"]) +returns the amount of the requested member key, if key is not passed, "total" is used. + +container:SortByKey (keyname) +sort the actor container placing in descending order actors with bigger amounts on their 'keyname'. +*only works for actor container + +sourceName = container:GetSpellSource (spellid) +return the name of the first actor found inside the container which used a spell with the desired spellid. +note: this is important for multi-language auras/displays where you doesn't want to hardcode the npc name. +*only works for actor container + +total = container:GetTotal (key = "total") +returns the total amount of all actors inside the container, if key is omitted, "total" is used. +*only works for actor container + +total = container:GetTotalOnRaid (key = "total", combat) +similar to GetTotal, but only counts the total of raid members. +combat is the combat object owner of this container. +*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. + +spell = actor:GetSpell (spellid) +returns a spell table of requested spell id. + +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. + +texture, left, right, top, bottom = actor:GetClassIcon() +returns the icon texture path and the texture's texcoords. +]], + + + --damage actor members +[[ +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). + +spell.m_amt = multistrike hits. +spell.m_dmg = multistrike damage. +spell.m_crit = multistrike critical hits. +spell.n_min = minimal damage made on a normal hit. +spell.n_max = max damage made on a normal hit. +spell.n_amt = amount of normal hits. +spell.n_dmg = total amount made doing only normal hits. +spell.c_min = minimal damage made on a critical hit. +spell.c_max = max damage 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_dmg = total amount made doing only normal hits. +spell.g_amt = how many glancing blows this spell has. +spell.g_dmg = total damage made by glancing blows. +spell.r_amt = total of times this spell got resisted by the target. +spell.r_dmg = amount of damage made when it got resisted. +spell.b_amt = amount of times this spell got blocked by the enemy. +spell.b_dmg = damage made when the spell got blocked. +spell.a_amt = amount of times this spell got absorbed. +spell.a_dmg = total damage while absorbed. + +spell.targets = hash table containing {["targetname"] = total damage done by this spell on this target} + +Getting Dps: +For activity time: DPS = actor.total / actor:Tempo() +For effective time: DPS = actor.total / combat:GetCombatTime() +]], + + + --healing actor members +[[ +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.m_amt = multistrike hits. +spell.m_healed = multistrike healed. +spell.m_crit = multistrike critical hits. +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. + +spell.targets = hash table containing {["targetname"] = total healing done by this spell on this target} +spell.targets_overheal = hash table containing {["targetname"] = total overhealing by this spell on this target} +spell.targets_absorbs = hash table containing {["targetname"] = total absorbs by shields (damage prevented) done by this spell on this target} + +Getting Hps: +For activity time: HPS = actor.total / actor:Tempo() +For effective time: HPS = actor.total / combat:GetCombatTime() +]], + + + --energy actor members +[[ +actor.total = total of energy generated. +actor.received = total of energy received. +actor.resource = total of resource generated. +actor.resource_type = type of the resource used by the actor. + +actor.pets = numeric table of GUIDs of pets summoned by this actor. +actor.targets = hash table of targets: {[targetName] = amount}. +actor.spells = spell container. + +spell: +total = total energy restored by this spell. +counter = how many times this spell restored energy. +id = spellid + +targets = hash table containing {["targetname"] = total energy produced towards this target} +]], + + + --misc actor members +[[ +these members and tables may not be present on all actors, depends what the actor performs during the combat, these tables are created on the fly by the parser. + +- Crowd Control Done: +actor.cc_done = amount of crowd control done. +actor.cc_done_targets = hash table with target names and amount {[targetName] = amount}. +actor.cc_done_spells = spell container. + +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} + + +- Dispel (members has 2 "L" instead of 1) +actor.dispell = amount of dispels done. +actor.dispell_targets = hash table telling who got dispel from this actor {[targetName] = amount}. +actor.dispell_spells = spell container. +actor.dispell_oque = hash table with the ids of the spells dispelled by this actor {[spellid of the spell dispelled] = 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}. +]], + + + --general functions +[[ +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. + +bestResult, encounterTable = Details.storage:GetBestFromPlayer (encounterDiff, encounterId, playerRole, playerName) +query the storage for the best result of the player on the encounter. +encounterDiff = raid difficult ID (15 for heroic, 16 for mythic). +encounterId = may be found on "id" member getting combat:GetBossInfo(). +playerRole = "DAMAGER" or "HEALER", tanks are considered "DAMAGER". +playerName = name of the player to query (with server name if the player is from another realm). +bestResult = integer, best damage or healing done on the boss made by the player. +encounterTable = {["date"] = formated time() ["time"] = time() ["elapsed"] = combat time ["guild"] = guild name ["damage"] = all damage players ["healing"] = all healers} + +heal_or_damage_done = Details.storage:GetPlayerData (encounterDiff, encounterId, playerName) +query the storage for previous ecounter data for the player. +returns a numeric table with the damage or healing done by the player on all encounters found. +encounterDiff = raid difficult ID (15 for heroic, 16 for mythic). +encounterId = may be found on "id" member getting combat:GetBossInfo(). +playerName = name of the player to query (with server name if the player is from another realm). + +itemLevel = Details.ilevel:GetIlvl (guid) +returns a table with {name = "actor name", ilvl = itemLevel, time = time() when the item level was gotten}. +return NIL if no data for the player is avaliable yet. + +talentsTable = Details:GetTalents (guid) +if available, returns a table with 7 indexes with the talentId selected for each tree {talentId, talentId, talentId, talentId, talentId, talentId, talentId}. +use with GetTalentInfoByID() + +spec = Details:GetSpec (guid) +if available, return the spec id of the actor, use with GetSpecializationInfoByID() + +Details:SetDeathLogLimit (limit) +Set the amount of lines to store on death log. + +npcId = Details:GetNpcIdFromGuid (guid) +Extract the npcId from the actor guid. +]], + + + --custom displays +[[ +Cstom Display is a special display where users can set their own rules on searching for what show in the window. +There is 4 scripts which compose the display: + +Required: +Search - this is the main script, it's responsible to build a list of actors to show in the window. + +Optional: +Tooltip - it runs when the user hover over a bar. +Total - runs when showing the bar, and helps format the total done. +Percent - also runs when showing the bar, it formats the percentage amount. + + +Search Code: +- The script receives 3 parameters: *Combat, *CustomContainer and *Instance. +*Combat - is the reference for the selected combat shown in the window (the one selected on segments menu). +*CustomContainer - is the place where the display mantain stored the results, Details! get the content inside the container and use to update the window. +*Instance - is the reference of the window where the custom display is shown. + +- Also, the script must return three values: total made by all players, the amount of the top player and the amount of players found by the script. +- The search script basically begins getting these three parameters and declaring our three return values: + +local Combat, CustomContainer, Instance = ... +local total, top, amount = 0, 0, 0 + +- Then, we build our search for wherever we want to show, here we are building an example for Damage Done by Pets and Guardians. +- So, as we are working with damage, we want to get a list of Actors from the Damage Container of the combat and iterate it with ipairs: + +local damage_container = combat:GetActorList( DETAILS_ATTRIBUTE_DAMAGE ) +for i, actor in ipairs( damage_container ) do + --do stuff +end + +- Actor, can be anything, a monster, player, boss, etc, so, we need to check if actor is a pet: + +if (actor:IsPetOrGuardian()) then + --do stuff +end + +- Now we found a pet, we need to get the damage done and find who is the owner of this pet, after that, we also need to check if the owner is a player: + +local petOwner = actor.owner +if (petOwner:IsPlayer()) then + local petDamage = actor.total +end + +- The next step is add the pet owner into the CustomContainer: + +CustomContainer:AddValue (petOwner, petDamage) + +- And in the and, we need to get the total, top and amount values. This is generally calculated inside our loop above, but just calling the API for the result is more handy: + +total, top = CustomContainer:GetTotalAndHighestValue() +amount = CustomContainer:GetNumActors() +return total, top, amount + + +The finished script looks like this: + +local Combat, CustomContainer, Instance = ... +local total, top, amount = 0, 0, 0 + +local damage_container = Combat:GetActorList( DETAILS_ATTRIBUTE_DAMAGE ) +for i, actor in ipairs( damage_container ) do + if (actor:IsPetOrGuardian()) then + local petOwner = actor.owner + if (petOwner:IsPlayer()) then + local petDamage = actor.total + CustomContainer:AddValue( petOwner, petDamage ) + end + end +end + +total, top = CustomContainer:GetTotalAndHighestValue() +amount = CustomContainer:GetNumActors() + +return total, top, amount + + +Tooltip Code: +- The script receives 3 parameters: *Actor, *Combat and *Instance. This script has no return value. +*Actor - in our case, actor is the petOwner. + +local Actor, Combat, Instance = ... +local Format = Details:GetCurrentToKFunction() + +- What we want where is show all pets the player used in the combat and how much damage each one made. +- The member .pets gives us a table with pet names that belongs to the actor. + +local actorPets = Actor.pets + +- Next move is iterate this table and get the pet actor from the combat. +- In Details! always use ">= 1" not "> 0", also when not using our format functions, use at least floor() + +for i, petName in ipairs( actorPets ) do + local petActor = Combat( DETAILS_ATTRIBUTE_DAMAGE, petName) + if (petActor and petActor.total >= 1) then + --do stuff + end +end + +- With the pet in hands, what we have to do now is add this pet to our tooltip. +- Details! uses 'GameCooltip' which is slight different than 'GameTooltip': + +GameCooltip:AddLine( petName, Format( nil, petActor.total ) ) +Details:AddTooltipBackgroundStatusbar() + + +The finished script looks like this: + +local Actor, Combat, Instance = ... +local Format = Details:GetCurrentToKFunction() + +local actorPets = Actor.pets + +for i, petName in ipairs( actorPets ) do + local petActor = Combat( DETAILS_ATTRIBUTE_DAMAGE, petName) + if (petActor and petActor.total >= 1) then + GameCooltip:AddLine( petName, Format( nil, petActor.total ) ) + Details:AddTooltipBackgroundStatusbar() + end +end + + + +Total Code and Percent Code: +- Details! build the total and the percent automatically, these scripts are for special cases where you want to show something different, e.g. convert total into seconds/minutes. +- Both scripts receives 5 parameters, three are new to us: +*Value - the total made by this actor. +*Top - the value made by the rank 1 actor. +*Total - the total made by all actors. + +local value, top, total, combat, instance = ... +local result = floor (value) +return total +]], + + + --custom container +[[ +Custom Container Object: +A custom container is primarily used when building custom displays. +Is used to hold values for any kind of actor in Details! and also any other table as long as it has a ".name" or ".id" key. + +value = is a number indicating the actor's score, the container doesn't know what kind of actor it is holding, if is a damage actor, energy, a spell, so, it is just nominated 'value'. + +container:GetValue ( actor ) +returns the current value for the requested actor. + +container:AddValue ( actor, amountToAdd, checkTop, nameComplement ) +actor is any actor object or any other table containing a member "name" or "id", e.g. {name = "Jeff"} {id = 186451} +amountToAdd is the amount to add to this actor on the container. +checkTop is for some special cases when the top value needs to be calculated immediately. +nameComplement is a string to add on the end of the actor's name, for instance, in cases where the actor is a spell and its name is generated by the container. +returns the current value for the actor. + +container:SetValue (actor, amount, nameComplement) +actor is any actor object or any other table containing a member "name" or "id", e.g. {name = "Jeff"} {id = 186451} +amount is the amount to set to this actor on the container. +nameComplement is a string to add on the end of the actor's name, for instance, in cases where the actor is a spell and its name is generated by the container. + +container:HasActor (actor) +return true if the container holds a reference for 'actor'. + +container:GetNumActors() +returns the amount of actors present inside the container. + +container:GetTotalAndHighestValue() +return 'total' and 'top' values. +total is the total of value of all actors together. +top is the amount of value of the actor with more value. + +container:WipeCustomActorContainer() +removes all data from a custom container. +this is automatically performed when the search script runs. +]] +} + +for i = 1, #Details.APIText do + local text = Details.APIText [i] + + --add the color to the text + text = text:gsub ([[@TITLE]], "|c" .. titleColor) + text = text:gsub ([[@CODE]], "|c" .. codeColor) + text = text:gsub ([[@DESC]], "|c" .. descColor) + + --add the end color + text = text:gsub ([[@]], "|r") + + Details.APIText [i] = text +end diff --git a/API.txt b/API.txt index e62c9c2e..44fd8553 100644 --- a/API.txt +++ b/API.txt @@ -197,12 +197,21 @@ returns the total of the requested attribute. mythictInfo = combat:GetMythicDungeonInfo() returns a table with information about the mythic dungeon encounter. +mythicTrashInfo = combat:GetMythicDungeonTrashInfo() +returns a table with information about the trash cleanup for this combat. + isMythicDungeonSegment = combat:IsMythicDungeon() returns if the segment is from a mythic dungeon. isMythicDungeonOverallSegment = combat:IsMythicDungeonOverall() returns if the segment is an overall mythic dungeon segment. +combatType = combat:GetCombatType() +returns the combat identification (see segment types). + +alternatePowerTable = combat:GetAlteranatePower() +returns a table containing information about alternate power gains from players. + -------------------------------------------------------------------- Other Calls: diff --git a/Details.toc b/Details.toc index 61caa883..d98cf7c8 100644 --- a/Details.toc +++ b/Details.toc @@ -23,6 +23,7 @@ locales\Details-zhTW.lua boot.lua indent.lua core\util.lua +API.lua functions\profiles.lua functions\hooks.lua diff --git a/boot.lua b/boot.lua index 9b55800f..c52d9a8d 100644 --- a/boot.lua +++ b/boot.lua @@ -3,7 +3,7 @@ _ = nil _detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0") - _detalhes.build_counter = 5101 + _detalhes.build_counter = 5154 _detalhes.userversion = "v7.3.0." .. _detalhes.build_counter _detalhes.realversion = 128 --core version _detalhes.version = _detalhes.userversion .. " (core " .. _detalhes.realversion .. ")" @@ -21,14 +21,14 @@ do local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) --[[ -|cFFFFFF00v7.3.2.5101.128 (|cFFFFCC00Dec 15th, 2017|r|cFFFFFF00)|r:\n\n -|cFFFFFF00-|r Moving the custom display window to the new plugins window.\n\n -|cFFFFFF00-|r Major layout changes on the Encounter Details plugin window.\n\n +|cFFFFFF00v7.3.2.5154.128 (|cFFFFCC00Dec 22th, 2017|r|cFFFFFF00)|r:\n\n +|cFFFFFF00-|r API, Custom Display and Create Aura windows are now attached to the new plugin window.\n\n +|cFFFFFF00-|r .\n\n --]] -- - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v7.3.2.5101.128 (|cFFFFCC00Dec 15th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Moving the custom display window to the new plugins window.\n\n|cFFFFFF00-|r Major layout changes on the Encounter Details plugin window.\n\n|cFFFFFF00v7.3.2.4919.128 (|cFFFFCC00Dec 08th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with the statistics sharing among guild members.\n\n|cFFFFFF00-|r Fixed an issue with Argus encounter where two segments were created.\n\n|cFFFFFF00-|r Fixed aura type images on the Create Aura Panel.\n\n|cFFFFFF00-|r Create Aura Panel can now be closed with Right Click.\n\n|cFFFFFF00-|r Framework updated to r60, plugins should be more stable now.\n\n|cFFFFFF00v7.3.0.4830.126 (|cFFFFFF00v7.3.2.4836.126 (|cFFFFCC00Nov 21th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Removed some tutorial windows popups.\n\n|cFFFFCC00Oct 21th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed opening windows when streamer settings > no alerts is enabled.\n\n|cFFFFFF00v7.3.0.4823.126 (|cFFFFCC00Oct 09th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added new options section: Streamer Settings, focused on adjustments for streamers and youtubers.\n\n|cFFFFFF00-|r Animations now always run at the same speed regardless the framerate.\n\n|cFFFFFF00-|r Click-To-Open menus now close the menu if the menu is already open.\n\n|cFFFFFF00v7.3.0.4723.126 (|cFFFFCC00Set 22th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed overall dungeon segments being added to overall data.\n\n|cFFFFFF00v7.3.0.4705.126 (|cFFFFCC00Set 19th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed damage taken tooltip for Brewmaster Monk where sometimes the tooltip didn't open.\n\n|cFFFFFF00-|r Fixed overall data on mythic dungeon not adding trash segments even with the option enabled on the options panel.\n\n|cFFFFFF00-|r Fixed the guild selection dropdown reseting everytime the Guild Rank window is opened.\n\n|cFFFFFF00v7.3.0.4677.126 (|cFFFFCC00Set 10th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r During mythic dungeons, the trash segments will be merged into a new segment at the end of the boss encounter (instead of merging on the fly while cleaning up).\n\n|cFFFFFF00v7.3.0.4615.125 (|cFFFFCC00Set 09th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Setting up the dungeon stuff as opt-in for early adopters while we continue to make improvements on the system.\n\n|cFFFFFF00v7.3.0.4586.125 (|cFFFFCC00Set 08th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Formating mythic+ dungeon segments, each segment should count the boss trash + boss fight.\n\n|cFFFFFF00-|r At the end of the mythic+ dungeon, it should create a new segment adding up all segments described above.\n\n|cFFFFFF00v7.3.0.4499.124 (|cFFFFCC00Set 05th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an option to always show all players when using the standard mode. Option under PvP/PvE bracket on the options panel.\n\n|cFFFFFF00-|r Added a setting to exclude healing done lines from the death log below a certain healing amount. This options is also under PvP/PvE bracket.\n\n|cFFFFFF00-|r Fixed the guild selection on the ranking panel.\n\n|cFFFFFF00v7.3.0.4467.124 (|cFFFFCC00August 29th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Damage or Healing record for the encounter should be printed on chat on the boss pull.\nUse /run Details.announce_damagerecord.enabled = false; to disable.\n\n|cFFFFFF00v7.2.5.4437.124 (|cFFFFCC00August 21th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added healing done cap for death log. Use /run Details.deathlog_healingdone_min = 10000\n\n|cFFFFFF00-|r Fixed an issue where the alpha from the fixed bar color was used even when this option was disabled.\n\n|cFFFFFF00v7.2.5.4436.124 (|cFFFFCC00August 17th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Attempt to fix the issue where the window doesn't update after entering a raid or reseting data.\n\n|cFFFFFF00v7.2.5.4434.124 (|cFFFFCC00August 10th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added buttons to create an aura at Aura tab on the Player Details window.\n\n|cFFFFFF00-|r Fixes and improvements on the damage rank panel.\n\n|cFFFFFF00-|r Best damage or healing for the player on the current boss encounter is now shown on the spec icon tooltip.\n\n|cFFFFFF00-|r Major revamp on the aura creation panel.\n\n|cFFFFFF00v7.2.5.4369.124 (|cFFFFCC00August 1st, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Details! can now track debuff applications (stack) and refreshes.\n\n|cFFFFFF00-|r Added new tab on Player Detail Window called 'Auras', you can see your buffs and debuffs from there.\n\n|cFFFFFF00-|r Death log now show debuff applications.\n\n|cFFFFFF00v7.2.5.4275.123 (|cFFFFCC00July 18th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed some issues with tooltiops popup when the user press SHIFT.\n\n|cFFFFFF00-|r Now is possible to change the bar durating when selecting Cast Start trigger on Details! Forge.\n\n|cFFFFFF00-|r Kil'Jaeden adds should be consolidated into only one actor instead of having one for each player targeted.\n\n|cFFFFFF00v7.2.5.4236.122 (|cFFFFCC00July 05th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r The alert to open the raid ranking after a boss kill, is now shown for 10 seconds (down from 40).\n\n|cFFFFFF00-|r Added a report button on the raid ranking panel and boss are sort alphabetically.\n\n|cFFFFFF00-|r Fixed some issues on the combatlog introduced on the wow patch 7.2.5 where sometimes the source of an event has no name.\n\n|cFFFFFF00-|r Ticket #209, fixed more issues with the comparison panel where are pets involved.\n\n|cFFFFFF00v7.2.5.4201.121 (|cFFFFCC00June 26th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed Monk Stagger where it was only shown on the friendly fire and not under the Damage Taken display.\n\n|cFFFFFF00-|r Added Forge and Ranking options on the main menu (orange cogwheel).\n\n|cFFFFFF00v7.2.5.4102.121 (|cFFFFCC00June 22th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Details! Forge has updated and now is more usder friendly.\n\n|cFFFFFF00-|r Fixed an issue with player buff uptime where sometimes some buffs wans't showing in the tooltip.\n\n|cFFFFFF00v7.2.5.3968.120 (|cFFFFCC00June 20th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r New Death Recap implemented! replaces the default from Blizzard and can be configured at Options > Raid Tools.\n\n|cFFFFFF00-|r New Guild Damage and Heal rank on '/details ranking' panel.\n\n|cFFFFFF00-|r Added a Guild Sync button on the Details! Ranking Panel.\n\n|cFFFFFF00-|r Added Custom display 'Damage on Shields', useful for encounter like Maiden of Vigilance where there's big shields to be removed and you want to know who is doing more damage to it.\n\n|cFFFFFF00-|r Added Heal Absorbed display under Heal bracket.\n\nHeal Absorb are the heal denied by abilities such like DK's Necrotic Strike or raid boss Sisters of the Moon 'Embrace of the Eclipse' ability.\nThe tooltip of this display shows which players got heal denied, which abilities absorbed the heal, which abilities tried to heal but got the heal denied.\n\n|cFFFFFF00-|r Added Alternate Power display under Energy bracket, it shows the total of alternate power gain from each player, useful for encounters such as Demonic Inquisition.\n\n|cFFFFFF00-|r 'First Hit' message after pulling a boss, now also shows who the boss is targeting (almost always is who pulled).\n\n|cFFFFFF00-|r Raid Dps {rdps} and Hps {rhps} can now be used on the Broker Data Feed..\n\n|cFFFFFF00-|r Fixed an issue with Chromie from the scenario 'The Deaths of Chromie' where she wasn't being shown on the meter.\n\n|cFFFFFF00-|r Fixed Paladin 'Light of the Martyr' damage to self.\n\n|cFFFFFF00-|r Ticket #198 'Script Error' Fixed.\n\n|cFFFFFF00v7.2.0.3703.119 (|cFFFFCC00May 29th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an error while killing low level mobs with warrior class.\n\n|cFFFFFF00v7.2.0.3693.118 (|cFFFFCC00May 25th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fury Warrior shouldn't be assigned as Protection any more.\n\n|cFFFFFF00-|r Some parser fixes.\n\n|cFFFFFF00v7.2.0.3673.118 (|cFFFFCC00May 09th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #187: Fixed an issue when comparing hunter pets on the player detail window.\n\n|cFFFFFF00-|r Ticket #189 #186: Fixed a taint issue for some classes when using friendly nameplates on.\n\n|cFFFFFF00v7.2.0.3512.116 (|cFFFFCC00April 27th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Havoc Demon Hunter: your fury energy is being shown under Mana Restored (don't ask me why, the combat log is telling us it's mana).\n\n|cFFFFFF00-|r Pets now are shown on damage tooltips.\n\n|cFFFFFF00-|r Pets are now also shown on the comparison panel.\n\n|cFFFFFF00v7.2.0.3474.116 (|cFFFFCC00April 20th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Plugin: Raid Check > added some food buffs which wasn't being tracked.\n\n|cFFFFFF00v7.2.0.3467.116 (|cFFFFCC00April 07th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for the custom display window where apply and cancel buttons where over the edit window.\n\n|cFFFFFF00-|r Fix for an issue on editing a bookmark.\n\n|cFFFFFF00v7.1.5.3459.116 (|cFFFFCC00Mar 21th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue on dynamic overall data where it wasn't showing DPS.\n\n|cFFFFFF00-|r Fixed an issue with Apply, Save and Cancel buttons when editing a custom display.\n\n|cFFFFFF00-|r Removed the Damage and Healing presets for custom displays, now is only possible create custom displays by scripting them.\n\n|cFFFFFF00v7.1.5.3431.116 (|cFFFFCC00Mar 15th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with bar orientation right to left where fixed bar color isn't working.\n\n|cFFFFFF00-|r The nickname field now use FrizQuadrataTT font and shall be compatible with Cyrillic.\n\n|cFFFFFF00v7.1.5.3418.116 (|cFFFFCC00Mar 1st, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #167 fix: Light of the Martyr self-damage now does reduce the healing done (following WCL method).\n\n|cFFFFFF00-|r Ticket #169 fix: Damage Prevented is now working for new segments.\n\n|cFFFFFF00-|r Fixed an issue where sometimes BeastMaster's Hati pet wasn't detected correctly.\n\n|cFFFFFF00v7.1.5.3369.116 (|cFFFFCC00Feb 07th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added custom display 'Dynamic Overall Damage' for mythic dungeons.\n\n|cFFFFFF00-|r Fix for Ticket #168: 'Auto Hide While [Not] Inside Instance is broken'.\n\n|cFFFFFF00-|r The bar truncate frame 'DetailsLeftTextAntiTruncate' is now created on Details! load instead on demand.\n\n|cFFFFFF00v7.1.5.3315.116 (|cFFFFCC00Jan 23th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #162: 'no Monochrome font' available, added an experimental slash command: /run _detalhes:UseOutline ('MONOCHROME').\n\n|cFFFFFF00-|r Ticket #158: 'no elapsed time shown on report to chat', added the elapsed time when reporting a segment.\n\n|cFFFFFF00-|r Ticket #164: 'error when browsing segments', an attempt to fix the problem has been made.\n\n|cFFFFFF00v7.1.5.3305.116 (|cFFFFCC00Jan 15th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Another fix for mythic dungeons overall data reset (thanks Tharai @ Curseforge).\n\n|cFFFFFF00-|r Fix for spec detection on PvP Arenas (thanks Pas06 @ Curseforge).\n\n|cFFFFFF00v7.1.0.3276.115 (|cFFFFCC00Jan 08th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed the overall data not reseting when starting a new mythic+ dungeon.\n\n|cFFFFFF00v7.1.0.3266.115 (|cFFFFCC00Dec 29th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with overall data not updating correctly at the end of the combat.\n\n|cFFFFFF00-|r Added a tutorial line on the window when the user access overall data.\n\n|cFFFFFF00v7.1.0.3236.115 (|cFFFFCC00Dec 19th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Integration with BigWigs should be working okay now.\n\n|cFFFFFF00v7.1.0.3231.115 (|cFFFFCC00Dec 15th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Disabled the link with BigWigs to avoid the 'RegisterMessage' error on every login.\n\n|cFFFFFF00v7.1.0.3229.115 (|cFFFFCC00Dec 09th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r When a window is locked, resize grips shouldn't be enabled messing with bar mouse over.\n\n|cFFFFFF00v7.0.3.3222.115 (|cFFFFCC00November 28th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Unstable Affliction to common spells with the same name.\n\n|cFFFFFF00-|r Fixed few issues with built-in plugins.\n\n|cFFFFFF00v7.0.3.3202.115 (|cFFFFCC00November 08th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Weakauras creator from the Encounter Details plugin and '/details forge' shall work correctly now with Trials of Valor.\n\n|cFFFFFF00-|r Raid history should now be recording your Trials of Valor kills.\n\n|cFFFFFF00-|r Added Trials of Valor raid info, good luck and have fun!.\n\n|cFFFFFF00v7.0.3.3201.115 (|cFFFFCC00November 04th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for Paladin holy icon.\n\n|cFFFFFF00-|r Fix for Rogue outlaw icon.\n\n|cFFFFFF00-|r Fixed misc displays with bar sorted by ascending order.\n\n|cFFFFFF00-|r Fix for '/details show' command while the window is on auto hide.\n\n|cFFFFFF00v7.0.3.3114.115 (|cFFFFCC00October 26th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Encounter Details (plugin): tooltip tutorial is now clamped to screen and its close button should be visible.\n\n|cFFFFFF00-|r Raid Check (plugin): now also works on dungeons.\n\n|cFFFFFF00-|r Added Potion of the Prolongued Power to the tracker.\n\n|cFFFFFF00v7.1.0.3097.115 (|cFFFFCC00October 25th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r renamed 'report history' to 'latest reports'.\n\n|cFFFFFF00-|r attempt to make all Details! users on the party or raid to track rogue's akaari's soul." + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v7.3.2.5154.128 (|cFFFFCC00Dec 22th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r API and Create Aura windows are now attached to the new plugin window.\n\n|cFFFFFF00v7.3.2.5101.128 (|cFFFFCC00Dec 15th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Moving the custom display window to the new plugins window.\n\n|cFFFFFF00-|r Major layout changes on the Encounter Details plugin window.\n\n|cFFFFFF00v7.3.2.4919.128 (|cFFFFCC00Dec 08th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with the statistics sharing among guild members.\n\n|cFFFFFF00-|r Fixed an issue with Argus encounter where two segments were created.\n\n|cFFFFFF00-|r Fixed aura type images on the Create Aura Panel.\n\n|cFFFFFF00-|r Create Aura Panel can now be closed with Right Click.\n\n|cFFFFFF00-|r Framework updated to r60, plugins should be more stable now.\n\n|cFFFFFF00v7.3.0.4830.126 (|cFFFFFF00v7.3.2.4836.126 (|cFFFFCC00Nov 21th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Removed some tutorial windows popups.\n\n|cFFFFCC00Oct 21th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed opening windows when streamer settings > no alerts is enabled.\n\n|cFFFFFF00v7.3.0.4823.126 (|cFFFFCC00Oct 09th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added new options section: Streamer Settings, focused on adjustments for streamers and youtubers.\n\n|cFFFFFF00-|r Animations now always run at the same speed regardless the framerate.\n\n|cFFFFFF00-|r Click-To-Open menus now close the menu if the menu is already open.\n\n|cFFFFFF00v7.3.0.4723.126 (|cFFFFCC00Set 22th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed overall dungeon segments being added to overall data.\n\n|cFFFFFF00v7.3.0.4705.126 (|cFFFFCC00Set 19th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed damage taken tooltip for Brewmaster Monk where sometimes the tooltip didn't open.\n\n|cFFFFFF00-|r Fixed overall data on mythic dungeon not adding trash segments even with the option enabled on the options panel.\n\n|cFFFFFF00-|r Fixed the guild selection dropdown reseting everytime the Guild Rank window is opened.\n\n|cFFFFFF00v7.3.0.4677.126 (|cFFFFCC00Set 10th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r During mythic dungeons, the trash segments will be merged into a new segment at the end of the boss encounter (instead of merging on the fly while cleaning up).\n\n|cFFFFFF00v7.3.0.4615.125 (|cFFFFCC00Set 09th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Setting up the dungeon stuff as opt-in for early adopters while we continue to make improvements on the system.\n\n|cFFFFFF00v7.3.0.4586.125 (|cFFFFCC00Set 08th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Formating mythic+ dungeon segments, each segment should count the boss trash + boss fight.\n\n|cFFFFFF00-|r At the end of the mythic+ dungeon, it should create a new segment adding up all segments described above.\n\n|cFFFFFF00v7.3.0.4499.124 (|cFFFFCC00Set 05th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an option to always show all players when using the standard mode. Option under PvP/PvE bracket on the options panel.\n\n|cFFFFFF00-|r Added a setting to exclude healing done lines from the death log below a certain healing amount. This options is also under PvP/PvE bracket.\n\n|cFFFFFF00-|r Fixed the guild selection on the ranking panel.\n\n|cFFFFFF00v7.3.0.4467.124 (|cFFFFCC00August 29th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Damage or Healing record for the encounter should be printed on chat on the boss pull.\nUse /run Details.announce_damagerecord.enabled = false; to disable.\n\n|cFFFFFF00v7.2.5.4437.124 (|cFFFFCC00August 21th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added healing done cap for death log. Use /run Details.deathlog_healingdone_min = 10000\n\n|cFFFFFF00-|r Fixed an issue where the alpha from the fixed bar color was used even when this option was disabled.\n\n|cFFFFFF00v7.2.5.4436.124 (|cFFFFCC00August 17th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Attempt to fix the issue where the window doesn't update after entering a raid or reseting data.\n\n|cFFFFFF00v7.2.5.4434.124 (|cFFFFCC00August 10th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added buttons to create an aura at Aura tab on the Player Details window.\n\n|cFFFFFF00-|r Fixes and improvements on the damage rank panel.\n\n|cFFFFFF00-|r Best damage or healing for the player on the current boss encounter is now shown on the spec icon tooltip.\n\n|cFFFFFF00-|r Major revamp on the aura creation panel.\n\n|cFFFFFF00v7.2.5.4369.124 (|cFFFFCC00August 1st, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Details! can now track debuff applications (stack) and refreshes.\n\n|cFFFFFF00-|r Added new tab on Player Detail Window called 'Auras', you can see your buffs and debuffs from there.\n\n|cFFFFFF00-|r Death log now show debuff applications.\n\n|cFFFFFF00v7.2.5.4275.123 (|cFFFFCC00July 18th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed some issues with tooltiops popup when the user press SHIFT.\n\n|cFFFFFF00-|r Now is possible to change the bar durating when selecting Cast Start trigger on Details! Forge.\n\n|cFFFFFF00-|r Kil'Jaeden adds should be consolidated into only one actor instead of having one for each player targeted.\n\n|cFFFFFF00v7.2.5.4236.122 (|cFFFFCC00July 05th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r The alert to open the raid ranking after a boss kill, is now shown for 10 seconds (down from 40).\n\n|cFFFFFF00-|r Added a report button on the raid ranking panel and boss are sort alphabetically.\n\n|cFFFFFF00-|r Fixed some issues on the combatlog introduced on the wow patch 7.2.5 where sometimes the source of an event has no name.\n\n|cFFFFFF00-|r Ticket #209, fixed more issues with the comparison panel where are pets involved.\n\n|cFFFFFF00v7.2.5.4201.121 (|cFFFFCC00June 26th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed Monk Stagger where it was only shown on the friendly fire and not under the Damage Taken display.\n\n|cFFFFFF00-|r Added Forge and Ranking options on the main menu (orange cogwheel).\n\n|cFFFFFF00v7.2.5.4102.121 (|cFFFFCC00June 22th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Details! Forge has updated and now is more usder friendly.\n\n|cFFFFFF00-|r Fixed an issue with player buff uptime where sometimes some buffs wans't showing in the tooltip.\n\n|cFFFFFF00v7.2.5.3968.120 (|cFFFFCC00June 20th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r New Death Recap implemented! replaces the default from Blizzard and can be configured at Options > Raid Tools.\n\n|cFFFFFF00-|r New Guild Damage and Heal rank on '/details ranking' panel.\n\n|cFFFFFF00-|r Added a Guild Sync button on the Details! Ranking Panel.\n\n|cFFFFFF00-|r Added Custom display 'Damage on Shields', useful for encounter like Maiden of Vigilance where there's big shields to be removed and you want to know who is doing more damage to it.\n\n|cFFFFFF00-|r Added Heal Absorbed display under Heal bracket.\n\nHeal Absorb are the heal denied by abilities such like DK's Necrotic Strike or raid boss Sisters of the Moon 'Embrace of the Eclipse' ability.\nThe tooltip of this display shows which players got heal denied, which abilities absorbed the heal, which abilities tried to heal but got the heal denied.\n\n|cFFFFFF00-|r Added Alternate Power display under Energy bracket, it shows the total of alternate power gain from each player, useful for encounters such as Demonic Inquisition.\n\n|cFFFFFF00-|r 'First Hit' message after pulling a boss, now also shows who the boss is targeting (almost always is who pulled).\n\n|cFFFFFF00-|r Raid Dps {rdps} and Hps {rhps} can now be used on the Broker Data Feed..\n\n|cFFFFFF00-|r Fixed an issue with Chromie from the scenario 'The Deaths of Chromie' where she wasn't being shown on the meter.\n\n|cFFFFFF00-|r Fixed Paladin 'Light of the Martyr' damage to self.\n\n|cFFFFFF00-|r Ticket #198 'Script Error' Fixed.\n\n|cFFFFFF00v7.2.0.3703.119 (|cFFFFCC00May 29th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an error while killing low level mobs with warrior class.\n\n|cFFFFFF00v7.2.0.3693.118 (|cFFFFCC00May 25th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fury Warrior shouldn't be assigned as Protection any more.\n\n|cFFFFFF00-|r Some parser fixes.\n\n|cFFFFFF00v7.2.0.3673.118 (|cFFFFCC00May 09th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #187: Fixed an issue when comparing hunter pets on the player detail window.\n\n|cFFFFFF00-|r Ticket #189 #186: Fixed a taint issue for some classes when using friendly nameplates on.\n\n|cFFFFFF00v7.2.0.3512.116 (|cFFFFCC00April 27th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Havoc Demon Hunter: your fury energy is being shown under Mana Restored (don't ask me why, the combat log is telling us it's mana).\n\n|cFFFFFF00-|r Pets now are shown on damage tooltips.\n\n|cFFFFFF00-|r Pets are now also shown on the comparison panel.\n\n|cFFFFFF00v7.2.0.3474.116 (|cFFFFCC00April 20th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Plugin: Raid Check > added some food buffs which wasn't being tracked.\n\n|cFFFFFF00v7.2.0.3467.116 (|cFFFFCC00April 07th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for the custom display window where apply and cancel buttons where over the edit window.\n\n|cFFFFFF00-|r Fix for an issue on editing a bookmark.\n\n|cFFFFFF00v7.1.5.3459.116 (|cFFFFCC00Mar 21th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue on dynamic overall data where it wasn't showing DPS.\n\n|cFFFFFF00-|r Fixed an issue with Apply, Save and Cancel buttons when editing a custom display.\n\n|cFFFFFF00-|r Removed the Damage and Healing presets for custom displays, now is only possible create custom displays by scripting them.\n\n|cFFFFFF00v7.1.5.3431.116 (|cFFFFCC00Mar 15th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with bar orientation right to left where fixed bar color isn't working.\n\n|cFFFFFF00-|r The nickname field now use FrizQuadrataTT font and shall be compatible with Cyrillic.\n\n|cFFFFFF00v7.1.5.3418.116 (|cFFFFCC00Mar 1st, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #167 fix: Light of the Martyr self-damage now does reduce the healing done (following WCL method).\n\n|cFFFFFF00-|r Ticket #169 fix: Damage Prevented is now working for new segments.\n\n|cFFFFFF00-|r Fixed an issue where sometimes BeastMaster's Hati pet wasn't detected correctly.\n\n|cFFFFFF00v7.1.5.3369.116 (|cFFFFCC00Feb 07th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added custom display 'Dynamic Overall Damage' for mythic dungeons.\n\n|cFFFFFF00-|r Fix for Ticket #168: 'Auto Hide While [Not] Inside Instance is broken'.\n\n|cFFFFFF00-|r The bar truncate frame 'DetailsLeftTextAntiTruncate' is now created on Details! load instead on demand.\n\n|cFFFFFF00v7.1.5.3315.116 (|cFFFFCC00Jan 23th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #162: 'no Monochrome font' available, added an experimental slash command: /run _detalhes:UseOutline ('MONOCHROME').\n\n|cFFFFFF00-|r Ticket #158: 'no elapsed time shown on report to chat', added the elapsed time when reporting a segment.\n\n|cFFFFFF00-|r Ticket #164: 'error when browsing segments', an attempt to fix the problem has been made.\n\n|cFFFFFF00v7.1.5.3305.116 (|cFFFFCC00Jan 15th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Another fix for mythic dungeons overall data reset (thanks Tharai @ Curseforge).\n\n|cFFFFFF00-|r Fix for spec detection on PvP Arenas (thanks Pas06 @ Curseforge).\n\n|cFFFFFF00v7.1.0.3276.115 (|cFFFFCC00Jan 08th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed the overall data not reseting when starting a new mythic+ dungeon.\n\n|cFFFFFF00v7.1.0.3266.115 (|cFFFFCC00Dec 29th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with overall data not updating correctly at the end of the combat.\n\n|cFFFFFF00-|r Added a tutorial line on the window when the user access overall data.\n\n|cFFFFFF00v7.1.0.3236.115 (|cFFFFCC00Dec 19th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Integration with BigWigs should be working okay now.\n\n|cFFFFFF00v7.1.0.3231.115 (|cFFFFCC00Dec 15th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Disabled the link with BigWigs to avoid the 'RegisterMessage' error on every login.\n\n|cFFFFFF00v7.1.0.3229.115 (|cFFFFCC00Dec 09th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r When a window is locked, resize grips shouldn't be enabled messing with bar mouse over.\n\n|cFFFFFF00v7.0.3.3222.115 (|cFFFFCC00November 28th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Unstable Affliction to common spells with the same name.\n\n|cFFFFFF00-|r Fixed few issues with built-in plugins.\n\n|cFFFFFF00v7.0.3.3202.115 (|cFFFFCC00November 08th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Weakauras creator from the Encounter Details plugin and '/details forge' shall work correctly now with Trials of Valor.\n\n|cFFFFFF00-|r Raid history should now be recording your Trials of Valor kills.\n\n|cFFFFFF00-|r Added Trials of Valor raid info, good luck and have fun!.\n\n|cFFFFFF00v7.0.3.3201.115 (|cFFFFCC00November 04th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for Paladin holy icon.\n\n|cFFFFFF00-|r Fix for Rogue outlaw icon.\n\n|cFFFFFF00-|r Fixed misc displays with bar sorted by ascending order.\n\n|cFFFFFF00-|r Fix for '/details show' command while the window is on auto hide.\n\n|cFFFFFF00v7.0.3.3114.115 (|cFFFFCC00October 26th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Encounter Details (plugin): tooltip tutorial is now clamped to screen and its close button should be visible.\n\n|cFFFFFF00-|r Raid Check (plugin): now also works on dungeons.\n\n|cFFFFFF00-|r Added Potion of the Prolongued Power to the tracker.\n\n|cFFFFFF00v7.1.0.3097.115 (|cFFFFCC00October 25th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r renamed 'report history' to 'latest reports'.\n\n|cFFFFFF00-|r attempt to make all Details! users on the party or raid to track rogue's akaari's soul." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails!:|r " diff --git a/classes/classe_combate.lua b/classes/classe_combate.lua index 108f5ba4..da0c068c 100644 --- a/classes/classe_combate.lua +++ b/classes/classe_combate.lua @@ -159,6 +159,9 @@ return Loc ["STRING_UNKNOW"] end + DETAILS_SEGMENTID_OVERALL = -1 + DETAILS_SEGMENTID_CURRENT = 0 + --enum segments type DETAILS_SEGMENTTYPE_GENERIC = 0 diff --git a/core/parser.lua b/core/parser.lua index 39783900..c8f40a76 100644 --- a/core/parser.lua +++ b/core/parser.lua @@ -4971,6 +4971,11 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 return _detalhes:GetActor (_combat, 1, _actorname), _detalhes:GetActor (_combat, 2, _actorname), _detalhes:GetActor (_combat, 3, _actorname), _detalhes:GetActor (_combat, 4, _actorname) end + --> get player + function _detalhes:GetPlayer (_actorname, _combat, _attribute) + return _detalhes:GetActor (_combat, _attribute, _actorname) + end + --> get an actor function _detalhes:GetActor (_combat, _attribute, _actorname) diff --git a/core/plugins.lua b/core/plugins.lua index 06b35d70..d0f08bbc 100644 --- a/core/plugins.lua +++ b/core/plugins.lua @@ -624,7 +624,7 @@ newButton.textsize = 10 --> set icon - newButton:SetIcon (pluginObject.__icon) + newButton:SetIcon (pluginObject.__icon, nil, nil, nil, pluginObject.__iconcoords, pluginObject.__iconcolor, 4) --> add it to menu table tinsert (f.MenuButtons, newButton) diff --git a/core/windows.lua b/core/windows.lua index ab296ffe..7d8bb85c 100644 --- a/core/windows.lua +++ b/core/windows.lua @@ -34,6 +34,9 @@ local animation_func_left local animation_func_right + gump:NewColor ("DETAILS_API_ICON", .5, .4, .3, 1) + gump:NewColor ("DETAILS_STATISTICS_ICON", .8, .8, .8, 1) + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> core @@ -1174,7 +1177,9 @@ DetailsRaidHistoryWindow.Frame = DetailsRaidHistoryWindow DetailsRaidHistoryWindow.__name = Loc ["STRING_STATISTICS"] DetailsRaidHistoryWindow.real_name = "DETAILS_STATISTICS" - DetailsRaidHistoryWindow.__icon = [[Interface\PvPRankBadges\PvPRank08]] + DetailsRaidHistoryWindow.__icon = [[Interface\AddOns\Details\images\icons]] + DetailsRaidHistoryWindow.__iconcoords = {278/512, 314/512, 43/512, 76/512} + DetailsRaidHistoryWindow.__iconcolor = "DETAILS_STATISTICS_ICON" DetailsPluginContainerWindow.EmbedPlugin (DetailsRaidHistoryWindow, DetailsRaidHistoryWindow, true) function DetailsRaidHistoryWindow.RefreshWindow() @@ -3805,617 +3810,61 @@ end - -- ~API - - function _detalhes.OpenAPI() - if (not DetailsAPIPanel) then - - local topics_text = { -[[ -Attribute Indexes: -DETAILS_ATTRIBUTE_DAMAGE = 1 -DETAILS_ATTRIBUTE_HEAL = 2 -DETAILS_ATTRIBUTE_ENERGY = 3 -DETAILS_ATTRIBUTE_MISC = 4 -]], -[[ -Combat Object: -actor = combat:GetActor ( attribute, character_name ) or actor = combat ( attribute, character_name ) -returns an actor object - -characterList = combat:GetActorList ( attribute ) -returns a numeric table with all actors of the specific attribute, contains players, npcs, pets, etc. - -combatName = combat:GetCombatName ( try_to_find ) -returns the segment name, e.g. "Trainning Dummy", if try_to_find is true, it searches the combat for a enemy name. - -bossInfo = combat:GetBossInfo() -returns the table containing informations about the boss encounter. -table members: name, zone, mapid, diff, diff_string, id, ej_instance_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. - -minutes, seconds = GetFormatedCombatTime() -returns the combat time formated with minutes and seconds. - -startDate, endDate = combat:GetDate() -returns the start and end date as %H:%M:%S. - -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 the unique ID number for the combat. - -container = combat:GetContainer ( attribute ) -returns the container table for the requested attribute. - -roster = combat:GetRoster() -returns a hash table with player names preset in the raid group at the start of the combat. - -chartData = combat:GetTimeData ( chart_data_name ) -returns the table containing the data for create a chart. - -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 - -total = combat:GetTotal ( attribute, subAttribute [, onlyGroup] ) -returns the total of the requested attribute. -]], -[[ -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' - -actor = container:GetActor (character_name) -returns the actor, for spell container use the spellid instead. - -container:GetSpell (spellid) -unique for spell container. -e.g. actor.spells:GetSpell (spellid) -return the spelltable for the requested spellid. - -amount = container:GetAmount (actorName [, key = "total"]) -returns the amount of the requested member key, if key is not passed, "total" is used. - -container:SortByKey (keyname) -sort the actor container placing in descending order actors with bigger amounts on their 'keyname'. -*only works for actor container - -sourceName = container:GetSpellSource (spellid) -return the name of the first actor found inside the container which used a spell with the desired spellid. -note: this is important for multi-language auras/displays where you doesn't want to hardcode the npc name. -*only works for actor container - -total = container:GetTotal (key = "total") -returns the total amount of all actors inside the container, if key is omitted, "total" is used. -*only works for actor container - -total = container:GetTotalOnRaid (key = "total", combat) -similar to GetTotal, but only counts the total of raid members. -combat is the combat object owner of this container. -*only works for actor container -]], -[[ -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. - -spell = actor:GetSpell (spellid) -returns a spell table of requested spell id. - -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. - -texture, left, right, top, bottom = actor:GetClassIcon() -returns the icon texture path and the texture's texcoords. -]], -[[ -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). - -spell.m_amt = multistrike hits. -spell.m_dmg = multistrike damage. -spell.m_crit = multistrike critical hits. -spell.n_min = minimal damage made on a normal hit. -spell.n_max = max damage made on a normal hit. -spell.n_amt = amount of normal hits. -spell.n_dmg = total amount made doing only normal hits. -spell.c_min = minimal damage made on a critical hit. -spell.c_max = max damage 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_dmg = total amount made doing only normal hits. -spell.g_amt = how many glancing blows this spell has. -spell.g_dmg = total damage made by glancing blows. -spell.r_amt = total of times this spell got resisted by the target. -spell.r_dmg = amount of damage made when it got resisted. -spell.b_amt = amount of times this spell got blocked by the enemy. -spell.b_dmg = damage made when the spell got blocked. -spell.a_amt = amount of times this spell got absorbed. -spell.a_dmg = total damage while absorbed. - -spell.targets = hash table containing {["targetname"] = total damage done by this spell on this target} - -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.m_amt = multistrike hits. -spell.m_healed = multistrike healed. -spell.m_crit = multistrike critical hits. -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. - -spell.targets = hash table containing {["targetname"] = total healing done by this spell on this target} -spell.targets_overheal = hash table containing {["targetname"] = total overhealing by this spell on this target} -spell.targets_absorbs = hash table containing {["targetname"] = total absorbs by shields (damage prevented) done by this spell on this target} - -Getting Hps: -For activity time: HPS = actor.total / actor:Tempo() -For effective time: HPS = actor.total / combat:GetCombatTime() -]], -[[ -actor.total = total of energy generated. -actor.received = total of energy received. -actor.resource = total of resource generated. -actor.resource_type = type of the resource used by the actor. - -actor.pets = numeric table of GUIDs of pets summoned by this actor. -actor.targets = hash table of targets: {[targetName] = amount}. -actor.spells = spell container. - -spell: -total = total energy restored by this spell. -counter = how many times this spell restored energy. -id = spellid - -targets = hash table containing {["targetname"] = total energy produced towards this target} -]], -[[ -these members and tables may not be present on all actors, depends what the actor performs during the combat, these tables are created on the fly by the parser. - -- Crowd Control Done: -actor.cc_done = amount of crowd control done. -actor.cc_done_targets = hash table with target names and amount {[targetName] = amount}. -actor.cc_done_spells = spell container. - -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} - - -- Dispel (members has 2 "L" instead of 1) -actor.dispell = amount of dispels done. -actor.dispell_targets = hash table telling who got dispel from this actor {[targetName] = amount}. -actor.dispell_spells = spell container. -actor.dispell_oque = hash table with the ids of the spells dispelled by this actor {[spellid of the spell dispelled] = 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. - -bestResult, encounterTable = Details.storage:GetBestFromPlayer (encounterDiff, encounterId, playerRole, playerName) -query the storage for the best result of the player on the encounter. -encounterDiff = raid difficult ID (15 for heroic, 16 for mythic). -encounterId = may be found on "id" member getting combat:GetBossInfo(). -playerRole = "DAMAGER" or "HEALER", tanks are considered "DAMAGER". -playerName = name of the player to query (with server name if the player is from another realm). -bestResult = integer, best damage or healing done on the boss made by the player. -encounterTable = {["date"] = formated time() ["time"] = time() ["elapsed"] = combat time ["guild"] = guild name ["damage"] = all damage players ["healing"] = all healers} - -heal_or_damage_done = Details.storage:GetPlayerData (encounterDiff, encounterId, playerName) -query the storage for previous ecounter data for the player. -returns a numeric table with the damage or healing done by the player on all encounters found. -encounterDiff = raid difficult ID (15 for heroic, 16 for mythic). -encounterId = may be found on "id" member getting combat:GetBossInfo(). -playerName = name of the player to query (with server name if the player is from another realm). - -itemLevel = Details.ilevel:GetIlvl (guid) -returns a table with {name = "actor name", ilvl = itemLevel, time = time() when the item level was gotten}. -return NIL if no data for the player is avaliable yet. - -talentsTable = Details:GetTalents (guid) -if available, returns a table with 7 indexes with the talentId selected for each tree {talentId, talentId, talentId, talentId, talentId, talentId, talentId}. -use with GetTalentInfoByID() - -spec = Details:GetSpec (guid) -if available, return the spec id of the actor, use with GetSpecializationInfoByID() - -Details:SetDeathLogLimit (limit) -Set the amount of lines to store on death log. - -npcId = Details:GetNpcIdFromGuid (guid) -Extract the npcId from the actor guid. -]], --custom displays -[[ -Cstom Display is a special display where users can set their own rules on searching for what show in the window. -There is 4 scripts which compose the display: - -Required: -Search - this is the main script, it's responsible to build a list of actors to show in the window. - -Optional: -Tooltip - it runs when the user hover over a bar. -Total - runs when showing the bar, and helps format the total done. -Percent - also runs when showing the bar, it formats the percentage amount. - - -Search Code: -- The script receives 3 parameters: *Combat, *CustomContainer and *Instance. -*Combat - is the reference for the selected combat shown in the window (the one selected on segments menu). -*CustomContainer - is the place where the display mantain stored the results, Details! get the content inside the container and use to update the window. -*Instance - is the reference of the window where the custom display is shown. - -- Also, the script must return three values: total made by all players, the amount of the top player and the amount of players found by the script. -- The search script basically begins getting these three parameters and declaring our three return values: - -local Combat, CustomContainer, Instance = ... -local total, top, amount = 0, 0, 0 - -- Then, we build our search for wherever we want to show, here we are building an example for Damage Done by Pets and Guardians. -- So, as we are working with damage, we want to get a list of Actors from the Damage Container of the combat and iterate it with ipairs: - -local damage_container = combat:GetActorList( DETAILS_ATTRIBUTE_DAMAGE ) -for i, actor in ipairs( damage_container ) do - --do stuff -end - -- Actor, can be anything, a monster, player, boss, etc, so, we need to check if actor is a pet: - -if (actor:IsPetOrGuardian()) then - --do stuff -end - -- Now we found a pet, we need to get the damage done and find who is the owner of this pet, after that, we also need to check if the owner is a player: - -local petOwner = actor.owner -if (petOwner:IsPlayer()) then - local petDamage = actor.total -end - -- The next step is add the pet owner into the CustomContainer: - -CustomContainer:AddValue (petOwner, petDamage) - -- And in the and, we need to get the total, top and amount values. This is generally calculated inside our loop above, but just calling the API for the result is more handy: - -total, top = CustomContainer:GetTotalAndHighestValue() -amount = CustomContainer:GetNumActors() -return total, top, amount - - -The finished script looks like this: - -local Combat, CustomContainer, Instance = ... -local total, top, amount = 0, 0, 0 - -local damage_container = Combat:GetActorList( DETAILS_ATTRIBUTE_DAMAGE ) -for i, actor in ipairs( damage_container ) do - if (actor:IsPetOrGuardian()) then - local petOwner = actor.owner - if (petOwner:IsPlayer()) then - local petDamage = actor.total - CustomContainer:AddValue( petOwner, petDamage ) + function _detalhes:InitializeAPIWindow() + local DetailsAPIPanel = gump:CreateSimplePanel (UIParent, 700, 480, "Details! API", "DetailsAPIPanel") + DetailsAPIPanel.Frame = DetailsAPIPanel + DetailsAPIPanel.__name = "API" + DetailsAPIPanel.real_name = "DETAILS_APIWINDOW" + DetailsAPIPanel.__icon = [[Interface\AddOns\Details\images\icons]] + DetailsAPIPanel.__iconcoords = {449/512, 480/512, 62/512, 83/512} + DetailsAPIPanel.__iconcolor = "DETAILS_API_ICON" + DetailsPluginContainerWindow.EmbedPlugin (DetailsAPIPanel, DetailsAPIPanel, true) + + function DetailsAPIPanel.RefreshWindow() + _detalhes.OpenAPI() end end -end + + function _detalhes.OpenAPI() + if (not DetailsAPIPanel or not DetailsAPIPanel.Initialized) then + + local f = DetailsAPIPanel or gump:CreateSimplePanel (UIParent, 700, 480, "Details! API", "DetailsAPIPanel") + DetailsAPIPanel.Initialized = true -total, top = CustomContainer:GetTotalAndHighestValue() -amount = CustomContainer:GetNumActors() - -return total, top, amount - - -Tooltip Code: -- The script receives 3 parameters: *Actor, *Combat and *Instance. This script has no return value. -*Actor - in our case, actor is the petOwner. - -local Actor, Combat, Instance = ... -local Format = Details:GetCurrentToKFunction() - -- What we want where is show all pets the player used in the combat and how much damage each one made. -- The member .pets gives us a table with pet names that belongs to the actor. - -local actorPets = Actor.pets - -- Next move is iterate this table and get the pet actor from the combat. -- In Details! always use ">= 1" not "> 0", also when not using our format functions, use at least floor() - -for i, petName in ipairs( actorPets ) do - local petActor = Combat( DETAILS_ATTRIBUTE_DAMAGE, petName) - if (petActor and petActor.total >= 1) then - --do stuff - end -end - -- With the pet in hands, what we have to do now is add this pet to our tooltip. -- Details! uses 'GameCooltip' which is slight different than 'GameTooltip': - -GameCooltip:AddLine( petName, Format( nil, petActor.total ) ) -Details:AddTooltipBackgroundStatusbar() - - -The finished script looks like this: - -local Actor, Combat, Instance = ... -local Format = Details:GetCurrentToKFunction() - -local actorPets = Actor.pets - -for i, petName in ipairs( actorPets ) do - local petActor = Combat( DETAILS_ATTRIBUTE_DAMAGE, petName) - if (petActor and petActor.total >= 1) then - GameCooltip:AddLine( petName, Format( nil, petActor.total ) ) - Details:AddTooltipBackgroundStatusbar() - end -end - - - -Total Code and Percent Code: -- Details! build the total and the percent automatically, these scripts are for special cases where you want to show something different, e.g. convert total into seconds/minutes. -- Both scripts receives 5 parameters, three are new to us: -*Value - the total made by this actor. -*Top - the value made by the rank 1 actor. -*Total - the total made by all actors. - -local value, top, total, combat, instance = ... -local result = floor (value) -return total -]], --custom container -[[ -Custom Container Object: -A custom container is primarily used when building custom displays. -Is used to hold values for any kind of actor in Details! and also any other table as long as it has a ".name" or ".id" key. - -value = is a number indicating the actor's score, the container doesn't know what kind of actor it is holding, if is a damage actor, energy, a spell, so, it is just nominated 'value'. - -container:GetValue ( actor ) -returns the current value for the requested actor. - -container:AddValue ( actor, amountToAdd, checkTop, nameComplement ) -actor is any actor object or any other table containing a member "name" or "id", e.g. {name = "Jeff"} {id = 186451} -amountToAdd is the amount to add to this actor on the container. -checkTop is for some special cases when the top value needs to be calculated immediately. -nameComplement is a string to add on the end of the actor's name, for instance, in cases where the actor is a spell and its name is generated by the container. -returns the current value for the actor. - -container:SetValue (actor, amount, nameComplement) -actor is any actor object or any other table containing a member "name" or "id", e.g. {name = "Jeff"} {id = 186451} -amount is the amount to set to this actor on the container. -nameComplement is a string to add on the end of the actor's name, for instance, in cases where the actor is a spell and its name is generated by the container. - -container:HasActor (actor) -return true if the container holds a reference for 'actor'. - -container:GetNumActors() -returns the amount of actors present inside the container. - -container:GetTotalAndHighestValue() -return 'total' and 'top' values. -total is the total of value of all actors together. -top is the amount of value of the actor with more value. - -container:WipeCustomActorContainer() -removes all data from a custom container. -this is automatically performed when the search script runs. -]] -} - local f = gump:CreateSimplePanel (UIParent, 700, 480, "Details! API", "DetailsAPIPanel") - - local text_box = gump:NewSpecialLuaEditorEntry (f, 520, 430, "text", "$parentTextEntry", true) - text_box:SetPoint ("topleft", f, "topleft", 170, -40) + local text_box = gump:NewSpecialLuaEditorEntry (f, 685, 540, "text", "$parentTextEntry", true) + text_box:SetPoint ("topleft", f, "topleft", 220, -40) + text_box:SetBackdrop (nil) + + --> create a background area where the text editor is + local TextEditorBackground = gump:NewButton (f, nil, nil, nil, 1, 1, function()end) + TextEditorBackground:SetAllPoints (text_box) + TextEditorBackground:SetTemplate (gump:GetTemplate ("button", "DETAILS_CUSTOMDISPLAY_CODE_BOX")) + local file, size, flags = text_box.editbox:GetFont() text_box.editbox:SetFont (file, 12, flags) - local topics = { - "Attributes List", - "Object: Combat", - "Object: Container", - "Object: Actor", - "Keys for Damage Actor", - "Keys for Healing Actor", - "Keys for Energy Actor", - "Keys for Misc Actor", - "General Functions", - "Custom Displays", - "Object: Custom Container", - } + local topics = Details.APITopics local select_topic = function (self, button, topic) - text_box:SetText (topics_text [topic]) + text_box:SetText (Details.APIText [topic]) end for i = 1, #topics do local title = topics [i] - local button = gump:CreateButton (f, select_topic, 80, 16, title, i) - button:SetPoint ("topleft", f, "topleft", 5, (-i*20)-40) + local button = gump:CreateButton (f, select_topic, 200, 20, title, i) + + button:SetTemplate (gump:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")) + button:SetPoint ("topleft", f, "topleft", 5, (-i*22)-30) button:SetIcon ([[Interface\Buttons\UI-GuildButton-PublicNote-Up]], nil, nil, nil, nil, nil, nil, 2) end - + + select_topic (nil, nil, 1) + end - DetailsAPIPanel:Show() + --DetailsAPIPanel:Show() + DetailsPluginContainerWindow.OpenPlugin (DetailsAPIPanel) end diff --git a/gumps/janela_custom.lua b/gumps/janela_custom.lua index 44b4e0f7..fa9f7c7a 100644 --- a/gumps/janela_custom.lua +++ b/gumps/janela_custom.lua @@ -81,6 +81,8 @@ backdropbordercolor = {0, 0, 0, 1}, }) + gump:NewColor ("DETAILS_CUSTOMDISPLAY_ICON", .7, .6, .5, 1) + local CONST_CODETEXTENTRY_TEMPLATE = gump:GetTemplate ("button", "DETAILS_CUSTOMDISPLAY_CODE_BOX") local CONST_CODETEXTENTRYEXPANDED_TEMPLATE = gump:GetTemplate ("button", "DETAILS_CUSTOMDISPLAY_CODE_BOX_EXPANDED") local CONST_CODETEXTENTRYBUTTON_TEMPLATE = gump:GetTemplate ("button", "DETAILS_CUSTOMDISPLAY_CODE_BOX_BUTTON") @@ -132,7 +134,10 @@ DetailsCustomPanel.Frame = DetailsCustomPanel DetailsCustomPanel.__name = "Custom Displays" DetailsCustomPanel.real_name = "DETAILS_CUSTOMDISPLAY" - DetailsCustomPanel.__icon = [[Interface\FriendsFrame\UI-FriendsList-Small-Up]] + --DetailsCustomPanel.__icon = [[Interface\FriendsFrame\UI-FriendsList-Small-Up]] + DetailsCustomPanel.__icon = [[Interface\AddOns\Details\images\icons]] + DetailsCustomPanel.__iconcoords = {412/512, 441/512, 43/512, 79/512} + DetailsCustomPanel.__iconcolor = "DETAILS_CUSTOMDISPLAY_ICON" DetailsPluginContainerWindow.EmbedPlugin (DetailsCustomPanel, DetailsCustomPanel, true) function DetailsCustomPanel.RefreshWindow() @@ -738,7 +743,7 @@ button:SetPoint ("topleft", self, "topleft", CONST_MENU_X_POSITION, CONST_MENU_Y_POSITION + ((index-1)*-23)) button:SetTemplate (CONST_BUTTON_TEMPLATE) - button:SetIcon (icon, CONST_MENU_HEIGHT-4, CONST_MENU_HEIGHT-4, "overlay", {.1, .9, .1, .9}) + button:SetIcon (icon, CONST_MENU_HEIGHT-4, CONST_MENU_HEIGHT-4, "overlay", {.1, .9, .1, .9}, nil, 4) button:SetHook ("OnEnter", onenter) button:SetHook ("OnLeave", onleave) diff --git a/images/icons.tga b/images/icons.tga index 23351c832a335d9da5f5ea98663ff84861f57e1a..6ee9767aecd8283d99e2f811589c2fc359e06669 100644 GIT binary patch delta 2870 zcmbVOYiv|S6z*($5P}UG6{Us^+em3l)mEzs7$qwhQ30*uBcV1~E_D_ChM7 znX_BwWOaO)wa_t6z)5#9c1lG}c6EP$e_8;qAW#HE-lN4(qNUBNtdT~OQ$;K1#ef7* zREC#YxQdoot5>vMvP|dzN7C?mdJ$g7xatVd2E4G=U9dquE3SmBi{k?W!DT561L4&8 zs+1)PApu04VOZ9Cw``RA2ZCT4=|I_Hy!xqK2Oj^#ePWZWf4Ks(2EiimDX^A;q@h2y z0)pmJpcKqXrQz7td6zaZlxA|!IV<6Z(hV(djXSYcnu^Ogh2&wDtY53GlG>K1M*mk3 zJ+<G-ql?)+T^H{04xcBPuyDKs^f;Yc!4kFc9X}>pl5HPdf=+xfoZ^MZj`b!g_24y z^p%()*u$1R!UcE|E$)P`<_I&*fhkeF z=?sG{DcPYVjha^M7ktCzbd%+F?UA~>wOunL z<`M@=f#6EK^eRLk#DFLeZ1PqlL`?p1C}|mZO#&_ee3+861TWpSH*HcY%iVAbylvYn zwUcZ|(S8;i6-%6)P+TMrYbbOLQdY`FK@etF)6 zIxwunEYN;S#qvyD>hAkqI{tkRqC=ciuck>}G@;HE-E;_jmaYL>dYOCu2l>gT<6J)V zmM*TkUaRf{@{k#O76#p*I=ex0%D6$7{B{#mFKL+hAAKNrQ0_CiO2vZY0oQC~ENmt< zb(7(E(_3Yf@!9=mmJE}A1~s$Uha_Th&ZQWtl$ph32^Y`|JP3T`Y^-XNe^C2vxKt~^ ziN1}k`7i=cQX7ngfMjdtDeD402KXc#H+Wpey6s2gydS#HHRNy1X0PF>%rRLc(i89o zgg%~E4S9`n9-649lc7a5GyVOf>X*HAv)6fCUN<2vLI7ho0BpC{EZbtoefFg6m|)qG z%k^9;FDb*Dy%Ftlb>I|{NPx$Hz1l-LXP)Es{wUl1Qxt=dPcla?Do`EwZ;MxdN^%3q zL&*^~`wxK2mTsowwx5wjjQx42X01txTZA&rTS1f~M(fGYr>I~@1IIoXHIvFxv4>otONQzX8I|3t9jG delta 475 zcmXZWO(?^07zgnFq}^;e$w4V82M6Wm@NYSg68;V-)@T@( z@n_yQo0r+VWb)RSmuUZ*a`4hpo@bnXeV*_0{GKN=Bz8+;mn29UDMd0CgZxbH+YvvLs$ zVzUcH%+n?O5I>iZPgH7Fpy9=BtI5TR+l>r%Yz=vw>o*{fW%DM!Xxg%c7-?`DucW9K zqU_tjIt@&CkjDR0jc*I@f(GNV)(