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
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
|