From f55511e337b5e72e07880ee8a5d0a52a9963c4c1 Mon Sep 17 00:00:00 2001 From: Tercio Date: Mon, 9 Oct 2017 22:43:26 -0300 Subject: [PATCH] - Added several options and tools for streamers and youtubers. - Bar animation now uses delta time and speed shouldn't variate with framerate. - Test bars got improvement! - Fixed balance druid sometimes being detected as resto druid. - API: added new events: COMBAT_ARENA_START, COMBAT_ARENA_END, COMBAT_MYTHICDUNGEON_START, COMBAT_MYTHICDUNGEON_END. - API: added Details:AddColorString (player_name, class), add the player class color in the name string. - API: added Details:AddRoleIcon (player_name, role, size), add the role icon in the name string. - API: framework updated to v57. --- Libs/DF/fw.lua | 2 +- Libs/DF/panel.lua | 128 ++- boot.lua | 11 +- classes/container_combatentes.lua | 14 +- classes/container_historico.lua | 6 + core/control.lua | 5 + core/gears.lua | 21 +- core/parser.lua | 7 + core/windows.lua | 1662 ++++++++++++++++++++++++++++- functions/events.lua | 10 +- functions/playerclass.lua | 45 +- functions/profiles.lua | 101 +- functions/spells.lua | 32 +- gumps/janela_options.lua | 329 +++++- gumps/janela_principal.lua | 16 +- images/icons2.blp | Bin 350724 -> 350724 bytes startup.lua | 51 +- 17 files changed, 2353 insertions(+), 87 deletions(-) diff --git a/Libs/DF/fw.lua b/Libs/DF/fw.lua index 4692e714..f447ab7d 100644 --- a/Libs/DF/fw.lua +++ b/Libs/DF/fw.lua @@ -1,5 +1,5 @@ -local dversion = 56 +local dversion = 57 local major, minor = "DetailsFramework-1.0", dversion local DF, oldminor = LibStub:NewLibrary (major, minor) diff --git a/Libs/DF/panel.lua b/Libs/DF/panel.lua index dfd2709a..bba0b4fa 100644 --- a/Libs/DF/panel.lua +++ b/Libs/DF/panel.lua @@ -3618,13 +3618,6 @@ end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- ~scrollbox - --- preciso de uma fauxscroll que seja facil de lidar --- ele cria scroll aqui, preciso falar a função que cria a linha e a função que atualiza --- precisa passsar o tamanho em height width quantas barras vai mostrar --- search box incluso opcionalmente - - DF.SortFunctions = {} local SortMember = "" @@ -3659,7 +3652,7 @@ DF.ScrollBoxFunctions.Refresh = function (self) offset = FauxScrollFrame_GetOffset (self) end - local okay, totalLines = pcall (self.refresh_func, self, self.data, offset, #self.Frames) + local okay, totalLines = pcall (self.refresh_func, self, self.data, offset, self.LineAmount) if (not okay) then error ("Details! FrameWork: Refresh(): " .. totalLines) end @@ -3674,6 +3667,19 @@ DF.ScrollBoxFunctions.Refresh = function (self) self:Show() + if (self.HideScrollBar) then + local frameName = self:GetName() + if (frameName) then + local scrollBar = _G [frameName .. "ScrollBar"] + if (scrollBar) then + scrollBar:Hide() + end + else + + end + + end + return self.Frames end @@ -3683,9 +3689,13 @@ DF.ScrollBoxFunctions.OnVerticalScroll = function (self, offset) end DF.ScrollBoxFunctions.CreateLine = function (self, func) + if (not func) then + func = self.CreateLineFunc + end local okay, newLine = pcall (func, self, #self.Frames+1) if (okay) then tinsert (self.Frames, newLine) + newLine.Index = #self.Frames return newLine else error ("Details! FrameWork: CreateLine(): " .. newLine) @@ -3707,14 +3717,85 @@ DF.ScrollBoxFunctions.GetData = function (self) return self.data end -function DF:CreateScrollBox (parent, name, refresh_func, data, width, height, line_amount, line_height) +DF.ScrollBoxFunctions.GetFrames = function (self) + return self.Frames +end + +DF.ScrollBoxFunctions.GetNumFramesCreated = function (self) + return #self.Frames +end + +DF.ScrollBoxFunctions.GetNumFramesShown = function (self) + return self.LineAmount +end + +DF.ScrollBoxFunctions.SetNumFramesShown = function (self, new_amount) + --> hide frames which won't be used + if (new_amount < #self.Frames) then + for i = new_amount+1, #self.Frames do + self.Frames [i]:Hide() + end + end + + --> set the new amount + self.LineAmount = new_amount +end + +DF.ScrollBoxFunctions.SetFramesHeight = function (self, new_height) + self.LineHeight = new_height + self:OnSizeChanged() + self:Refresh() +end + +DF.ScrollBoxFunctions.OnSizeChanged = function (self) + if (self.ReajustNumFrames) then + --> how many lines the scroll can show + local amountOfFramesToShow = floor (self:GetHeight() / self.LineHeight) + + --> how many lines the scroll already have + local totalFramesCreated = self:GetNumFramesCreated() + + --> how many lines are current shown + local totalFramesShown = self:GetNumFramesShown() + + --> the amount of frames increased + if (amountOfFramesToShow > totalFramesShown) then + for i = totalFramesShown+1, amountOfFramesToShow do + --> check if need to create a new line + if (i > totalFramesCreated) then + self:CreateLine (self.CreateLineFunc) + end + end + + --> the amount of frames decreased + elseif (amountOfFramesToShow < totalFramesShown) then + --> hide all frames above the new amount to show + for i = totalFramesCreated, amountOfFramesToShow, -1 do + if (self.Frames [i]) then + self.Frames [i]:Hide() + end + end + end + + --> set the new amount of frames + self:SetNumFramesShown (amountOfFramesToShow) + + --> refresh lines + self:Refresh() + end +end + +function DF:CreateScrollBox (parent, name, refresh_func, data, width, height, line_amount, line_height, create_line_func, auto_amount, no_scroll) local scroll = CreateFrame ("scrollframe", name, parent, "FauxScrollFrameTemplate") scroll:SetSize (width, height) scroll.LineAmount = line_amount scroll.LineHeight = line_height scroll.IsFauxScroll = true + scroll.HideScrollBar = no_scroll scroll.Frames = {} + scroll.ReajustNumFrames = auto_amount + scroll.CreateLineFunc = create_line_func DF:Mixin (scroll, DF.SortFunctions) DF:Mixin (scroll, DF.ScrollBoxFunctions) @@ -3723,9 +3804,38 @@ function DF:CreateScrollBox (parent, name, refresh_func, data, width, height, li scroll.data = data scroll:SetScript ("OnVerticalScroll", scroll.OnVerticalScroll) + scroll:SetScript ("OnSizeChanged", DF.ScrollBoxFunctions.OnSizeChanged) return scroll end +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +-- ~resizers +function DF:CreateResizeGrips (parent) + if (parent) then + local parentName = parent:GetName() + + local leftResizer = CreateFrame ("button", parentName and parentName .. "LeftResizer" or nil, parent) + local rightResizer = CreateFrame ("button", parentName and parentName .. "RightResizer" or nil, parent) + + leftResizer:SetPoint ("bottomleft", parent, "bottomleft") + rightResizer:SetPoint ("bottomright", parent, "bottomright") + leftResizer:SetSize (16, 16) + rightResizer:SetSize (16, 16) + + rightResizer:SetNormalTexture ([[Interface\CHATFRAME\UI-ChatIM-SizeGrabber-Up]]) + rightResizer:SetHighlightTexture ([[Interface\CHATFRAME\UI-ChatIM-SizeGrabber-Highlight]]) + rightResizer:SetPushedTexture ([[Interface\CHATFRAME\UI-ChatIM-SizeGrabber-Down]]) + leftResizer:SetNormalTexture ([[Interface\CHATFRAME\UI-ChatIM-SizeGrabber-Up]]) + leftResizer:SetHighlightTexture ([[Interface\CHATFRAME\UI-ChatIM-SizeGrabber-Highlight]]) + leftResizer:SetPushedTexture ([[Interface\CHATFRAME\UI-ChatIM-SizeGrabber-Down]]) + + leftResizer:GetNormalTexture():SetTexCoord (1, 0, 0, 1) + leftResizer:GetHighlightTexture():SetTexCoord (1, 0, 0, 1) + leftResizer:GetPushedTexture():SetTexCoord (1, 0, 0, 1) + + return leftResizer, rightResizer + end +end diff --git a/boot.lua b/boot.lua index 8dfae69f..f558115c 100644 --- a/boot.lua +++ b/boot.lua @@ -3,7 +3,7 @@ _ = nil _detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0") - _detalhes.build_counter = 4771 + _detalhes.build_counter = 4823 _detalhes.userversion = "v7.3.0." .. _detalhes.build_counter _detalhes.realversion = 126 --core version _detalhes.version = _detalhes.userversion .. " (core " .. _detalhes.realversion .. ")" @@ -21,13 +21,12 @@ do local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) --[[ -|cFFFFFF00v7.3.0.4723.126 (|cFFFFCC00Set 22th, 2017|r|cFFFFFF00)|r:\n\n -|cFFFFFF00-|r Fixed overall dungeon segments being added to overall data.\n\n +|cFFFFFF00v7.3.0.4823.126 (|cFFFFCC00Oct 09th, 2017|r|cFFFFFF00)|r:\n\n +|cFFFFFF00-|r Added new options section: Streamer Settings, focused on adjustments for streamers and youtubers.\n\n +|cFFFFFF00-|r Animations now always run at the same speed regardless the framerate.\n\n --]] ---|cFFFFFF00v7.3.0.4705.126 (|cFFFFCC00Set 19th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed damage taken tooltip for Brewmaster Monk where sometimes the tooltip didn't open.\n\n|cFFFFFF00-|r Fixed overall data on mythic dungeon not adding trash segments even with the option enabled on the options panel.\n\n|cFFFFFF00-|r Fixed the guild selection dropdown reseting everytime the Guild Rank window is opened.\n\n - - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v7.3.0.4723.126 (|cFFFFCC00Set 22th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed overall dungeon segments being added to overall data.\n\n|cFFFFFF00v7.3.0.4705.126 (|cFFFFCC00Set 19th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed damage taken tooltip for Brewmaster Monk where sometimes the tooltip didn't open.\n\n|cFFFFFF00-|r Fixed overall data on mythic dungeon not adding trash segments even with the option enabled on the options panel.\n\n|cFFFFFF00-|r Fixed the guild selection dropdown reseting everytime the Guild Rank window is opened.\n\n|cFFFFFF00v7.3.0.4677.126 (|cFFFFCC00Set 10th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r During mythic dungeons, the trash segments will be merged into a new segment at the end of the boss encounter (instead of merging on the fly while cleaning up).\n\n|cFFFFFF00v7.3.0.4615.125 (|cFFFFCC00Set 09th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Setting up the dungeon stuff as opt-in for early adopters while we continue to make improvements on the system.\n\n|cFFFFFF00v7.3.0.4586.125 (|cFFFFCC00Set 08th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Formating mythic+ dungeon segments, each segment should count the boss trash + boss fight.\n\n|cFFFFFF00-|r At the end of the mythic+ dungeon, it should create a new segment adding up all segments described above.\n\n|cFFFFFF00v7.3.0.4499.124 (|cFFFFCC00Set 05th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an option to always show all players when using the standard mode. Option under PvP/PvE bracket on the options panel.\n\n|cFFFFFF00-|r Added a setting to exclude healing done lines from the death log below a certain healing amount. This options is also under PvP/PvE bracket.\n\n|cFFFFFF00-|r Fixed the guild selection on the ranking panel.\n\n|cFFFFFF00v7.3.0.4467.124 (|cFFFFCC00August 29th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Damage or Healing record for the encounter should be printed on chat on the boss pull.\nUse /run Details.announce_damagerecord.enabled = false; to disable.\n\n|cFFFFFF00v7.2.5.4437.124 (|cFFFFCC00August 21th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added healing done cap for death log. Use /run Details.deathlog_healingdone_min = 10000\n\n|cFFFFFF00-|r Fixed an issue where the alpha from the fixed bar color was used even when this option was disabled.\n\n|cFFFFFF00v7.2.5.4436.124 (|cFFFFCC00August 17th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Attempt to fix the issue where the window doesn't update after entering a raid or reseting data.\n\n|cFFFFFF00v7.2.5.4434.124 (|cFFFFCC00August 10th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added buttons to create an aura at Aura tab on the Player Details window.\n\n|cFFFFFF00-|r Fixes and improvements on the damage rank panel.\n\n|cFFFFFF00-|r Best damage or healing for the player on the current boss encounter is now shown on the spec icon tooltip.\n\n|cFFFFFF00-|r Major revamp on the aura creation panel.\n\n|cFFFFFF00v7.2.5.4369.124 (|cFFFFCC00August 1st, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Details! can now track debuff applications (stack) and refreshes.\n\n|cFFFFFF00-|r Added new tab on Player Detail Window called 'Auras', you can see your buffs and debuffs from there.\n\n|cFFFFFF00-|r Death log now show debuff applications.\n\n|cFFFFFF00v7.2.5.4275.123 (|cFFFFCC00July 18th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed some issues with tooltiops popup when the user press SHIFT.\n\n|cFFFFFF00-|r Now is possible to change the bar durating when selecting Cast Start trigger on Details! Forge.\n\n|cFFFFFF00-|r Kil'Jaeden adds should be consolidated into only one actor instead of having one for each player targeted.\n\n|cFFFFFF00v7.2.5.4236.122 (|cFFFFCC00July 05th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r The alert to open the raid ranking after a boss kill, is now shown for 10 seconds (down from 40).\n\n|cFFFFFF00-|r Added a report button on the raid ranking panel and boss are sort alphabetically.\n\n|cFFFFFF00-|r Fixed some issues on the combatlog introduced on the wow patch 7.2.5 where sometimes the source of an event has no name.\n\n|cFFFFFF00-|r Ticket #209, fixed more issues with the comparison panel where are pets involved.\n\n|cFFFFFF00v7.2.5.4201.121 (|cFFFFCC00June 26th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed Monk Stagger where it was only shown on the friendly fire and not under the Damage Taken display.\n\n|cFFFFFF00-|r Added Forge and Ranking options on the main menu (orange cogwheel).\n\n|cFFFFFF00v7.2.5.4102.121 (|cFFFFCC00June 22th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Details! Forge has updated and now is more usder friendly.\n\n|cFFFFFF00-|r Fixed an issue with player buff uptime where sometimes some buffs wans't showing in the tooltip.\n\n|cFFFFFF00v7.2.5.3968.120 (|cFFFFCC00June 20th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r New Death Recap implemented! replaces the default from Blizzard and can be configured at Options > Raid Tools.\n\n|cFFFFFF00-|r New Guild Damage and Heal rank on '/details ranking' panel.\n\n|cFFFFFF00-|r Added a Guild Sync button on the Details! Ranking Panel.\n\n|cFFFFFF00-|r Added Custom display 'Damage on Shields', useful for encounter like Maiden of Vigilance where there's big shields to be removed and you want to know who is doing more damage to it.\n\n|cFFFFFF00-|r Added Heal Absorbed display under Heal bracket.\n\nHeal Absorb are the heal denied by abilities such like DK's Necrotic Strike or raid boss Sisters of the Moon 'Embrace of the Eclipse' ability.\nThe tooltip of this display shows which players got heal denied, which abilities absorbed the heal, which abilities tried to heal but got the heal denied.\n\n|cFFFFFF00-|r Added Alternate Power display under Energy bracket, it shows the total of alternate power gain from each player, useful for encounters such as Demonic Inquisition.\n\n|cFFFFFF00-|r 'First Hit' message after pulling a boss, now also shows who the boss is targeting (almost always is who pulled).\n\n|cFFFFFF00-|r Raid Dps {rdps} and Hps {rhps} can now be used on the Broker Data Feed..\n\n|cFFFFFF00-|r Fixed an issue with Chromie from the scenario 'The Deaths of Chromie' where she wasn't being shown on the meter.\n\n|cFFFFFF00-|r Fixed Paladin 'Light of the Martyr' damage to self.\n\n|cFFFFFF00-|r Ticket #198 'Script Error' Fixed.\n\n|cFFFFFF00v7.2.0.3703.119 (|cFFFFCC00May 29th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an error while killing low level mobs with warrior class.\n\n|cFFFFFF00v7.2.0.3693.118 (|cFFFFCC00May 25th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fury Warrior shouldn't be assigned as Protection any more.\n\n|cFFFFFF00-|r Some parser fixes.\n\n|cFFFFFF00v7.2.0.3673.118 (|cFFFFCC00May 09th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #187: Fixed an issue when comparing hunter pets on the player detail window.\n\n|cFFFFFF00-|r Ticket #189 #186: Fixed a taint issue for some classes when using friendly nameplates on.\n\n|cFFFFFF00v7.2.0.3512.116 (|cFFFFCC00April 27th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Havoc Demon Hunter: your fury energy is being shown under Mana Restored (don't ask me why, the combat log is telling us it's mana).\n\n|cFFFFFF00-|r Pets now are shown on damage tooltips.\n\n|cFFFFFF00-|r Pets are now also shown on the comparison panel.\n\n|cFFFFFF00v7.2.0.3474.116 (|cFFFFCC00April 20th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Plugin: Raid Check > added some food buffs which wasn't being tracked.\n\n|cFFFFFF00v7.2.0.3467.116 (|cFFFFCC00April 07th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for the custom display window where apply and cancel buttons where over the edit window.\n\n|cFFFFFF00-|r Fix for an issue on editing a bookmark.\n\n|cFFFFFF00v7.1.5.3459.116 (|cFFFFCC00Mar 21th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue on dynamic overall data where it wasn't showing DPS.\n\n|cFFFFFF00-|r Fixed an issue with Apply, Save and Cancel buttons when editing a custom display.\n\n|cFFFFFF00-|r Removed the Damage and Healing presets for custom displays, now is only possible create custom displays by scripting them.\n\n|cFFFFFF00v7.1.5.3431.116 (|cFFFFCC00Mar 15th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with bar orientation right to left where fixed bar color isn't working.\n\n|cFFFFFF00-|r The nickname field now use FrizQuadrataTT font and shall be compatible with Cyrillic.\n\n|cFFFFFF00v7.1.5.3418.116 (|cFFFFCC00Mar 1st, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #167 fix: Light of the Martyr self-damage now does reduce the healing done (following WCL method).\n\n|cFFFFFF00-|r Ticket #169 fix: Damage Prevented is now working for new segments.\n\n|cFFFFFF00-|r Fixed an issue where sometimes BeastMaster's Hati pet wasn't detected correctly.\n\n|cFFFFFF00v7.1.5.3369.116 (|cFFFFCC00Feb 07th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added custom display 'Dynamic Overall Damage' for mythic dungeons.\n\n|cFFFFFF00-|r Fix for Ticket #168: 'Auto Hide While [Not] Inside Instance is broken'.\n\n|cFFFFFF00-|r The bar truncate frame 'DetailsLeftTextAntiTruncate' is now created on Details! load instead on demand.\n\n|cFFFFFF00v7.1.5.3315.116 (|cFFFFCC00Jan 23th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #162: 'no Monochrome font' available, added an experimental slash command: /run _detalhes:UseOutline ('MONOCHROME').\n\n|cFFFFFF00-|r Ticket #158: 'no elapsed time shown on report to chat', added the elapsed time when reporting a segment.\n\n|cFFFFFF00-|r Ticket #164: 'error when browsing segments', an attempt to fix the problem has been made.\n\n|cFFFFFF00v7.1.5.3305.116 (|cFFFFCC00Jan 15th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Another fix for mythic dungeons overall data reset (thanks Tharai @ Curseforge).\n\n|cFFFFFF00-|r Fix for spec detection on PvP Arenas (thanks Pas06 @ Curseforge).\n\n|cFFFFFF00v7.1.0.3276.115 (|cFFFFCC00Jan 08th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed the overall data not reseting when starting a new mythic+ dungeon.\n\n|cFFFFFF00v7.1.0.3266.115 (|cFFFFCC00Dec 29th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with overall data not updating correctly at the end of the combat.\n\n|cFFFFFF00-|r Added a tutorial line on the window when the user access overall data.\n\n|cFFFFFF00v7.1.0.3236.115 (|cFFFFCC00Dec 19th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Integration with BigWigs should be working okay now.\n\n|cFFFFFF00v7.1.0.3231.115 (|cFFFFCC00Dec 15th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Disabled the link with BigWigs to avoid the 'RegisterMessage' error on every login.\n\n|cFFFFFF00v7.1.0.3229.115 (|cFFFFCC00Dec 09th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r When a window is locked, resize grips shouldn't be enabled messing with bar mouse over.\n\n|cFFFFFF00v7.0.3.3222.115 (|cFFFFCC00November 28th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Unstable Affliction to common spells with the same name.\n\n|cFFFFFF00-|r Fixed few issues with built-in plugins.\n\n|cFFFFFF00v7.0.3.3202.115 (|cFFFFCC00November 08th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Weakauras creator from the Encounter Details plugin and '/details forge' shall work correctly now with Trials of Valor.\n\n|cFFFFFF00-|r Raid history should now be recording your Trials of Valor kills.\n\n|cFFFFFF00-|r Added Trials of Valor raid info, good luck and have fun!.\n\n|cFFFFFF00v7.0.3.3201.115 (|cFFFFCC00November 04th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for Paladin holy icon.\n\n|cFFFFFF00-|r Fix for Rogue outlaw icon.\n\n|cFFFFFF00-|r Fixed misc displays with bar sorted by ascending order.\n\n|cFFFFFF00-|r Fix for '/details show' command while the window is on auto hide.\n\n|cFFFFFF00v7.0.3.3114.115 (|cFFFFCC00October 26th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Encounter Details (plugin): tooltip tutorial is now clamped to screen and its close button should be visible.\n\n|cFFFFFF00-|r Raid Check (plugin): now also works on dungeons.\n\n|cFFFFFF00-|r Added Potion of the Prolongued Power to the tracker.\n\n|cFFFFFF00v7.1.0.3097.115 (|cFFFFCC00October 25th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r renamed 'report history' to 'latest reports'.\n\n|cFFFFFF00-|r attempt to make all Details! users on the party or raid to track rogue's akaari's soul." + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v7.3.0.4823.126 (|cFFFFCC00Oct 09th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added new options section: Streamer Settings, focused on adjustments for streamers and youtubers.\n\n|cFFFFFF00-|r Animations now always run at the same speed regardless the framerate.\n\n|cFFFFFF00v7.3.0.4723.126 (|cFFFFCC00Set 22th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed overall dungeon segments being added to overall data.\n\n|cFFFFFF00v7.3.0.4705.126 (|cFFFFCC00Set 19th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed damage taken tooltip for Brewmaster Monk where sometimes the tooltip didn't open.\n\n|cFFFFFF00-|r Fixed overall data on mythic dungeon not adding trash segments even with the option enabled on the options panel.\n\n|cFFFFFF00-|r Fixed the guild selection dropdown reseting everytime the Guild Rank window is opened.\n\n|cFFFFFF00v7.3.0.4677.126 (|cFFFFCC00Set 10th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r During mythic dungeons, the trash segments will be merged into a new segment at the end of the boss encounter (instead of merging on the fly while cleaning up).\n\n|cFFFFFF00v7.3.0.4615.125 (|cFFFFCC00Set 09th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Setting up the dungeon stuff as opt-in for early adopters while we continue to make improvements on the system.\n\n|cFFFFFF00v7.3.0.4586.125 (|cFFFFCC00Set 08th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Formating mythic+ dungeon segments, each segment should count the boss trash + boss fight.\n\n|cFFFFFF00-|r At the end of the mythic+ dungeon, it should create a new segment adding up all segments described above.\n\n|cFFFFFF00v7.3.0.4499.124 (|cFFFFCC00Set 05th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an option to always show all players when using the standard mode. Option under PvP/PvE bracket on the options panel.\n\n|cFFFFFF00-|r Added a setting to exclude healing done lines from the death log below a certain healing amount. This options is also under PvP/PvE bracket.\n\n|cFFFFFF00-|r Fixed the guild selection on the ranking panel.\n\n|cFFFFFF00v7.3.0.4467.124 (|cFFFFCC00August 29th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Damage or Healing record for the encounter should be printed on chat on the boss pull.\nUse /run Details.announce_damagerecord.enabled = false; to disable.\n\n|cFFFFFF00v7.2.5.4437.124 (|cFFFFCC00August 21th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added healing done cap for death log. Use /run Details.deathlog_healingdone_min = 10000\n\n|cFFFFFF00-|r Fixed an issue where the alpha from the fixed bar color was used even when this option was disabled.\n\n|cFFFFFF00v7.2.5.4436.124 (|cFFFFCC00August 17th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Attempt to fix the issue where the window doesn't update after entering a raid or reseting data.\n\n|cFFFFFF00v7.2.5.4434.124 (|cFFFFCC00August 10th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added buttons to create an aura at Aura tab on the Player Details window.\n\n|cFFFFFF00-|r Fixes and improvements on the damage rank panel.\n\n|cFFFFFF00-|r Best damage or healing for the player on the current boss encounter is now shown on the spec icon tooltip.\n\n|cFFFFFF00-|r Major revamp on the aura creation panel.\n\n|cFFFFFF00v7.2.5.4369.124 (|cFFFFCC00August 1st, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Details! can now track debuff applications (stack) and refreshes.\n\n|cFFFFFF00-|r Added new tab on Player Detail Window called 'Auras', you can see your buffs and debuffs from there.\n\n|cFFFFFF00-|r Death log now show debuff applications.\n\n|cFFFFFF00v7.2.5.4275.123 (|cFFFFCC00July 18th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed some issues with tooltiops popup when the user press SHIFT.\n\n|cFFFFFF00-|r Now is possible to change the bar durating when selecting Cast Start trigger on Details! Forge.\n\n|cFFFFFF00-|r Kil'Jaeden adds should be consolidated into only one actor instead of having one for each player targeted.\n\n|cFFFFFF00v7.2.5.4236.122 (|cFFFFCC00July 05th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r The alert to open the raid ranking after a boss kill, is now shown for 10 seconds (down from 40).\n\n|cFFFFFF00-|r Added a report button on the raid ranking panel and boss are sort alphabetically.\n\n|cFFFFFF00-|r Fixed some issues on the combatlog introduced on the wow patch 7.2.5 where sometimes the source of an event has no name.\n\n|cFFFFFF00-|r Ticket #209, fixed more issues with the comparison panel where are pets involved.\n\n|cFFFFFF00v7.2.5.4201.121 (|cFFFFCC00June 26th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed Monk Stagger where it was only shown on the friendly fire and not under the Damage Taken display.\n\n|cFFFFFF00-|r Added Forge and Ranking options on the main menu (orange cogwheel).\n\n|cFFFFFF00v7.2.5.4102.121 (|cFFFFCC00June 22th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Details! Forge has updated and now is more usder friendly.\n\n|cFFFFFF00-|r Fixed an issue with player buff uptime where sometimes some buffs wans't showing in the tooltip.\n\n|cFFFFFF00v7.2.5.3968.120 (|cFFFFCC00June 20th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r New Death Recap implemented! replaces the default from Blizzard and can be configured at Options > Raid Tools.\n\n|cFFFFFF00-|r New Guild Damage and Heal rank on '/details ranking' panel.\n\n|cFFFFFF00-|r Added a Guild Sync button on the Details! Ranking Panel.\n\n|cFFFFFF00-|r Added Custom display 'Damage on Shields', useful for encounter like Maiden of Vigilance where there's big shields to be removed and you want to know who is doing more damage to it.\n\n|cFFFFFF00-|r Added Heal Absorbed display under Heal bracket.\n\nHeal Absorb are the heal denied by abilities such like DK's Necrotic Strike or raid boss Sisters of the Moon 'Embrace of the Eclipse' ability.\nThe tooltip of this display shows which players got heal denied, which abilities absorbed the heal, which abilities tried to heal but got the heal denied.\n\n|cFFFFFF00-|r Added Alternate Power display under Energy bracket, it shows the total of alternate power gain from each player, useful for encounters such as Demonic Inquisition.\n\n|cFFFFFF00-|r 'First Hit' message after pulling a boss, now also shows who the boss is targeting (almost always is who pulled).\n\n|cFFFFFF00-|r Raid Dps {rdps} and Hps {rhps} can now be used on the Broker Data Feed..\n\n|cFFFFFF00-|r Fixed an issue with Chromie from the scenario 'The Deaths of Chromie' where she wasn't being shown on the meter.\n\n|cFFFFFF00-|r Fixed Paladin 'Light of the Martyr' damage to self.\n\n|cFFFFFF00-|r Ticket #198 'Script Error' Fixed.\n\n|cFFFFFF00v7.2.0.3703.119 (|cFFFFCC00May 29th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an error while killing low level mobs with warrior class.\n\n|cFFFFFF00v7.2.0.3693.118 (|cFFFFCC00May 25th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fury Warrior shouldn't be assigned as Protection any more.\n\n|cFFFFFF00-|r Some parser fixes.\n\n|cFFFFFF00v7.2.0.3673.118 (|cFFFFCC00May 09th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #187: Fixed an issue when comparing hunter pets on the player detail window.\n\n|cFFFFFF00-|r Ticket #189 #186: Fixed a taint issue for some classes when using friendly nameplates on.\n\n|cFFFFFF00v7.2.0.3512.116 (|cFFFFCC00April 27th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Havoc Demon Hunter: your fury energy is being shown under Mana Restored (don't ask me why, the combat log is telling us it's mana).\n\n|cFFFFFF00-|r Pets now are shown on damage tooltips.\n\n|cFFFFFF00-|r Pets are now also shown on the comparison panel.\n\n|cFFFFFF00v7.2.0.3474.116 (|cFFFFCC00April 20th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Plugin: Raid Check > added some food buffs which wasn't being tracked.\n\n|cFFFFFF00v7.2.0.3467.116 (|cFFFFCC00April 07th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for the custom display window where apply and cancel buttons where over the edit window.\n\n|cFFFFFF00-|r Fix for an issue on editing a bookmark.\n\n|cFFFFFF00v7.1.5.3459.116 (|cFFFFCC00Mar 21th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue on dynamic overall data where it wasn't showing DPS.\n\n|cFFFFFF00-|r Fixed an issue with Apply, Save and Cancel buttons when editing a custom display.\n\n|cFFFFFF00-|r Removed the Damage and Healing presets for custom displays, now is only possible create custom displays by scripting them.\n\n|cFFFFFF00v7.1.5.3431.116 (|cFFFFCC00Mar 15th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with bar orientation right to left where fixed bar color isn't working.\n\n|cFFFFFF00-|r The nickname field now use FrizQuadrataTT font and shall be compatible with Cyrillic.\n\n|cFFFFFF00v7.1.5.3418.116 (|cFFFFCC00Mar 1st, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #167 fix: Light of the Martyr self-damage now does reduce the healing done (following WCL method).\n\n|cFFFFFF00-|r Ticket #169 fix: Damage Prevented is now working for new segments.\n\n|cFFFFFF00-|r Fixed an issue where sometimes BeastMaster's Hati pet wasn't detected correctly.\n\n|cFFFFFF00v7.1.5.3369.116 (|cFFFFCC00Feb 07th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added custom display 'Dynamic Overall Damage' for mythic dungeons.\n\n|cFFFFFF00-|r Fix for Ticket #168: 'Auto Hide While [Not] Inside Instance is broken'.\n\n|cFFFFFF00-|r The bar truncate frame 'DetailsLeftTextAntiTruncate' is now created on Details! load instead on demand.\n\n|cFFFFFF00v7.1.5.3315.116 (|cFFFFCC00Jan 23th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Ticket #162: 'no Monochrome font' available, added an experimental slash command: /run _detalhes:UseOutline ('MONOCHROME').\n\n|cFFFFFF00-|r Ticket #158: 'no elapsed time shown on report to chat', added the elapsed time when reporting a segment.\n\n|cFFFFFF00-|r Ticket #164: 'error when browsing segments', an attempt to fix the problem has been made.\n\n|cFFFFFF00v7.1.5.3305.116 (|cFFFFCC00Jan 15th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Another fix for mythic dungeons overall data reset (thanks Tharai @ Curseforge).\n\n|cFFFFFF00-|r Fix for spec detection on PvP Arenas (thanks Pas06 @ Curseforge).\n\n|cFFFFFF00v7.1.0.3276.115 (|cFFFFCC00Jan 08th, 2017|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed the overall data not reseting when starting a new mythic+ dungeon.\n\n|cFFFFFF00v7.1.0.3266.115 (|cFFFFCC00Dec 29th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with overall data not updating correctly at the end of the combat.\n\n|cFFFFFF00-|r Added a tutorial line on the window when the user access overall data.\n\n|cFFFFFF00v7.1.0.3236.115 (|cFFFFCC00Dec 19th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Integration with BigWigs should be working okay now.\n\n|cFFFFFF00v7.1.0.3231.115 (|cFFFFCC00Dec 15th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Disabled the link with BigWigs to avoid the 'RegisterMessage' error on every login.\n\n|cFFFFFF00v7.1.0.3229.115 (|cFFFFCC00Dec 09th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r When a window is locked, resize grips shouldn't be enabled messing with bar mouse over.\n\n|cFFFFFF00v7.0.3.3222.115 (|cFFFFCC00November 28th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Unstable Affliction to common spells with the same name.\n\n|cFFFFFF00-|r Fixed few issues with built-in plugins.\n\n|cFFFFFF00v7.0.3.3202.115 (|cFFFFCC00November 08th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Weakauras creator from the Encounter Details plugin and '/details forge' shall work correctly now with Trials of Valor.\n\n|cFFFFFF00-|r Raid history should now be recording your Trials of Valor kills.\n\n|cFFFFFF00-|r Added Trials of Valor raid info, good luck and have fun!.\n\n|cFFFFFF00v7.0.3.3201.115 (|cFFFFCC00November 04th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for Paladin holy icon.\n\n|cFFFFFF00-|r Fix for Rogue outlaw icon.\n\n|cFFFFFF00-|r Fixed misc displays with bar sorted by ascending order.\n\n|cFFFFFF00-|r Fix for '/details show' command while the window is on auto hide.\n\n|cFFFFFF00v7.0.3.3114.115 (|cFFFFCC00October 26th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Encounter Details (plugin): tooltip tutorial is now clamped to screen and its close button should be visible.\n\n|cFFFFFF00-|r Raid Check (plugin): now also works on dungeons.\n\n|cFFFFFF00-|r Added Potion of the Prolongued Power to the tracker.\n\n|cFFFFFF00v7.1.0.3097.115 (|cFFFFCC00October 25th, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r renamed 'report history' to 'latest reports'.\n\n|cFFFFFF00-|r attempt to make all Details! users on the party or raid to track rogue's akaari's soul." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails!:|r " diff --git a/classes/container_combatentes.lua b/classes/container_combatentes.lua index 949865dd..45b4bd54 100644 --- a/classes/container_combatentes.lua +++ b/classes/container_combatentes.lua @@ -160,11 +160,21 @@ if (have_cached) then novo_objeto.spec = have_cached --> check is didn't changed the spec: + if (_detalhes.streamer_config.quick_detection) then + --> validate the spec more times if on quick detection + _detalhes:ScheduleTimer ("ReGuessSpec", 2, {novo_objeto, self}) + _detalhes:ScheduleTimer ("ReGuessSpec", 4, {novo_objeto, self}) + _detalhes:ScheduleTimer ("ReGuessSpec", 6, {novo_objeto, self}) + end _detalhes:ScheduleTimer ("ReGuessSpec", 15, {novo_objeto, self}) --print (nome, "spec em cache:", have_cached) else - _detalhes:ScheduleTimer ("GuessSpec", 3, {novo_objeto, self, 1}) - --print (nome, "nao tem") + if (_detalhes.streamer_config.quick_detection) then + --> shoot detection early if in quick detection + _detalhes:ScheduleTimer ("GuessSpec", 1, {novo_objeto, self, 1}) + else + _detalhes:ScheduleTimer ("GuessSpec", 3, {novo_objeto, self, 1}) + end end end diff --git a/classes/container_historico.lua b/classes/container_historico.lua index d336d245..7a6f4c6f 100644 --- a/classes/container_historico.lua +++ b/classes/container_historico.lua @@ -424,6 +424,9 @@ function historico:resetar_overall() end end + --> stop bar testing if any + _detalhes:StopTestBarUpdate() + _detalhes:ClockPluginTickOnSegment() end @@ -433,6 +436,9 @@ function historico:resetar() _detalhes.bosswindow:Reset() end + --> stop bar testing if any + _detalhes:StopTestBarUpdate() + if (_detalhes.tabela_vigente.verifica_combate) then --> finaliza a checagem se esta ou não no combate _detalhes:CancelTimer (_detalhes.tabela_vigente.verifica_combate) end diff --git a/core/control.lua b/core/control.lua index 2ab0f7e4..0f6ec497 100644 --- a/core/control.lua +++ b/core/control.lua @@ -415,6 +415,9 @@ _detalhes:CheckSwitchToCurrent() _detalhes:CheckForTextTimeCounter (true) + + --> stop bar testing if any + _detalhes:StopTestBarUpdate() end function _detalhes:DelayedSyncAlert() @@ -900,6 +903,7 @@ _detalhes.tabela_vigente.arena = true _detalhes.tabela_vigente.is_arena = {name = _detalhes.zone_name, zone = _detalhes.zone_name, mapid = _detalhes.zone_id} + _detalhes:SendEvent ("COMBAT_ARENA_START") end function _detalhes:StartArenaSegment (...) @@ -946,6 +950,7 @@ _detalhes:TimeDataUnregister ("Your Team Healing") _detalhes:TimeDataUnregister ("Enemy Team Healing") + _detalhes:SendEvent ("COMBAT_ARENA_END") end local validSpells = { diff --git a/core/gears.lua b/core/gears.lua index 76ac105e..8249484b 100644 --- a/core/gears.lua +++ b/core/gears.lua @@ -461,17 +461,34 @@ function _detalhes:ResetSpecCache (forced) end +function _detalhes:RefreshUpdater (suggested_interval) + local updateInterval = suggested_interval or _detalhes.update_speed + + if (_detalhes.streamer_config.faster_updates) then + --> force 60 updates per second + updateInterval = 0.016 + end + + if (_detalhes.atualizador) then + _detalhes:CancelTimer (_detalhes.atualizador) + end + _detalhes.atualizador = _detalhes:ScheduleRepeatingTimer ("AtualizaGumpPrincipal", updateInterval, -1) +end + function _detalhes:SetWindowUpdateSpeed (interval, nosave) if (not interval) then interval = _detalhes.update_speed end + + if (type (interval) ~= "number") then + interval = _detalhes.update_speed or 0.3 + end if (not nosave) then _detalhes.update_speed = interval end - _detalhes:CancelTimer (_detalhes.atualizador) - _detalhes.atualizador = _detalhes:ScheduleRepeatingTimer ("AtualizaGumpPrincipal", interval, -1) + _detalhes:RefreshUpdater (interval) end function _detalhes:SetUseAnimations (enabled, nosave) diff --git a/core/parser.lua b/core/parser.lua index f01d285f..f695b7fe 100644 --- a/core/parser.lua +++ b/core/parser.lua @@ -4060,6 +4060,13 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 _detalhes.time_type = 1 end + if (not _detalhes.is_in_arena) then + --> reset spec cache if broadcaster requested + if (_detalhes.streamer_config.reset_spec_cache) then + wipe (_detalhes.cached_specs) + end + end + _detalhes.is_in_arena = true _detalhes:EnteredInArena() diff --git a/core/windows.lua b/core/windows.lua index 637f7cd3..8981561a 100644 --- a/core/windows.lua +++ b/core/windows.lua @@ -10,6 +10,7 @@ local _type = type --lua local local _math_abs = math.abs --lua local local _math_min = math.min + local _math_max = math.max local _ipairs = ipairs --lua local local _GetScreenWidth = GetScreenWidth --wow api local @@ -24,6 +25,15 @@ local end_window_spacement = 0 +--> settings + + local animation_speed = 33 + local animation_speed_hightravel_trigger = 5 + local animation_speed_hightravel_maxspeed = 3 + local animation_speed_lowtravel_minspeed = 0.33 + local animation_func_left + local animation_func_right + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> core @@ -61,9 +71,10 @@ end self.proximo_update = 0 end + + function _detalhes:fazer_animacoes (amt_barras) - --aqui if (self.bars_sort_direction == 2) then @@ -140,20 +151,10 @@ end - function _detalhes:AnimarBarra (esta_barra, fim) - esta_barra.inicio = esta_barra.statusbar.value - esta_barra.fim = fim - esta_barra.tem_animacao = true - - if (esta_barra.fim > esta_barra.inicio) then - esta_barra:SetScript ("OnUpdate", self.FazerAnimacao_Direita) - else - esta_barra:SetScript ("OnUpdate", self.FazerAnimacao_Esquerda) - end - end - function _detalhes:FazerAnimacao_Esquerda (elapsed) - self.inicio = self.inicio - 1 + --> simple left and right animations by delta time + local animation_left_simple = function (self, deltaTime) + self.inicio = self.inicio - (animation_speed * deltaTime) self:SetValue (self.inicio) if (self.inicio-1 <= self.fim) then self.tem_animacao = false @@ -161,10 +162,85 @@ end end - function _detalhes:FazerAnimacao_Direita (elapsed) - self.inicio = self.inicio + 1 + local animation_right_simple = function (self, deltaTime) + self.inicio = self.inicio + (animation_speed * deltaTime) self:SetValue (self.inicio) - if (self.inicio+1 >= self.fim) then + if (self.inicio+0.1 >= self.fim) then + self.tem_animacao = false + self:SetScript ("OnUpdate", nil) + end + end + + --> animation with acceleration + local animation_left_with_accel = function (self, deltaTime) + local distance = self.inicio - self.fim + local calcAnimationSpeed = animation_speed * _math_max (_math_min (distance/animation_speed_hightravel_trigger, animation_speed_hightravel_maxspeed), animation_speed_lowtravel_minspeed) + + self.inicio = self.inicio - (calcAnimationSpeed * deltaTime) + self:SetValue (self.inicio) + if (self.inicio-0.1 <= self.fim) then + self.tem_animacao = false + self:SetScript ("OnUpdate", nil) + end + end + + local animation_right_with_accel = function (self, deltaTime) + local distance = self.fim - self.inicio + local calcAnimationSpeed = animation_speed * _math_max (_math_min (distance/animation_speed_hightravel_trigger, animation_speed_hightravel_maxspeed), animation_speed_lowtravel_minspeed) + + self.inicio = self.inicio + (calcAnimationSpeed * deltaTime) + self:SetValue (self.inicio) + if (self.inicio+0.1 >= self.fim) then + self.tem_animacao = false + self:SetScript ("OnUpdate", nil) + end + end + + --> initiate with defaults + animation_func_left = animation_left_simple + animation_func_right = animation_right_simple + + function _detalhes:AnimarBarra (esta_barra, fim) + esta_barra.inicio = esta_barra.statusbar.value + esta_barra.fim = fim + esta_barra.tem_animacao = true + + if (esta_barra.fim > esta_barra.inicio) then + esta_barra:SetScript ("OnUpdate", animation_func_right) + else + esta_barra:SetScript ("OnUpdate", animation_func_left) + end + end + + function _detalhes:RefreshAnimationFunctions() + if (_detalhes.streamer_config.use_animation_accel) then + animation_func_left = animation_left_with_accel + animation_func_right = animation_right_with_accel + + else + animation_func_left = animation_left_simple + animation_func_right = animation_right_simple + end + + animation_speed = _detalhes.animation_speed + animation_speed_hightravel_trigger = _detalhes.animation_speed_triggertravel + animation_speed_hightravel_maxspeed = _detalhes.animation_speed_maxtravel + animation_speed_lowtravel_minspeed = _detalhes.animation_speed_mintravel + end + + --deprecated + function _detalhes:FazerAnimacao_Esquerda (deltaTime) + self.inicio = self.inicio - (animation_speed * deltaTime) + self:SetValue (self.inicio) + if (self.inicio-1 <= self.fim) then + self.tem_animacao = false + self:SetScript ("OnUpdate", nil) + end + end + function _detalhes:FazerAnimacao_Direita (deltaTime) + self.inicio = self.inicio + (animation_speed * deltaTime) + self:SetValue (self.inicio) + if (self.inicio+0.1 >= self.fim) then self.tem_animacao = false self:SetScript ("OnUpdate", nil) end @@ -3421,12 +3497,12 @@ function _detalhes:TestBarsUpdate() local current_combat = _detalhes:GetCombat ("current") for index, actor in current_combat[1]:ListActors() do - actor.total = actor.total + (actor.total / 100 * math.random (1, 5)) - actor.total = actor.total - (actor.total / 100 * math.random (1, 5)) + actor.total = actor.total + (actor.total / 100 * math.random (1, 10)) + actor.total = actor.total - (actor.total / 100 * math.random (1, 10)) end for index, actor in current_combat[2]:ListActors() do - actor.total = actor.total + (actor.total / 100 * math.random (1, 5)) - actor.total = actor.total - (actor.total / 100 * math.random (1, 5)) + actor.total = actor.total + (actor.total / 100 * math.random (1, 10)) + actor.total = actor.total - (actor.total / 100 * math.random (1, 10)) end current_combat[1].need_refresh = true current_combat[2].need_refresh = true @@ -4649,4 +4725,1546 @@ end background_up:SetDesaturated (true) background_down:SetDesaturated (true) ---]] \ No newline at end of file +--]] + + +local CreateCurrentDpsFrame = function (parent, name) + + local DF = _detalhes.gump + local SharedMedia = LibStub:GetLibrary ("LibSharedMedia-3.0") + + --> some constants + local header_size = 12 --title bar size + local spacing_vertical = -6 --vertical space between the group anchor and the group dps + local green_team_color = {.5, 1, .5, 1} + local yellow_team_color = {1, 1, .5, 1} + + --> main farame + local f = CreateFrame ("frame", name, parent or UIParent) + f:SetPoint ("center", UIParent, "center") + f:SetSize (_detalhes.current_dps_meter.frame.width, _detalhes.current_dps_meter.frame.height) + + f:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tile = true, tileSize = 16, insets = {left = 0, right = 0, top = 0, bottom = 0}}) + f:SetBackdropColor (unpack (_detalhes.current_dps_meter.frame.backdrop_color)) + f:EnableMouse (true) + f:SetMovable (true) + f:SetClampedToScreen (true) + + f.PlayerTeam = 0 + + local LibWindow = LibStub ("LibWindow-1.1") + LibWindow.RegisterConfig (f, _detalhes.current_dps_meter.frame) + LibWindow.MakeDraggable (f) + LibWindow.RestorePosition (f) + + --> title bar + local TitleString = f:CreateFontString (nil, "overlay", "GameFontNormal") + TitleString:SetPoint ("top", f, "top", 0, -1) + TitleString:SetText ("Dps on Last 5 Seconds") + DF:SetFontSize (TitleString, 9) + local TitleBackground = f:CreateTexture (nil, "artwork") + TitleBackground:SetTexture ([[Interface\Tooltips\UI-Tooltip-Background]]) + TitleBackground:SetVertexColor (.1, .1, .1, .9) + TitleBackground:SetPoint ("topleft", f, "topleft") + TitleBackground:SetPoint ("topright", f, "topright") + TitleBackground:SetHeight (header_size) + + --> labels for arena + local labelPlayerTeam = f:CreateFontString (nil, "overlay", "GameFontNormal") + local labelYellowTeam = f:CreateFontString (nil, "overlay", "GameFontNormal") + labelPlayerTeam:SetText ("Player Team") + labelYellowTeam:SetText ("Enemy Team") + DF:SetFontSize (labelPlayerTeam, 14) + DF:SetFontSize (labelYellowTeam, 14) + DF:SetFontOutline (labelPlayerTeam, "NONE") + DF:SetFontOutline (labelYellowTeam, "NONE") + + local labelPlayerTeam_DPS = f:CreateFontString (nil, "overlay", "GameFontNormal") + local labelYellowTeam_DPS = f:CreateFontString (nil, "overlay", "GameFontNormal") + labelPlayerTeam_DPS:SetText ("0") + labelYellowTeam_DPS:SetText ("0") + + local labelPlayerTeam_DPS_Icon = f:CreateTexture (nil, "overlay") + local labelYellowTeam_DPS_Icon = f:CreateTexture (nil, "overlay") + labelPlayerTeam_DPS_Icon:SetTexture ([[Interface\LFGFRAME\UI-LFG-ICON-ROLES]]) + labelYellowTeam_DPS_Icon:SetTexture ([[Interface\LFGFRAME\UI-LFG-ICON-ROLES]]) + labelPlayerTeam_DPS_Icon:SetTexCoord (72/256, 130/256, 69/256, 127/256) + labelYellowTeam_DPS_Icon:SetTexCoord (72/256, 130/256, 69/256, 127/256) + local icon_size = 16 + labelPlayerTeam_DPS_Icon:SetSize (icon_size, icon_size) + labelYellowTeam_DPS_Icon:SetSize (icon_size, icon_size) + + labelPlayerTeam:SetPoint ("left", f, "left", 5, 10) + labelYellowTeam:SetPoint ("right", f, "right", -5, 10) + + labelPlayerTeam_DPS_Icon:SetPoint ("topleft", labelPlayerTeam, "bottomleft", 0, -4) + labelYellowTeam_DPS_Icon:SetPoint ("topleft", labelYellowTeam, "bottomleft", 0, -4) + + labelPlayerTeam_DPS:SetPoint ("left", labelPlayerTeam_DPS_Icon, "right", 4, 0) + labelYellowTeam_DPS:SetPoint ("left", labelYellowTeam_DPS_Icon, "right", 4, 0) + + labelPlayerTeam:SetTextColor (unpack (green_team_color)) + labelYellowTeam:SetTextColor (unpack (yellow_team_color)) + + function f.SwapArenaTeamColors() + if (f.PlayerTeam == 0) then + labelPlayerTeam:SetTextColor (unpack (yellow_team_color)) + labelYellowTeam:SetTextColor (unpack (green_team_color)) + else + labelPlayerTeam:SetTextColor (unpack (green_team_color)) + labelYellowTeam:SetTextColor (unpack (yellow_team_color)) + end + end + + --> labels for mythic dungeon / group party + local labelGroupDamage = f:CreateFontString (nil, "overlay", "GameFontNormal") + labelGroupDamage:SetText ("Group DPS") + DF:SetFontSize (labelGroupDamage, 14) + DF:SetFontOutline (labelGroupDamage, "NONE") + + local labelGroupDamage_DPS = f:CreateFontString (nil, "overlay", "GameFontNormal") + labelGroupDamage_DPS:SetText ("0") + + labelGroupDamage:SetPoint ("center", f, "center", 0, 10) + labelGroupDamage_DPS:SetPoint ("center", labelGroupDamage, "center") + labelGroupDamage_DPS:SetPoint ("top", labelGroupDamage, "bottom", 0, spacing_vertical) + + --[=[ + local labelGroupDamage_DPS_Icon = f:CreateTexture (nil, "overlay") + labelGroupDamage_DPS_Icon:SetTexture ([[Interface\LFGFRAME\UI-LFG-ICON-ROLES]]) + labelGroupDamage_DPS_Icon:SetTexCoord (72/256, 130/256, 69/256, 127/256) + labelGroupDamage_DPS_Icon:SetSize (icon_size, icon_size) + labelGroupDamage_DPS_Icon:SetPoint ("topleft", labelPlayerTeam, "bottomleft", 0, -4) + --]=] + + --> frame update function + + --> update + local time_fraction = 100/1000 --one tick per 100ms + f.NextUpdate = time_fraction --when the next tick occur + f.NextScreenUpdate = _detalhes.current_dps_meter.update_interval --when the labels on the frame receive update + + --> arena + f.PlayerTeamBuffer = {} + f.YellowTeamBuffer = {} + f.PlayerTeamDamage = 0 + f.YellowDamage = 0 + f.LastPlayerTeamDamage = 0 + f.LastYellowDamage = 0 + + --> mythic dungeon / party group + f.GroupBuffer = {} + f.GroupTotalDamage = 0 + f.LastTickGroupDamage = 0 + + --> general + f.SampleSize = _detalhes.current_dps_meter.sample_size + f.MaxBufferIndex = 1 + f.ShowingArena = false + + function _detalhes:UpdateTheRealCurrentDPSFrame (scenario) + --> don't run if the featured hasn't loaded + if (not f) then + return + end + + if (not _detalhes.current_dps_meter.enabled) then + f:Hide() + return + end + + if (not _detalhes.current_dps_meter.arena_enabled and not _detalhes.current_dps_meter.mythic_dungeon_enabled) then + f:Hide() + return + end + + --> where the player are + if (scenario == "arena") then + labelPlayerTeam_DPS:Show() + labelYellowTeam_DPS:Show() + labelPlayerTeam:Show() + labelYellowTeam:Show() + labelPlayerTeam_DPS_Icon:Show() + labelYellowTeam_DPS_Icon:Show() + + --> update arena labels + DF:SetFontColor (labelPlayerTeam_DPS, _detalhes.current_dps_meter.font_color) + DF:SetFontFace (labelPlayerTeam_DPS, _detalhes.current_dps_meter.font_face) + DF:SetFontSize (labelPlayerTeam_DPS, _detalhes.current_dps_meter.font_size) + DF:SetFontOutline (labelPlayerTeam_DPS, _detalhes.current_dps_meter.font_shadow) + + DF:SetFontColor (labelYellowTeam_DPS, _detalhes.current_dps_meter.font_color) + DF:SetFontFace (labelYellowTeam_DPS, _detalhes.current_dps_meter.font_face) + DF:SetFontSize (labelYellowTeam_DPS, _detalhes.current_dps_meter.font_size) + DF:SetFontOutline (labelYellowTeam_DPS, _detalhes.current_dps_meter.font_shadow) + + --> wipe current data for arena + wipe (f.PlayerTeamBuffer) + wipe (f.YellowTeamBuffer) + + --> reset damage + f.PlayerTeamDamage = 0 + f.YellowDamage = 0 + + --> reset last tick damage + f.LastPlayerTeamDamage = 0 + f.LastYellowDamage = 0 + + f:Show() + else + --> isn't arena, hide arena labels + labelPlayerTeam_DPS:Hide() + labelYellowTeam_DPS:Hide() + labelPlayerTeam:Hide() + labelYellowTeam:Hide() + labelPlayerTeam_DPS_Icon:Hide() + labelYellowTeam_DPS_Icon:Hide() + end + + if (scenario == "mythicdungeon") then + labelGroupDamage:Show() + labelGroupDamage_DPS:Show() + + DF:SetFontColor (labelGroupDamage_DPS, _detalhes.current_dps_meter.font_color) + DF:SetFontFace (labelGroupDamage_DPS, _detalhes.current_dps_meter.font_face) + DF:SetFontSize (labelGroupDamage_DPS, _detalhes.current_dps_meter.font_size) + DF:SetFontOutline (labelGroupDamage_DPS, _detalhes.current_dps_meter.font_shadow) + + --> wipe current data for mythic dungeon + f.GroupBuffer = {} + + --> reset damage + f.GroupTotalDamage = 0 + + --> reset last tick damage + f.LastTickGroupDamage = 0 + + f:Show() + else + labelGroupDamage:Hide() + labelGroupDamage_DPS:Hide() + end + + --> frame position + f:SetSize (_detalhes.current_dps_meter.frame.width, _detalhes.current_dps_meter.frame.height) + LibWindow.RegisterConfig (f, _detalhes.current_dps_meter.frame) + LibWindow.RestorePosition (f) + + --> backdrop color + f:SetBackdropColor (unpack (_detalhes.current_dps_meter.frame.backdrop_color)) + + --> set frame size + f:SetSize (_detalhes.current_dps_meter.frame.width, _detalhes.current_dps_meter.frame.height) + + --> frame is locked + if (_detalhes.current_dps_meter.frame.locked) then + f:EnableMouse (false) + else + f:EnableMouse (true) + end + + --> frame can show title + if (_detalhes.current_dps_meter.frame.show_title) then + TitleString:Show() + TitleBackground:Show() + else + TitleString:Hide() + TitleBackground:Hide() + end + + --> frame strata + f:SetFrameStrata (_detalhes.current_dps_meter.frame.strata) + + --> calcule buffer size + f.MaxBufferIndex = f.SampleSize * time_fraction * 100 --sample size in seconds * fraction * tick milliseconds + + --> interval to update the frame + f.NextScreenUpdate = _detalhes.current_dps_meter.update_interval + end + + _detalhes:UpdateTheRealCurrentDPSFrame() + + local on_tick = function (self, deltaTime) + + self.NextUpdate = self.NextUpdate - deltaTime + + if (self.NextUpdate <= 0) then + --> update string + local currentCombat = _detalhes:GetCombat() + local damageContainer = currentCombat:GetContainer (DETAILS_ATTRIBUTE_DAMAGE) + + --> show the current dps during an arena match + if (self.ShowingArena) then + --> the team damage done at this tick + local thisTickPlayerTeamDamage = 0 + local thisTickYellowDamage = 0 + + for i, actor in damageContainer:ListActors() do + --actor.arena_team = actor.arena_team or 0 --debug + if (actor:IsPlayer() and actor.arena_team) then + if (actor.arena_team == 0) then + --green team / player team + thisTickPlayerTeamDamage = thisTickPlayerTeamDamage + actor.total + else + --yellow + thisTickYellowDamage = thisTickYellowDamage + actor.total + end + + if (actor.nome == _detalhes.playername) then + --> if player isn't in green team > swap colors + if (f.PlayerTeam ~= actor.arena_team) then + f.SwapArenaTeamColors() + f.PlayerTeam = actor.arena_team + end + end + end + end + + --> calculate how much damage the team made on this tick + local playerTeamDamageDone = thisTickPlayerTeamDamage - f.LastPlayerTeamDamage + local yellowDamageDone = thisTickYellowDamage - f.LastYellowDamage + + --> add the damage to buffer + tinsert (f.PlayerTeamBuffer, 1, playerTeamDamageDone) + tinsert (f.YellowTeamBuffer, 1, yellowDamageDone) + + --> save the current damage amount + f.LastPlayerTeamDamage = thisTickPlayerTeamDamage + f.LastYellowDamage = thisTickYellowDamage + + --> add the damage to current total damage + f.PlayerTeamDamage = f.PlayerTeamDamage + playerTeamDamageDone + f.YellowDamage = f.YellowDamage + yellowDamageDone + + --> remove player team damage + local removedDamage = tremove (f.PlayerTeamBuffer, f.MaxBufferIndex+1) + if (removedDamage) then + f.PlayerTeamDamage = f.PlayerTeamDamage - removedDamage + --> be save + f.PlayerTeamDamage = max (0, f.PlayerTeamDamage) + end + + --> remove yellow damage + local removedDamage = tremove (f.YellowTeamBuffer, f.MaxBufferIndex+1) + if (removedDamage) then + f.YellowDamage = f.YellowDamage - removedDamage + --> be save + f.YellowDamage = max (0, f.YellowDamage) + end + + self.NextScreenUpdate = self.NextScreenUpdate - time_fraction + if (self.NextScreenUpdate <= 0) then + if (f.PlayerTeam == 0) then + labelPlayerTeam_DPS:SetText (_detalhes:ToK2 (self.PlayerTeamDamage / self.SampleSize)) + labelYellowTeam_DPS:SetText (_detalhes:ToK2 (self.YellowDamage / self.SampleSize)) + else + labelPlayerTeam_DPS:SetText (_detalhes:ToK2 (self.YellowDamage / self.SampleSize)) + labelYellowTeam_DPS:SetText (_detalhes:ToK2 (self.PlayerTeamDamage / self.SampleSize)) + end + f.NextScreenUpdate = _detalhes.current_dps_meter.update_interval + end + + elseif (self.ShowingMythicDungeon) then + + --iniciava um novo combate e tinha o buffer do combate anterior + --então dava o total de dano do combate recente menos o que tinha no buffer do round anterior + + --> the party damage done at this tick + local thisTickGroupDamage = 0 + + for i, actor in damageContainer:ListActors() do + if (actor:IsPlayer() and actor:IsGroupPlayer()) then + thisTickGroupDamage = thisTickGroupDamage + actor.total + end + end + + --> calculate how much damage the team made on this tick + local groupDamageDoneOnThisTick = thisTickGroupDamage - f.LastTickGroupDamage + + --> add the damage to buffer + tinsert (f.GroupBuffer, 1, groupDamageDoneOnThisTick) + + --> save the current damage amount + f.LastTickGroupDamage = thisTickGroupDamage + + --> add the damage to current total damage + f.GroupTotalDamage = f.GroupTotalDamage + groupDamageDoneOnThisTick + + --> cicle buffer removing the last index and subtract its damage + local removedDamage = tremove (f.GroupBuffer, f.MaxBufferIndex+1) + if (removedDamage) then + --> remove the value from the total damage + f.GroupTotalDamage = f.GroupTotalDamage - removedDamage + --> be save + f.GroupTotalDamage = max (0, f.GroupTotalDamage) + end + + self.NextScreenUpdate = self.NextScreenUpdate - time_fraction + if (self.NextScreenUpdate <= 0) then + labelGroupDamage_DPS:SetText (_detalhes:ToK2 (f.GroupTotalDamage / self.SampleSize)) + f.NextScreenUpdate = _detalhes.current_dps_meter.update_interval + end + + end + + --> set next update time + self.NextUpdate = time_fraction + end + end + + f:SetScript ("OnHide", function() + f.ShowingArena = false + f.ShowingMythicDungeon = false + f:SetScript ("OnUpdate", nil) + end) + + function f:StartForArenaMatch() + if (not f.ShowingArena) then + _detalhes:UpdateTheRealCurrentDPSFrame ("arena") + f.ShowingArena = true + f:SetScript ("OnUpdate", on_tick) + end + end + + function f:StartForMythicDungeon() + if (not f.ShowingMythicDungeon) then + _detalhes:UpdateTheRealCurrentDPSFrame ("mythicdungeon") + f.ShowingMythicDungeon = true + f:SetScript ("OnUpdate", on_tick) + end + end + + local eventListener = _detalhes:CreateEventListener() + + function eventListener:ArenaStarted() + if (_detalhes.current_dps_meter.arena_enabled) then + f:StartForArenaMatch() + end + end + + function eventListener:MythicDungeonStarted() + if (_detalhes.current_dps_meter.mythic_dungeon_enabled) then + f:StartForMythicDungeon() + end + end + + function eventListener:ArenaEnded() + f:Hide() + end + + function eventListener:MythicDungeonEnded() + f:Hide() + end + + function eventListener:ResetBuffer() + if (f:IsShown()) then + wipe (f.PlayerTeamBuffer) + wipe (f.YellowTeamBuffer) + wipe (f.GroupBuffer) + f.GroupTotalDamage = 0 + f.PlayerTeamDamage = 0 + f.YellowDamage = 0 + f.LastTickGroupDamage = 0 + f.LastPlayerTeamDamage = 0 + f.LastYellowDamage = 0 + end + end + + eventListener:RegisterEvent ("COMBAT_ARENA_START", "ArenaStarted") + eventListener:RegisterEvent ("COMBAT_ARENA_END", "ArenaEnded") + eventListener:RegisterEvent ("COMBAT_MYTHICDUNGEON_START", "MythicDungeonStarted") + eventListener:RegisterEvent ("COMBAT_MYTHICDUNGEON_END", "MythicDungeonEnded") + eventListener:RegisterEvent ("COMBAT_PLAYER_ENTER", "ResetBuffer") + + _detalhes.Broadcaster_CurrentDpsLoaded = true + _detalhes.Broadcaster_CurrentDpsFrame = f + f:Hide() +end + +local CreateEventTrackerFrame = function (parent, name) + + local DF = _detalhes.gump + local SharedMedia = LibStub:GetLibrary ("LibSharedMedia-3.0") + + --> main farame + local f = CreateFrame ("frame", name, parent or UIParent) + f:SetPoint ("center", UIParent, "center") + f:SetMinResize (150, 40) + f:SetMaxResize (800, 1024) + f:SetSize (_detalhes.event_tracker.frame.width, _detalhes.event_tracker.frame.height) + + f:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tile = true, tileSize = 16, insets = {left = 0, right = 0, top = 0, bottom = 0}}) + f:SetBackdropColor (unpack (_detalhes.event_tracker.frame.backdrop_color)) + f:EnableMouse (true) + f:SetMovable (true) + f:SetResizable (true) + f:SetClampedToScreen (true) + + local LibWindow = LibStub ("LibWindow-1.1") + LibWindow.RegisterConfig (f, _detalhes.event_tracker.frame) + LibWindow.MakeDraggable (f) + LibWindow.RestorePosition (f) + + --> two resizers + + local left_resize, right_resize = DF:CreateResizeGrips (f) + + left_resize:SetScript ("OnMouseDown", function (self) + if (not f.resizing and not _detalhes.event_tracker.frame.locked) then + f.resizing = true + f:StartSizing ("bottomleft") + end + end) + left_resize:SetScript ("OnMouseUp", function (self) + if (f.resizing) then + f.resizing = false + f:StopMovingOrSizing() + _detalhes.event_tracker.frame.width = f:GetWidth() + _detalhes.event_tracker.frame.height = f:GetHeight() + end + end) + right_resize:SetScript ("OnMouseDown", function (self) + if (not f.resizing and not _detalhes.event_tracker.frame.locked) then + f.resizing = true + f:StartSizing ("bottomright") + end + end) + right_resize:SetScript ("OnMouseUp", function (self) + if (f.resizing) then + f.resizing = false + f:StopMovingOrSizing() + _detalhes.event_tracker.frame.width = f:GetWidth() + _detalhes.event_tracker.frame.height = f:GetHeight() + end + end) + + f:SetScript ("OnSizeChanged", function (self) + + end) + + --> scroll frame + + --> frame config + + local scroll_line_amount = 1 + local scroll_width = 195 + local header_size = 20 + + --> on tick script + local lineOnTick = function (self, deltaTime) + --> when this event occured on combat log + local gameTime = self.GameTime + + --> calculate how much time elapsed since the event got triggered + local elapsedTime = GetTime() - gameTime + + --> set the bar animation: + local animationPercent = min (elapsedTime, 1) + self.Statusbar:SetValue (animationPercent) + + --> set the spark location + if (animationPercent < 1) then + self.Spark:SetPoint ("left", self, "left", (self:GetWidth() * animationPercent) - 10, 0) + if (not self.Spark:IsShown()) then + self.Spark:Show() + end + else + if (self.Spark:IsShown()) then + self.Spark:Hide() + end + end + end + + --> create a line on the scroll frame + local scroll_createline = function (self, index) + + local line = CreateFrame ("frame", "$parentLine" .. index, self) + line:EnableMouse (false) + line.Index = index --> hack to not trigger error on UpdateWorldTrackerLines since Index is set after this function is ran + + --> set its backdrop + line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tile = true, tileSize = 16, insets = {left = 0, right = 0, top = 0, bottom = 0}}) + line:SetBackdropColor (1, 1, 1, 0.75) + + --> statusbar + local statusbar = CreateFrame ("statusbar", "$parentStatusBar", line) + statusbar:SetAllPoints() + local statusbartexture = statusbar:CreateTexture (nil, "border") + statusbar:SetStatusBarTexture (statusbartexture) + statusbar:SetMinMaxValues (0, 1) + statusbar:SetValue (0) + + local statusbarspark = statusbar:CreateTexture (nil, "artwork") + statusbarspark:SetTexture ([[Interface\CastingBar\UI-CastingBar-Spark]]) + statusbarspark:SetSize (16, 30) + statusbarspark:SetBlendMode ("ADD") + statusbarspark:Hide() + + --> create the icon textures and texts - they are all statusbar childs + local lefticon = statusbar:CreateTexture ("$parentLeftIcon", "overlay") + lefticon:SetPoint ("left", line, "left", 0, 0) + + local righticon = statusbar:CreateTexture ("$parentRightIcon", "overlay") + righticon:SetPoint ("right", line, "right", 0, 0) + + local lefttext = statusbar:CreateFontString ("$parentLeftText", "overlay", "GameFontNormal") + DF:SetFontSize (lefttext, 9) + lefttext:SetPoint ("left", lefticon, "right", 2, 0) + + local righttext = statusbar:CreateFontString ("$parentRightText", "overlay", "GameFontNormal") + DF:SetFontSize (righttext, 9) + righttext:SetPoint ("right", righticon, "left", -2, 0) + + lefttext:SetJustifyH ("left") + righttext:SetJustifyH ("right") + + local actionicon = statusbar:CreateTexture ("$parentRightIcon", "overlay") + actionicon:SetPoint ("center", line, "center") + + --> set members + line.LeftIcon = lefticon + line.RightIcon = righticon + line.LeftText = lefttext + line.RightText = righttext + line.Statusbar = statusbar + line.StatusbarTexture = statusbartexture + line.Spark = statusbarspark + line.ActionIcon = actionicon + + --> set some parameters + _detalhes:UpdateWorldTrackerLines (line) + + --> set scripts + line:SetScript ("OnUpdate", lineOnTick) + + return line + end + + --> some consts to help work with indexes + local SPELLTYPE_COOLDOWN = "cooldown" + local SPELLTYPE_INTERRUPT = "interrupt" + local SPELLTYPE_OFFENSIVE = "offensive" + local SPELLTYPE_CROWDCONTROL = "crowdcontrol" + + local ABILITYTABLE_SPELLTYPE = 1 + local ABILITYTABLE_SPELLID = 2 + local ABILITYTABLE_CASTERNAME = 3 + local ABILITYTABLE_TARGETNAME = 4 + local ABILITYTABLE_TIME = 5 + local ABILITYTABLE_EXTRASPELLID = 6 + local ABILITYTABLE_GAMETIME = 7 + local ABILITYTABLE_CASTERSERIAL = 8 + local ABILITYTABLE_ISENEMY = 9 + local ABILITYTABLE_TARGETSERIAL = 10 + + local get_spec_or_class = function (serial, name) + local class + local spec = _detalhes.cached_specs [serial] + if (not spec) then + local _, engClass = UnitClass (name) + if (engClass) then + class = engClass + else + local locClass, engClass, locRace, engRace, gender = GetPlayerInfoByGUID (serial) + if (engClass) then + class = engClass + end + end + end + + return spec, class + end + + local get_player_icon = function (spec, class) + if (spec) then + return [[Interface\AddOns\Details\images\spec_icons_normal]], unpack (_detalhes.class_specs_coords [spec]) + elseif (class) then + return [[Interface\AddOns\Details\images\classes_small]], unpack (_detalhes.class_coords [class]) + else + return [[Interface\AddOns\Details\images\classes_plus]], 0.50390625, 0.62890625, 0, 0.125 + end + end + + local add_role_and_class_color = function (player_name, player_serial) + + --> get the actor object + local actor = _detalhes.tabela_vigente[1]:GetActor (player_name) + + if (actor) then + --> remove realm name + player_name = _detalhes:GetOnlyName (player_name) + + local class, spec, role = actor.classe, actor.spec, actor.role + if (not class) then + spec, class = get_spec_or_class (player_serial, player_name) + end + + --> add the class color + if (_detalhes.player_class [class]) then + --> is a player, add the class color + player_name = _detalhes:AddColorString (player_name, class) + end + + --add the role icon + if (role ~= "NONE") then + --> have a role + player_name = _detalhes:AddRoleIcon (player_name, role, _detalhes.event_tracker.line_height) + end + + else + local spec, class = get_spec_or_class (player_serial, player_name) + player_name = _detalhes:GetOnlyName (player_name) + + if (class) then + --> add the class color + if (_detalhes.player_class [class]) then + --> is a player, add the class color + player_name = _detalhes:AddColorString (player_name, class) + end + end + end + + return player_name + end + + local get_text_size = function() + local iconsSpace = _detalhes.event_tracker.line_height * 3 + local textSpace = 4 + local saveSpace = 14 + + local availableSpace = (f:GetWidth() - iconsSpace - textSpace - saveSpace) / 2 + + return availableSpace + end + + local shrink_string = function (fontstring, size) + local text = fontstring:GetText() + local loops = 20 + while (fontstring:GetStringWidth() > size and loops > 0) do + text = strsub (text, 1, #text-1) + fontstring:SetText (text) + loops = loops - 1 + end + + return fontstring + end + + --refresh the scroll frame + local scroll_refresh = function (self, data, offset, total_lines) + + local textSize = get_text_size() + + for i = 1, total_lines do + local index = i + offset + local ability = data [index] + + if (ability) then + local line = self:GetLine (i) + + local spec, class = get_spec_or_class (ability [ABILITYTABLE_CASTERSERIAL], ability [ABILITYTABLE_CASTERNAME]) + local texture, L, R, T, B = get_player_icon (spec, class) + line.LeftIcon:SetTexture (texture) + line.LeftIcon:SetTexCoord (L, R, T, B) + line.LeftText:SetText (_detalhes:GetOnlyName (ability [ABILITYTABLE_CASTERNAME])) + + if (ability [ABILITYTABLE_ISENEMY]) then + line:SetBackdropColor (1, .3, .3, 0.75) + else + line:SetBackdropColor (1, 1, 1, 0.75) + end + + if (ability [ABILITYTABLE_SPELLTYPE] == SPELLTYPE_COOLDOWN) then + local spellName, _, spellIcon = GetSpellInfo (ability [ABILITYTABLE_SPELLID]) + line.RightIcon:SetTexture (spellIcon) + line.RightIcon:SetTexCoord (.06, .94, .06, .94) + + local targetName = ability [ABILITYTABLE_TARGETNAME] + if (targetName) then + local targetSerial = ability [ABILITYTABLE_TARGETSERIAL] + targetName = add_role_and_class_color (targetName, targetSerial) + end + + line.RightText:SetText (targetName or spellName) + + line.ActionIcon:SetTexture ([[Interface\AddOns\Details\images\event_tracker_icons]]) + line.ActionIcon:SetTexCoord (0, 0.125, 0, 1) + + elseif (ability [ABILITYTABLE_SPELLTYPE] == SPELLTYPE_OFFENSIVE) then + local spellName, _, spellIcon = GetSpellInfo (ability [ABILITYTABLE_SPELLID]) + line.RightIcon:SetTexture (spellIcon) + line.RightIcon:SetTexCoord (.06, .94, .06, .94) + line.RightText:SetText (spellName) + + line.ActionIcon:SetTexture ([[Interface\AddOns\Details\images\event_tracker_icons]]) + line.ActionIcon:SetTexCoord (0.127, 0.25, 0, 1) + + elseif (ability [ABILITYTABLE_SPELLTYPE] == SPELLTYPE_INTERRUPT) then + local spellNameInterrupted, _, spellIconInterrupted = GetSpellInfo (ability [ABILITYTABLE_EXTRASPELLID]) + line.RightIcon:SetTexture (spellIconInterrupted) + line.RightIcon:SetTexCoord (.06, .94, .06, .94) + line.RightText:SetText (spellNameInterrupted) + + line.ActionIcon:SetTexture ([[Interface\AddOns\Details\images\event_tracker_icons]]) + line.ActionIcon:SetTexCoord (0.251, 0.375, 0, 1) + + elseif (ability [ABILITYTABLE_SPELLTYPE] == SPELLTYPE_CROWDCONTROL) then + local spellName, _, spellIcon = GetSpellInfo (ability [ABILITYTABLE_SPELLID]) + line.RightIcon:SetTexture (spellIcon) + line.RightIcon:SetTexCoord (.06, .94, .06, .94) + + local targetName = ability [ABILITYTABLE_TARGETNAME] + if (targetName) then + local targetSerial = ability [ABILITYTABLE_TARGETSERIAL] + targetName = add_role_and_class_color (targetName, targetSerial) + end + + line.RightText:SetText (targetName or "unknown target") + + line.ActionIcon:SetTexture ([[Interface\AddOns\Details\images\event_tracker_icons]]) + line.ActionIcon:SetTexCoord (0.376, 0.5, 0, 1) + + end + + shrink_string (line.LeftText, textSize) + shrink_string (line.RightText, textSize) + + --> set when the ability was registered on combat log + line.GameTime = ability [ABILITYTABLE_GAMETIME] + line:Show() + end + end + end + + --title text + local TitleString = f:CreateFontString (nil, "overlay", "GameFontNormal") + TitleString:SetPoint ("top", f, "top", 0, -3) + TitleString:SetText ("Details!: Event Tracker") + local TitleBackground = f:CreateTexture (nil, "artwork") + TitleBackground:SetTexture ([[Interface\Tooltips\UI-Tooltip-Background]]) + TitleBackground:SetVertexColor (.1, .1, .1, .9) + TitleBackground:SetPoint ("topleft", f, "topleft") + TitleBackground:SetPoint ("topright", f, "topright") + TitleBackground:SetHeight (header_size) + + --> table with spells showing on the scroll frame + local CurrentShowing = {} + + --> scrollframe + local scrollframe = DF:CreateScrollBox (f, "$parentScrollFrame", scroll_refresh, CurrentShowing, scroll_width, 400, scroll_line_amount, _detalhes.event_tracker.line_height, scroll_createline, true, true) + scrollframe:SetPoint ("topleft", f, "topleft", 0, -header_size) + scrollframe:SetPoint ("topright", f, "topright", 0, -header_size) + scrollframe:SetPoint ("bottomleft", f, "bottomleft", 0, 0) + scrollframe:SetPoint ("bottomright", f, "bottomright", 0, 0) + + --> update line - used by 'UpdateWorldTrackerLines' function + local update_line = function (line) + + --> get the line index + local index = line.Index + + --> update left text + DF:SetFontColor (line.LeftText, _detalhes.event_tracker.font_color) + DF:SetFontFace (line.LeftText, _detalhes.event_tracker.font_face) + DF:SetFontSize (line.LeftText, _detalhes.event_tracker.font_size) + DF:SetFontOutline (line.LeftText, _detalhes.event_tracker.font_shadow) + + --> update right text + DF:SetFontColor (line.RightText, _detalhes.event_tracker.font_color) + DF:SetFontFace (line.RightText, _detalhes.event_tracker.font_face) + DF:SetFontSize (line.RightText, _detalhes.event_tracker.font_size) + DF:SetFontOutline (line.RightText, _detalhes.event_tracker.font_shadow) + + --> adjust where the line is anchored + line:SetPoint ("topleft", line:GetParent(), "topleft", 0, -((index-1)*(_detalhes.event_tracker.line_height+1))) + line:SetPoint ("topright", line:GetParent(), "topright", 0, -((index-1)*(_detalhes.event_tracker.line_height+1))) + + --> set its height + line:SetHeight (_detalhes.event_tracker.line_height) + + --> set texture + local texture = SharedMedia:Fetch ("statusbar", _detalhes.event_tracker.line_texture) + line.StatusbarTexture:SetTexture (texture) + line.StatusbarTexture:SetVertexColor (unpack (_detalhes.event_tracker.line_color)) + + --> set icon size + line.LeftIcon:SetSize (_detalhes.event_tracker.line_height, _detalhes.event_tracker.line_height) + line.RightIcon:SetSize (_detalhes.event_tracker.line_height, _detalhes.event_tracker.line_height) + line.ActionIcon:SetSize (_detalhes.event_tracker.line_height-4, _detalhes.event_tracker.line_height-4) + line.ActionIcon:SetAlpha (0.65) + end + + -- /run _detalhes.event_tracker.font_shadow = 24 + -- /run _detalhes:UpdateWorldTrackerLines() + + function _detalhes:UpdateWorldTrackerLines (line) + --> don't run if the featured hasn't loaded + if (not f) then + return + end + + if (line) then + update_line (line) + else + --> update all lines + for index, line in ipairs (scrollframe:GetFrames()) do + update_line (line) + end + scrollframe:SetFramesHeight (_detalhes.event_tracker.line_height) + scrollframe:Refresh() + end + end + + function _detalhes:UpdateEventTrackerFrame() + --> don't run if the featured hasn't loaded + if (not f) then + return + end + + f:SetSize (_detalhes.event_tracker.frame.width, _detalhes.event_tracker.frame.height) + LibWindow.RegisterConfig (f, _detalhes.event_tracker.frame) + LibWindow.RestorePosition (f) + scrollframe:OnSizeChanged() + + if (_detalhes.event_tracker.frame.locked) then + f:EnableMouse (false) + left_resize:Hide() + right_resize:Hide() + else + f:EnableMouse (true) + left_resize:Show() + right_resize:Show() + end + + if (_detalhes.event_tracker.frame.show_title) then + TitleString:Show() + TitleBackground:Show() + scrollframe:SetPoint ("topleft", f, "topleft", 0, -header_size) + scrollframe:SetPoint ("topright", f, "topright", 0, -header_size) + else + TitleString:Hide() + TitleBackground:Hide() + scrollframe:SetPoint ("topleft", f, "topleft", 0, 0) + scrollframe:SetPoint ("topright", f, "topright", 0, 0) + end + + f:SetBackdropColor (unpack (_detalhes.event_tracker.frame.backdrop_color)) + f:SetFrameStrata (_detalhes.event_tracker.frame.strata) + + _detalhes:UpdateWorldTrackerLines() + scrollframe:Refresh() + end + + --create the first line + for i = 1, 1 do + scrollframe:CreateLine (scroll_createline) + end + f.scrollframe = scrollframe + scrollframe:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16}) + scrollframe:SetBackdropColor (0, 0, 0, 0) + + --> get tables used inside the combat parser + local cooldownList1 = _detalhes.DefensiveCooldownSpellsNoBuff + local cooldownList2 = _detalhes.DefensiveCooldownSpells + + local attackCooldownsList1 = _detalhes.AttackCooldownSpells + + local crowdControlList1 = _detalhes.CrowdControlSpells + + --> remove thise spells on shipping + --cooldownList1 [194679] = {60, 10} + --cooldownList1 [221699] = {60, 10} + + local combatLog = CreateFrame ("frame") + combatLog:RegisterEvent ("COMBAT_LOG_EVENT_UNFILTERED") + local OBJECT_TYPE_PLAYER = 0x00000400 + local OBJECT_TYPE_ENEMY = 0x00000040 + + --> combat parser + local is_player = function (flag) + return bit.band (flag, OBJECT_TYPE_PLAYER) ~= 0 + end + local is_enemy = function (flag) + return bit.band (flag, OBJECT_TYPE_ENEMY) ~= 0 + end + combatLog:SetScript ("OnEvent", function (self, event, time, token, hidding, caster_serial, caster_name, caster_flags, caster_flags2, target_serial, target_name, target_flags, target_flags2, spellid, spellname, spelltype, extraSpellID, extraSpellName, extraSchool) + + local added = false + + --> defensive cooldown + if (token == "SPELL_CAST_SUCCESS" and (cooldownList1 [spellid] or cooldownList2 [spellid]) and is_player (caster_flags)) then + tinsert (CurrentShowing, 1, {SPELLTYPE_COOLDOWN, spellid, caster_name, target_name, time, false, GetTime(), caster_serial, is_enemy (caster_flags), target_serial}) + added = true + + --> offensive cooldown + elseif (token == "SPELL_CAST_SUCCESS" and (attackCooldownsList1 [spellid]) and is_player (caster_flags)) then + tinsert (CurrentShowing, 1, {SPELLTYPE_OFFENSIVE, spellid, caster_name, target_name, time, false, GetTime(), caster_serial, is_enemy (caster_flags), target_serial}) + added = true + + --> crowd control + elseif (token == "SPELL_AURA_APPLIED" and (crowdControlList1 [spellid])) then + tinsert (CurrentShowing, 1, {SPELLTYPE_CROWDCONTROL, spellid, caster_name, target_name, time, false, GetTime(), caster_serial, is_enemy (caster_flags), target_serial}) + added = true + + --> spell interrupt + elseif (token == "SPELL_INTERRUPT") then + tinsert (CurrentShowing, 1, {SPELLTYPE_INTERRUPT, spellid, caster_name, target_name, time, extraSpellID, GetTime(), caster_serial, is_enemy (caster_flags), target_serial}) + added = true + + end + + if (added) then + local amountOfLines = scrollframe:GetNumFramesShown() + local amountToShow = #CurrentShowing + + if (amountToShow > amountOfLines) then + tremove (CurrentShowing, amountToShow) + end + scrollframe:Refresh() + end + + end) + + _detalhes.Broadcaster_EventTrackerLoaded = true + _detalhes.Broadcaster_EventTrackerFrame = f + f:Hide() + +end + +function Details:LoadFramesForBroadcastTools() + --> event tracker + --> if enabled and not loaded, load it + if (_detalhes.event_tracker.enabled and not _detalhes.Broadcaster_EventTrackerLoaded) then + CreateEventTrackerFrame (UIParent, "DetailsEventTracker") + end + + --> if enabled and loaded, refresh and show + if (_detalhes.event_tracker.enabled and _detalhes.Broadcaster_EventTrackerLoaded) then + _detalhes:UpdateEventTrackerFrame() + DetailsEventTracker:Show() + end + + --> if not enabled but loaded, hide it + if (not _detalhes.event_tracker.enabled and _detalhes.Broadcaster_EventTrackerLoaded) then + DetailsEventTracker:Hide() + end + + --> current dps + local bIsEnabled = _detalhes.current_dps_meter.enabled and (_detalhes.current_dps_meter.arena_enabled or _detalhes.current_dps_meter.mythic_dungeon_enabled) + + --> if enabled and not loaded, load it + if (bIsEnabled and not _detalhes.Broadcaster_CurrentDpsLoaded) then + CreateCurrentDpsFrame (UIParent, "DetailsCurrentDpsMeter") + end + + --> if enabled, check if can show + if (bIsEnabled and _detalhes.Broadcaster_CurrentDpsLoaded) then + if (_detalhes.current_dps_meter.mythic_dungeon_enabled) then + local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo() + if (difficultyID == 8) then + --> player is inside a mythic dungeon + DetailsCurrentDpsMeter:StartForMythicDungeon() + end + end + + if (_detalhes.current_dps_meter.arena_enabled) then + local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo() + if (instanceType == "arena") then + --> player is inside an arena + DetailsCurrentDpsMeter:StartForArenaMatch() + end + end + end + + --> if not enabled but loaded, hide it + if (not bIsEnabled and _detalhes.Broadcaster_CurrentDpsLoaded) then + DetailsCurrentDpsMeter:Hide() + end + +end + +function Details:OpenCurrentRealDPSOptions (from_options_panel) + + if (not DetailsCurrentRealDPSOptions) then + + local DF = _detalhes.gump + + local f = DF:CreateSimplePanel (UIParent, 700, 400, "Details! The Current Real DPS Options", "DetailsCurrentRealDPSOptions") + f:SetPoint ("center", UIParent, "center") + f:SetScript ("OnMouseDown", nil) + f:SetScript ("OnMouseUp", nil) + local LibWindow = LibStub ("LibWindow-1.1") + LibWindow.RegisterConfig (f, _detalhes.current_dps_meter.options_frame) + LibWindow.MakeDraggable (f) + LibWindow.RestorePosition (f) + + local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE") + local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE") + local options_switch_template = DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE") + local options_slider_template = DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE") + local options_button_template = DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE") + + local testUsing = "arena" --mythicdungeon + + --> frame strata options + local set_frame_strata = function (_, _, strata) + Details.current_dps_meter.frame.strata = strata + Details:UpdateTheRealCurrentDPSFrame (testUsing) + end + local strataTable = {} + strataTable [1] = {value = "BACKGROUND", label = "BACKGROUND", onclick = set_frame_strata} + strataTable [2] = {value = "LOW", label = "LOW", onclick = set_frame_strata} + strataTable [3] = {value = "MEDIUM", label = "MEDIUM", onclick = set_frame_strata} + strataTable [4] = {value = "HIGH", label = "HIGH", onclick = set_frame_strata} + strataTable [5] = {value = "DIALOG", label = "DIALOG", onclick = set_frame_strata} + + --> font options + local set_font_shadow= function (_, _, shadow) + Details.current_dps_meter.font_shadow = shadow + Details:UpdateTheRealCurrentDPSFrame (testUsing) + end + local fontShadowTable = {} + fontShadowTable [1] = {value = "NONE", label = "None", onclick = set_font_shadow} + fontShadowTable [2] = {value = "OUTLINE", label = "Outline", onclick = set_font_shadow} + fontShadowTable [3] = {value = "THICKOUTLINE", label = "Thick Outline", onclick = set_font_shadow} + + local on_select_text_font = function (self, fixed_value, value) + Details.current_dps_meter.font_face = value + Details:UpdateTheRealCurrentDPSFrame (testUsing) + end + + --> options table + local options = { + + {type = "label", get = function() return "Frame Settings:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, + --enabled + { + type = "toggle", + get = function() return Details.current_dps_meter.enabled end, + set = function (self, fixedparam, value) + Details.current_dps_meter.enabled = not Details.current_dps_meter.enabled + Details:LoadFramesForBroadcastTools() + end, + desc = "Enabled", + name = "Enabled", + text_template = options_text_template, + }, + --locked + { + type = "toggle", + get = function() return Details.current_dps_meter.frame.locked end, + set = function (self, fixedparam, value) + Details.current_dps_meter.frame.locked = not Details.current_dps_meter.frame.locked + Details:UpdateTheRealCurrentDPSFrame (testUsing) + end, + desc = "Locked", + name = "Locked", + text_template = options_text_template, + }, + --showtitle + { + type = "toggle", + get = function() return Details.current_dps_meter.frame.show_title end, + set = function (self, fixedparam, value) + Details.current_dps_meter.frame.show_title = not Details.current_dps_meter.frame.show_title + Details:UpdateTheRealCurrentDPSFrame (testUsing) + end, + desc = "Show Title", + name = "Show Title", + text_template = options_text_template, + }, + --backdrop color + { + type = "color", + get = function() + return {Details.current_dps_meter.frame.backdrop_color[1], Details.current_dps_meter.frame.backdrop_color[2], Details.current_dps_meter.frame.backdrop_color[3], Details.current_dps_meter.frame.backdrop_color[4]} + end, + set = function (self, r, g, b, a) + local color = Details.current_dps_meter.frame.backdrop_color + color[1], color[2], color[3], color[4] = r, g, b, a + Details:UpdateTheRealCurrentDPSFrame (testUsing) + end, + desc = "Backdrop Color", + name = "Backdrop Color", + text_template = options_text_template, + }, + --statra + { + type = "select", + get = function() return Details.current_dps_meter.frame.strata end, + values = function() return strataTable end, + name = "Frame Strata" + }, + --width + { + type = "range", + get = function() return Details.current_dps_meter.frame.width end, + set = function (self, fixedparam, value) + Details.current_dps_meter.frame.width = value + Details:UpdateTheRealCurrentDPSFrame (testUsing) + end, + min = 1, + max = 300, + step = 1, + name = "Width", + text_template = options_text_template, + }, + --height + { + type = "range", + get = function() return Details.current_dps_meter.frame.height end, + set = function (self, fixedparam, value) + Details.current_dps_meter.frame.height = value + Details:UpdateTheRealCurrentDPSFrame (testUsing) + end, + min = 1, + max = 300, + step = 1, + name = "Height", + text_template = options_text_template, + }, + + {type = "breakline"}, + {type = "label", get = function() return "Enabled On:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, + --arenas + { + type = "toggle", + get = function() return Details.current_dps_meter.arena_enabled end, + set = function (self, fixedparam, value) + Details.current_dps_meter.arena_enabled = not Details.current_dps_meter.arena_enabled + Details:LoadFramesForBroadcastTools() + end, + name = "Arena Matches", + text_template = options_text_template, + }, + --mythic dungeon + { + type = "toggle", + get = function() return Details.current_dps_meter.mythic_dungeon_enabled end, + set = function (self, fixedparam, value) + Details.current_dps_meter.mythic_dungeon_enabled = not Details.current_dps_meter.mythic_dungeon_enabled + Details:LoadFramesForBroadcastTools() + end, + name = "Mythic Dungeons", + text_template = options_text_template, + }, + + {type = "breakline"}, + {type = "label", get = function() return "Text Settings:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, + --font size + { + type = "range", + get = function() return Details.current_dps_meter.font_size end, + set = function (self, fixedparam, value) + Details.current_dps_meter.font_size = value + Details:UpdateTheRealCurrentDPSFrame (testUsing) + end, + min = 4, + max = 32, + step = 1, + name = "Font Size", + text_template = options_text_template, + }, + --font color + { + type = "color", + get = function() + return {Details.current_dps_meter.font_color[1], Details.current_dps_meter.font_color[2], Details.current_dps_meter.font_color[3], Details.current_dps_meter.font_color[4]} + end, + set = function (self, r, g, b, a) + local color = Details.current_dps_meter.font_color + color[1], color[2], color[3], color[4] = r, g, b, a + Details:UpdateTheRealCurrentDPSFrame (testUsing) + end, + desc = "Font Color", + name = "Font Color", + text_template = options_text_template, + }, + --font shadow + { + type = "select", + get = function() return Details.current_dps_meter.font_shadow end, + values = function() return fontShadowTable end, + name = "Font Shadow" + }, + --font face + { + type = "select", + get = function() return Details.current_dps_meter.font_face end, + values = function() return DF:BuildDropDownFontList (on_select_text_font) end, + name = "Font Face", + text_template = options_text_template, + }, + + + } + + DF:BuildMenu (f, options, 7, -30, 500, true, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template) + + f:SetScript ("OnHide" , function() + if (DetailsCurrentDpsMeter) then + --> check if can hide the main frame as well + --> we force show the main frame for the user see the frame while editing the options + local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo() + if ((instanceType ~= "party" and difficultyID ~= 8) and instanceType ~= "arena") then + DetailsCurrentDpsMeter:Hide() + end + end + + --> reopen the options panel + if (f.FromOptionsPanel) then + C_Timer.After (0.2, function() + Details:OpenOptionsWindow(Details:GetInstance(1)) + end) + end + end) + + end + + --> check if the frame was been created + if (not DetailsCurrentDpsMeter) then + CreateCurrentDpsFrame (UIParent, "DetailsCurrentDpsMeter") + end + + --> show the options + DetailsCurrentRealDPSOptions:Show() + DetailsCurrentRealDPSOptions:RefreshOptions() + DetailsCurrentRealDPSOptions.FromOptionsPanel = from_options_panel + + --> start the frame for viewing while editing the options + DetailsCurrentDpsMeter:StartForArenaMatch() + +end + +function Details:OpenEventTrackerOptions (from_options_panel) + + if (not DetailsEventTrackerOptions) then + + local DF = _detalhes.gump + + local f = DF:CreateSimplePanel (UIParent, 700, 400, "Details! Event Tracker Options", "DetailsEventTrackerOptions") + f:SetPoint ("center", UIParent, "center") + f:SetScript ("OnMouseDown", nil) + f:SetScript ("OnMouseUp", nil) + local LibWindow = LibStub ("LibWindow-1.1") + LibWindow.RegisterConfig (f, _detalhes.event_tracker.options_frame) + LibWindow.MakeDraggable (f) + LibWindow.RestorePosition (f) + + local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE") + local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE") + local options_switch_template = DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE") + local options_slider_template = DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE") + local options_button_template = DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE") + + --> frame strata options + local set_frame_strata = function (_, _, strata) + Details.event_tracker.frame.strata = strata + Details:UpdateEventTrackerFrame() + end + local strataTable = {} + strataTable [1] = {value = "BACKGROUND", label = "BACKGROUND", onclick = set_frame_strata} + strataTable [2] = {value = "LOW", label = "LOW", onclick = set_frame_strata} + strataTable [3] = {value = "MEDIUM", label = "MEDIUM", onclick = set_frame_strata} + strataTable [4] = {value = "HIGH", label = "HIGH", onclick = set_frame_strata} + strataTable [5] = {value = "DIALOG", label = "DIALOG", onclick = set_frame_strata} + + --> font options + local set_font_shadow= function (_, _, shadow) + Details.event_tracker.font_shadow = shadow + Details:UpdateEventTrackerFrame() + end + local fontShadowTable = {} + fontShadowTable [1] = {value = "NONE", label = "None", onclick = set_font_shadow} + fontShadowTable [2] = {value = "OUTLINE", label = "Outline", onclick = set_font_shadow} + fontShadowTable [3] = {value = "THICKOUTLINE", label = "Thick Outline", onclick = set_font_shadow} + + local on_select_text_font = function (self, fixed_value, value) + Details.event_tracker.font_face = value + Details:UpdateEventTrackerFrame() + end + + --> texture options + local set_bar_texture = function (_, _, value) + Details.event_tracker.line_texture = value + Details:UpdateEventTrackerFrame() + end + + local SharedMedia = LibStub:GetLibrary ("LibSharedMedia-3.0") + local textures = SharedMedia:HashTable ("statusbar") + local texTable = {} + for name, texturePath in pairs (textures) do + texTable [#texTable + 1] = {value = name, label = name, statusbar = texturePath, onclick = set_bar_texture} + end + table.sort (texTable, function (t1, t2) return t1.label < t2.label end) + + --> options table + local options = { + + {type = "label", get = function() return "Frame Settings:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, + --enabled + { + type = "toggle", + get = function() return Details.event_tracker.enabled end, + set = function (self, fixedparam, value) + Details.event_tracker.enabled = not Details.event_tracker.enabled + Details:LoadFramesForBroadcastTools() + end, + desc = "Enabled", + name = "Enabled", + text_template = options_text_template, + }, + --locked + { + type = "toggle", + get = function() return Details.event_tracker.frame.locked end, + set = function (self, fixedparam, value) + Details.event_tracker.frame.locked = not Details.event_tracker.frame.locked + Details:UpdateEventTrackerFrame() + end, + desc = "Locked", + name = "Locked", + text_template = options_text_template, + }, + --showtitle + { + type = "toggle", + get = function() return Details.event_tracker.frame.show_title end, + set = function (self, fixedparam, value) + Details.event_tracker.frame.show_title = not Details.event_tracker.frame.show_title + Details:UpdateEventTrackerFrame() + end, + desc = "Show Title", + name = "Show Title", + text_template = options_text_template, + }, + --backdrop color + { + type = "color", + get = function() + return {Details.event_tracker.frame.backdrop_color[1], Details.event_tracker.frame.backdrop_color[2], Details.event_tracker.frame.backdrop_color[3], Details.event_tracker.frame.backdrop_color[4]} + end, + set = function (self, r, g, b, a) + local color = Details.event_tracker.frame.backdrop_color + color[1], color[2], color[3], color[4] = r, g, b, a + Details:UpdateEventTrackerFrame() + end, + desc = "Backdrop Color", + name = "Backdrop Color", + text_template = options_text_template, + }, + --statra + { + type = "select", + get = function() return Details.event_tracker.frame.strata end, + values = function() return strataTable end, + name = "Frame Strata" + }, + {type = "breakline"}, + {type = "label", get = function() return "Line Settings:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, + --line height + { + type = "range", + get = function() return Details.event_tracker.line_height end, + set = function (self, fixedparam, value) + Details.event_tracker.line_height = value + Details:UpdateEventTrackerFrame() + end, + min = 4, + max = 32, + step = 1, + name = "Line Height", + text_template = options_text_template, + }, + --line texture + { + type = "select", + get = function() return Details.event_tracker.line_texture end, + values = function() return texTable end, + name = "Line Texture", + }, + --line color + { + type = "color", + get = function() + return {Details.event_tracker.line_color[1], Details.event_tracker.line_color[2], Details.event_tracker.line_color[3], Details.event_tracker.line_color[4]} + end, + set = function (self, r, g, b, a) + local color = Details.event_tracker.line_color + color[1], color[2], color[3], color[4] = r, g, b, a + Details:UpdateEventTrackerFrame() + end, + desc = "Line Color", + name = "Line Color", + text_template = options_text_template, + }, + --font size + { + type = "range", + get = function() return Details.event_tracker.font_size end, + set = function (self, fixedparam, value) + Details.event_tracker.font_size = value + Details:UpdateEventTrackerFrame() + end, + min = 4, + max = 32, + step = 1, + name = "Font Size", + text_template = options_text_template, + }, + --font color + { + type = "color", + get = function() + return {Details.event_tracker.font_color[1], Details.event_tracker.font_color[2], Details.event_tracker.font_color[3], Details.event_tracker.font_color[4]} + end, + set = function (self, r, g, b, a) + local color = Details.event_tracker.font_color + color[1], color[2], color[3], color[4] = r, g, b, a + Details:UpdateEventTrackerFrame() + end, + desc = "Font Color", + name = "Font Color", + text_template = options_text_template, + }, + --font shadow + { + type = "select", + get = function() return Details.event_tracker.font_shadow end, + values = function() return fontShadowTable end, + name = "Font Shadow" + }, + --font face + { + type = "select", + get = function() return Details.event_tracker.font_face end, + values = function() return DF:BuildDropDownFontList (on_select_text_font) end, + name = "Font Face", + text_template = options_text_template, + }, + } + + DF:BuildMenu (f, options, 7, -30, 500, true, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template) + + f:SetScript ("OnHide", function() + --> reopen the options panel + if (f.FromOptionsPanel) then + C_Timer.After (0.2, function() + Details:OpenOptionsWindow(Details:GetInstance(1)) + end) + end + end) + end + + DetailsEventTrackerOptions:RefreshOptions() + DetailsEventTrackerOptions:Show() + + DetailsEventTrackerOptions.FromOptionsPanel = from_options_panel + +end + +-- fazer painel de opções +-- fazer um painel de opções "broadcaster settings" + +C_Timer.After (1, function() + --Details:OpenOptionsWindow(Details:GetInstance(1)) +end) diff --git a/functions/events.lua b/functions/events.lua index c1292a3b..5b934591 100644 --- a/functions/events.lua +++ b/functions/events.lua @@ -39,7 +39,11 @@ ["COMBAT_CHARTTABLES_CREATING"] = {}, ["COMBAT_CHARTTABLES_CREATED"] = {}, ["COMBAT_ENCOUNTER_PHASE_CHANGED"] = {}, - + ["COMBAT_ARENA_START"] = {}, + ["COMBAT_ARENA_END"] = {}, + ["COMBAT_MYTHICDUNGEON_START"] = {}, + ["COMBAT_MYTHICDUNGEON_END"] = {}, + --> area ["ZONE_TYPE_CHANGED"] = {}, @@ -96,6 +100,10 @@ local common_events = { ["COMBAT_CHARTTABLES_CREATING"] = true, ["COMBAT_CHARTTABLES_CREATED"] = true, ["COMBAT_ENCOUNTER_PHASE_CHANGED"] = true, + ["COMBAT_ARENA_START"] = true, + ["COMBAT_ARENA_END"] = true, + ["COMBAT_MYTHICDUNGEON_START"] = true, + ["COMBAT_MYTHICDUNGEON_END"] = true, ["GROUP_ONENTER"] = true, ["GROUP_ONLEAVE"] = true, ["ZONE_TYPE_CHANGED"] = true, diff --git a/functions/playerclass.lua b/functions/playerclass.lua index 648ac9e9..c97714c3 100644 --- a/functions/playerclass.lua +++ b/functions/playerclass.lua @@ -459,13 +459,50 @@ do return spec end - - if (tries and tries < 10) then - t[3] = tries + 1 - _detalhes:ScheduleTimer ("GuessSpec", 3, t) + + if (_detalhes.streamer_config.quick_detection) then + if (tries and tries < 30) then + t[3] = tries + 1 + _detalhes:ScheduleTimer ("GuessSpec", 1, t) + end + else + if (tries and tries < 10) then + t[3] = tries + 1 + _detalhes:ScheduleTimer ("GuessSpec", 3, t) + end end return false end end + + +function _detalhes:AddColorString (player_name, class) + --> check if the class colors exists + local classColors = _G.RAID_CLASS_COLORS + if (classColors) then + local color = classColors [class] + --> check if the player name is valid + if (type (player_name) == "string" and color) then + player_name = "|c" .. color.colorStr .. player_name .. "|r" + return player_name + end + end + + --> if failed, return the player name without modifications + return player_name +end + +function _detalhes:AddRoleIcon (player_name, role, size) + --> check if is a valid role + local roleIcon = _detalhes.role_texcoord [role] + if (type (player_name) == "string" and roleIcon and role ~= "NONE") then + --> add the role icon + size = size or 14 + player_name = "|TInterface\\LFGFRAME\\UI-LFG-ICON-ROLES:" .. size .. ":" .. size .. ":0:0:256:256:" .. roleIcon .. "|t " .. player_name + return player_name + end + + return player_name +end diff --git a/functions/profiles.lua b/functions/profiles.lua index ba85abd3..f310e8b0 100644 --- a/functions/profiles.lua +++ b/functions/profiles.lua @@ -234,14 +234,20 @@ function _detalhes:ApplyProfile (profile_name, nosave, is_copy) --> update profile keys before go for key, value in pairs (_detalhes.default_profile) do + --> the entire key doesn't exist if (profile [key] == nil) then if (type (value) == "table") then profile [key] = table_deepcopy (_detalhes.default_profile [key]) else profile [key] = value end - + + --> the key exist and is a table, check for missing values on sub tables elseif (type (value) == "table") then + --> deploy only copy non existing data + _detalhes.table.deploy (profile [key], value) + + --[=[ for key2, value2 in pairs (value) do if (profile [key] [key2] == nil) then if (type (value2) == "table") then @@ -251,7 +257,7 @@ function _detalhes:ApplyProfile (profile_name, nosave, is_copy) end end end - + --]=] end end @@ -542,6 +548,15 @@ function _detalhes:ApplyProfile (profile_name, nosave, is_copy) --> update the numerical system _detalhes:SelectNumericalSystem() + + --> refresh the update interval + _detalhes:RefreshUpdater() + + --> refresh animation functions + _detalhes:RefreshAnimationFunctions() + + --> refresh broadcaster tools + _detalhes:LoadFramesForBroadcastTools() if (_detalhes.initializing) then _detalhes.profile_loaded = true @@ -864,14 +879,14 @@ local default_profile = { 0.23, -- [3] }, ["ARENA_GREEN"] = { - 0.1, -- [1] - 0.85, -- [2] - 0.1, -- [3] + 0.4, -- [1] + 1, -- [2] + 0.4, -- [3] }, ["ARENA_YELLOW"] = { - 0.90, -- [1] - 0.90, -- [2] - 0, -- [3] + 1, -- [1] + 1, -- [2] + 0.25, -- [3] }, ["NEUTRAL"] = { 1, -- [1] @@ -942,6 +957,10 @@ local default_profile = { --> performance use_row_animations = false, + animation_speed = 33, + animation_speed_triggertravel = 5, + animation_speed_mintravel = 0.45, + animation_speed_maxtravel = 3, animate_scroll = false, use_scroll = false, scroll_speed = 2, @@ -1013,7 +1032,64 @@ local default_profile = { tab_name = "", single_window = false, }, + + --> broadcaster options + broadcaster_enabled = false, + --> event tracker + event_tracker = { + frame = { + locked = false, + width = 250, + height = 300, + backdrop_color = {0, 0, 0, 0.2}, + show_title = true, + strata = "LOW", + }, + options_frame = {}, + enabled = false, + font_size = 10, + font_color = {1, 1, 1, 1}, + font_shadow = "NONE", + font_face = "Friz Quadrata TT", + line_height = 16, + line_texture = "Details Serenity", + line_color = {.1, .1, .1, 0.3}, + }, + + --> current damage + current_dps_meter = { + frame = { + locked = false, + width = 220, + height = 65, + backdrop_color = {0, 0, 0, 0.2}, + show_title = false, + strata = "LOW", + }, + options_frame = {}, + enabled = false, + arena_enabled = true, + mythic_dungeon_enabled = true, + font_size = 18, + font_color = {1, 1, 1, 1}, + font_shadow = "NONE", + font_face = "Friz Quadrata TT", + update_interval = 0.10, + sample_size = 5, --in seconds + }, + + --> streamer +-- _detalhes.streamer_config. + streamer_config = { + reset_spec_cache = false, + disable_mythic_dungeon = false, + no_alerts = false, + quick_detection = false, + faster_updates = false, + use_animation_accel = false, + }, + --> tooltip tooltip = { fontface = "Friz Quadrata TT", @@ -1303,6 +1379,11 @@ local default_global_data = { _detalhes.default_global_data = default_global_data function _detalhes:GetTutorialCVar (key, default) + --> is disabling all popups from the streamer options + if (_detalhes.streamer_config.no_alerts) then + return true + end + local value = _detalhes.tutorial [key] if (value == nil and default) then _detalhes.tutorial [key] = default @@ -1401,6 +1482,10 @@ function _detalhes:RestoreState_CurrentMythicDungeonRun() _detalhes.MythicPlus.PreviousBossKilledAt = savedTable.previous_boss_killed_at _detalhes.MythicPlus.IsRestoredState = true DetailsMythicPlusFrame.IsDoingMythicDungeon = true + + C_Timer.After (2, function() + _detalhes:SendEvent ("COMBAT_MYTHICDUNGEON_START") + end) return end end diff --git a/functions/spells.lua b/functions/spells.lua index 6c0aedc8..25374532 100644 --- a/functions/spells.lua +++ b/functions/spells.lua @@ -135,14 +135,14 @@ do -- Restoration Druid: - [145518] = 105, -- Genesis + [145518] = 105, -- Genesis --no exists [145205] = 105, -- Wild Mushroom [48438] = 105, -- Wild Growth [740] = 105, -- Tranquility [102342] = 105, -- Ironbark [33763] = 105, -- Lifebloom [88423] = 105, -- Nature's Cure - [8936] = 105, -- Regrowth + --[8936] = 105, -- Regrowth -overlap [18562] = 105, -- Swiftmend -- Beast Mastery Hunter: @@ -1572,6 +1572,34 @@ do --[29842] = "WARRIOR", --undribled wrath } + _detalhes.HardCrowdControlSpells = { + --> death knight + + --> deamon hunter + + --> druid + [33786] = true, -- Cyclone + + --> hunter + + --> mage + + --> monk + + --> paladin + + --> priest + + --> rogue + + --> shaman + + --> warlock + + --> warrior + + } + -- updated on 25/04/2015 (@Tonyleila - WoWInterface) _detalhes.CrowdControlSpells = { diff --git a/gumps/janela_options.lua b/gumps/janela_options.lua index a07ae5d1..fffa4bd2 100644 --- a/gumps/janela_options.lua +++ b/gumps/janela_options.lua @@ -20,7 +20,7 @@ 15 - custom spells 16 - data for charts 17 - automatization settings - 18 - misc settings + 18 - broadcaster options 19 - externals widgets (data feed) 20 - tooltip --]] @@ -478,8 +478,16 @@ function _detalhes:OpenOptionsWindow (instance, no_reopen, section) local extra_buttons_on_leave = function (self, capsule) capsule.textcolor = "C_OptionsButtonOrange" end - - local fillbars = g:NewButton (window, _, "$parentCreateExampleBarsButton", nil, 110, 14, _detalhes.CreateTestBars, nil, nil, nil, Loc ["STRING_OPTIONS_TESTBARS"], 1) + + local create_test_bars_func = function() + _detalhes.CreateTestBars() + if (not _detalhes.test_bar_update) then + _detalhes:StartTestBarUpdate() + else + _detalhes:StopTestBarUpdate() + end + end + local fillbars = g:NewButton (window, _, "$parentCreateExampleBarsButton", nil, 110, 14, create_test_bars_func, nil, nil, nil, Loc ["STRING_OPTIONS_TESTBARS"], 1) fillbars:SetPoint ("bottomleft", window.widget, "bottomleft", 41, 12) fillbars.textalign = "left" fillbars.textcolor = "C_OptionsButtonOrange" @@ -566,7 +574,7 @@ function _detalhes:OpenOptionsWindow (instance, no_reopen, section) 17, --auto hide settings 9, --wallpaper - 18, --misc + 18, --streamer options --advanced 11, --raid tools @@ -600,7 +608,7 @@ local menus = { --labels nos menus Loc ["STRING_OPTIONSMENU_AUTOMATIC"], Loc ["STRING_OPTIONSMENU_WALLPAPER"], - "-- -- --", --Loc ["STRING_OPTIONSMENU_MISC"] + "Streamer Settings", --Loc ["STRING_OPTIONSMENU_MISC"] }, { @@ -631,7 +639,7 @@ local menus2 = { Loc ["STRING_OPTIONSMENU_DATACHART"], --16 Loc ["STRING_OPTIONSMENU_AUTOMATIC"], --17 --Loc ["STRING_OPTIONSMENU_MISC"], --18 - "-- -- --", --18 + "Streamer Settings", --18 Loc ["STRING_OPTIONSMENU_DATAFEED"], --19 Loc ["STRING_OPTIONSMENU_TOOLTIP"], --20 } @@ -647,10 +655,13 @@ local menus2 = { [9] = true, [14] = true, [17] = true, - [18] = true, + --[18] = true, } window.is_window_settings = is_window_settings - + + local newIcon = g:CreateImage (window, [[Interface\AddOns\Details\images\icons2]], 62*0.6, 40*0.6, "overlay", {443/512, 505/512, 306/512, 346/512}) + newIcon:SetPoint ("topleft", window.widget, "topleft", 135, -351) + local select_options = function (options_type, true_index) window.current_selected = options_type @@ -2198,7 +2209,7 @@ function window:CreateFrame19() end --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- Advanced Settings - Miscellaneous ~18 +-- Advanced Settings - options for broadcasters ~18 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- function window:CreateFrame18() @@ -2209,19 +2220,287 @@ function window:CreateFrame18() titulo_misc_settings_desc.width = 350 titulo_misc_settings_desc.height = 20 - local right_side = { - --{"instancesMiscLabel", 1, true}, - --{"deleteInstanceLabel", 2}, - - --{"DisableGroupsLabel", 5, true}, - --{"DisableLockResizeUngroupLabel", 7}, - --{"DisableStretchButtonLabel", 8}, - --{"DisableBarHighlightLabel", 9}, - --{"DisableAllDisplaysWindowLabel", 10}, - --{"DamageTakenEverythingLabel", 10}, + --> + local button_width = 180 + + local titleFrame18 = g:NewLabel (frame18, _, "$parentTitleText", "TitleTextLabel", "Streamer Settings", "GameFontNormal", 16) + local titleFrame18Desc = g:NewLabel (frame18, _, "$parentTitleDescText", "TitleDescTextLabel", "Set of tools for streamers, youtubers and broadcasters in general", "GameFontNormal", 10, "white") + titleFrame18Desc:SetSize (450, 20) + + --fazer os headers com espaço para images + --fazer o botão para abrir o painel de opçopoes + + --> streamer plugin - a.k.a. player spell tracker + --> title anchor + g:NewLabel (frame18, _, "$parentStreamerPluginAnchor", "streamerPluginAnchor", "Streamer Plugin: Action Tracker", "GameFontNormal") + local streamerTitleDesc = g:NewLabel (frame18, _, "$parentStreamerTitleDescText", "StreamerTitleDescTextLabel", "Show the spells you are casting, allowing the viewer to follow your decision making and learn your rotation.", "GameFontNormal", 10, "white") + streamerTitleDesc:SetSize (270, 40) + streamerTitleDesc:SetJustifyV ("top") + streamerTitleDesc:SetPoint ("topleft", frame18.streamerPluginAnchor, "bottomleft", 0, -4) - --{"scrollLabel", 11, true}, + local streamerTitleImage = g:CreateImage (frame18, [[Interface\AddOns\Details\images\icons2]], 256, 41, "overlay", {0.5, 1, 0.49, 0.57}) + streamerTitleImage:SetPoint ("topleft", frame18.streamerPluginAnchor, "bottomleft", 0, -40) + + --> get the plugin object + local StreamerPlugin = _detalhes:GetPlugin ("DETAILS_PLUGIN_STREAM_OVERLAY") + if (StreamerPlugin) then + --> get the plugin settings table + local tPluginSettings = _detalhes:GetPluginSavedTable ("DETAILS_PLUGIN_STREAM_OVERLAY") + if (tPluginSettings) then + local bIsPluginEnabled = tPluginSettings.enabled + --> plugin already enabled + if (bIsPluginEnabled) then + --> config button + local configure_streamer_plugin = function() + StreamerPlugin.OpenOptionsPanel (true) + C_Timer.After (0.2, function() + window:Hide() + end) + end + local configurePluginButton = g:NewButton (frame18, _, "$parentConfigureStreamerPluginButton", "configureStreamerPlugin", 100, 20, configure_streamer_plugin, nil, nil, nil, "Action Tracker Options", nil, options_button_template) + configurePluginButton:SetWidth (button_width) + configurePluginButton:SetPoint ("topleft", streamerTitleImage, "bottomleft", 0, -7) + + --> text telling how to disable + local pluginAlreadyEnabled = g:NewLabel (frame18, _, "$parentStreamerAlreadyEnabledText", "StreamerAlreadyEnabledTextLabel", "Plugin is enabled. You may disable it on Plugin Management section.", "GameFontNormal", 10, "white") + pluginAlreadyEnabled:SetJustifyV ("top") + pluginAlreadyEnabled:SetSize (270, 40) + pluginAlreadyEnabled:SetPoint ("topleft", configurePluginButton, "bottomleft", 0, -7) + else + --> plugin isnt enabled, create the enable button + local enable_streamer_plugin = function() + tPluginSettings.enabled = true + StreamerPlugin.__enabled = true + _detalhes:SendEvent ("PLUGIN_ENABLED", StreamerPlugin) + + frame18.enableStreamerPluginButton:Hide() + + --> config button + local configure_streamer_plugin = function() + StreamerPlugin.OpenOptionsPanel() + end + local configurePluginButton = g:NewButton (frame18, _, "$parentConfigureStreamerPluginButton", "configureStreamerPlugin", 100, 20, configure_streamer_plugin, nil, nil, nil, "Action Tracker Options", nil, options_button_template) + configurePluginButton:SetWidth (button_width) + configurePluginButton:SetPoint ("topleft", streamerTitleImage, "bottomleft", 0, -7) + + --> text telling how to disable + local pluginAlreadyEnabled = g:NewLabel (frame18, _, "$parentStreamerAlreadyEnabledText", "StreamerAlreadyEnabledTextLabel", "Plugin is enabled. You may disable it on Plugin Management section.", "GameFontNormal", 10, "white") + pluginAlreadyEnabled:SetJustifyV ("top") + pluginAlreadyEnabled:SetSize (270, 40) + pluginAlreadyEnabled:SetPoint ("topleft", configurePluginButton, "bottomleft", 0, -7) + end + + local enablePluginButton = g:NewButton (frame18, _, "$parentEnableStreamerPluginButton", "enableStreamerPluginButton", 100, 20, enable_streamer_plugin, nil, nil, nil, "Enable Plugin", nil, options_button_template) + enablePluginButton:SetWidth (button_width) + enablePluginButton:SetPoint ("topleft", streamerTitleImage, "bottomleft", 0, -5) + end + end + else + --> plugin is disabled at the addon control panel + local pluginDisabled = g:NewLabel (frame18, _, "$parentStreamerDisabledText", "StreamerDisabledTextLabel", "Details!: Streamer Plugin is disabled on the AddOns Control Panel.", "GameFontNormal", 10, "red") + pluginDisabled:SetSize (270, 40) + pluginDisabled:SetPoint ("topleft", streamerTitleImage, "bottomleft", 0, -2) + end + + + --> event tracker + g:NewLabel (frame18, _, "$parentEventTrackerAnchor", "eventTrackerAnchor", "Event Tracker", "GameFontNormal") + local eventTrackerTitleDesc = g:NewLabel (frame18, _, "$parentEventTrackerTitleDescText", "EventTrackerTitleDescTextLabel", "Show what's happening near you so the viewer can follow what's going on. Show cooldowns, CC, spell interruption. Useful on any group content.", "GameFontNormal", 10, "white") + eventTrackerTitleDesc:SetJustifyV ("top") + eventTrackerTitleDesc:SetSize (270, 40) + eventTrackerTitleDesc:SetPoint ("topleft", frame18.eventTrackerAnchor, "bottomleft", 0, -4) + + local eventTrackerTitleImage = g:CreateImage (frame18, [[Interface\AddOns\Details\images\icons2]], 256, 50, "overlay", {0.5, 1, 134/512, 184/512}) + eventTrackerTitleImage:SetPoint ("topleft", frame18.eventTrackerAnchor, "bottomleft", 0, -40) + + --> enable feature checkbox + g:NewLabel (frame18, _, "$parentEnableEventTrackerLabel", "EventTrackerLabel", "Enable Event Tracker", "GameFontHighlightLeft") + g:NewSwitch (frame18, _, "$parentEventTrackerSlider", "EventTrackerSlider", 60, 20, _, _, _detalhes.event_tracker.enabled, nil, nil, nil, nil, options_switch_template) + frame18.EventTrackerSlider:SetPoint ("left", frame18.EventTrackerLabel, "right", 2) + frame18.EventTrackerSlider:SetAsCheckBox() + frame18.EventTrackerSlider.OnSwitch = function (_, _, value) + _detalhes.event_tracker.enabled = not _detalhes.event_tracker.enabled + Details:LoadFramesForBroadcastTools() + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + window:CreateLineBackground2 (frame18, "EventTrackerSlider", "EventTrackerLabel", "Enable Event Tracker") + + frame18.EventTrackerLabel:SetPoint ("topleft", eventTrackerTitleImage, "bottomleft", 0, -10) + frame18.EventTrackerSlider:SetPoint ("left", frame18.EventTrackerLabel, "right", 2, 0) + + --> configure feature button + local configure_event_tracker = function() + _detalhes:OpenEventTrackerOptions (true) + C_Timer.After (0.2, function() + window:Hide() + end) + end + local configureEventTrackerButton = g:NewButton (frame18, _, "$parentConfigureEventTrackerButton", "configureEventTracker", 100, 20, configure_event_tracker, nil, nil, nil, "Event Tracker Options", nil, options_button_template) + configureEventTrackerButton:SetWidth (button_width) + configureEventTrackerButton:SetPoint ("topleft", frame18.EventTrackerLabel, "bottomleft", 0, -7) + + + --> current dps + g:NewLabel (frame18, _, "$parentCurrentDPSAnchor", "currentDPSAnchor", "The Real Current DPS", "GameFontNormal") + local currentDPSTitleDesc = g:NewLabel (frame18, _, "$parentCurrentDPSTitleDescText", "CurrentDPSTitleDescTextLabel", "Show a frame with DPS done only in the last 5 seconds, making it change very quickly when the group uses attack cooldowns.", "GameFontNormal", 10, "white") + currentDPSTitleDesc:SetJustifyV ("top") + currentDPSTitleDesc:SetSize (270, 40) + currentDPSTitleDesc:SetPoint ("topleft", frame18.currentDPSAnchor, "bottomleft", 0, -4) + + local currentDPSTitleImage = g:CreateImage (frame18, [[Interface\AddOns\Details\images\icons2]], 250, 61, "overlay", {259/512, 509/512, 186/512, 247/512}) + currentDPSTitleImage:SetPoint ("topleft", frame18.currentDPSAnchor, "bottomleft", 0, -40) + + --> enable feature checkbox + g:NewLabel (frame18, _, "$parentEnableCurrentDPSLabel", "CurrentDPSLabel", "Enable The Real Current Dps", "GameFontHighlightLeft") + g:NewSwitch (frame18, _, "$parentCurrentDPSSlider", "CurrentDPSSlider", 60, 20, _, _, _detalhes.current_dps_meter.enabled, nil, nil, nil, nil, options_switch_template) + + frame18.CurrentDPSSlider:SetPoint ("left", frame18.CurrentDPSLabel, "right", 2) + frame18.CurrentDPSSlider:SetAsCheckBox() + frame18.CurrentDPSSlider.OnSwitch = function (_, _, value) + _detalhes.current_dps_meter.enabled = not _detalhes.current_dps_meter.enabled + Details:LoadFramesForBroadcastTools() + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + window:CreateLineBackground2 (frame18, "CurrentDPSSlider", "CurrentDPSLabel", "Enable The Real Current Dps") + + frame18.CurrentDPSLabel:SetPoint ("topleft", currentDPSTitleImage, "bottomleft", 0, -10) + frame18.CurrentDPSSlider:SetPoint ("left", frame18.CurrentDPSLabel, "right", 2, 0) + + --> configure feature button + local configure_current_dps = function() + _detalhes:OpenCurrentRealDPSOptions (true) + C_Timer.After (0.2, function() + window:Hide() + end) + end + local configureCurrentDPSButton = g:NewButton (frame18, _, "$parentConfigureCurrentDPSButton", "configureCurrentDPS", 100, 20, configure_current_dps, nil, nil, nil, "Current Real DPS Options", nil, options_button_template) + configureCurrentDPSButton:SetWidth (button_width) + configureCurrentDPSButton:SetPoint ("topleft", frame18.CurrentDPSLabel, "bottomleft", 0, -7) + + + --> suppress alerts and tutorial popups + g:NewLabel (frame18, _, "$parentAlertsAndPopupsAnchor", "alertsAndPopupsAnchor", "Settings:", "GameFontNormal") + + + + --> no alerts + g:NewLabel (frame18, _, "$parentNoAlertsLabel", "NoAlertsLabel", "No Window Alerts", "GameFontHighlightLeft") + g:NewSwitch (frame18, _, "$parentNoAlertsSlider", "NoAlertsSlider", 60, 20, _, _, _detalhes.streamer_config.no_alerts, nil, nil, nil, nil, options_switch_template) + + frame18.NoAlertsSlider:SetPoint ("left", frame18.NoAlertsLabel, "right", 2) + frame18.NoAlertsSlider:SetAsCheckBox() + frame18.NoAlertsSlider.OnSwitch = function (_, _, value) + _detalhes.streamer_config.no_alerts = not _detalhes.streamer_config.no_alerts + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + window:CreateLineBackground2 (frame18, "NoAlertsSlider", "NoAlertsLabel", "Don't show alerts in the bottom of the window and avoid show tutorial popups.") + + --> faster updates + g:NewLabel (frame18, _, "$parentFasterUpdatesLabel", "FasterUpdatesLabel", "60 Updates Per Second", "GameFontHighlightLeft") + g:NewSwitch (frame18, _, "$parentFasterUpdatesSlider", "FasterUpdatesSlider", 60, 20, _, _, _detalhes.streamer_config.faster_updates, nil, nil, nil, nil, options_switch_template) + + frame18.FasterUpdatesSlider:SetPoint ("left", frame18.FasterUpdatesLabel, "right", 2) + frame18.FasterUpdatesSlider:SetAsCheckBox() + frame18.FasterUpdatesSlider.OnSwitch = function (_, _, value) + _detalhes.streamer_config.faster_updates = not _detalhes.streamer_config.faster_updates + _detalhes:RefreshUpdater() + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + window:CreateLineBackground2 (frame18, "FasterUpdatesSlider", "FasterUpdatesLabel", "Increase the refresh rate to 60 times per second.") + + --> quick detection + g:NewLabel (frame18, _, "$parentQuickDetectionLabel", "QuickDetectionLabel", "Quick Player Info", "GameFontHighlightLeft") + g:NewSwitch (frame18, _, "$parentQuickDetectionSlider", "QuickDetectionSlider", 60, 20, _, _, _detalhes.streamer_config.quick_detection, nil, nil, nil, nil, options_switch_template) + + frame18.QuickDetectionSlider:SetPoint ("left", frame18.QuickDetectionLabel, "right", 2) + frame18.QuickDetectionSlider:SetAsCheckBox() + frame18.QuickDetectionSlider.OnSwitch = function (_, _, value) + _detalhes.streamer_config.quick_detection = not _detalhes.streamer_config.quick_detection + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + window:CreateLineBackground2 (frame18, "QuickDetectionSlider", "QuickDetectionLabel", "Attempt to acquire player information such as class, spec or item level faster.") + + --> disable mythic dungeon + g:NewLabel (frame18, _, "$parentDisableMythicDungeonLabel", "DisableMythicDungeonLabel", "No Mythic Dungeon Shenanigans", "GameFontHighlightLeft") + g:NewSwitch (frame18, _, "$parentDisableMythicDungeonSlider", "DisableMythicDungeonSlider", 60, 20, _, _, _detalhes.streamer_config.disable_mythic_dungeon, nil, nil, nil, nil, options_switch_template) + + frame18.DisableMythicDungeonSlider:SetPoint ("left", frame18.DisableMythicDungeonLabel, "right", 2) + frame18.DisableMythicDungeonSlider:SetAsCheckBox() + frame18.DisableMythicDungeonSlider.OnSwitch = function (_, _, value) + _detalhes.streamer_config.disable_mythic_dungeon = not _detalhes.streamer_config.disable_mythic_dungeon + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + window:CreateLineBackground2 (frame18, "DisableMythicDungeonSlider", "DisableMythicDungeonLabel", "Threat mythic dungeon as a normal dungeon: no trash merge, no mythic run overall segment.") + + --> clear cache + g:NewLabel (frame18, _, "$parentClearCacheLabel", "ClearCacheLabel", "Clear Cache on New Event", "GameFontHighlightLeft") + g:NewSwitch (frame18, _, "$parentClearCacheSlider", "ClearCacheSlider", 60, 20, _, _, _detalhes.streamer_config.reset_spec_cache, nil, nil, nil, nil, options_switch_template) + + frame18.ClearCacheSlider:SetPoint ("left", frame18.ClearCacheLabel, "right", 2) + frame18.ClearCacheSlider:SetAsCheckBox() + frame18.ClearCacheSlider.OnSwitch = function (_, _, value) + _detalhes.streamer_config.reset_spec_cache = not _detalhes.streamer_config.reset_spec_cache + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + window:CreateLineBackground2 (frame18, "ClearCacheSlider", "ClearCacheLabel", "Reduces the chance of getting a serial number overlap when working with multiple realms.") + + --> advanced animations + g:NewLabel (frame18, _, "$parentAdvancedAnimationsLabel", "AdvancedAnimationsLabel", "Use Animation Acceleration", "GameFontHighlightLeft") + g:NewSwitch (frame18, _, "$parentAdvancedAnimationsSlider", "AdvancedAnimationsSlider", 60, 20, _, _, _detalhes.streamer_config.use_animation_accel, nil, nil, nil, nil, options_switch_template) + + frame18.AdvancedAnimationsSlider:SetPoint ("left", frame18.AdvancedAnimationsLabel, "right", 2) + frame18.AdvancedAnimationsSlider:SetAsCheckBox() + frame18.AdvancedAnimationsSlider.OnSwitch = function (_, _, value) + _detalhes.streamer_config.use_animation_accel = not _detalhes.streamer_config.use_animation_accel + _detalhes:RefreshAnimationFunctions() + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + window:CreateLineBackground2 (frame18, "AdvancedAnimationsSlider", "AdvancedAnimationsLabel", "Animation speed changes accordly to the amount of space the bar needs to travel.") + + + --> anchoring + local x = window.left_start_at + titleFrame18:SetPoint (x, window.title_y_pos) + titleFrame18Desc:SetPoint (x, window.title_y_pos2) + + local a = frame18:CreateFontString (nil, "overlay", "GameFontNormal") + frame18.a = a + + local left_side = { + {"streamerPluginAnchor", 0, true}, + + {"eventTrackerAnchor", 0, true}, + {"eventTrackerAnchor", 0, true}, + {"eventTrackerAnchor", 0, true}, + {"eventTrackerAnchor", 0, true}, + {"eventTrackerAnchor", 0, true}, + + } + + window:arrange_menu (frame18, left_side, x, window.top_start_at) + + local right_side = { + {"currentDPSAnchor", 0, true}, + {"alertsAndPopupsAnchor", 0, true}, + {"alertsAndPopupsAnchor", 0, true}, + {"alertsAndPopupsAnchor", 0, true}, + {"alertsAndPopupsAnchor", 0, true}, + {"alertsAndPopupsAnchor", 0, true}, + {"NoAlertsLabel"}, + {"FasterUpdatesLabel"}, + {"QuickDetectionLabel"}, + {"DisableMythicDungeonLabel"}, + {"ClearCacheLabel"}, + {"AdvancedAnimationsLabel"}, } window:arrange_menu (frame18, right_side, window.right_start_at, window.top_start_at) @@ -11339,6 +11618,16 @@ end --> if not window --> window 16 _G.DetailsOptionsWindow16UserTimeCapturesFillPanel.MyObject:Refresh() + --> window 18 + _G.DetailsOptionsWindow18EventTrackerSlider.MyObject:SetValue (_detalhes.event_tracker.enabled) + _G.DetailsOptionsWindow18CurrentDPSSlider.MyObject:SetValue (_detalhes.current_dps_meter.enabled) + _G.DetailsOptionsWindow18NoAlertsSlider.MyObject:SetValue (_detalhes.streamer_config.no_alerts) + _G.DetailsOptionsWindow18FasterUpdatesSlider.MyObject:SetValue (_detalhes.streamer_config.faster_updates) + _G.DetailsOptionsWindow18QuickDetectionSlider.MyObject:SetValue (_detalhes.streamer_config.quick_detection) + _G.DetailsOptionsWindow18DisableMythicDungeonSlider.MyObject:SetValue (_detalhes.streamer_config.disable_mythic_dungeon) + _G.DetailsOptionsWindow18ClearCacheSlider.MyObject:SetValue (_detalhes.streamer_config.reset_spec_cache) + _G.DetailsOptionsWindow18AdvancedAnimationsSlider.MyObject:SetValue (_detalhes.streamer_config.use_animation_accel) + --> window 17 _G.DetailsOptionsWindow17CombatAlphaDropdown.MyObject:Select (editing_instance.hide_in_combat_type, true) _G.DetailsOptionsWindow17HideOnCombatAlphaSlider.MyObject:SetFixedParameter (editing_instance) diff --git a/gumps/janela_principal.lua b/gumps/janela_principal.lua index f0d2cb89..784777c1 100644 --- a/gumps/janela_principal.lua +++ b/gumps/janela_principal.lua @@ -1493,8 +1493,7 @@ local resize_scripts_onmousedown = function (self, button) _detalhes:SendEvent ("DETAILS_INSTANCE_STARTRESIZE", nil, self._instance) if (_detalhes.update_speed > 0.3) then - _detalhes:CancelTimer (_detalhes.atualizador) - _detalhes.atualizador = _detalhes:ScheduleRepeatingTimer ("AtualizaGumpPrincipal", 0.3, -1) + _detalhes:SetWindowUpdateSpeed (0.3, true) _detalhes.resize_changed_update_speed = true end @@ -1591,8 +1590,7 @@ local resize_scripts_onmouseup = function (self, button) end if (_detalhes.resize_changed_update_speed) then - _detalhes:CancelTimer (_detalhes.atualizador) - _detalhes.atualizador = _detalhes:ScheduleRepeatingTimer ("AtualizaGumpPrincipal", _detalhes.update_speed, -1) + _detalhes:SetWindowUpdateSpeed (false, true) _detalhes.resize_changed_update_speed = nil end @@ -2636,8 +2634,7 @@ local function button_stretch_scripts (baseframe, backgrounddisplay, instancia) --> change the update speed if (_detalhes.update_speed > 0.3) then - _detalhes:CancelTimer (_detalhes.atualizador) - _detalhes.atualizador = _detalhes:ScheduleRepeatingTimer ("AtualizaGumpPrincipal", 0.3, -1) + _detalhes:SetWindowUpdateSpeed (0.3, true) _detalhes.stretch_changed_update_speed = true end @@ -2723,8 +2720,7 @@ local function button_stretch_scripts (baseframe, backgrounddisplay, instancia) _detalhes:SendEvent ("DETAILS_INSTANCE_ENDSTRETCH", nil, instancia) if (_detalhes.stretch_changed_update_speed) then - _detalhes:CancelTimer (_detalhes.atualizador) - _detalhes.atualizador = _detalhes:ScheduleRepeatingTimer ("AtualizaGumpPrincipal", _detalhes.update_speed, -1) + _detalhes:SetWindowUpdateSpeed (false, true) _detalhes.stretch_changed_update_speed = nil end @@ -2991,6 +2987,10 @@ end function _detalhes:InstanceAlert (msg, icon, time, clickfunc, doflash) + if (_detalhes.streamer_config.no_alerts) then + return + end + if (not self.meu_id) then local lower = _detalhes:GetLowerInstanceNumber() if (lower) then diff --git a/images/icons2.blp b/images/icons2.blp index 69f4e6cf8caa284983b4f8380806052ab533fe1a..5168909ac9a5612af53b2aeaddfbe0b5704850f5 100644 GIT binary patch literal 350724 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 QS}oNvb%VZ12ODJnAH!hN!vFvP literal 350724 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 merged trash segment is current segment > MergeTrashCleanup() is scheduled:", isFromSchedule) + --happened after killing one mob and leaving the dungeon, lots of /reload has done inside the dungeon end end @@ -1040,10 +1041,27 @@ function _G._detalhes:Start() elseif (event == "CHALLENGE_MODE_START") then --> CHALLENGE_MODE_START does trigger every time the player enters a mythic dungeon already in progress - + + --> send mythic dungeon start event + local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo() + if (difficultyID == 8) then + _detalhes:SendEvent ("COMBAT_MYTHICDUNGEON_START") + end + if (newFrame.DevelopmentDebug) then print ("Details!", event, ...) end + + --> reset spec cache if broadcaster requested + if (_detalhes.streamer_config.reset_spec_cache) then + wipe (_detalhes.cached_specs) + end + + --> ignore the event if ignoring mythic dungeon special treatment + if (_detalhes.streamer_config.disable_mythic_dungeon) then + return + end + C_Timer.After (0.5, newFrame.OnChallengeModeStart) elseif (event == "CHALLENGE_MODE_COMPLETED") then @@ -1051,6 +1069,17 @@ function _G._detalhes:Start() print ("Details!", event, ...) end + --> send mythic dungeon end event + local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo() + if (difficultyID == 8) then + _detalhes:SendEvent ("COMBAT_MYTHICDUNGEON_END") + end + + --> ignore the event if ignoring mythic dungeon special treatment + if (_detalhes.streamer_config.disable_mythic_dungeon) then + return + end + --> delay to wait the encounter_end trigger first --> assuming here the party cleaned the mobs kill objective before going to kill the last boss C_Timer.After (2, newFrame.MythicDungeonFinished) @@ -1060,6 +1089,11 @@ function _G._detalhes:Start() print ("Details!", event, ...) end + --> ignore the event if ignoring mythic dungeon special treatment + if (_detalhes.streamer_config.disable_mythic_dungeon) then + return + end + if (newFrame.IsDoingMythicDungeon) then local encounterID, encounterName, difficultyID, raidSize, endStatus = ... if (endStatus == 1) then @@ -1100,11 +1134,21 @@ function _G._detalhes:Start() print ("Details!", event, ...) print ("Zone changed and is Doing Mythic Dungeon") end + + --> ignore the event if ignoring mythic dungeon special treatment + if (_detalhes.streamer_config.disable_mythic_dungeon) then + return + end + local _, _, difficulty, _, _, _, _, currentZoneID = GetInstanceInfo() if (currentZoneID ~= self.MythicPlus.DungeonID) then if (newFrame.DevelopmentDebug) then print ("Zone changed and the zone is different than the dungeon") end + + --> send mythic dungeon end event + _detalhes:SendEvent ("COMBAT_MYTHICDUNGEON_END") + --> finish the segment newFrame.BossDefeated (true) @@ -1450,6 +1494,9 @@ function _G._detalhes:Start() _detalhes:OpenWelcomeWindow() end + --> load broadcaster tools + _detalhes:LoadFramesForBroadcastTools() + --_detalhes:OpenWelcomeWindow() --debug -- /run _detalhes:OpenWelcomeWindow()