You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1719 lines
74 KiB

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--global name declaration
--local _StartDebugTime = debugprofilestop() print(debugprofilestop() - _StartDebugTime)
--test if the packager will deploy to wago
--https://github.com/LuaLS/lua-language-server/wiki/Annotations#documenting-types
_ = nil
_G.Details = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0")
--add the original name to the global namespace
_detalhes = _G.Details --[[GLOBAL]]
local addonName, Details222 = ...
local version, build, date, tocversion = GetBuildInfo()
Details.build_counter = 12032
Details.alpha_build_counter = 12032 --if this is higher than the regular counter, use it instead
Details.dont_open_news = true
Details.game_version = version
Details.userversion = version .. " " .. Details.build_counter
Details.realversion = 155 --core version, this is used to check API version for scripts and plugins (see alias below)
Details.APIVersion = Details.realversion --core version
Details.version = Details.userversion .. " (core " .. Details.realversion .. ")" --simple stirng to show to players
Details.acounter = 1 --in case of a second release with the same .build_counter
Details.curseforgeVersion = C_AddOns and C_AddOns.GetAddOnMetadata and C_AddOns.GetAddOnMetadata("Details", "Version")
if (not Details.curseforgeVersion and GetAddOnMetadata) then
Details.curseforgeVersion = GetAddOnMetadata("Details", "Version")
end
function Details:GetCoreVersion()
return Details.realversion
end
Details.BFACORE = 131 --core version on BFA launch
Details.SHADOWLANDSCORE = 143 --core version on Shadowlands launch
Details.DRAGONFLIGHT = 147 --core version on Dragonflight launch
Details = Details
local gameVersionPrefix = "VWD" --vanilla, wrath, dragonflight
Details.gameVersionPrefix = gameVersionPrefix
pcall(function() Details.version_alpha_id = tonumber(Details.curseforgeVersion:match("%-(%d+)%-")) end)
--WD 10288 RELEASE 10.0.2
--WD 10288 ALPHA 21 10.0.2
function Details.GetVersionString()
local curseforgeVersion = Details.curseforgeVersion or ""
local alphaId = curseforgeVersion:match("%-(%d+)%-")
if (not alphaId) then
--this is a release version
alphaId = "RELEASE"
else
alphaId = "ALPHA " .. alphaId
end
return Details.gameVersionPrefix .. " " .. Details.build_counter .. " " .. alphaId .. " " .. Details.game_version .. ""
end
--namespace for the player breakdown window
Details.PlayerBreakdown = {}
Details222.PlayerBreakdown = {
DamageSpellsCache = {}
}
--namespace color
Details222.ColorScheme = {
["gradient-background"] = {0.1215, 0.1176, 0.1294, 0.8},
}
function Details222.ColorScheme.GetColorFor(colorScheme)
return Details222.ColorScheme[colorScheme]
end
--namespace for damage spells (spellTable)
Details222.DamageSpells = {}
--namespace for texture
Details222.Textures = {}
--namespace for pet
Details222.Pets = {}
--auto run code
Details222.AutoRunCode = {}
--options panel
Details222.OptionsPanel = {}
Details222.Instances = {}
Details222.Combat = {}
Details222.MythicPlus = {}
Details222.EJCache = {}
Details222.Segments = {}
Details222.Tables = {}
Details222.Mixins = {}
Details222.Cache = {}
Details222.Perf = {}
Details222.Cooldowns = {}
Details222.GarbageCollector = {}
Details222.BreakdownWindow = {}
Details222.PlayerStats = {}
Details222.LoadSavedVariables = {}
Details222.SaveVariables = {}
Details222.GuessSpecSchedules = {
Schedules = {},
}
Details222.TimeMachine = {}
Details222.OnUseItem = {Trinkets = {}}
Details222.Date = {
GetDateForLogs = function()
return _G.date("%Y-%m-%d %H:%M:%S")
end,
}
Details222.ClassCache = {}
Details222.ClassCache.ByName = {}
Details222.ClassCache.ByGUID = {}
Details222.UnitIdCache = {}
Details222.Roskash = {}
Details222.SpecHelpers = {
[1473] = {},
}
Details222.Actors = {}
Details222.CurrentDPS = {
Cache = {}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--initialization stuff
local _
do
local _detalhes = _G.Details
_detalhes.resize_debug = {}
local Loc = _G.LibStub("AceLocale-3.0"):GetLocale("Details")
--change logs
--[=[
--]=]
local news = {
{"v10.2.0.12023.155", "November 08th, 2023"},
"Several fixes to make the addon work with the combat log changes done on patch 10.2.0.",
"Added trinket data for patch 10.2.0.",
"Fixed an issue with death tooltips going off-screen when the window is too close to a screen border.",
"Fixed a spam of errors during battlegrounds when an enemy player heal with a dot spell.",
{"v10.1.7.12012.155", "October 27th, 2023"},
"Implemented [Pip's Emerald Friendship Badge] trinket buffs.",
"Implemented the amount of times 'On Use' trinkets are used.",
"10.2 trinket damage spells renamed to the item name.",
"Framework Upgrade",
"Lib OpenRaid Upgrade.",
"Fixed the issue 'Segment Not Found' while resetting data.",
"Fixed Rogue icon",
"Fixed an issue with the healing merge amount on death tooltips (Flamanis).",
"Fixed 'extraStatusbar' showing in wrong views (non-player-dmg) (Continuity).",
"Removed LibCompress (Flamanis).",
{"v10.1.7.11914.155", "September 13th, 2023"},
"Added an extra bar within the evoker damage bar, this new bar when hovered over shows the buff uptime of Ebon Might and Prescience on all players.",
"ToC Files of all plugins got updated.",
"Fixed the error 'Attempt to compare string with number' on vanilla (Flamanis).",
"Fixed the error 'object:ToolTip() is invalid'.",
{"v10.1.7.11901.155", "September 09th, 2023"},
"Evoker Predicted Damage improvements.",
"Improved spellId check for first hit when entering a combat (Flamanis).",
"Replaced Classic Era deprecated functions (Flamanis).",
"Change DF/pictureedit frame heirarchy to allow for close button and Done button to work right (Flamanis).",
"Unlocked Retail Streamer plugin for Classic Era (Flamanis).",
"Attempt to fix death log healing spam where a spell has multiple heals in the same millisecond.",
"Fixed an error with the old comparison window.",
{"v10.1.7.11856.155", "August 13th, 2023"},
"Fixed an issue with importing a profile with a corrupted time type.",
"Added Elemental Shaman overload spells (WillowGryph).",
{"v10.1.5.11855.155", "August 12th, 2023"},
"Forcing update interval to 0.1 on arenas matches using the real-time dps feature.",
"More parser cleanups and code improvements.",
"Auras tab now ignores regular 'world auras' (those weekly buffs of reputation, etc)",
"Fixed the player info tooltip (hovering the spec icon) height not being updated for Evoker Predicted damage.",
"Framework Update.",
"Lib Open Raid Update.",
"Code cleanup and refactoring.",
{"v10.1.5.11773.151", "July 30th, 2023"},
"Add animIn/animOut checks for the welcome window (Flamanis)",
"Fixed an issue with players with the time measurement 'real time' (Flamanis).",
{"v10.1.5.11770.151", "July 29th, 2023"},
"Removed 'Real Time DPS' from the time measure dropdown.",
"Added 'Show 'Real Time' DPS' toggle to show real time dps while in combat.",
"Added 'Order Bars By Real Time DPS' toggle to order bars by the amount of real time dps.",
"Added 'Always Use Real Time in Arenas' toggle to always use real time dps in Arenas.",
"Added .last_dps_realtime to player actors, caches the latest real time dps calculated.",
"Fixed breakdown window not opening when there's player data available at the window.",
"Fixed Augmented Evoker buffs placed before the combat start not being counted.",
"Cyclical pet ownership fix (Flamanis).",
"Added: Details:FindBuffCastedBy(unitId, buffSpellId, casterName), return up to 19 parameters",
"Framework and OpenRaid upgrades.",
{"v10.1.5.11718.151", "July 20th, 2023"},
"Renamed damageActor.extra_bar to damageActor.total_extra",
"Added: Details:ShowExtraStatusbar(barLineObject, amount, amountPercent, extraAmount)",
"Add the evoker predicted damage to overall data.",
"If any damage actor has 'total_extra' bigger than 0, the extra bar is shown.",
"List of spec names for spec tooltip detection now load at Startup not at lua compiling.",
"Renamed InstaciaCallFunction to InstanceCallDetailsFunc.",
"Fixed things about the Real Time DPS; Open Raid Lib Update.",
"Fixed Details:FindDebuffDuration(unitId, spellId, casterName) which wasn't taking the casterName in consideration.",
"Fixes on Encounter Details plugin.",
"Fixed an issue of clicking in a plugin icon in the title bar of Details! but the plugin wouldn't open.",
{"v10.1.5.11718.151", "July 13th, 2023"},
"Added: Hovering over the Augmented Evoker icon shows the Evoker's damage, along with an estimated damage done by its buffs.",
"Auras tab at the Breakdown Window, now shows damage buffs received from other players (Ebon Might, Precience and Power Infusion).",
"Auras tab now ignores regular 'world auras' (those weekly buffs of reputation, etc).",
"Added individual bar for Neltharus Weapons. Weapons on final boss and the Burning Chain (Flamanis).",
"Update interval is set to 0.1 on arenas matches using the real-time dps feature.",
"Evoker's predicted damage done is now also shown in the overall data.",
"Removed 'Real Time DPS' from the time measure dropdown.",
"Added 'Show Real Time DPS' toggle to show real time dps while in combat.",
"Added 'Order Bars By Real Time DPS' toggle to order bars by the amount of real time dps.",
"Added 'Always Use Real Time in Arenas' toggle to always use real time dps in Arenas.",
"Fixed an issue where the Breakdown Window was not refreshing when the data was reset.",
"Fixed an issue where clicking on a plugin icon in the Details! title bar would not open the plugin.",
"Fixed bugs reported for the Encounter Details plugin.",
"Fixed bugs reported for the Real Time DPS.",
"Fixed Welcome Window sometimes not opening for new instalations (Flamanis).",
"*Combat start code verification cleanup (Flamanis).",
"*Added .last_dps_realtime to player actors, caches the latest real time dps calculated.",
"*Added: actordamage.total_extra for cases where there's a secondary bar for a damage actor.",
"*If any damage actor has 'total_extra' bigger than 0, the extra bar is shown.",
"*Added: Details:ShowExtraStatusbar(lineFrame, amount, extraAmount, totalAmount, topAmount, instanceObject, onEnterFunc, onLeaveFunc)",
"*Renamed 'InstaciaCallFunction' to 'InstanceCallDetailsFunc'.",
"*Renamed 'PegaHabilidade' to GetOrCreateSpell.",
"*Renamed 'PegarCombatente' to 'GetOrCreateActor'.",
"*List of spec names for spec tooltip detection now load at Startup not at lua compiling stage.",
"*Fixed custom displays ignoring actor.customColor.",
"*Details! Framework and LibOpenRaid upgrades.",
{"v10.1.0.11700.151", "July 11th, 2023"},
"Effective time is used when displaying tooltips information.",
"Wrap the specid name locatlization cache in a Details Framework check.",
"More fixes for real time dps.",
"Don't populate overall segment on load and force refresh window on segment swap.",
"Added: spec detection from the specialization name shown on tooltip.",
"Improvements to class detection by using GetPlayerInfoByGUID()",
"Removed Breath of Eons from spec detection for augmentation evokers.",
"When DBM/BW send a callback, check if the current combat in details is valid.",
"When the actor is considered a ungroupped player, check if that player has a spec and show the spec icon instead.",
"Segments locked don't swap windows to overall.",
"Use the new API 'SetSegment' over 'TrocaTabela' for the segment selector.",
"Sort damage taken tooltip on damage amount.",
"Added: Details:GetBossEncounterTexture(encounterName); Added combat.bossIcon; Added combat.bossTimers.",
"Added: Details:DoesCombatWithUIDExists(uniqueCombatId); Details:GetCombatByUID(uniqueCombatId); combat:GetCombatUID().",
"Added: Details:RemoveSegmentByCombatObject(combatObject).",
"Details:UnpackDeathTable(deathTable) now return the spec of the character as the last parameter returned.",
"classCombat:GetTimeData(chartName) now check if the combat has a TimeData table or return an empty table; Added classCombat:EraseTimeData(chartName).",
"Code for Dispel has been modernized, deathTable now includes the key .spec.",
"Added: key .unixtime into is_boss to know when the boss was killed.",
"Fixed an issue with auto run code not saving properly.",
"Ignore vessel periodic damage when out of combat.",
"More fixes for Augmentation Evoker on 10.1.5.",
"Another wave of code changes, modernizations and refactoring.",
"Combat Objects which has been discarded due to any reason will have the boolean member: __destroyed set to true. With this change, 3rd party code can see if the data cached is up to date or obsolete.",
"Removed several deprecated code from March 2023 and earlier.",
"Large amount of code cleanup and refactoring, some functions got renamed, they are listed below:",
"- 'TravarTempos' renamed to 'LockActivityTime'.",
"- 'ClearTempTables' renamed to 'ClearCacheTables'.",
"- 'SpellIsDot' renamed to 'SetAsDotSpell'.",
"- 'FlagCurrentCombat' remamed to 'FlagNewCombat_PVPState'.",
"- 'UpdateContainerCombatentes' renamed to 'UpdatePetCache'.",
"- 'segmentClass:AddCombat(combatObject)' renamed to 'Details222.Combat.AddCombat(combatToBeAdded)'.",
"- 'CurrentCombat.verifica_combate' timer is now obsolete.",
"- 'Details.last_closed_combat' is now obsolete.",
"- 'Details.EstaEmCombate' is now obsolete.",
"- 'Details.options' is now obsolete.",
"- Spec Guess Timers are now stored within Details222.GuessSpecSchedules.Schedules, all timers are killed at the end of the combat or at a data reset.",
"- Initial time delay to send the startup signal (event sent when details has started) reduced from 5 to 4 seconds.",
"- Fixed some division by zero on ptr 10.1.5.",
"- Fixed DETAILS_STARTED event not triggering in some cases due to 'event not registered'.",
"Fixed Auto Run Code window not closing by click on the close button.",
"Set up statusbar options instead of using metatable.",
"More code cleanup and framework updates.",
"TimeData code modernizations.",
"Implementations to show plugins in the breakdown window.",
"Damage Taken by Spell overhaul, now it uses modern Details API.",
"Time Machine overhaul.",
"Splitted the window_playerbreakdown_spells.lua into three more files.",
"Added IconTexture directive to the TOC files.",
"Disabled time captures for spellTables, this should be done by a plugin.",
"Replacing table.wipe with Details:Destroy().",
{"v10.1.0.11022.151", "May 20th, 2023"},
"Breakdown pet options has changed to: 'Group Pets by Their Names' or 'Group Pets by Their Spells'.",
"Evoker empowered level now ocupies less space on the rectangle showing the damage by empower level.",
"Another Framework update.",
"Fixed an issue where some pet bars still showing the owner name.",
"Fixed an issue with the player selector on Breakdown window causing an error when selecting some players.",
"Fixed an issue caused by opening the breakdown window while seeing healing overall.",
"Fixed an issue with the min and max damage of a spell when viewing the 'merged' damage of two or more spells.",
"Fixed an issue with the Raid Check plugin throwing an error on Shuffle Arenas.",
"Fixed shields for Classic versions (Flamanis).",
{"v10.1.0.11011.151", "May 13th, 2023"},
"Added options: 'Group Player Spells With Same Name' and 'Group Pets By Spell' on the breakdown options.",
"Added combat log options for 'Calculate Shield Wasted Amount' and 'Calculate Energy Wasted Amount' under the options > Combat Log.",
"Framework and OpenRaid Updated.",
"Breakdown window won't go off screen anymore.",
"Breakdown now shows damage per phase if the segment has more than one phase.",
"Overhealing can now be seen within the Healing Done breakdown. This removes the necessity of having to go back and forward between healing done and overhealing.",
"Friendly Fire can now be seen in the breakdown window by clicking on the player bar (before the click on the player bar opened the report screen).",
"Healing Taken can also be seen on the breakdown window.",
"Some options from the Breakdown options got removed, most of them are now auto calculated by the system.",
"Fixed an issue where the Frags display was showinig death of friendly objects like Efflorescense.",
"Fixed an issue where item damage was showing 'Unknown Item' on cold logins.",
"Fixed defenses gauge (miss, dodge, parry) not showing in the spell details on the breakdown window.",
{"v10.1.0.10985.151", "May 4th, 2023"},
"The Breakdown Window has been completely rebuilt from the ground up and now includes support for several new features.",
"A significant portion of the back-end code has been revamped, resulting in improved performance and stability.",
"Combatlog now supports options, check them at the Combat Log section in the options panel.",
"Big plugin updates with improvements to Cast Log and new features for Advanced Death Log.",
"Added Real-time dps bar for arena streamers.",
"Flamanis:",
"Changed Pet Ownership detection to be hopefully more robust for future patches.",
"Added option to merge Atonement, Contrition, Ancient Teachings, and Awakened Faeline with their Crits, in the Combat Log section.",
"Added DemonHunter and Evoker Defensive cooldowns.",
"Readded option to have M+ Overall Segment only contain Bosses.",
"Fixed issue with swapping to/from Tiny Threat and other plugins using bookmarks.",
"Fixed position persistency for Statusbar elements.",
"Fixed alpha channel persistency for certain color options.",
"Fixed stack overflow related to changing option tabs or profiles too many times.",
"Fixed the highlight image of a bar icon not swapping to the new icon upon scrolling.",
"Fixed issues related to the new Left Text Offset position.",
"Fixed the wrong options being unusable with Aligned Text Columns enabled.",
{"v10.0.5.10661.147", "Mar 1st, 2023"},
"Major fixes and updates on the Event Tracker feature (for streamers).",
"When trying to import a profile with a name that already exists, it'll rename it and import (Flamanis).",
"Ignoring Fodder to the Flame npcs (Flamanis).",
"Mythic plus overall segments now have the list of player deaths.",
{"v10.0.2.10333.147", "Feb 08th, 2023"},
"Fixed load errors on Wrath.",
"Fixed enemy cast time in the death tooltip sometimes showing off time.",
"Allow negative offsets on Aligned Text Columns (Flamanis).",
"Fixed Shaman and Warrior spec detection (Flamanis).",
"More Demon hunter abilities added to be merged (Flamanis).",
"Added duck polymorph to Mage CCs (Flamanis).",
"Fixed offline player showing as party members in the /keys panel and players from other realms not caching (Flamanis).",
"Fixed an issue with some options not updating when the window is selected at the bottom right corner of the options panel (Flamanis).",
"Fixed some issues with the breakdown window for 'Damage Taken' (Flamanis).",
"Fixed an issue where sometimes the 'Always Show Me' wouldn't show if the total bar is enabled (Ricodyn).",
{"v10.0.2.10333.147", "Jan 04th, 2023"},
"Enemy Cast (non-interrupted) now is shown in the death log.",
"Damage Done by Blessing of Winter and Summer now counts torward the paladin.",
"Tooltips for Mythic Dungeon segments in the segments menu, now brings more information about the combat.",
"List of Potions updated (Jooooo)",
"Priest Spirit of Redemption now shows in the Death Log breakdown.",
"/keystone doesn't show the player realm anymore",
"When importing a profile, the confirmation box (asking a name for the new profile) got a check box to opt-out of importing Code.",
"Major fixes for Guild Sync and Statistics window: /details stats",
"Raid Check (plugin): Added M+ Score and fixed the flask usage.",
"Streamer (plugin): Fixed the plugin window hidding after login.",
"Fixed Evoker and several other cooldowns which wasn't showing in the cooldown usage display.",
"Fixed a small freeze that was happening when hovering over the segments menu.",
"Fixed some slash commands not working for deDE localization.",
"Fixed Rogue Akaari's Soul not getting detected properly during combat (Flamanis).",
"Fixed the sorting columns on /keystone panel which key stone level wasn't sorting correctly (Benjamin H.).",
"Fix for Fire Elemental on Wrath (Flamanis).",
"Fixed Evoker bug where empowered abilities wasn't showing in overall data (Flamanis).",
"Fixed an error when Details! attempted to use Ghost Frame in Wrath, but Ghost frame doesn't exists on that expansion (Flamanis).",
"Fixed spec detection for some specs on retail (Flamanis).",
"Fixed ToC for Compare2, how it also works on Wrath (Flamanis).",
"Fixed an issue with buff and debuff uptime sometimes not closing properly after the combat.",
{"v10.0.2.10333.147", "Nov 18th, 2022"},
"Added two checkboxes for Merge Pet and Player spell on the Breakdown window.",
"Added uptime for Hunter's Pet Frenzy Buff, it now show in the 'Auras' tab in the Breakdown Window.",
"/played is showing something new!",
"Options panel now closes by pressing Escape (Flamanis).",
{"v10.0.2.10277.146", "Nov 18th, 2022"},
"REMINDER: '/details coach' to get damage/healing/deaths in real time as the 21st person (coach) for the next raid tier in dragonflight.",
"New Compare tab: recreated from scratch, this new Compare has no player limitation, pets merged, bigger lines.",
"New <Plugin: Cast Log> show a time line of spells used by players in the group, Raid Leader: show all attack and defense cooldowns used by the raid (download it now on wago or curseforge).",
"Wago: Details! Standalone version is now hosted on addons.wago.io and WowUp.com.",
"",
"Added a little damage chart for your spells in the Player Breakdown Window.",
"Details! will count class play time, everyone using Details! from day 1 in Dragonflight should have an accurate play time in the class.",
"Visual updates on default skin.",
"All panels from options to plugins received visual updates.",
"Profiles won't export Auto Hide automations to stop issues with players not knowing why the window is hidding.",
"Details! should decrease the amount of chat spam errors and instead show them in the bug report window like al the other addons.",
"Player Details! Breakdown window: player selection now uses the same font as the regular window.",
"Death log tooltip revamp for more clarity to see the ability name and the damage done.",
"Dragonflight Trinkets damage will show the trinket name after the spell name.",
"'/details scroll' feature: spell name and spell id can now be copied, the frame got a scale bar.",
"Added option: 'Use Dynamic Overall Damage', if enabled swap to Dynamic Overall Damage when combat start while showing Overall Damage.",
"Fixed for most of the user having the problem of the encounter time not showing.",
"Fixed most of the issues with the melee spell name being called 'Word of Recall'.",
"Details! Damage Meter, Deatails! Framework, LibOpenRaid has been successfully updated to Dragonflight.",
"New class Evoker are now fully supported by Details!.",
"",
"Fixed an issue where warlocks was entering in combat from a debug doing damage (Flamanis).",
"Fixed 'Auto of Range' problem in Wrath of the Lich King (Flamanis).",
"Fixed a bug with custom displays when showing players outside the player group (Flamanis).",
"Fixed an issue where specs wheren't sent on Wrath (Flamanis).",
"Fixed Buff Uptime Tooltip where the buff had zero uptime (Flamanis)",
"Fixed shield damage preventing rare error when the absorption was zero (Flamanis).",
"Fixed chat embed system built in Details! from the Skins section (Flamanis).",
"Fixed an issue where damage in battlegrounds was not being sync with battleground score board in Wrath (Flamanis).",
"",
"New Slash Commands:",
"/playedclass: show how much time you have played this class on this expansion.",
"/dumpt <anything>: show the value of any table, global, spellId, etc.",
"/details auras: show a panel with your current auras, spell ids and spell payload.",
"/details perf: show performance issues when you get a warning about freezes due to UpdateAddOnMemoryUsage().",
"/details npcid: get the npc id of your target (a box is shown with the number ready to be copied).",
}
local newsString = "|cFFF1F1F1"
for i = 1, #news do
local line = news[i]
if (type(line) == "table") then
local version = line[1]
local date = line[2]
newsString = newsString .. "|cFFFFFF00" .. version .. " (|cFFFF8800" .. date .. "|r):|r\n\n"
else
if (line ~= "") then
newsString = newsString .. "|cFFFFFF00-|r " .. line .. "\n\n"
else
newsString = newsString .. " \n"
end
end
end
Loc["STRING_VERSION_LOG"] = newsString
Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails!:|r "
--startup
_detalhes.max_windowline_columns = 11
_detalhes.initializing = true
_detalhes.enabled = true
_detalhes.__index = _detalhes
_detalhes._tempo = time()
_detalhes.debug = false
_detalhes.debug_chr = false
_detalhes.opened_windows = 0
_detalhes.last_combat_time = 0
--store functions to create options frame
Details.optionsSection = {}
--containers
--armazenas as fun��es do parser - All parse functions
_detalhes.parser = {}
_detalhes.parser_functions = {}
_detalhes.parser_frame = CreateFrame("Frame")
_detalhes.pvp_parser_frame = CreateFrame("Frame")
_detalhes.parser_frame:Hide()
_detalhes.MacroList = {
{Name = "Click on Your Own Bar", Desc = "To open the player details window on your character, like if you click on your bar in the damage window. The number '1' is the window number where it'll click.", MacroText = "/script Details:OpenPlayerDetails(1)"},
{Name = "Open Encounter Breakdown", Desc = "Open the encounter breakdown plugin. Details! Encounter Breakdown (plugin) must be enabled.", MacroText = "/script Details:OpenPlugin ('Encounter Breakdown')"},
{Name = "Open Damage per Phase", Desc = "Open the encounter breakdown plugin in the phase tab. Details! Encounter Breakdown (plugin) must be enabled.", MacroText = "/script Details:OpenPlugin ('Encounter Breakdown'); local a=Details_EncounterDetails and Details_EncounterDetails.buttonSwitchPhases:Click()"},
{Name = "Reset Data", Desc = "Reset the overall and regular segments data. Use 'ResetSegmentOverallData' to reset only the overall.", MacroText = "/script Details:ResetSegmentData()"},
{Name = "Change What the Window Shows", Desc = "Make a window show different data. SetDisplay uses (segment, displayGroup, displayID), the menu from the sword icon is in order (damage = group 1, overheal is: displayGroup 2 displayID 3.", MacroText = "/script Details:GetWindow(1):SetDisplay( DETAILS_SEGMENTID_CURRENT, 4, 5 )"},
{Name = "Toggle Window Height to Max Size", Desc = "Make a window be 450 pixel height, pressing the macro again toggle back to the original size. The number '1' if the window number. Hold a click in any window to show their number.", MacroText = "/script Details:GetWindow(1):ToggleMaxSize()"},
-- /script Details:OpenPlugin ('Advanced Death Logs'); local a = Details_DeathGraphsModeEnduranceButton and Details_DeathGraphsModeEnduranceButton.MyObject:Click()
{Name = "Report What is Shown In the Window", Desc = "Report the current data shown in the window, the number 1 is the window number, replace it to report another window.", MacroText = "/script Details:FastReportWindow(1)"},
}
--current instances of the exp (need to maintain)
_detalhes.InstancesToStoreData = { --mapId
[2549] = true, --amirdrassil
}
--store shield information for absorbs
_detalhes.ShieldCache = {}
--armazena as fun��es dos frames - Frames functions
_detalhes.gump = _G ["DetailsFramework"]
function _detalhes:GetFramework()
return self.gump
end
GameCooltip = GameCooltip2
--anima��es dos icones
_detalhes.icon_animations = {
load = {
in_use = {},
available = {},
},
}
--make a color namespace
Details.Colors = {}
function Details.Colors.GetMenuTextColor()
return "orange"
end
--armazena as fun��es para inicializa��o dos dados - Metatable functions
_detalhes.refresh = {}
--armazena as fun��es para limpar e guardas os dados - Metatable functions
_detalhes.clear = {}
--armazena a config do painel de fast switch
_detalhes.switch = {}
--armazena os estilos salvos
_detalhes.savedStyles = {}
--armazena quais atributos possue janela de atributos - contain attributes and sub attributos wich have a detailed window (left click on a row)
_detalhes.row_singleclick_overwrite = {}
--report
_detalhes.ReportOptions = {}
--armazena os buffs registrados - store buffs ids and functions
_detalhes.Buffs = {} --initialize buff table
-- cache de grupo
_detalhes.cache_damage_group = {}
_detalhes.cache_healing_group = {}
_detalhes.cache_npc_ids = {}
--cache de specs
_detalhes.cached_specs = {}
_detalhes.cached_talents = {}
--ignored pets
_detalhes.pets_ignored = {}
_detalhes.pets_no_owner = {}
_detalhes.pets_players = {}
--dual candidates
_detalhes.duel_candidates = {}
--armazena as skins dispon�veis para as janelas
_detalhes.skins = {}
--armazena os hooks das fun��es do parser
_detalhes.hooks = {}
--informa��es sobre a luta do boss atual
_detalhes.encounter_end_table = {}
_detalhes.encounter_table = {}
_detalhes.encounter_counter = {}
_detalhes.encounter_dungeons = {}
--unitId dos inimigos dentro de uma arena
_detalhes.arena_enemies = {}
--reliable char data sources
--actors that are using details! and sent character data, we don't need query inspect on these actors
_detalhes.trusted_characters = {}
--informa��es sobre a arena atual
_detalhes.arena_table = {}
_detalhes.arena_info = {
--need to get the new mapID for 8.0.1
[562] = {file = "LoadScreenBladesEdgeArena", coords = {0, 1, 0.29296875, 0.9375}}, -- Circle of Blood Arena
[617] = {file = "LoadScreenDalaranSewersArena", coords = {0, 1, 0.29296875, 0.857421875}}, --Dalaran Arena
[559] = {file = "LoadScreenNagrandArenaBattlegrounds", coords = {0, 1, 0.341796875, 1}}, --Ring of Trials
[980] = {file = "LoadScreenTolvirArena", coords = {0, 1, 0.29296875, 0.857421875}}, --Tol'Viron Arena
[572] = {file = "LoadScreenRuinsofLordaeronBattlegrounds", coords = {0, 1, 0.341796875, 1}}, --Ruins of Lordaeron
[1134] = {file = "LoadingScreen_Shadowpan_bg", coords = {0, 1, 0.29296875, 0.857421875}}, -- Tiger's Peak
--legion, thanks @pas06 on curse forge for the mapIds
[1552] = {file = "LoadingScreen_ArenaValSharah_wide", coords = {0, 1, 0.29296875, 0.857421875}}, -- Ashmane's Fall
[1504] = {file = "LoadingScreen_BlackrookHoldArena_wide", coords = {0, 1, 0.29296875, 0.857421875}}, --Black Rook Hold
--"LoadScreenOrgrimmarArena", --Ring of Valor
}
Details.IgnoredEnemyNpcsTable = {
[31216] = true, --mirror image
[53006] = true, --spirit link totem
[63508] = true, --xuen
[73967] = true, --xuen
}
function _detalhes:GetArenaInfo (mapid)
local t = _detalhes.arena_info [mapid]
if (t) then
return t.file, t.coords
end
end
_detalhes.battleground_info = {
--need to get the nwee mapID for 8.0.1
[489] = {file = "LoadScreenWarsongGulch", coords = {0, 1, 121/512, 484/512}}, --warsong gulch
[727] = {file = "LoadScreenSilvershardMines", coords = {0, 1, 251/1024, 840/1024}}, --silvershard mines
[529] = {file = "LoadscreenArathiBasin", coords = {0, 1, 126/512, 430/512}}, --arathi basin
[566] = {file = "LoadScreenNetherBattlegrounds", coords = {0, 1, 142/512, 466/512}}, --eye of the storm
[30] = {file = "LoadScreenPvpBattleground", coords = {0, 1, 127/512, 500/512}}, --alterac valley
[761] = {file = "LoadScreenGilneasBG2", coords = {0, 1, 281/1024, 878/1024}}, --the battle for gilneas
[726] = {file = "LoadScreenTwinPeaksBG", coords = {0, 1, 294/1024, 876/1024}}, --twin peaks
[998] = {file = "LoadScreenValleyofPower", coords = {0, 1, 257/1024, 839/1024}}, --temple of kotmogu
[1105] = {file = "LoadScreen_GoldRush", coords = {0, 1, 264/1024, 840/1024}}, --deepwind gorge
[607] = {file = "LoadScreenNorthrendBG", coords = {0, 1, 302/1024, 879/1024}}, --strand of the ancients
[628] = {file = "LOADSCREENISLEOFCONQUEST", coords = {0, 1, 297/1024, 878/1024}}, --isle of conquest
--[] = {file = "", coords = {0, 1, 0, 0}}, --
}
function _detalhes:GetBattlegroundInfo(mapid)
local battlegroundInfo = _detalhes.battleground_info[mapid]
if (battlegroundInfo) then
return battlegroundInfo.file, battlegroundInfo.coords
end
end
--tokenid
_detalhes.TokenID = {
["SPELL_PERIODIC_DAMAGE"] = 1,
["SPELL_EXTRA_ATTACKS"] = 2,
["SPELL_DAMAGE"] = 3,
["SPELL_BUILDING_DAMAGE"] = 4,
["SWING_DAMAGE"] = 5,
["RANGE_DAMAGE"] = 6,
["DAMAGE_SHIELD"] = 7,
["DAMAGE_SPLIT"] = 8,
["RANGE_MISSED"] = 9,
["SWING_MISSED"] = 10,
["SPELL_MISSED"] = 11,
["SPELL_PERIODIC_MISSED"] = 12,
["SPELL_BUILDING_MISSED"] = 13,
["DAMAGE_SHIELD_MISSED"] = 14,
["ENVIRONMENTAL_DAMAGE"] = 15,
["SPELL_HEAL"] = 16,
["SPELL_PERIODIC_HEAL"] = 17,
["SPELL_HEAL_ABSORBED"] = 18,
["SPELL_ABSORBED"] = 19,
["SPELL_AURA_APPLIED"] = 20,
["SPELL_AURA_REMOVED"] = 21,
["SPELL_AURA_REFRESH"] = 22,
["SPELL_AURA_APPLIED_DOSE"] = 23,
["SPELL_ENERGIZE"] = 24,
["SPELL_PERIODIC_ENERGIZE"] = 25,
["SPELL_CAST_SUCCESS"] = 26,
["SPELL_DISPEL"] = 27,
["SPELL_STOLEN"] = 28,
["SPELL_AURA_BROKEN"] = 29,
["SPELL_AURA_BROKEN_SPELL"] = 30,
["SPELL_RESURRECT"] = 31,
["SPELL_INTERRUPT"] = 32,
["UNIT_DIED"] = 33,
["UNIT_DESTROYED"] = 34,
}
---@type table<npcid, textureid>
local npcIdToIcon = {
[98035] = 1378282, --dreadstalker
[17252] = 136216, --felguard
[136404] = 132182, --bilescourge
[136398] = 626007, --illidari satyr
[136403] = 1100177, --void terror
[136402] = 1581747, --ur'zyk
[136399] = 1709931, --visious hellhound
[136406] = 615148, --shivarra
[136407] = 615025, --wrathguard
[136408] = 1709932, --darkhound
}
_detalhes.NpcIdToIcon = npcIdToIcon
--armazena instancias inativas
_detalhes.unused_instances = {}
_detalhes.default_skin_to_use = "Minimalistic"
_detalhes.instance_title_text_timer = {}
--player detail skin
_detalhes.playerdetailwindow_skins = {}
_detalhes.BitfieldSwapDebuffsIDs = {265646, 272407, 269691, 273401, 269131, 260900, 260926, 284995, 292826, 311367, 310567, 308996, 307832, 327414, 337253,
36797, 37122, 362397}
_detalhes.BitfieldSwapDebuffsSpellIDs = {
[360418] = true
}
--auto run code
_detalhes.RunCodeTypes = {
{Name = "On Initialization", Desc = "Run code when Details! initialize or when a profile is changed.", Value = 1, ProfileKey = "on_init"},
{Name = "On Zone Changed", Desc = "Run code when the zone where the player is in has changed (e.g. entered in a raid).", Value = 2, ProfileKey = "on_zonechanged"},
{Name = "On Enter Combat", Desc = "Run code when the player enters in combat.", Value = 3, ProfileKey = "on_entercombat"},
{Name = "On Leave Combat", Desc = "Run code when the player left combat.", Value = 4, ProfileKey = "on_leavecombat"},
{Name = "On Spec Change", Desc = "Run code when the player has changed its specialization.", Value = 5, ProfileKey = "on_specchanged"},
{Name = "On Enter/Leave Group", Desc = "Run code when the player has entered or left a party or raid group.", Value = 6, ProfileKey = "on_groupchange"},
}
--run a function without stopping the execution in case of an error
function Details.SafeRun(func, executionName, ...)
local runToCompletion, errorText = pcall(func, ...)
if (not runToCompletion) then
if (Details.debug) then
Details:Msg("Safe run failed:", executionName, errorText)
end
return false
end
return true
end
--tooltip
_detalhes.tooltip_backdrop = {
bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]],
edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]],
tile = true,
edgeSize = 16,
tileSize = 16,
insets = {left = 3, right = 3, top = 4, bottom = 4}
}
_detalhes.tooltip_border_color = {1, 1, 1, 1}
_detalhes.tooltip_spell_icon = {file = [[Interface\CHARACTERFRAME\UI-StateIcon]], coords = {36/64, 58/64, 7/64, 26/64}}
_detalhes.tooltip_target_icon = {file = [[Interface\Addons\Details\images\icons]], coords = {0, 0.03125, 0.126953125, 0.15625}}
--icons
_detalhes.attribute_icons = [[Interface\AddOns\Details\images\atributos_icones]]
function _detalhes:GetAttributeIcon (attribute)
return _detalhes.attribute_icons, 0.125 * (attribute - 1), 0.125 * attribute, 0, 1
end
--colors
_detalhes.default_backdropcolor = {.094117, .094117, .094117, .8}
_detalhes.default_backdropbordercolor = {0, 0, 0, 1}
--Plugins
--plugin templates
_detalhes.gump:NewColor("DETAILS_PLUGIN_BUTTONTEXT_COLOR", 0.9999, 0.8196, 0, 1)
_detalhes.gump:InstallTemplate("button", "DETAILS_PLUGINPANEL_BUTTON_TEMPLATE",
{
backdrop = {edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true},
backdropcolor = {0, 0, 0, .5},
backdropbordercolor = {0, 0, 0, .5},
onentercolor = {0.3, 0.3, 0.3, .5},
}
)
_detalhes.gump:InstallTemplate("button", "DETAILS_PLUGINPANEL_BUTTONSELECTED_TEMPLATE",
{
backdrop = {edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true},
backdropcolor = {0, 0, 0, .5},
backdropbordercolor = {1, 1, 0, 1},
onentercolor = {0.3, 0.3, 0.3, .5},
}
)
_detalhes.gump:InstallTemplate("button", "DETAILS_PLUGIN_BUTTON_TEMPLATE",
{
backdrop = {edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true},
backdropcolor = {1, 1, 1, .5},
backdropbordercolor = {0, 0, 0, 1},
onentercolor = {1, 1, 1, .9},
textcolor = "DETAILS_PLUGIN_BUTTONTEXT_COLOR",
textsize = 10,
width = 120,
height = 20,
}
)
_detalhes.gump:InstallTemplate("button", "DETAILS_PLUGIN_BUTTONSELECTED_TEMPLATE",
{
backdrop = {edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true},
backdropcolor = {1, 1, 1, .5},
backdropbordercolor = {1, .7, 0, 1},
onentercolor = {1, 1, 1, .9},
textcolor = "DETAILS_PLUGIN_BUTTONTEXT_COLOR",
textsize = 10,
width = 120,
height = 20,
}
)
_detalhes.gump:InstallTemplate("button", "DETAILS_TAB_BUTTON_TEMPLATE",
{
width = 100,
height = 20,
},
"DETAILS_PLUGIN_BUTTON_TEMPLATE"
)
_detalhes.gump:InstallTemplate("button","DETAILS_TAB_BUTTONSELECTED_TEMPLATE",
{
width = 100,
height = 20,
},
"DETAILS_PLUGIN_BUTTONSELECTED_TEMPLATE"
)
_detalhes.PluginsGlobalNames = {}
_detalhes.PluginsLocalizedNames = {}
--raid -------------------------------------------------------------------
--general function for raid mode plugins
_detalhes.RaidTables = {}
--menu for raid modes
_detalhes.RaidTables.Menu = {}
--plugin objects for raid mode
_detalhes.RaidTables.Plugins = {}
--name to plugin object
_detalhes.RaidTables.NameTable = {}
--using by
_detalhes.RaidTables.InstancesInUse = {}
_detalhes.RaidTables.PluginsInUse = {}
--solo -------------------------------------------------------------------
--general functions for solo mode plugins
_detalhes.SoloTables = {}
--maintain plugin menu
_detalhes.SoloTables.Menu = {}
--plugins objects for solo mode
_detalhes.SoloTables.Plugins = {}
--name to plugin object
_detalhes.SoloTables.NameTable = {}
--toolbar -------------------------------------------------------------------
--plugins container
_detalhes.ToolBar = {}
--current showing icons
_detalhes.ToolBar.Shown = {}
_detalhes.ToolBar.AllButtons = {}
--plugin objects
_detalhes.ToolBar.Plugins = {}
--name to plugin object
_detalhes.ToolBar.NameTable = {}
_detalhes.ToolBar.Menu = {}
--statusbar -------------------------------------------------------------------
--plugins container
_detalhes.StatusBar = {}
--maintain plugin menu
_detalhes.StatusBar.Menu = {}
--plugins object
_detalhes.StatusBar.Plugins = {}
--name to plugin object
_detalhes.StatusBar.NameTable = {}
--constants
if(DetailsFramework.IsWotLKWow()) then
--[[global]] DETAILS_HEALTH_POTION_ID = 33447 -- Runic Healing Potion
--[[global]] DETAILS_HEALTH_POTION2_ID = 41166 -- Runic Healing Injector
--[[global]] DETAILS_REJU_POTION_ID = 40087 -- Powerful Rejuvenation Potion
--[[global]] DETAILS_REJU_POTION2_ID = 40077 -- Crazy Alchemist's Potion
--[[global]] DETAILS_MANA_POTION_ID = 33448 -- Runic Mana Potion
--[[global]] DETAILS_MANA_POTION2_ID = 42545 -- Runic Mana Injector
--[[global]] DETAILS_FOCUS_POTION_ID = 307161
--[[global]] DETAILS_HEALTHSTONE_ID = 47875 --Warlock's Healthstone
--[[global]] DETAILS_HEALTHSTONE2_ID = 47876 --Warlock's Healthstone (1/2 Talent)
--[[global]] DETAILS_HEALTHSTONE3_ID = 47877 --Warlock's Healthstone (2/2 Talent)
--[[global]] DETAILS_INT_POTION_ID = 40212 --Potion of Wild Magic
--[[global]] DETAILS_AGI_POTION_ID = 40211 --Potion of Speed
--[[global]] DETAILS_STR_POTION_ID = 307164
--[[global]] DETAILS_STAMINA_POTION_ID = 40093 --Indestructible Potion
--[[global]] DETAILS_HEALTH_POTION_LIST = {
[DETAILS_HEALTH_POTION_ID] = true, -- Runic Healing Potion
[DETAILS_HEALTH_POTION2_ID] = true, -- Runic Healing Injector
[DETAILS_HEALTHSTONE_ID] = true, --Warlock's Healthstone
[DETAILS_HEALTHSTONE2_ID] = true, --Warlock's Healthstone (1/2 Talent)
[DETAILS_HEALTHSTONE3_ID] = true, --Warlock's Healthstone (2/2 Talent)
[DETAILS_REJU_POTION_ID] = true, -- Powerful Rejuvenation Potion
[DETAILS_REJU_POTION2_ID] = true, -- Crazy Alchemist's Potion
[DETAILS_MANA_POTION_ID] = true, -- Runic Mana Potion
[DETAILS_MANA_POTION2_ID] = true, -- Runic Mana Injector
}
else
--[[global]] DETAILS_HEALTH_POTION_ID = 307192 -- spiritual healing potion
--[[global]] DETAILS_HEALTH_POTION2_ID = 359867 --cosmic healing potion
--[[global]] DETAILS_REJU_POTION_ID = 307194
--[[global]] DETAILS_MANA_POTION_ID = 307193
--[[global]] DETAILS_FOCUS_POTION_ID = 307161
--[[global]] DETAILS_HEALTHSTONE_ID = 6262
--[[global]] DETAILS_INT_POTION_ID = 307162
--[[global]] DETAILS_AGI_POTION_ID = 307159
--[[global]] DETAILS_STR_POTION_ID = 307164
--[[global]] DETAILS_STAMINA_POTION_ID = 307163
--[[global]] DETAILS_HEALTH_POTION_LIST = {
[DETAILS_HEALTH_POTION_ID] = true, --Healing Potion
[DETAILS_HEALTHSTONE_ID] = true, --Warlock's Healthstone
[DETAILS_REJU_POTION_ID] = true, --Rejuvenation Potion
[DETAILS_MANA_POTION_ID] = true, --Mana Potion
[323436] = true, --Phial of Serenity (from Kyrians)
[DETAILS_HEALTH_POTION2_ID] = true,
}
end
--[[global]] DETAILS_MODE_GROUP = 2
--[[global]] DETAILS_MODE_ALL = 3
_detalhes._detalhes_props = {
DATA_TYPE_START = 1, --Something on start
DATA_TYPE_END = 2, --Something on end
MODO_ALONE = 1, --Solo
MODO_GROUP = 2, --Group
MODO_ALL = 3, --Everything
MODO_RAID = 4, --Raid
}
_detalhes.modos = {
alone = 1, --Solo
group = 2, --Group
all = 3, --Everything
raid = 4 --Raid
}
_detalhes.divisores = {
abre = "(", --open
fecha = ")", --close
colocacao = ". " --dot
}
_detalhes.role_texcoord = {
DAMAGER = "72:130:69:127",
HEALER = "72:130:2:60",
TANK = "5:63:69:127",
NONE = "139:196:69:127",
}
_detalhes.role_texcoord_normalized = {
DAMAGER = {72/256, 130/256, 69/256, 127/256},
HEALER = {72/256, 130/256, 2/256, 60/256},
TANK = {5/256, 63/256, 69/256, 127/256},
NONE = {139/256, 196/256, 69/256, 127/256},
}
_detalhes.player_class = {
["HUNTER"] = true,
["WARRIOR"] = true,
["PALADIN"] = true,
["SHAMAN"] = true,
["MAGE"] = true,
["ROGUE"] = true,
["PRIEST"] = true,
["WARLOCK"] = true,
["DRUID"] = true,
["MONK"] = true,
["DEATHKNIGHT"] = true,
["DEMONHUNTER"] = true,
}
_detalhes.classstring_to_classid = {
["WARRIOR"] = 1,
["PALADIN"] = 2,
["HUNTER"] = 3,
["ROGUE"] = 4,
["PRIEST"] = 5,
["DEATHKNIGHT"] = 6,
["SHAMAN"] = 7,
["MAGE"] = 8,
["WARLOCK"] = 9,
["MONK"] = 10,
["DRUID"] = 11,
["DEMONHUNTER"] = 12,
}
_detalhes.classid_to_classstring = {
[1] = "WARRIOR",
[2] = "PALADIN",
[3] = "HUNTER",
[4] = "ROGUE",
[5] = "PRIEST",
[6] = "DEATHKNIGHT",
[7] = "SHAMAN",
[8] = "MAGE",
[9] = "WARLOCK",
[10] = "MONK",
[11] = "DRUID",
[12] = "DEMONHUNTER",
}
local Loc = LibStub("AceLocale-3.0"):GetLocale ("Details")
_detalhes.segmentos = {
label = Loc ["STRING_SEGMENT"]..": ",
overall = Loc ["STRING_TOTAL"],
overall_standard = Loc ["STRING_OVERALL"],
current = Loc ["STRING_CURRENT"],
current_standard = Loc ["STRING_CURRENTFIGHT"],
past = Loc ["STRING_FIGHTNUMBER"]
}
_detalhes._detalhes_props["modo_nome"] = {
[_detalhes._detalhes_props["MODO_ALONE"]] = Loc ["STRING_MODE_SELF"],
[_detalhes._detalhes_props["MODO_GROUP"]] = Loc ["STRING_MODE_GROUP"],
[_detalhes._detalhes_props["MODO_ALL"]] = Loc ["STRING_MODE_ALL"],
[_detalhes._detalhes_props["MODO_RAID"]] = Loc ["STRING_MODE_RAID"]
}
--[[global]] DETAILS_MODE_SOLO = 1
--[[global]] DETAILS_MODE_RAID = 4
--[[global]] DETAILS_MODE_GROUP = 2
--[[global]] DETAILS_MODE_ALL = 3
_detalhes.icones = {
--report window
report = {
up = "Interface\\FriendsFrame\\UI-Toast-FriendOnlineIcon",
down = "Interface\\ItemAnimations\\MINIMAP\\TRACKING\\Profession",
disabled = "Interface\\ItemAnimations\\MINIMAP\\TRACKING\\Profession",
highlight = nil
}
}
_detalhes.missTypes = {"ABSORB", "BLOCK", "DEFLECT", "DODGE", "EVADE", "IMMUNE", "MISS", "PARRY", "REFLECT", "RESIST"} --do not localize-me
function Details.SendHighFive()
Details.users = {{UnitName("player"), GetRealmName(), (Details.userversion or "") .. " (" .. Details.APIVersion .. ")"}}
Details.sent_highfive = GetTime()
if (IsInRaid()) then
Details:SendRaidData(Details.network.ids.HIGHFIVE_REQUEST)
else
Details:SendPartyData(Details.network.ids.HIGHFIVE_REQUEST)
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--frames
local CreateFrame = CreateFrame --api locals
local UIParent = UIParent --api locals
--create the breakdown window frame
---@type breakdownwindow
Details.BreakdownWindowFrame = CreateFrame("Frame", "DetailsBreakdownWindow", UIParent, "BackdropTemplate")
Details.PlayerDetailsWindow = Details.BreakdownWindowFrame
Details.BreakdownWindow = Details.BreakdownWindowFrame
--Event Frame
Details.listener = CreateFrame("Frame", nil, UIParent)
Details.listener:RegisterEvent("ADDON_LOADED")
Details.listener:SetFrameStrata("LOW")
Details.listener:SetFrameLevel(9)
Details.listener.FrameTime = 0
Details.overlay_frame = CreateFrame("Frame", nil, UIParent)
Details.overlay_frame:SetFrameStrata("TOOLTIP")
--Pet Owner Finder
CreateFrame("GameTooltip", "DetailsPetOwnerFinder", nil, "GameTooltipTemplate")
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--plugin defaults
--backdrop
Details.PluginDefaults = {}
Details.PluginDefaults.Backdrop = {bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16,
edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1,
insets = {left = 1, right = 1, top = 1, bottom = 1}}
Details.PluginDefaults.BackdropColor = {0, 0, 0, .6}
Details.PluginDefaults.BackdropBorderColor = {0, 0, 0, 1}
function Details.GetPluginDefaultBackdrop()
return Details.PluginDefaults.Backdrop, Details.PluginDefaults.BackdropColor, Details.PluginDefaults.BackdropBorderColor
end
------------------------------------------------------------------------------------------
-- welcome panel
function _detalhes:CreateWelcomePanel(name, parent, width, height, makeMovable)
local newWelcomePanel = CreateFrame("frame", name, parent or UIParent, "BackdropTemplate")
DetailsFramework:ApplyStandardBackdrop(newWelcomePanel)
newWelcomePanel:SetSize(width or 1, height or 1)
if (makeMovable) then
newWelcomePanel:SetScript("OnMouseDown", function(self, button)
if (self.isMoving) then
return
end
if (button == "RightButton") then
self:Hide()
else
self:StartMoving()
self.isMoving = true
end
end)
newWelcomePanel:SetScript("OnMouseUp", function(self, button)
if (self.isMoving and button == "LeftButton") then
self:StopMovingOrSizing()
self.isMoving = nil
end
end)
newWelcomePanel:SetToplevel(true)
newWelcomePanel:SetMovable(true)
end
return newWelcomePanel
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--functions
_detalhes.empty_function = function() end
_detalhes.empty_table = {}
--register textures and fonts for shared media
local SharedMedia = LibStub:GetLibrary ("LibSharedMedia-3.0")
--default bars
SharedMedia:Register("statusbar", "Details Hyanda", [[Interface\AddOns\Details\images\bar_hyanda]])
SharedMedia:Register("statusbar", "Details D'ictum", [[Interface\AddOns\Details\images\bar4]])
SharedMedia:Register("statusbar", "Details Vidro", [[Interface\AddOns\Details\images\bar4_vidro]])
SharedMedia:Register("statusbar", "Details D'ictum (reverse)", [[Interface\AddOns\Details\images\bar4_reverse]])
--flat bars
SharedMedia:Register("statusbar", "Details Serenity", [[Interface\AddOns\Details\images\bar_serenity]])
SharedMedia:Register("statusbar", "BantoBar", [[Interface\AddOns\Details\images\BantoBar]])
SharedMedia:Register("statusbar", "Skyline", [[Interface\AddOns\Details\images\bar_skyline]])
SharedMedia:Register("statusbar", "WorldState Score", [[Interface\WorldStateFrame\WORLDSTATEFINALSCORE-HIGHLIGHT]])
SharedMedia:Register("statusbar", "DGround", [[Interface\AddOns\Details\images\bar_background]])
SharedMedia:Register("statusbar", "Details Flat", [[Interface\AddOns\Details\images\bar_background]])
SharedMedia:Register("statusbar", "Splitbar", [[Interface\AddOns\Details\images\bar_textures\split_bar]])
SharedMedia:Register("statusbar", "Details2020", [[Interface\AddOns\Details\images\bar_textures\texture2020]])
SharedMedia:Register("statusbar", "Left White Gradient", [[Interface\AddOns\Details\images\bar_textures\gradient_white_10percent_left]])
SharedMedia:Register("statusbar", "Details! Slash", [[Interface\AddOns\Details\images\bar_textures\bar_of_bars.png]])
--window bg and bar order
SharedMedia:Register("background", "Details Ground", [[Interface\AddOns\Details\images\background]])
SharedMedia:Register("border", "Details BarBorder 1", [[Interface\AddOns\Details\images\border_1]])
SharedMedia:Register("border", "Details BarBorder 2", [[Interface\AddOns\Details\images\border_2]])
SharedMedia:Register("border", "Details BarBorder 3", [[Interface\AddOns\Details\images\border_3]])
SharedMedia:Register("border", "1 Pixel", [[Interface\Buttons\WHITE8X8]])
--misc fonts
SharedMedia:Register("font", "Oswald", [[Interface\Addons\Details\fonts\Oswald-Regular.ttf]])
SharedMedia:Register("font", "Nueva Std Cond", [[Interface\Addons\Details\fonts\Nueva Std Cond.ttf]])
SharedMedia:Register("font", "Accidental Presidency", [[Interface\Addons\Details\fonts\Accidental Presidency.ttf]])
SharedMedia:Register("font", "TrashHand", [[Interface\Addons\Details\fonts\TrashHand.TTF]])
SharedMedia:Register("font", "Harry P", [[Interface\Addons\Details\fonts\HARRYP__.TTF]])
SharedMedia:Register("font", "FORCED SQUARE", [[Interface\Addons\Details\fonts\FORCED SQUARE.ttf]])
SharedMedia:Register("sound", "Details Gun1", [[Interface\Addons\Details\sounds\sound_gun2.ogg]])
SharedMedia:Register("sound", "Details Gun2", [[Interface\Addons\Details\sounds\sound_gun3.ogg]])
SharedMedia:Register("sound", "Details Jedi1", [[Interface\Addons\Details\sounds\sound_jedi1.ogg]])
SharedMedia:Register("sound", "Details Whip1", [[Interface\Addons\Details\sounds\sound_whip1.ogg]])
SharedMedia:Register("sound", "Details Horn", [[Interface\Addons\Details\sounds\Details Horn.ogg]])
SharedMedia:Register("sound", "Details Warning", [[Interface\Addons\Details\sounds\Details Warning 100.ogg]])
--SharedMedia:Register("sound", "Details Warning (Volume 75%)", [[Interface\Addons\Details\sounds\Details Warning 75.ogg]])
--SharedMedia:Register("sound", "Details Warning Volume 50%", [[Interface\Addons\Details\sounds\Details Warning 50.ogg]])
--SharedMedia:Register("sound", "Details Warning Volume 25%", [[Interface\Addons\Details\sounds\Details Warning 25.ogg]])
--dump table contents over chat panel
function Details.VarDump(t)
if (type(t) ~= "table") then
return
end
for a,b in pairs(t) do
print(a,b)
end
end
function dumpt(value) --[[GLOBAL]]
--check if this is a spellId
local spellId = tonumber(value)
if (spellId) then
local spellInfo = {GetSpellInfo(spellId)}
if (type(spellInfo[1]) == "string") then
return Details:Dump(spellInfo)
end
end
--check if is an atlas texture
local atlas
if (type(value) == "string") then
atlas = C_Texture.GetAtlasInfo(value)
if (atlas) then
return Details:Dump(atlas)
end
end
if (value == nil) then
local allTooltips = {"GameTooltip", "GameTooltipTooltip", "EventTraceTooltip", "FrameStackTooltip", "GarrisonMissionMechanicTooltip", "GarrisonMissionMechanicFollowerCounterTooltip", "ItemSocketingDescription", "NamePlateTooltip", "PrivateAurasTooltip", "RuneforgeFrameResultTooltip", "ItemRefTooltip", "QuickKeybindTooltip", "SettingsTooltip"}
for i = 1, #allTooltips do
local tooltipName = allTooltips[i]
local tooltip = _G[tooltipName]
if (tooltip and tooltip.GetTooltipData and tooltip:IsVisible()) then
local tooltipData = tooltip:GetTooltipData()
if (tooltipData) then
if (tooltip.ItemTooltip and tooltip.ItemTooltip:IsVisible()) then
local icon = tooltip.ItemTooltip.Icon
if (icon) then
local texture = icon:GetTexture()
local atlas = icon:GetAtlas()
if (texture or atlas) then
tooltipData.IconTexture = texture
tooltipData.IconAtlas = atlas
end
end
end
if (tooltipData.hyperlink) then
local itemName, itemLink, itemQuality, itemLevel, itemMinLevel, itemType, itemSubType,
itemStackCount, itemEquipLoc, itemTexture, sellPrice, classID, subclassID, bindType,
expacID, setID, isCraftingReagent = GetItemInfo(tooltipData.hyperlink)
local itemInfo = {
itemName = itemName,
itemLink = itemLink,
itemQuality = itemQuality,
itemLevel = itemLevel,
itemMinLevel = itemMinLevel,
itemType = itemType,
itemSubType = itemSubType,
itemStackCount = itemStackCount,
itemEquipLoc = itemEquipLoc,
itemTexture = itemTexture,
sellPrice = sellPrice,
classID = classID,
subclassID = subclassID,
bindType = bindType,
expacID = expacID,
setID = setID,
isCraftingReagent = isCraftingReagent
}
DetailsFramework.table.deploy(tooltipData, itemInfo)
end
return Details:Dump(tooltipData)
end
end
end
end
return Details:Dump(value)
end
function FindSpellByName(spellName) --[[GLOBAL]]
if (spellName and type(spellName) == "string") then
local GSI = GetSpellInfo
local foundSpells = {}
spellName = spellName:lower()
for i = 1, 450000 do
local thisSpellName = GSI(i)
if (thisSpellName) then
thisSpellName = thisSpellName:lower()
if (spellName == thisSpellName) then
foundSpells[#foundSpells+1] = {GSI(i)}
end
end
end
if (#foundSpells > 0) then
dumpt(foundSpells)
else
Details:Msg("spell", spellName, "not found.")
end
end
end
--copies a full table
function Details.CopyTable(orig)
local orig_type = type(orig)
local copy
if orig_type == 'table' then
copy = {}
for orig_key, orig_value in next, orig, nil do
--print(orig_key, orig_value)
copy[Details.CopyTable(orig_key)] = Details.CopyTable(orig_value)
end
else
copy = orig
end
return copy
end
--delay messages
function _detalhes:DelayMsg(msg)
_detalhes.delaymsgs = _detalhes.delaymsgs or {}
_detalhes.delaymsgs[#_detalhes.delaymsgs+1] = msg
end
function _detalhes:ShowDelayMsg()
if (_detalhes.delaymsgs and #_detalhes.delaymsgs > 0) then
for _, msg in ipairs(_detalhes.delaymsgs) do
print(msg)
end
end
_detalhes.delaymsgs = {}
end
--print messages
function _detalhes:Msg(str, arg1, arg2, arg3, arg4)
if (self.__name) then
print("|cffffaeae" .. self.__name .. "|r |cffcc7c7c(plugin)|r: " .. (str or ""), arg1 or "", arg2 or "", arg3 or "", arg4 or "")
else
print(Loc ["STRING_DETAILS1"] .. (str or ""), arg1 or "", arg2 or "", arg3 or "", arg4 or "")
end
end
--welcome
function _detalhes:WelcomeMsgLogon()
_detalhes:Msg("you can always reset the addon running the command |cFFFFFF00'/details reinstall'|r if it does fail to load after being updated.")
function _detalhes:wipe_combat_after_failed_load()
_detalhes.tabela_historico = _detalhes.historico:CreateNewSegmentDatabase()
_detalhes.tabela_overall = _detalhes.combate:NovaTabela()
_detalhes.tabela_vigente = _detalhes.combate:NovaTabela (_, _detalhes.tabela_overall)
_detalhes.tabela_pets = _detalhes.container_pets:NovoContainer()
_detalhes:UpdatePetCache()
_detalhes_database.tabela_overall = nil
_detalhes_database.tabela_historico = nil
_detalhes:Msg("seems failed to load, please type /reload to try again.")
end
Details.Schedules.After(5, _detalhes.wipe_combat_after_failed_load)
end
Details.failed_to_load = C_Timer.NewTimer(1, function() Details.Schedules.NewTimer(20, _detalhes.WelcomeMsgLogon) end)
--key binds
--[=
--header
_G ["BINDING_HEADER_Details"] = "Details!"
_G ["BINDING_HEADER_DETAILS_KEYBIND_SEGMENTCONTROL"] = Loc ["STRING_KEYBIND_SEGMENTCONTROL"]
_G ["BINDING_HEADER_DETAILS_KEYBIND_SCROLLING"] = Loc ["STRING_KEYBIND_SCROLLING"]
_G ["BINDING_HEADER_DETAILS_KEYBIND_WINDOW_CONTROL"] = Loc ["STRING_KEYBIND_WINDOW_CONTROL"]
_G ["BINDING_HEADER_DETAILS_KEYBIND_BOOKMARK"] = Loc ["STRING_KEYBIND_BOOKMARK"]
_G ["BINDING_HEADER_DETAILS_KEYBIND_REPORT"] = Loc ["STRING_KEYBIND_WINDOW_REPORT_HEADER"]
--keys
_G ["BINDING_NAME_DETAILS_TOGGLE_ALL"] = Loc ["STRING_KEYBIND_TOGGLE_WINDOWS"]
_G ["BINDING_NAME_DETAILS_RESET_SEGMENTS"] = Loc ["STRING_KEYBIND_RESET_SEGMENTS"]
_G ["BINDING_NAME_DETAILS_SCROLL_UP"] = Loc ["STRING_KEYBIND_SCROLL_UP"]
_G ["BINDING_NAME_DETAILS_SCROLL_DOWN"] = Loc ["STRING_KEYBIND_SCROLL_DOWN"]
_G ["BINDING_NAME_DETAILS_REPORT_WINDOW1"] = string.format(Loc ["STRING_KEYBIND_WINDOW_REPORT"], 1)
_G ["BINDING_NAME_DETAILS_REPORT_WINDOW2"] = string.format(Loc ["STRING_KEYBIND_WINDOW_REPORT"], 2)
_G ["BINDING_NAME_DETAILS_TOOGGLE_WINDOW1"] = string.format(Loc ["STRING_KEYBIND_TOGGLE_WINDOW"], 1)
_G ["BINDING_NAME_DETAILS_TOOGGLE_WINDOW2"] = string.format(Loc ["STRING_KEYBIND_TOGGLE_WINDOW"], 2)
_G ["BINDING_NAME_DETAILS_TOOGGLE_WINDOW3"] = string.format(Loc ["STRING_KEYBIND_TOGGLE_WINDOW"], 3)
_G ["BINDING_NAME_DETAILS_TOOGGLE_WINDOW4"] = string.format(Loc ["STRING_KEYBIND_TOGGLE_WINDOW"], 4)
_G ["BINDING_NAME_DETAILS_TOOGGLE_WINDOW5"] = string.format(Loc ["STRING_KEYBIND_TOGGLE_WINDOW"], 5)
_G ["BINDING_NAME_DETAILS_BOOKMARK1"] = string.format(Loc ["STRING_KEYBIND_BOOKMARK_NUMBER"], 1)
_G ["BINDING_NAME_DETAILS_BOOKMARK2"] = string.format(Loc ["STRING_KEYBIND_BOOKMARK_NUMBER"], 2)
_G ["BINDING_NAME_DETAILS_BOOKMARK3"] = string.format(Loc ["STRING_KEYBIND_BOOKMARK_NUMBER"], 3)
_G ["BINDING_NAME_DETAILS_BOOKMARK4"] = string.format(Loc ["STRING_KEYBIND_BOOKMARK_NUMBER"], 4)
_G ["BINDING_NAME_DETAILS_BOOKMARK5"] = string.format(Loc ["STRING_KEYBIND_BOOKMARK_NUMBER"], 5)
_G ["BINDING_NAME_DETAILS_BOOKMARK6"] = string.format(Loc ["STRING_KEYBIND_BOOKMARK_NUMBER"], 6)
_G ["BINDING_NAME_DETAILS_BOOKMARK7"] = string.format(Loc ["STRING_KEYBIND_BOOKMARK_NUMBER"], 7)
_G ["BINDING_NAME_DETAILS_BOOKMARK8"] = string.format(Loc ["STRING_KEYBIND_BOOKMARK_NUMBER"], 8)
_G ["BINDING_NAME_DETAILS_BOOKMARK9"] = string.format(Loc ["STRING_KEYBIND_BOOKMARK_NUMBER"], 9)
_G ["BINDING_NAME_DETAILS_BOOKMARK10"] = string.format(Loc ["STRING_KEYBIND_BOOKMARK_NUMBER"], 10)
--]=]
end
if (select(4, GetBuildInfo()) >= 100000) then
local f = CreateFrame("frame")
f:RegisterEvent("ADDON_ACTION_FORBIDDEN")
f:SetScript("OnEvent", function()
local text = StaticPopup1 and StaticPopup1.text and StaticPopup1.text:GetText()
if (text and text:find("Details")) then
--fix false-positive taints that are being attributed to random addons
StaticPopup1.button2:Click()
end
end)
end
local classCacheName = Details222.ClassCache.ByName
local classCacheGUID = Details222.ClassCache.ByGUID
function Details222.ClassCache.GetClassFromCache(value)
return classCacheName[value] or classCacheGUID[value]
end
function Details222.ClassCache.AddClassToCache(value, whichCache)
if (whichCache == "name") then
classCacheName[value] = true
elseif (whichCache == "guid") then
classCacheGUID[value] = true
end
end
function Details222.ClassCache.GetClass(value)
local className = Details222.ClassCache.ByName[value] or Details222.ClassCache.ByGUID[value]
if (className) then
return className
end
local _, unitClass = UnitClass(value)
return unitClass
end
function Details222.ClassCache.MakeCache()
--iterage among all segments in the container history, get the damage container and get the actor list, check if the actor is a player and if it is, get the class and store it in the cache
local segmentsTable = Details:GetCombatSegments()
for _, combatObject in ipairs(segmentsTable) do
for _, actorObject in combatObject:GetContainer(DETAILS_ATTRIBUTE_DAMAGE):ListActors() do
if (actorObject:IsPlayer()) then
local actorName = actorObject.nome
local actorClass = actorObject.classe
local actorGUID = actorObject.serial
Details222.ClassCache.ByName[actorName] = actorClass
Details222.ClassCache.ByGUID[actorGUID] = actorClass
end
end
end
end
Details222.UnitIdCache.Raid = {
[1] = "raid1",
[2] = "raid2",
[3] = "raid3",
[4] = "raid4",
[5] = "raid5",
[6] = "raid6",
[7] = "raid7",
[8] = "raid8",
[9] = "raid9",
[10] = "raid10",
[11] = "raid11",
[12] = "raid12",
[13] = "raid13",
[14] = "raid14",
[15] = "raid15",
[16] = "raid16",
[17] = "raid17",
[18] = "raid18",
[19] = "raid19",
[20] = "raid20",
[21] = "raid21",
[22] = "raid22",
[23] = "raid23",
[24] = "raid24",
[25] = "raid25",
[26] = "raid26",
[27] = "raid27",
[28] = "raid28",
[29] = "raid29",
[30] = "raid30",
[31] = "raid31",
[32] = "raid32",
[33] = "raid33",
[34] = "raid34",
[35] = "raid35",
[36] = "raid36",
[37] = "raid37",
[38] = "raid38",
[39] = "raid39",
[40] = "raid40",
}
Details222.UnitIdCache.Party = {
[1] = "party1",
[2] = "party2",
[3] = "party3",
[4] = "party4",
}
Details222.UnitIdCache.Boss = {
[1] = "boss1",
[2] = "boss2",
[3] = "boss3",
[4] = "boss4",
[5] = "boss5",
[6] = "boss6",
[7] = "boss7",
[8] = "boss8",
[9] = "boss9",
}
Details222.UnitIdCache.Nameplate = {
[1] = "nameplate1",
[2] = "nameplate2",
[3] = "nameplate3",
[4] = "nameplate4",
[5] = "nameplate5",
[6] = "nameplate6",
[7] = "nameplate7",
[8] = "nameplate8",
[9] = "nameplate9",
[10] = "nameplate10",
[11] = "nameplate11",
[12] = "nameplate12",
[13] = "nameplate13",
[14] = "nameplate14",
[15] = "nameplate15",
[16] = "nameplate16",
[17] = "nameplate17",
[18] = "nameplate18",
[19] = "nameplate19",
[20] = "nameplate20",
[21] = "nameplate21",
[22] = "nameplate22",
[23] = "nameplate23",
[24] = "nameplate24",
[25] = "nameplate25",
[26] = "nameplate26",
[27] = "nameplate27",
[28] = "nameplate28",
[29] = "nameplate29",
[30] = "nameplate30",
[31] = "nameplate31",
[32] = "nameplate32",
[33] = "nameplate33",
[34] = "nameplate34",
[35] = "nameplate35",
[36] = "nameplate36",
[37] = "nameplate37",
[38] = "nameplate38",
[39] = "nameplate39",
[40] = "nameplate40",
}
Details222.UnitIdCache.Arena = {
[1] = "arena1",
[2] = "arena2",
[3] = "arena3",
[4] = "arena4",
[5] = "arena5",
}
function Details222.Tables.MakeWeakTable(mode)
local newTable = {}
setmetatable(newTable, {__mode = mode or "v"})
return newTable
end
--STRING_CUSTOM_POT_DEFAULT
---add a statistic, log, or any other data to the player stat table
---@param statName string
---@param value number
function Details222.PlayerStats:AddStat(statName, value)
Details.player_stats[statName] = (Details.player_stats[statName] or 0) + value
end
---get the value of a saved stat
---@param statName string
---@return any
function Details222.PlayerStats:GetStat(statName)
return Details.player_stats[statName]
end
---same thing as above but set the value instead of adding
---@param statName string
---@param value number
function Details222.PlayerStats:SetStat(statName, value)
Details.player_stats[statName] = value
end
---destroy a table and remove it from the object, if the key isn't passed, the object itself is destroyed
---@param object any
---@param key string|nil
function Details:Destroy(object, key)
if (key) then
if (getmetatable(object[key])) then
setmetatable(object[key], nil)
end
object[key].__index = nil
table.wipe(object[key])
object[key] = nil
else
if (getmetatable(object)) then
setmetatable(object, nil)
end
object.__index = nil
table.wipe(object)
end
end
function Details:DestroyCombat(combatObject)
--destroy each individual actor, hence more cleanups are done
for i = 1, DETAILS_COMBAT_AMOUNT_CONTAINERS do
local actorContainer = combatObject:GetContainer(i)
for index, actorObject in actorContainer:ListActors() do
Details:DestroyActor(actorObject, actorContainer, combatObject, 3)
end
end
setmetatable(combatObject, nil)
combatObject.__index = nil
combatObject.__newindex = nil
combatObject.__call = nil
Details:Destroy(combatObject)
--leave a trace that the actor has been deleted
combatObject.__destroyed = true
combatObject.__destroyedBy = debugstack(2, 1, 0)
end
---destroy the actor, also calls container:RemoveActor(actor)
---@param self details
---@param actorObject actor
---@param actorContainer actorcontainer
---@param combatObject combat
function Details:DestroyActor(actorObject, actorContainer, combatObject, callStackDepth)
local containerType = actorContainer:GetType()
local combatTotalsTable = combatObject.totals[containerType] --without group
local combatTotalsTableInGroup = combatObject.totals_grupo[containerType] --with group
--remove the actor from the parser cache
local c1, c2, c3, c4 = Details222.Cache.GetParserCacheTables()
c1[actorObject.serial] = nil
c2[actorObject.serial] = nil
c3[actorObject.serial] = nil
c4[actorObject.serial] = nil
if (not actorObject.ownerName) then --not a pet
if (containerType == 1 or containerType == 2) then --damage|healing done
combatTotalsTable = combatTotalsTable - actorObject.total
if (actorObject.grupo) then
combatTotalsTableInGroup = combatTotalsTableInGroup - actorObject.total
end
elseif (containerType == 3) then
---@cast actorObject actorresource
if (actorObject.total and actorObject.total > 0) then
if (actorObject.powertype) then
combatTotalsTable[actorObject.powertype] = combatTotalsTable[actorObject.powertype] - actorObject.total
combatTotalsTableInGroup[actorObject.powertype] = combatTotalsTableInGroup[actorObject.powertype] - actorObject.total
end
end
if (actorObject.alternatepower and actorObject.alternatepower > 0) then
combatTotalsTable.alternatepower = combatTotalsTable.alternatepower - actorObject.alternatepower
combatTotalsTableInGroup.alternatepower = combatTotalsTableInGroup.alternatepower - actorObject.alternatepower
end
elseif (containerType == 4) then
---@cast actorObject actorutility
--decrease the amount of CC break from the combat totals
if (actorObject.cc_break and actorObject.cc_break > 0) then
if (combatTotalsTable.cc_break) then
combatTotalsTable.cc_break = combatTotalsTable.cc_break - actorObject.cc_break
end
if (combatTotalsTableInGroup.cc_break) then
combatTotalsTableInGroup.cc_break = combatTotalsTableInGroup.cc_break - actorObject.cc_break
end
end
--decrease the amount of dispell from the combat totals
if (actorObject.dispell and actorObject.dispell > 0) then
if (combatTotalsTable.dispell) then
combatTotalsTable.dispell = combatTotalsTable.dispell - actorObject.dispell
end
if (combatTotalsTableInGroup.dispell) then
combatTotalsTableInGroup.dispell = combatTotalsTableInGroup.dispell - actorObject.dispell
end
end
--decrease the amount of interrupt from the combat totals
if (actorObject.interrupt and actorObject.interrupt > 0) then
if (combatTotalsTable.interrupt) then
combatTotalsTable.interrupt = combatTotalsTable.interrupt - actorObject.interrupt
end
if (combatTotalsTableInGroup.interrupt) then
combatTotalsTableInGroup.interrupt = combatTotalsTableInGroup.interrupt - actorObject.interrupt
end
end
--decrease the amount of ress from the combat totals
if (actorObject.ress and actorObject.ress > 0) then
if (combatTotalsTable.ress) then
combatTotalsTable.ress = combatTotalsTable.ress - actorObject.ress
end
if (combatTotalsTableInGroup.ress) then
combatTotalsTableInGroup.ress = combatTotalsTableInGroup.ress - actorObject.ress
end
end
--decrease the amount of dead from the combat totals
if (actorObject.dead and actorObject.dead > 0) then
if (combatTotalsTable.dead) then
combatTotalsTable.dead = combatTotalsTable.dead - actorObject.dead
end
if (combatTotalsTableInGroup.dead) then
combatTotalsTableInGroup.dead = combatTotalsTableInGroup.dead - actorObject.dead
end
end
--decreate the amount of cooldowns used from the combat totals
if (actorObject.cooldowns_defensive and actorObject.cooldowns_defensive > 0) then
if (combatTotalsTable.cooldowns_defensive) then
combatTotalsTable.cooldowns_defensive = combatTotalsTable.cooldowns_defensive - actorObject.cooldowns_defensive
end
if (combatTotalsTableInGroup.cooldowns_defensive) then
combatTotalsTableInGroup.cooldowns_defensive = combatTotalsTableInGroup.cooldowns_defensive - actorObject.cooldowns_defensive
end
end
--decrease the amount of buff uptime from the combat totals
if (actorObject.buff_uptime and actorObject.buff_uptime > 0) then
if (combatTotalsTable.buff_uptime) then
combatTotalsTable.buff_uptime = combatTotalsTable.buff_uptime - actorObject.buff_uptime
end
if (combatTotalsTableInGroup.buff_uptime) then
combatTotalsTableInGroup.buff_uptime = combatTotalsTableInGroup.buff_uptime - actorObject.buff_uptime
end
end
--decrease the amount of debuff uptime from the combat totals
if (actorObject.debuff_uptime and actorObject.debuff_uptime > 0) then
if (combatTotalsTable.debuff_uptime) then
combatTotalsTable.debuff_uptime = combatTotalsTable.debuff_uptime - actorObject.debuff_uptime
end
if (combatTotalsTableInGroup.debuff_uptime) then
combatTotalsTableInGroup.debuff_uptime = combatTotalsTableInGroup.debuff_uptime - actorObject.debuff_uptime
end
end
end
end
Details222.TimeMachine.RemoveActor(actorObject)
local actorName = actorObject:Name()
combatObject:RemoveActorFromSpellCastTable(actorName)
setmetatable(actorObject, nil)
actorObject.__index = nil
actorObject.__newindex = nil
Details:Destroy(actorObject)
--leave a trace that the actor has been deleted
actorObject.__destroyed = true
actorObject.__destroyedBy = debugstack(callStackDepth or 2, 1, 0)
end